リモートからリモートへscpする際に、デバッグ情報をファイルに保存する


このエントリーをはてなブックマークに追加

TL;DR

  • リモート間でファイルのやりとりを行いたい
  • Macのターミナルからコマンドを送ることでリモート的に上記を実行したい
  • Macからのシェルスクリプトでも起動したい
  • リモートでscpを実行させると、scpの進行状況が表示されない
    • 最終的な転送速度をログとしてMacにテキストファイルなどで残しておきたい


をひとまずRaspberryPiを用いて実現した

構成は下記のような形で



やり方としてはシェルスクリプトに記載すると下記のようにした

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh
# MacからRaspberryPiにssh経由でリモート的にscpコマンドを実行, 秘密鍵公開鍵方式でパスワード無しでいけるようにした
ssh -i ~/.ssh/raspi_rsa pi@192.168.21.201 'scp -v -i /home/pi/.ssh/raspberry_rsa /home/pi/sample.txt pi@192.168.21.202:/home/pi/test/sample.txt' > ./output.txt 2>&1 &
while :
do
output=`ssh -i ~/.ssh/raspi_rsa pi@192.168.21.201 ps aux | grep scp`
if [ -n "$output" ]
then
echo "sending..."
else
echo "finish!"
break
fi
sleep 1
done


上記を実行すると、scpのデバッグログがMacのカレントディレクトリ下に output.txt として保存される


デバイス

下記を用いた

  • MacBook Pro
    • macOS High Siera
  • RaspberryPi2 Model B
    • OSはRaspbian 2018-04-18 Scratch
    • 2台用いた、それぞれIPアドレスを固定したので、下記のように名付ける
      • RaspiA: 192.168.21.201
      • RaspiB: 192.168.21.202
      • 便宜的に2台をA, Bと置いただけなので、RaspberryPiボードのバージョンとは関係ないです, 今回使用したのはあくまでRaspberryPi2 ModelBを2台

以下は導入の経緯と調べた流れ


RaspberryPiから別のRaspberryPiへファイルを転送したい

  • これ自体は
  • 上記までやれば、例えば秘密鍵の名前をraspberry_rsaとして192.168.21.202のほうのRaspberryPiにファイルを送る時、下記コマンドで指定したファイルを転送することができる
    • raspberry$ scp -i /home/pi/.ssh/raspberry_rsa sample.txt pi@192.168.21.202:/home/pi/sample.txt


次に、Macのコマンドから送れるようにした


これで目的としての、リモート操作でのRaspiAからRaspiBへのファイル転送は成功した

が、リモート操作なので転送速度などが表示されず、転送速度をログとして保存したかったので以下scpの -v オプションで解決することにした


scp -v


以上をやってみると下記のようになる

ssh -i ~/.ssh/raspi_rsa pi@192.168.21.201 'scp -v -i /home/pi/.ssh/raspberry_rsa /home/pi/sample.txt pi@192.168.21.202:/home/pi/test/sample.txt' >> output.txt 2>&1

たとえば、ファイル転送速度だとoutput.txtの最後のほうにBytes per second: sent 8577645.7, received 1456.1 みたいに出力されているはずなのでこれを参考にすればよい

これでできた

小さいテキストファイルとかだと一瞬で終わってしまうので、動画ファイルなどある程度大きいものを転送してみたほうがいいかも


これでログファイルが出力されることもわかったが、もう少し踏み込んで

  • シェルスクリプトでバックグラウンド的にファイル送信を実行させたい
  • その際、ファイルが大きいと、コピーがいつ終わるか画面に出ないとわからない
  • が、プログレスバーを出す方法がうまいのがみつからなかった
  • 進捗状況は、ps aux | grep scp コマンドを利用して、scpコマンドが実行されなくなったところを感知してファイル転送の終了と見なすようにした
    • 正確には何%進んだか、というのはわからないがまぁひとまずこれで送信中なのか終わったのかは判断できそう

というのを満たすためのシェルスクリプトが下記

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh
# MacからRaspberryPiにssh経由でリモート的にscpコマンドを実行, 秘密鍵公開鍵方式でパスワード無しでいけるようにした
ssh -i ~/.ssh/raspi_rsa pi@192.168.21.201 'scp -v -i /home/pi/.ssh/raspberry_rsa /home/pi/sample.txt pi@192.168.21.203:/home/pi/test/sample.txt' > ./output.txt 2>&1 &
while :
do
output=`ssh -i ~/.ssh/raspi_rsa pi@192.168.21.201 ps aux | grep scp`
if [ -n "$output" ]
then
echo "sending..."
else
echo "finish!"
break
fi
sleep 1
done


  • 1秒ごとにpsコマンドでプロセスを確認して、プロセスが実行されている間は sending... と画面に表示
  • プロセスが終了したところを、送信終了とみなして finish! と表示させるようにした


これで目的の

  • リモートからリモートへのファイル転送
  • ファイル転送した際の進捗の確認および転送速度のログを保存

が出来た

リモートからリモートが1個だけだったら手打ちしてもよいが

複数のリモート同士がネットワークを貼る場合はなんとか自動化なりシェルスクリプト化などしたかったので今回のが生きてくると思われる

あとはプログレス的に何%転送が進んだのかなども確認できると良いかもしれないのだがひとまずここまで


このエントリーをはてなブックマークに追加