まえがき
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 <接続名> <ユーザー名>@<ホストネーム>
ファイル・ディレクトリの送信
接続中は、cd
、ls
、mkdir
などのコマンドが使えます。ローカルに対して実行したい場合は先頭に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のほうを使っていこうと思います。