scpとsftpでファイルを移す
目標
scpとsftpでファイルをアップロード・ダウンロードし、タイムスタンプを保持し、チェックサムで完全性を確認します。
なぜ重要なのか
転送が「終わった」ことと「正しく届いた」ことは、別の話です。実務では、常にチェックサムで確認します。そして、scpのポートのオプションが大文字の-Pであることは些細に見えますが、sshは小文字がポートなので、実際によく間違えます。小文字の-pはタイムスタンプの保持なので、静かに別のことをして通り過ぎます。sftpのバッチモードは、パートナー企業とのファイル交換の自動化で、今でも標準的に使われています。
このラボでは、127.0.0.1:2222は別のサーバーだと考えてください。前のラボで作成した/root/.ssh/id_labhubの鍵を、そのまま使います。
ステップ
/root/xfer/srcディレクトリを作成し、その中にa.txt(1KB以上)、b.txt(1KB以上)、c.bin(10KB以上)の3つのファイルを作成してください。- リモートに
/root/xfer/dst/ディレクトリを作成し、a.txtをそこへアップロードしてください。 /root/xfer/srcディレクトリ全体を、リモートの/root/xfer/tree/の下に再帰コピーしてください。結果として、/root/xfer/tree/src/b.txtが存在する必要があります。- リモートの
/root/xfer/dst/a.txtを、ローカルの/root/xfer/back/へダウンロードしてください。 /root/xfer/batch.txtにsftpのバッチコマンドを書いて、実行してください。バッチは、/root/xfer/src/c.binをリモートの/root/xfer/dst/へアップロードする必要があります。実行ログを/root/xfer/sftp.logに保存してください。b.txtをタイムスタンプを保持したままリモートの/root/xfer/dst/へコピーし、元とコピーのmtime(秒単位)を、1行ずつ/root/xfer/mtime.txtに書いてください。2つの値が同じである必要があります。/root/xfer/srcの3つのファイルについてsha256のマニフェストを作成し、/root/xfer/dstと/root/xfer/tree/srcに届いたファイルのハッシュが一致するかを検証して、結果を/root/xfer/verify.txtに保存してください。/root/xfer/notes.txtを次の3行で作成してください。SCP_PORT_FLAG=-P/SSH_PORT_FLAG=-p/SCP_PRESERVE_FLAG=-p
参考
scp -P 2222 -i /root/.ssh/id_labhub <원본> root@127.0.0.1:<대상>の形です(プレースホルダーは元のパスと宛先です)。- リモートでディレクトリを作成するには、
ssh lab2 mkdir -p /root/xfer/dstのように、コマンドをリモート実行すればよいです。 - sftpのバッチファイルの例は、
cd /root/xfer/dstの次の行にput /root/xfer/src/c.binです。 - よくある間違い1: ステップ2で小文字の
-pを使い、ポートが22へ向かう場合です。接続自体が失敗します。 - よくある間違い2: ステップ3で、宛先パスの末尾のスラッシュの有無によって、ディレクトリの深さが変わります。求められている最終的なパスを確認してください。
転送するファイルの準備
/root/xfer/srcディレクトリを作成し、その中にa.txt(1KB以上)、b.txt(1KB以上)、c.bin(10KB以上)の3つのファイルを作成してください。
サイズの違うファイルが3つあれば十分です。headやddで作ってもよく、base64で埋めてもかまいません。
ファイルのアップロード
リモートに/root/xfer/dst/ディレクトリを作成し、a.txtをそこへアップロードしてください。
ポートの指定は、大文字のオプションです。小文字は意味がまったく違うので、注意してください。
ディレクトリを丸ごとアップロード
/root/xfer/srcディレクトリ全体を、リモートの/root/xfer/tree/の下に再帰コピーしてください。結果として、/root/xfer/tree/src/b.txtが存在する必要があります。
ディレクトリを送るには、再帰オプションが必要です。宛先のパスがなければ、事前に作成しておいてください。
ダウンロード
リモートの/root/xfer/dst/a.txtを、ローカルの/root/xfer/back/へダウンロードしてください。
リモートのパスを前に、ローカルのパスを後ろに書きます。リモートの表記は、ユーザー@ホスト:パスの形式です。
sftpバッチの実行
/root/xfer/batch.txtにsftpのバッチコマンドを書いて、実行してください。バッチは、/root/xfer/src/c.binをリモートの/root/xfer/dst/へアップロードする必要があります。実行ログを/root/xfer/sftp.logに保存してください。
sftpには、コマンド一覧をファイルから読み込むオプションがあります。バッチファイルには、1行に1つのコマンドを書きます。
タイムスタンプの保持
b.txtをタイムスタンプを保持したままリモートの/root/xfer/dst/へコピーし、元とコピーのmtime(秒単位)を、1行ずつ/root/xfer/mtime.txtに書いてください。2つの値が同じである必要があります。
保持のオプションは小文字です。statでmtimeを比較して、確認してください。
完全性の検証
/root/xfer/srcの3つのファイルについてsha256のマニフェストを作成し、/root/xfer/dstと/root/xfer/tree/srcに届いたファイルのハッシュが一致するかを検証して、結果を/root/xfer/verify.txtに保存してください。
sha256sumでマニフェストを作成し、-cで検査します。元とコピーが同じ名前を持つようにパスを合わせると、楽です。
オプションの整理ノート
/root/xfer/notes.txtを次の3行で作成してください。
SCP_PORT_FLAG=-P / SSH_PORT_FLAG=-p / SCP_PRESERVE_FLAG=-p
scpとsshで、ポートオプションの大文字・小文字が違う点が核心です。値は、正確な文字で書いてください。