以前、Tera TermのSCP機能を利用し、手動操作でファイルの転送(送受信)を行う手順をご紹介させていただきました。覚えてらっしゃいますか?
⇒ Tera Term(SCP機能)を利用してのファイル転送(送信編)
⇒ Tera Term(SCP機能)を利用してのファイル転送(受信編)
簡単なファイルの送受信には、かなり便利な機能でしたよね。
ここでは、SCP機能を使い手動操作でファイルの送信を行うのではなく、Tera Termのマクロ機能を利用してファイルの送信を行いたいと思います。
接続先ホストに、ファイルを配布したりするのに使用すると便利なマクロかもしれませんね。
テラタームマクロを使ったSCPファイル転送(送信編)
;=========================================================== ; Filename : file-tranfer-02.ttl ; Description : SSH Auto login ; Author : JUNZOU ; Created : 2011/04/10 ; modified : ;=========================================================== ;; 接続先ホスト/ユーザ名/パスワード/送信ファイル設定 HOSTADDR = '接続先IPアドレス' USERNAME = 'ユーザ名' PASSWORD = 'パスワード' DESTFILE = '/tmp/test.txt' SOURFILE = 'C:\work\test.txt' ;=========================================================== ;; ①コマンド組立て COMMAND = HOSTADDR strconcat COMMAND ':22 /ssh /2 /auth=password /user=' strconcat COMMAND USERNAME strconcat COMMAND ' /passwd=' strconcat COMMAND PASSWORD ;; ②接続 connect COMMAND ;; ③接続判定1(接続出来ない場合はメッセージを表示しマクロ終了) if result <> 2 then messagebox 'It could not be connected.' 'Connection Error' end endif ;; ④接続判定2(10秒以内にプロンプトが表示されない場合TeraTerm終了) timeout = 10 wait '$' '#' if result = 0 then disconnect 0 end endif ;; ⑤ファイル送信 scpsend SOURFILE DESTFILE mpause 1000 sendln 'exit' ;; ⑥マクロ終了 end
マクロ内容の解説
⑤ファイル送信
SCP機能を利用してファイルの送信を行っています。
TTLコマンド「scpsend」の書式(△はスペース)
scpsend△ローカルPCファイルフルパス名△リモートファイルフルパス名
ファイル送信中にエラーが出るようであれば「mpause 1000(1000ミリ秒)」の値を少し増やしてみてください。ファイルの送信中にマクロが終了しエラーを起こしている場合があります。
他の部分の解説については、ここでは割愛させていただきます。過去に「SSH自動接続マクロ」の中で詳しく解説していますので、そちらをご参照ください。
おわりに
まあ簡単なファイルを配布するのにはもってこいのテラタームマクロですね。便利機能ですので、是非ご利用ください。
マクロでファイル送信したいのですが、ファイルサイズは場合によって変わります。
⑤では時間指定で待機していますが、それではファイルによって時間を設定しなくてはなりません。
ファイル送信の完了を確認する方法はないのでしょうか。
Yさん。こんばんは。
Tera Termマクロの「scpsend」を使った場合、残念ながらファイル送信の完了を確認する方法はありません。
もしファイル転送が終わって何か処理をしようと思っているのであれば、FTPを使用すれば可能ですね。
ただのファイル転送であればマクロを終了させずに、開きっぱなしだと「mpause」は必要ありません。
ファイル転送後に何をやるかによって使い分ける必要がありますね。
大伯力さん
回答ありがとうございます。スクリプトを転送後に実行したいのですが、scpsendを使用した場合には確実に実行できる保証がないことになってしまいますね。FTPを使えればよいのですが、ssh以外は使えないサーバもあるため八方ふさがりです・・・。
Yさん。こんばんは。
苦肉の策ですが、一応以下のマクロでSCPの終了が確認できると思います。
(当方の環境ではうまく動作しました)
「scpsend」実行中はプロセスに「scp -t」が存在します。
そのプロセス数をチェックして、1だったら実行中。0だったらコピー終了と判断できます。(確実ではありませんが)
ループ処理でまわして、プロセスが存在する間はmpauseを繰り返します。
プロセスがなくなるとループを抜け、次のコマンドが実行されます。
下記例では「messagebox」を実行しています。
苦肉の策ですが、とりあえずご参考まで。
============================================
scpsend SOURFILE DESTFILE
do
mpause 5000
sendln ‘ps -ef |grep -v grep |grep -c scp’
waitln ‘0’ ‘1’
loop while result = 2
messagebox ‘test’ ‘test’
============================================
なるほど。これでうまく行きそうです。ありがとうございます!