使用 .bashrc 而不破坏 sftp

使用 .bashrc 而不破坏 sftp

我的问题是我需要设置一些变量,并且每次登录 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>

相关内容