DRYな備忘録

Don't Repeat Yourself.

scpできなくて私もハマった

問題

scpがエラー無く終わるが、何も転送されていない

% scp otiai10@foobar.com:~/test.txt ~/
Enter passphrase for key '/User/otiai10/.ssh/foobar': 
foobar
%
% ls -la | grep test.txt
% # ← あれーん?

tl;dr, 解決

  • リモート側の.bashrcでログイン時にログインしたホスト名を出力するようにしていたのが原因だったっぽい?(ナンデ?)
# リモートの~/.bashrc

### 以下をコメントアウトしたら動いた
hostname

参考

ログ

問題の発覚

% scp otiai10@foobar.com:~/test.txt ~/
Enter passphrase for key '/User/otiai10/.ssh/foobar': 
foobar
%
% ls -la | grep test.txt
%

なんもない? scpコマンドにはverbose logを出す-vオプションがあるので調査

% scp otiai10@foobar.com:~/test.txt ~/
#
# 略
#
debug1: Entering interactive session.
debug1: pledge: network
debug1: Sending command: scp -v -f ~/test.txt
Sink: foobar
foobar
Sending file modes: C0640 37 test.txt
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK
Transferred: sent 3264, received 2992 bytes, in 0.1 seconds
Bytes per second: sent 22591.7, received 20709.0
debug1: Exit status 1
% 

確かにExit status 1してるし、sentに対してrecievedが少ないが、なんとも情報が少ない。ググってギリギリそれっぽいのがこれだった。

sshも繋がるしWinSCPも出来たのでなかなか原因にたどり着くことができませんでした。同じような状況のときは.~rcを調べてみるといいかもしれません…。

f:id:otiai10:20170512131857j:plain

それな。~/.bashrcを確認しても、だいたい環境変数のexportとかしてるだけでそれっぽいものが無いけど、以下のブロックを見つけた

# {{{ PROMPT
if [[ `hostname` =~ foobar ]]; then
    hostname
else
    export PS1="\e[1;34m\]$\e[m\] "
fi
# }}}

foobarサーバだったらfoobarを出力し、それ以外だったらプロンプト(コマンド受け付けるところの左のやつ)をシンプルに $ (色付き)だけにするというやつ。「まさかぁ〜」と思いつつコメントアウトしたら動いた。問題を切り分けて、どうやら hostname を実行している箇所 だけ が問題だったということが判明して事なきを得たが、結局原因はわかっていないです。教えてエロいひと。

DRY