scp命令的那些坑儿

文章来源于 : 淘宝运维 文强

前两天发现scp命令的一个坑,分享 下,以免其他兄弟再踩这坑了~

前两天有个开发兄弟向我反馈他的任务跑失败了,原因是里面 的一条scp执行失败。后来我试 了试,发现xxxxx机 器下的数据不能通过tssfsdf帐户scp至其他机器,或从其 他机器scp过来,只输出’bashrc’然后就结 束了(顺便吐下槽,感谢XX同学在tscadmin下的~/.bashrc加的是echo ’bashrc’, 让俺能够快速定位问题)。

为什么bashrc里加一条echo语句,就会造成scp失败呢?

scp使用SSH连接,在两台服务器 之间通过一些特特殊的协议消息控制源端与宿端的数据传输。在实际数据传输前,源端需要先向宿端传输协议文本,协议文本传输结束 后,再向宿端传递字符'\0'来表示真正文件传 输的开始。当文件接收完成后,宿端会给源端发送一个'\0'表示文件传输结 束。然后而ssh login远程服 务器时,会source ~/.bashrc和/etc/bashrc文 件,所以当在 ~/.bashrc或/etc/bashrc执 行过程中产生了任何内容输出时,scp会把这些echo回来的东西认作协 议包进行解析,遇到'\0'则会当成表示传输 失败的错误信息,然后exit 1。

所以,一般对于有标准输出的语句最好是放到.bash_profile中。 以免引起不必要的错误。

  继续阅读“scp命令的那些坑儿”