使用 .bashrc 而不破坏 sftp

Joe*_*hew 21 linux ssh sftp bashrc

我的问题是我需要设置几个变量,并且每次登录ssh shell时输出几行,同时我必须能够使用sf​​tp通过Filezilla tarnsfer文件。

现在,根据http://www.openssh.org/faq.html 上的 openssh 常见问题解答,如果您的启动脚本回显任何类型的输出,它就会与 sftp 混淆。因此,它要么无限期地延迟,要么因“连接被服务器关闭,退出代码为 128”而出错。

我尝试过将 .bashrc 移动到 .bash_profile 或在 .bashrc 中使用以下代码的解决方案:

if [ "$TERM" != "dumb" ]
then
   source .bashc_real
fi
Run Code Online (Sandbox Code Playgroud)

和:

if [ "$TERM" = "xterm" ]
then
   source .bashc_real
fi
Run Code Online (Sandbox Code Playgroud)

但是,没有任何效果。我的 shell 终端是 bash,我使用 filezilla 连接到 sftp。

Mik*_*ike 27

尝试这样做

if [ "$SSH_TTY" ]
then
   source .bashc_real
fi
Run Code Online (Sandbox Code Playgroud)


Ins*_*yte 18

迈克的回答可能会奏效。但值得指出的是,您可以通过仔细选择将详细内容放入哪些启动文件来完成此操作。来自 bash 手册页:

当 bash 作为交互式登录 shell 或作为具有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的命令中读取和执行命令。当 shell 启动时可以使用 --noprofile 选项来禁止这种行为。

当一个不是登录 shell 的交互式 shell 启动时,bash 从 ~/.bashrc 读取并执行命令,如果该文件存在。这可以通过使用 --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$
Run Code Online (Sandbox Code Playgroud)

第一个测试会导致 scp/sftp/rsync 等中断。第二个版本将工作得很好。

  • 由`scp` 或`ssh 主机命令` 调用的`Bash` 确实是**非交互式**。我刚刚在 bash 手册中发现了这一点:*“Bash 试图确定 ** 何时运行它的标准输入连接到网络连接**,就像由远程 shell 守护程序执行时一样,通常是 **rshd 或安全shell 守护进程 sshd**。如果 bash 确定它正在以这种方式运行,它会从 `~/.bashrc` 读取并执行命令,如果该文件存在并且可读。"* 这是 [有趣的历史](http: //lists.gnu.org/archive/html/bug-bash/2012-06/msg00028.html)。 (3认同)
  • “交互式”一词不是主观的。这是 bash 用来描述其启动模式之一的术语。事实上,sftp/scp 启动了一个“交互式非登录 shell”。随意与开发人员争论是否在这种情况下不采购 .bashrc 是合适的;我只是告诉你它的作用。 (2认同)