web-dev-qa-db-ja.com

「ssh -t」で転送されたこのバイナリファイルが変更されるのはなぜですか?

SSH経由でファイルをコピー をしようとしていますが、必要な正確なファイル名がわからないため、scpを使用できません。小さなバイナリファイルとテキストファイルは問題なく転送されますが、大きなバイナリファイルは変更されます。サーバー上のファイルは次のとおりです。

remote$ ls -la
-rw-rw-r--  1 user user 244970907 Aug 24 11:11 foo.gz
remote$ md5sum foo.gz 
9b5a44dad9d129bab52cbc6d806e7fda foo.gz

移動した後のファイルは次のとおりです。

local$ time ssh [email protected] -t 'cat /path/to/foo.gz' > latest.gz

real    1m52.098s
user    0m2.608s
sys     0m4.370s
local$ md5sum latest.gz
76fae9d6a4711bad1560092b539d034b  latest.gz

local$ ls -la
-rw-rw-r--  1 dotancohen dotancohen 245849912 Aug 24 18:26 latest.gz

ダウンロードしたファイルはサーバー上のファイルよりも大きいことに注意してください!ただし、非常に小さいファイルで同じことを行うと、すべてが期待どおりに機能します。

remote$ echo "Hello" | gzip -c > hello.txt.gz
remote$ md5sum hello.txt.gz
08bf5080733d46a47d339520176b9211  hello.txt.gz

local$ time ssh [email protected] -t 'cat /path/to/hello.txt.gz' > hi.txt.gz

実際0m3.041sユーザー0m0.013s sys 0m0.005s

local$ md5sum hi.txt.gz
08bf5080733d46a47d339520176b9211  hi.txt.gz

この場合、両方のファイルサイズは26バイトです。

小さいファイルは問題なく転送されるのに、大きいファイルには数バイトが追加されるのはなぜですか?

31
dotancohen

その方法を使用してファイルをコピーすると、ファイルが異なるように見えます。

リモートサーバー

ls -l | grep vim_cfg
-rw-rw-r--.  1 slm slm 9783257 Aug  5 16:51 vim_cfg.tgz

ローカルサーバー

ssh ... catコマンド:

$ ssh dufresne -t 'cat ~/vim_cfg.tgz' > vim_cfg.tgz

ローカルサーバー上のこのファイルの結果:

$ ls -l | grep vim_cfg.tgz 
-rw-rw-r--. 1 saml saml 9820481 Aug 24 12:13 vim_cfg.tgz

なぜ調査?

結果のファイルをローカル側で調査すると、ファイルが破損していることがわかります。 -tsshコマンドから切り替えると、期待どおりに機能します。

$ ssh dufresne 'cat ~/vim_cfg.tgz' > vim_cfg.tgz

$ ls -l | grep vim_cfg.tgz
-rw-rw-r--. 1 saml saml 9783257 Aug 24 12:17 vim_cfg.tgz

チェックサムも機能するようになりました:

# remote server
$ ssh dufresne "md5sum ~/vim_cfg.tgz"
9e70b036836dfdf2871e76b3636a72c6  /home/slm/vim_cfg.tgz

# local server
$ md5sum vim_cfg.tgz 
9e70b036836dfdf2871e76b3636a72c6  vim_cfg.tgz
6
slm