This request has already been treated.

  1. panakuma
Changes in body
Source | HTML | Preview
@@ -1,160 +1,160 @@
# SCPプロトコルは非推奨
> なお開発チームはscpプロトコルは時代遅れで柔軟性がなく、修正が容易ではないとし、sftpやrsyncなどを使ってファイル転送することを奨励している。
[「OpenSSH 8.0/8.0p」リリース、scpプロトコルに関連した脆弱性を修正 | OSDN Magazine](https://mag.osdn.jp/19/04/22/164000)
# SCPを使わないファイル転送
## 1. SFTP
SFTPは対話型でファイル転送を行える。バッチファイルを書くことで非対話でのファイル転送も行える。
### .ssh/configを使わないで接続
`-C` で圧縮して転送を行える。
```shell
$ sftp -C -P 10022 -i ~/.ssh/id_ecdsa john@example.com
```
### .ssh/configを使った接続
```shell
$ sftp -C example
```
あらかじめ`.ssh/config`へ設定を書いておく。
```shell:.ssh/config
Host example
HostName example.com
Port 10022
User john
IdentityFile ~/.ssh/id_ecdsa
```
### ファイル操作
コマンドの接頭辞に `l` をつけるとローカルの操作コマンドになる。
```shell:ローカルディレクトリの操作
# ファイルの一覧
lls
# 現在のディレクトリ
lpwd
# ディレクトリの移動
lcd sample
# ディレクトリ作成
lmkdir foodir
# ファイルの転送(アップロード)
put sample.txt
# ディレクトリの転送(アップロード)
put -r sample/
```
```shell:リモートディレクトリの操作
# ファイルの一覧
ls
# 現在のディレクトリ
pwd
# ディレクトリの移動
cd sample
# ディレクトリ作成
mkdir foodir
# ファイルの取得(ダウンロード)
get sample.txt
# ディレクトリの取得(ダウンロード)
get -r sample/
```
### バッチを使ったSFTPによる非対話型のファイル操作
以下の記事を参照
[バッチファイルを書いてSFTPサーバへのファイル配置を自動化する - Qiita](https://qiita.com/sasaplus1/items/619283711399c55306b6)
## Rsync + SSH
Rsyncのオプションについてユーザ
- `-a`: foo
- `-hv`: 人間に読みやすいように詳細を出力
- `-z`: 圧縮して転送
### .ssh/configを使った接続
サーバのホームディレクトリ内にある `sample-dir/` を手元マシンのカレントディレクトリへコピーする。
```shell:ディレクトリのダウンロード
rsync -ahvz -e 'ssh' example:~/sample-dir/ .
```
手元マシンのカレントディレクトリにある `sample-dir/` をサーバーのホームディレクトリへコピーする。
```shell:ディレクトリのアップロード
rsync -ahvz -e 'ssh' ./sample-dir/ example:~/
```
### .ssh/configを使わないで接続
サーバのホームディレクトリ内にある `sample-dir/` を手元マシンのカレントディレクトリへコピーする。
```shell:ディレクトリのダウンロード
rsync -ahvz -e 'ssh -p 10022 -i ~/.ssh/id_ecdsa ' john@example.com:~/sample-dir/ .
```
手元マシンのカレントディレクトリにある `sample-dir/` をサーバーのホームディレクトリへコピーする。
```shell:ディレクトリのアップロード
$ rsync -ahvz -e 'ssh -p 10022 -i ~/.ssh/id_ecdsa ' ./sample-dir/ john@example.com:~/
```
## SSH + tarball
tarのオプションにハイフンをつけないとおじさん扱いされる。
[お前のtarオプション指定は古い - Qiita](https://qiita.com/junjis0203/items/6bb48184b508045e69da)
```Shell:アップロード
$ tar -czvf - ./aa | ssh example tar -xzvf -
```
```Shell:ダウンロード
$ ssh example "tar -czvf - ./sysFiles/" | tar -xzvf -
```
## 転送速度の比較
### randomなデータの1GB x 5ファイルの転送
ddで`/dev/urandom`から生成しようとしたところ、小さいサイズのファイルしか生成されなかったのでopensslで生成した。
```shell:サンプルファイルを生成
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:~/` | `time sftp -C -b bat example` |
+| 実行コマンド | `time sh -c 'tar -czvf - ./temp*` | `ssh example tar -xzvf -'` | `time rsync -ahvz -e 'ssh' ./temp* example:~/` | `time sftp -C -b bat example` |
## 参考URL
- [sftpでディレクトリごと転送する - pockestrap](https://pocke.hatenablog.com/entry/2013/01/26/150100)
- [Linuxコマンド【 sftp 】安全なファイル転送 - Linux入門 - Webkaru](https://webkaru.net/linux/sftp-command/)
- [巨大ファイルを作成する | monolithic kernel](https://blog.mono0x.net/2013/02/16/large-files/)