我有一个问题,它看起来与其他被问到的问题非常相似,但没有人回答我的问题。我在发送命令时遇到了 ssh 错误(没有加载交互式 shell)。
场景
我公司的默认 shell 是 csh,而不是更合理的 bash。我知道 bash 是受支持的,因为其他一些队友将其用作默认 shell。对于我们所有的流程,csh 都可以正常工作,但我只想使用更好的。我修改了 .cshrc 以启动 bash。
setenv SHELL /bin/bash
exec /bin/bash --login
这样就可以正常创建 shell,设置 SHELL 环境变量并在启动时启动 bash。所有通过脚本或手动运行的 ssh(和 rsh)命令都会出现问题。我可以ssh user@host
正常运行并获取 shell,但我试图运行ssh -vvv user@host "echo hello"
它在验证并发送命令后挂起,
debug1: Sending command: echo hello
debug2: channel 0: request exec confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0
我尝试过的方法
为了简单起见,只需通过 ssh 连接到本地主机即可测试这些更改。
.bashrc 和 .bash_profile 更改
我尝试过许多不同的 .bashrc 和 .bash_profile 配置,以确保它们与环境变量无关。但这似乎不是问题,因为它们在 bash 和 csh 中都一样(csh 运行正常)。
添加 -t
我-t
向 ssh 添加了标志以进行连接,但实际上它并没有运行我告诉它运行的命令,而是给了我一个可以使用的 shell。它本身也不一定是一个解决方案,因为一堆脚本无法修改,因为它们是每个人都共享的。
[user@host: ~/test ] $ ssh -t user@host "echo hello"
[user@host ~]$
在 csh 中进行健全性测试
和-t
:
[user@host: ~/test ] $ ssh -t user@host "echo hello"
hello
Connection to host closed.
[user@host: ~/test ] $
没有-t
:
[user@host: ~/test ] $ ssh -t user@host "echo hello"
hello
[user@host: ~/test ] $
附加信息
我公司的 IT 支持人员查看了一下,说是我的 bash 配置文件有问题,让我查看 .bashrc 和 .bash_profile,基本上就是告诉我自己去解决。我不是说他们错了,而是说我已经做了我能想到的所有调试,这就是我来这里的原因。这也意味着我无法在服务器端更改任何东西,而必须依赖客户端/用户端。
通过 ps 判断,Bash 肯定已加载并且没有根据我的 .cshrc 更改运行 csh:
PID TTY TIME CMD
6725 pts/68 00:00:00 bash
26391 pts/68 00:00:00 ps
结论
到底发生了什么?我很困惑,因为我对 ssh 的内部工作原理了解不多,我甚至不确定为什么 csh 的行为方式是这样的,而 bash 的行为方式是另一种。我的 bash 启动有问题吗?
答案1
回答我自己的问题但是...我尝试了一些似乎有效的新方法?
我最终将 bash 启动命令(和setenv
)exec
从 .cshrc 移到了 .login。我不知道为什么这会改变一切,因为据我所知,csh 以相同的方式加载这两个东西,并且一个接一个。但这样一来,ssh 现在可以正常工作,我需要的所有脚本都可以运行。所以...如果其他人遇到这样的问题,请尝试这个简单的步骤。