Tera Term(テラターム)のマクロコマンド「scpsend」を使用してサーバへファイル送信する事ができる事はみなさんご存知ですよね。
先日「scpsend」でファイルをサーバに送信し、ファイル転送の終了を待ってあるコマンドを実行したいが何か方法が無いかとの相談を受けました。
「scpsend」の解説を確認すると以下のように書かれていました。
ファイル<filename>をSCP(Secure Copy Protocol)プロトコルで送信する。転送先を省略した場合は、ファイルはリモートホストのホームディレクトリへコピーされる。送信が終わるのを待たずに、次のコマンドを実行することができる。
『送信が終わるのを待たずに、次のコマンドを実行することができる。』が肝ですね。
ファイル送信の処理を実行し、終了を待たずして次のコマンドが実行出来るのは便利なのですが、もし以下のようなマクロを書いてしまうとタイミングによってはファイル送信完了前にマクロが終了してしまったり、ファイルの送信は完了するが後続のマクロが動かない等、思い通りの動作をしない事があります。
;; ファイル送信 scpsend SOURFILE DESTFILE mpause 1000 sendln 'exit' ;; マクロ終了 end
そこで苦肉の策なのですが、以下のマクロサンプルを追加する事で、ファイル転送の終了を確認する事ができましたのでここでご紹介致します。
内容としましては「scpsend」実行中は「scp -t」のプロセスが存在します。このプロセスの終了を確認する事でファイル転送の終了を確認しています。
「scpsend」実行中のプロセス例) $ ps -ef |grep scp user01 15004 14982 0 20:05 ? 00:00:00 scp -t /tmp/test.txt
;; ファイル送信 scpsend SOURFILE DESTFILE ;; ファイル送信プロセス確認 do mpause 5000 sendln ‘ps -ef |grep -v grep |grep -c scp’ waitln ’0′ ’1′ loop while result != 1 ;; ファイル送信が完了すると次のマクロを実行 sendln 'exit' ;; マクロ終了 end
これでファイル送信が終了してからコマンドを実行したり、ちゃんとファイル転送が終了するのを待ってからマクロを終了する事が可能になります。
しかしこれにも欠点があります!
もし他の人が同じ時間帯にSCPでファイル転送を実行していると、その処理が終了するまでファイル転送中のステータスとなってしまいます。もし容量の大きいファイルを転送してたりすると、その処理が終わるまで待つことになってしまいます。
実行するユーザが違えば、以下のように修正する事でカバーできますが・・・。
sendln ‘ps -ef |grep -v grep |grep scp |grep -c ユーザ名’
おわりに
将来的には、引数などでファイル送信の終了を待てるようするとか、ファイル送信の正常性を戻り値で取得できるようになったら便利になりますね。
まあ何かの参考にでもなれば幸いです。
情報どうもありがとうございます。マクロスクリプトに追加させていただきました。
http://ttssh2.sourceforge.jp/manual/ja/macro/command/scpsend.html
非同期ではなく、同期してファイル転送できるように、将来的にはしたいと考えています。
ゆたかさん。こんばんは。
ちょっとでもお役に立てたのであれば幸いです。
同期しての転送楽しみにしています。
以下のようにしたら、私の使っているサーバではできました。
(ttyを基にsshログインユーザの親PIDを特定して、正しいscpプロセスをチェックしています)
ご参考までに。
;; ファイル送信プロセス確認
do
mpause 5000
sendln ‘ps -ef | grep `ps -ef | grep “[\`whoami\`]@${SSH_TTY##/dev/}” | awk “{print \\$2}”` | grep -c scp’
waitln ‘0’ ‘1’
loop while result != 1
hirshさん。
情報ありがとうございます。
早速試してみたいと思います。