我的问题是我需要设置一些变量,并在每次登录 ssh shell 时输出几行,同时我必须能够使用 sftp 通过 Filezilla 来传输文件。
现在,根据http://www.openssh.org/faq.html上的 openssh 常见问题解答,如果您的启动脚本回显任何类型的输出,它就会与 sftp 混淆。因此,它要么无限期地延迟,要么因“退出代码为 128 的服务器关闭连接”而出错。
我尝试过将 .bashrc 移动到 .bash_profile 或在 .bashrc 中使用以下代码等解决方案:
if [ "$TERM" != "dumb" ]
then
source .bashc_real
fi
和:
if [ "$TERM" = "xterm" ]
then
source .bashc_real
fi
但是,没有任何效果。我的 shell 终端是 bash,我用 filezilla 连接到 sftp。
尝试这样做
迈克的回答可能会奏效。但值得指出的是,您可以仔细选择要将冗长的内容放入哪些启动文件来完成此操作。来自 bash 手册页:
sftp/scp 工具启动一个交互式非登录 shell,因此 .bashrc 将被获取。许多发行版从 .bash_profile 获取 .bashrc,反之亦然,因此它可能会让人感到困惑。测试登录环境清洁度的一个好技巧是使用命令 ssh 登录,该命令模拟与 scp/sftp 连接相同的方式。例如:
ssh myhost /bin/true
将向您准确显示 scp/sftp 在连接时看到的内容。一个简单的演示:
第一个测试将导致 scp/sftp/rsync 等中断。第二个版本会工作得很好。
如果您使用的是 csh:
如果是 bash:
或者使用 bash 正则表达式:
这些行应该在您输出/回显某些内容的行之前。
迈克的解决方案也对我有用。但由于我的默认 shell 是 TCSH,我不得不按如下方式稍微编辑修复程序(在 .tcshrc 中):
只是想我会分享给大家的利益。
这是我的(默认)
.bashrc
文件的第一行:检查交互式会话避免搞乱 SCP、SFTP 或
ssh remote-host command
模式。如果没有这个,如果您的文件
.bashrc
使用echo
或在 stdout 上打印其他一些东西,您可能会遇到这种错误:Received message too long 168435779
protocol error: unexpected <newline>
我更喜欢这里提到的其他一些解决方案,但我想我放弃了我目前在我的 bash 和 csh 虚拟机上使用的解决方案,以防止由于我的启动脚本中的 echo 命令导致 SFTP 断开连接,以防万一有人发现这些信息有帮助.
在巴什:
在 csh 中:
这有点蛮力,但确实有效。