TT Lab
はじめる
学ぶ 学習パス コース

SSHとファイル転送

scpとsftpでファイルを移す

TT Labで続きを見る

目標

scpとsftpでファイルをアップロード・ダウンロードし、タイムスタンプを保持し、チェックサムで完全性を確認します。

なぜ重要なのか

転送が「終わった」ことと「正しく届いた」ことは、別の話です。実務では、常にチェックサムで確認します。そして、scpのポートのオプションが大文字の-Pであることは些細に見えますが、sshは小文字がポートなので、実際によく間違えます。小文字の-pはタイムスタンプの保持なので、静かに別のことをして通り過ぎます。sftpのバッチモードは、パートナー企業とのファイル交換の自動化で、今でも標準的に使われています。

このラボでは、127.0.0.1:2222は別のサーバーだと考えてください。前のラボで作成した/root/.ssh/id_labhubの鍵を、そのまま使います。

ステップ

  1. /root/xfer/srcディレクトリを作成し、その中にa.txt(1KB以上)、b.txt(1KB以上)、c.bin(10KB以上)の3つのファイルを作成してください。
  2. リモートに/root/xfer/dst/ディレクトリを作成し、a.txtをそこへアップロードしてください。
  3. /root/xfer/srcディレクトリ全体を、リモートの/root/xfer/tree/の下に再帰コピーしてください。結果として、/root/xfer/tree/src/b.txtが存在する必要があります。
  4. リモートの/root/xfer/dst/a.txtを、ローカルの/root/xfer/back/へダウンロードしてください。
  5. /root/xfer/batch.txtにsftpのバッチコマンドを書いて、実行してください。バッチは、/root/xfer/src/c.binをリモートの/root/xfer/dst/へアップロードする必要があります。実行ログを/root/xfer/sftp.logに保存してください。
  6. b.txtをタイムスタンプを保持したままリモートの/root/xfer/dst/へコピーし、元とコピーのmtime(秒単位)を、1行ずつ/root/xfer/mtime.txtに書いてください。2つの値が同じである必要があります。
  7. /root/xfer/srcの3つのファイルについてsha256のマニフェストを作成し、/root/xfer/dstと/root/xfer/tree/srcに届いたファイルのハッシュが一致するかを検証して、結果を/root/xfer/verify.txtに保存してください。
  8. /root/xfer/notes.txtを次の3行で作成してください。 SCP_PORT_FLAG=-P / SSH_PORT_FLAG=-p / SCP_PRESERVE_FLAG=-p

参考

転送するファイルの準備

/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で、ポートオプションの大文字・小文字が違う点が核心です。値は、正確な文字で書いてください。