我的问题是,我需要设置一些variables,每次login到ssh shell时输出几行,同时我必须能够使用sftp来通过Filezilla转换文件。
现在,按照http://www.openssh.org/faq.html上的openssh FAQ,如果你的启动脚本回显任何types的输出,它会用sftp搞砸。 所以它要么无限期地延迟,要么出现“连接被服务器closures,退出码为128”的错误。
我已经尝试了将.bashrc移动到.bash_profile或在.bashrc中使用以下代码的解决scheme:
if [ "$TERM" != "dumb" ] then source .bashc_real fi
和:
if [ "$TERM" = "xterm" ] then source .bashc_real fi
但是,没有任何工作。 我的shellterminal是bash,我用filezilla连接到sftp。
尝试这样做,而不是
if [ "$SSH_TTY" ] then source .bashc_real fi
迈克的答案可能会奏效。 但值得指出的是,您可以仔细select哪些启动文件来放置冗长的东西。从bash手册页:
当bash作为交互式loginshell或者作为具有–login选项的非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。 读取该文件后,它将按照该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从第一个存在并读取的第一个中读取和执行命令。 当shell开始禁止这种行为时,可以使用–noprofile选项。
当一个不是loginshell的交互式shell被启动时,如果该文件存在,bash将读取并执行〜/ .bashrc中的命令。 这可以通过使用–norc选项来禁止。 –rcfile文件选项将强制bash从文件读取并执行命令,而不是〜/ .bashrc。
sftp / scp工具启动一个交互式的非loginshell,所以.bashrc将被采用。 很多发行版都会从.bash_profile或.bashrc发布.bashrc,所以它会变得混乱。 testing你的login环境清洁度的一个很好的方法就是使用一个命令来模拟scp / sftp connect。 例如: 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$
第一个testing会导致scp / sftp / rsync等中断。 第二个版本将工作得很好。
如果你使用的是csh:
if ($?prompt) ... interactive stuff ...
如果是bash:
if [[ $- == *i* ]]; then ... interactive stuff ... fi
或者使用bash正则expression式:
if [[ $- =~ i ]]; then ... interactive stuff ... fi
这些行应该在你输出/回显某些东西的行之前。
迈克的解决scheme也为我工作。 但是由于我的默认shell是TCSH,所以我不得不按如下方式(在.tcshrc中)修改这个修补程序:
if ( $?SSH_TTY ) then exec /bin/bash endif
只是想我会分享给大家的好处。