SCPプロトコルは非推奨
なお開発チームはscpプロトコルは時代遅れで柔軟性がなく、修正が容易ではないとし、sftpやrsyncなどを使ってファイル転送することを奨励している。
「OpenSSH 8.0/8.0p」リリース、scpプロトコルに関連した脆弱性を修正 | OSDN Magazine
SCPを使わないファイル転送
[1] SFTP
SFTPは対話型でファイル転送を行える。バッチファイルを書くことで非対話でのファイル転送も行える。
.ssh/configを使わないで接続
-C
で圧縮して転送を行える。
$ sftp -C -P 10022 -i ~/.ssh/id_ecdsa john@example.com
.ssh/configを使った接続
$ sftp -C example
あらかじめ.ssh/config
へ設定を書いておく。
Host example
HostName example.com
Port 10022
User john
IdentityFile ~/.ssh/id_ecdsa
ファイル操作
コマンドの接頭辞に l
をつけるとローカルの操作コマンドになる。
# ファイルの一覧
lls
# 現在のディレクトリ
lpwd
# ディレクトリの移動
lcd sample
# ディレクトリ作成
lmkdir foodir
# ファイルの転送(アップロード)
put sample.txt
# ディレクトリの転送(アップロード)
put -r sample/
# ファイルの一覧
ls
# 現在のディレクトリ
pwd
# ディレクトリの移動
cd sample
# ディレクトリ作成
mkdir foodir
# ファイルの取得(ダウンロード)
get sample.txt
# ディレクトリの取得(ダウンロード)
get -r sample/
バッチを使ったSFTPによる非対話型のファイル操作
以下の記事を参照
バッチファイルを書いてSFTPサーバへのファイル配置を自動化する - Qiita
[2] Rsync + SSH
Rsyncのオプションについてユーザ
-
-a
: コピー元と同一条件でコピー -
-hv
: 人間に読みやすいように詳細を出力 -
-z
: 圧縮して転送
.ssh/configを使った接続
サーバのホームディレクトリ内にある sample-dir/
を手元マシンのカレントディレクトリへコピーする。
rsync -ahvz example:~/sample-dir/ .
手元マシンのカレントディレクトリにある sample-dir/
をサーバーのホームディレクトリへコピーする。
rsync -ahvz ./sample-dir/ example:~/
.ssh/configを使わないで接続
サーバのホームディレクトリ内にある sample-dir/
を手元マシンのカレントディレクトリへコピーする。
rsync -ahvz -e 'ssh -p 10022 -i ~/.ssh/id_ecdsa ' john@example.com:~/sample-dir/ .
手元マシンのカレントディレクトリにある sample-dir/
をサーバーのホームディレクトリへコピーする。
$ rsync -ahvz -e 'ssh -p 10022 -i ~/.ssh/id_ecdsa ' ./sample-dir/ john@example.com:~/
[3] SSH + tarball
tarのオプションにハイフンをつけないとおじさん扱いされる。
$ tar -czvf - ./aa | ssh example tar -xzvf -
$ ssh example "tar -czvf - ./sysFiles/" | tar -xzvf -
転送速度の比較
randomなデータの1GB x 5ファイルの転送
ddで/dev/urandom
から生成しようとしたところ、小さいサイズのファイルしか生成されなかったのでopensslで生成した。
for i in {1..5}
do
time openssl rand 1073741824 > temp${i}.bin &
done
結果
Rsyncが若干早いように見えるが、誤差ともとれるので判断しにくい。ファイルサイズとファイル数を増やして実験したい。
回数 | SSH+tarball | Rsync+SSH | SFTP |
---|---|---|---|
1 | real 2m38.834s | real 2m33.605s | real 2m40.634s |
2 | real 2m41.456s | real 2m30.869s | real 2m38.730s |
3 | real 2m42.166s | real 2m34.490s | real 2m40.162s |
実行コマンド | time sh -c 'tar -czvf - ./temp* |
ssh example tar -xzvf -' |
time rsync -ahvz -e 'ssh' ./temp* example:~/ |