17
19

More than 1 year has passed since last update.

SSHできるサーバーへのSCPを使わないファイル転送方法とその速度比較

Last updated at Posted at 2019-05-19

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へ設定を書いておく。

.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オプション指定は古い - Qiita

アップロード
$ 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:~/

参考URL

17
19
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
19