LoginSignup
11

More than 3 years have passed since last update.

posted at

sftpをシェルで実行

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コマンドの構文エラーはキャッチできない。。。
実行後にログ等に吐いてチェックロジックを別で作らないといけないかも。

参考にさせていただいたサイト

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
11