好吧,我已经使用 Linux 很长时间了,但这是我很长时间以来遇到的最奇怪的事情。也许我只是不经常使用 scp,所以可能在这里遗漏了一些简单的东西。所以在我的 .bashrc 文件中,我有以下内容。
export KERNEL=$(uname -r)
#echo "HOST: $HOSTNAME: KERNEL VERSION: $KERNEL"
if [ $KERNEL == "2.6.32-431.3.1.el6.x86_64" ];then
... logic here
else
.. more logic
fi
现在,如果我取消注释该 echo 行,则以下命令不起作用!它只显示 echo,但不执行任何复制。如果我删除该行,它会执行复制
$ scp -r host1.net:/prod/path1/path2/dir1/etc /tmp/user/sim/dir1
HOST: host1.net: KERNEL VERSION: 3.4.70-1.el6.companyX
$ scp -r host1.net:/prod/path1/path2/dir1/etc /tmp/user/sim/dir1
pybackup 100% 174 0.2KB/秒 00:00
Proxy.ini 100% 623 0.6KB/秒 00:00
这很奇怪...
答案1
在 .bashrc 中使用 echo 将破坏 scp,因为 scp 需要通过 stdin/stdout 通道查看其协议数据。请参阅https://bugzilla.redhat.com/show_bug.cgi?id=20527和这个帖子了解有关此问题的更多讨论。
有几种可用的解决方法,如何在 .bashrc 中以 scp 安全的方式使用 echo:
case $- in *i*) echo Hello World ; esac
tty >/dev/null && echo Hello World
if [ -t 1 ]; then echo Hello World ; fi
答案2
以下是我的(默认)文件的第一行.bashrc
:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
检查交互式会话可避免混淆 SCP、SFTP 或ssh remote-host command
模式。
如果没有这个,如果你的文件.bashrc
使用echo
或在标准输出上打印其他东西,你可能会收到这种错误:
- 安全FTP:
Received message too long 168435779
- SCP-007:
protocol error: unexpected <newline>