21
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

scpの代わりにrsyncでファイル転送を行う方法

はじめに

なんでも昨年2019年4月17日のOpenSSHの公式リリースで、scpは非推奨とのアナウンスがあったそうで。先日誰かのtwitterを見て知りました。遅せぇよ俺。
OpenSSHの公式リリースを見ると、OpenSSH 8.0/8.0p1 (2019-04-17)のリリースノートに記載がありました。
https://www.openssh.com/releasenotes.html
https://www.openssh.com/txt/release-8.0

The scp protocol is outdated, inflexible and not readily fixed. We
recommend the use of more modern protocols like sftp and rsync for
file transfer instead.

確かに。ファイル転送にはsftpやrsyncを代わりに推奨って書いてありますね。

Linuxでサーバを建てた時、パスワード無しログインに必要なauthorized_keysとか、自分のbash_profileをサーバへ送り込むのにscpを使っていましたが、これからはお作法としてはあまりよろしくない、ってことですね(そんな大事なファイルをscpとかネットワーク経由で送るってこともあまりよろしくないですが…)。
急にscpが使えなくなる、ってことはないでしょうけど、お行儀の良い手順として、rsyncでファイルを転送する手順を記録しておきます。

環境

クライアント側はmacOS 10.13.6
サーバ側はUbuntu 20.04(VirtualBox)
サーバ側(送信先)でsshdが動作していることとします。
たまにmacとLinuxだとBSDとGNUのコマンドの違いでオプションが違っていることがありますが(dateコマンドで泣いた)、今回は両方とも当然BSDのscp(というかssh)なので、OSによる違いは無いと思います。

今までのscpによるファイル転送

scp [転送するファイル] ログイン名@サーバアドレス:[サーバ側のコピー先絶対パス]

scpの実行例

$ scp ./memo.txt hogehoge@192.168.0.12:/home/hogehoge/memo.txt
hogehoge@192.168.0.12's password: ※パスワード入力
memo.txt               100%   32    18.3KB/s   00:00 

rsyncでファイルを転送する場合

$rsync -av ログイン名@サーバアドレス:[サーバ側のコピー先絶対パス]

ほとんど同じですね。ポイントはオプションに「-e "ssh"」を追加すること。
(ご指摘があり、rsync ver2.6.0以降では必要無いので修正します)
もし、サーバ側のsshのポート番号を変更している場合は「-e "ssh -p 2222"」という感じで、-eオプションでsshを指定、-pオプションでポート番号を指定してください。
rsyncのmanを見ると「-e, --rsh=COMMAND specify the remote shell to use」とあります。

一応、rsyncのオプションに指定した-avの説明

オプション 説明
-a: -rlptgoDと同じ(いろいろあるんですよねぇ。以下で説明)
-r: 指定ディレクトリ配下をすべて対象とする
-l: シンボリックリンクは、そのままシンボリックリンクとしてコピー
-p: パーミッションをそのままコピー
-t: タイムスタンプをそのままコピー
-g: グループをそのままコピー
-o: ファイル所有者をそのままコピー
-D: デバイスファイルや特殊ファイルを保持(--devices --specialと同じ)
-v: verboseモード。動作状況を表示。

rsyncの実行例

$ rsync -av ./memo.txt hogehoge@192.168.0.12:/home/hogehoge/memo.txt
hogehoge@192.168.0.12's password: ※パスワード入力
building file list ... done
memo.txt

sent 160 bytes  received 42 bytes  134.67 bytes/sec
total size is 32  speedup is 0.16

今回はファイル1個だけですが、本来の(?)rsyncの使い方である、同期をとるような場合は、ディレクトリのお尻にケツスラッシュが有ると無いとでは動作が大違いなので、こちらのサイトを参照して気をつけましょう。
(適当にディレクトリを指定すると、中身を転送先にブチまけて悲しい思いをします)

scpとrsyncでパスのケツスラッシュのありなしの挙動を毎回迷うのでメモ
http://oretachino.hatenablog.com/entry/2014/12/11/003815

追記
2020/06/07修正
ご指摘があり、rsyncの2.6.0以降ではsshがデフォルトのリモートシェルとなったので、「-e ssh」オプションは必要ないとのご指摘があり、実際に-eオプションは必要無いので修正しました。

rsyncのリリースノートにも記載がありました。
https://rsync.samba.org

The default remote shell is now "ssh" unless you tell configure you want to make
something else the default.

2004年1月1日なので結構昔ですね。

2020/07/01修正
修正漏れがあったので直すついでにもう一度上記コマンドを別の環境で試したところ、動かない…

rsync -av ./memo.txt hogehoge@192.168.0.51:/home/hogehoge/memo.txt
hogehoge@192.168.0.51: 
bash: rsync: コマンドが見つかりません
rsync: connection unexpectedly closed (0 bytes received so far) [sender]

「コマンドが見つかりません」ってrsync実行しているでしょ?
と思ったら、接続先にrsyncがインストールされてなかったというオチでした。
パスワードを入力した後ですからね、それりゃ手元の環境ではなく接続先ですよ。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
21
Help us understand the problem. What are the problem?