当我的 .bashrc 回显到控制台时,scp 不起作用

当我的 .bashrc 回显到控制台时,scp 不起作用

好吧,我已经使用 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>

相关内容