我的问题是我需要设置一些变量,并且每次登录 ssh shell 时输出几行,同时我必须能够使用 sftp 通过 Filezilla 传输文件。
现在,根据 openssh FAQhttp://www.openssh.org/faq.html,如果您的启动脚本回显任何类型的输出,它都会与 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。
答案1
尝试这样做
if [ "$SSH_TTY" ]
then
source .bashc_real
fi
答案2
Mike 的答案可能有用。但值得指出的是,您可以通过仔细选择将详细信息放入哪些启动文件中来完成此操作。摘自 bash 手册页:
当 bash 作为交互式登录 shell 或使用 --login 选项作为非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。启动 shell 时可以使用 --noprofile 选项来禁止此行为。
当启动非登录 shell 的交互式 shell 时,如果 ~/.bashrc 文件存在,bash 将从该文件中读取并执行命令。可以使用 --norc 选项禁止此操作。--rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 中读取并执行命令。
sftp/scp 工具启动一个交互式非登录 shell,因此将获取 .bashrc。许多发行版从 .bash_profile 获取 .bashrc 或反之亦然,因此可能会造成混淆。测试登录环境清洁度的一个好方法是使用命令 ssh 进入,该命令模拟 scp/sftp 连接的方式。例如:ssh myhost /bin/true
将向您展示 scp/sftp 连接时看到的确切内容。
一个简单的演示:
insyte@mazer:~$ echo "echo Hello from .profile" > .profile
insyte@mazer:~$ echo "echo Hello from .bashrc" > .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$
insyte@mazer:~$ rm .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$
第一个测试会导致 scp/sftp/rsync 等中断。第二个版本将正常工作。
答案3
如果你使用 csh:
if ($?prompt)
... interactive stuff ...
如果是 bash:
if [[ $- == *i* ]]; then
... interactive stuff ...
fi
或者使用 bash 正则表达式:
if [[ $- =~ i ]]; then
... interactive stuff ...
fi
这些行应该位于输出/回显某些内容的行之前。
答案4
以下是我的(默认)文件的第一行.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>