#SFTPをシェルで実行
いろいろと試行錯誤して、対話形式のログインが必須(相手からID、PASSでの認証指定)の場合に下記の方法で実現しました。
ところどころでハマったのでメモしておきます。
#!/bin/sh
#sftp get用シェル
FNAME="$1"
HOST="hogehoge.com"
USER="hogeid"
PORT="22"
PASS="hogepass"
CMD1="cd /data"
CMD2="get hoge.csv /home/"
expect -c "
set timeout 10
spawn sftp -P $PORT $USER@$HOST
expect \"hogeid@hogehoge.com's password:\"
send \"${PASS}\r\"
expect \"sftp>\"
send \"${CMD1}\r\"
expect \"sftp>\"
send \"${CMD2}\r\"
expect \"sftp>\"
send \"bye\r\"
expect eof
exit
"
#工夫したところ
##エスケープは入念に
パスワードなどで、$が混ざってたりする場合は、それもエスケープ。
\$ (文字として$をつかう場合。変数で使うならエスケープしなくていい。)
ex)pass$wordという文字列がパスワードなら
send \”pass\\\$word\r\”
##終了は下記で
expect内の"interact"の記述。
よく上記のサンプルがあるんですが、よく理解していないとハマります。
シェルにしたいってことは、cronで実行したいとおもうので、
expect eof
exit
とする必要あり。
##画面に表示される文字をexpect
expect \"sftp>\"
#「sftp>」は「sftp>」ですね!
#注意点
expectの構文に問題なければ、エラーとならない。
ってことは相手と通信エラーや、SFTPコマンドの構文エラーはキャッチできない。。。
実行後にログ等に吐いてチェックロジックを別で作らないといけないかも。
##参考にさせていただいたサイト
https://qiita.com/ine1127/items/cd6bc91174635016db9b