rsyncとsftpコマンドの使い方

まえがき

SCPコマンドは2019年に脆弱性が見つかり現在は非推奨のコマンドとなっています。この脆弱性自体は、修正済みであるようです。
今までscp非推奨であることを知りつつも新しいコマンド調べるのがめんどくさくプライベートではSCP使い続けてました。新卒で入社して、仕事で使うのはいかがなものかということで今回はSCPの代替コマンドであるrsyncとSFTPコマンドでファイルとディレクトリの送受信について調べてみました。

rsync

rsyncとは

リモート環境とファイルやディレクトリを同期するコマンドです。ローカル環境でも使用可能です。
差分のみ更新することやパーミッションやグループなどを保持したまま同期することができます。 SSH経由で使うことでセキュアに転送することが可能です。

ファイル・ディレクトリの送信

sshのポート番号の変更や鍵認証を使っているときは、eオプションを付けます。

ファイルの送信

$ rsync -e 'ssh -p <ポート番号>' /path/to/file <ユーザー名>@<ホストネーム>:~/path
$ rsync -e 'ssh -i ~/.ssh/keyfile' /path/to/file <ユーザー名>@<ホストネーム>:~/path

ディレクトリの送信

rオプションでもできますが、aオプション付けるのが一般的らしいです。aオプションだとディレクトリの同期だけでなく、シンボリックリンク、グループ、タイムスタンプ、所有者、パーミッション、デバイスファイル、特殊ファイルの情報も同期できるみたいです。

/dir1/だとdist_path内に直接ファイルが配置されます。
/dir1だとdist_path内にdir1が配置されます。

$ rsync -e 'ssh -p <ポート番号>' /path <ユーザー名>@<ホストネーム>:~/dist_path

ファイル・ディレクトリの受信

順番逆にすればできます。

ファイルの受信

$ rsync -e 'ssh -p <ポート番号>' <ユーザー名>@<ホストネーム>:~/path/to/file /path

ディレクトリの受信

$ rsync -e 'ssh -p <ポート番号>' <ユーザー名>@<ホストネーム>:~/path/to/dir /dir1/test_file1 /path

便利そうなオプション

オプション 説明
v 詳細表示
P 進捗表示と転送を中断したファイルを保持する
u 同期先のほうが新しい場合はスキップ
n dry run

SFTP

SFTPとは

ftpコマンドのように対話形式でファイル転送をすることができるコマンドです。すべての操作はSSHで暗号化された通信経路を経由して行われます。
ちなみにですが、SSLを利用して暗号化を行うFTPSというものもあります。

サーバとの接続

port番号指定
$ sftp -P <ユーザー名>@<ホストネーム>

認証鍵
$ sftp -i /path/to/keyfile <ユーザー名>@<ホストネーム>

ssh config
$ sftp -F <接続名> <ユーザー名>@<ホストネーム>

ファイル・ディレクトリの送信

接続中は、cdlsmkdirなどのコマンドが使えます。ローカルに対して実行したい場合は先頭にlをつけます。

ファイルの送信

sftp> cd <送信したいpath>
sftp> put local/path/to/file

ディレクトリの送信

sftp> cd <送信したいpath>
sftp> put -r local/path/to/dir

ファイル・ディレクトリの受信

ファイルの受信

sftp> lcd <受信したいpath>
sftp> get /path/to/file

ディレクトリの受信

sftp> lcd <受信したいpath>
sftp> get -r /path/to/dir

感想

sftpは対話式のため若干めんどくささがあるので、今後はrsyncのほうを使っていこうと思います。

参考文献

  1. SCP は SFTP よりも安全か?
  2. 【 rsync 】コマンド(その1)――ファイルやディレクトリを同期する
  3. Rsyncでローカルとリモートのディレクトリを同期する方法
  4. Linuxコマンド【 sftp 】安全なファイル転送