はじめに
sftp方式でファイルをダウンロード、接続先のファイル削除までを自動化したかったが、対話方式でしか通信を行ったことがなかった。今回非対話方式でsftpを行う方法知ったのでメモ。
なお、本記事はbashで書くことを目的としている。
ダウンロード
以下でカレントディレクトリにファイルがダウンロードされる。
sftp -i [keyのフルパス] [ユーザ名]@[アクセス先]:[取得したいファイルのフルパス]
アップロード/削除
expect.sh
#!/bin/bash
user="[ユーザ]"
sftp_path="[接続先]"
key_path="[keyのフルパス]"
expect -c "
set timeout 3600
spawn sftp -i ${key_path} ${user}@${sftp_path}
expect \"sftp>\"
send \"put /home/ubuntu/kobayashi/dammy\r\"
expect \"sftp>\"
send \"rm dammy\r\"
expect \"sftp>\"
send \"bye\r\"
expect eof
exit
"
ここでは非対話方式のsftpコマンドを使用するのではなく、expectを使用して対話を自動化している。
expect
以下のQiitaを参考にさせていただいた。
Linuxの対話がめんどくさい?そんな時こそ自動化だ!-expect編https://qiita.com › Linux
一応ここでも簡単に解説する。
簡単な解説
expectは、簡潔にいうと対話方式のやり取りを自動でおこなってくれるモノ。
導入は
yum install expect
主な要素は以下。
コマンド | 動作 |
---|---|
expect -c " |
ここからexpectで自動化するよーっていうexpectの書き始め。 自動化の最後には必ず " で締める。 |
set timeout |
1つのコマンドがタイムアウトするまでの秒数を設定。デフォルトで10秒。 |
spawn |
自動化対象のコマンドのプロセスを生成。 |
expect |
前のコマンドの応答を受け取る。 指定した文字列を応答が含む場合、次のコマンドを実行する。 |
send |
実行したいコマンドを記述する。 コマンドの後ろに \r を書かないと、前のexpect がタイムアウトするまで実行されないため注意 |
expect eof exit
|
操作の主導権をユーザに戻す。代わりにinteract でも可。(筆者の好み) |
メモ
これらを含んだbashはcronで夜間に動かしていたのだが、ユーザをrootにしていたので、sftpでダウンロードされるファイルの格納先がrootになってしまった。
sftpで取得する前にcdでカレントディレクトリを変更することで対応した。
(おそらくsftpコマンドでダウンロード先を指定することができるのだろうが、これで対応できたので調べていない)