SSH命令执行挂起,虽然交互式shell功能很好

时间:2011-05-08 18:55:16

标签: linux ssh remote-execution

当我尝试使用ssh在远程服务器上执行命令时,ssh命令在exec request accepted调试消息之后挂起,并最终超时。

失败的命令:ssh -v -v <username>@<server> uptime(也尝试了echo hello等)

debug1: Authentication succeeded (publickey).
Authenticated to <server> (<ip>:22).
debug1: channel 0: new [client-session]
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug2: fd 4 setting TCP_NODELAY
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug2: channel 0: request env confirm 0
debug1: Sending command: uptime
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

它无限期地挂起。

然而,当我没有命令进入我的远程服务器时,我得到一个交互式shell,一切都很好。

成功命令:ssh -v -v <username>@<server>

输出:

debug1: Authentication succeeded (publickey).
Authenticated to <server> (<ip>:22).
debug1: channel 0: new [client-session]
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug2: fd 4 setting TCP_NODELAY
debug2: channel 0: request pty-req confirm 1
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug2: channel 0: request env confirm 0
debug2: channel 0: request shell confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel_input_status_confirm: type 99 id 0
debug2: PTY allocation request accepted on channel 0
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: shell request accepted on channel 0
Welcome!
<prompt>%
...

有谁知道为什么交互式会话会成功但命令执行不是?

我已经困扰了好几个月了,因为我不能再使用unison来同步我的文件了(它曾经工作过)。任何帮助非常感谢。

7 个答案:

答案 0 :(得分:24)

问题确实是我的登录脚本,虽然与要求终端无关(我怀疑并使用-t-T选项进行测试)。问题是我的.bashrc正在运行exec(在这种情况下是zsh - 因为我们的系统不允许chshzsh。 / p>

违规行:

test -f /usr/bin/zsh && exec /usr/bin/zsh

首先检查交互式shell并退出,如果是这样解决:

[ -z "$PS1" ] && return
test -f /usr/bin/zsh && exec /usr/bin/zsh

所以,基本上,因为shell正在进入zshssh正在等待这个完成 - 这从未发生过。

我有点困惑为什么我的.bashrc被调用了 - 我认为这只适用于交互式shell,但是各种init脚本的确切目的和顺序是我认为的不行'我会学习的。

我希望这对于在启动脚本中有某种exec的其他人有用。

顺便说一下 - 其他两个答案都在正确的轨道上,所以我完全不确定我是应该'回答'还是只是评论他们的答案。如果在stackoverflow上回答我自己的问题在道德上是错误的,请告诉我,我会做忏悔。感谢其他回答者。

答案 1 :(得分:4)

您的问题很可能在于您的shell启动或shell注销脚本。不知道那里有什么,很难猜出实际问题。

答案 2 :(得分:2)

检查shell启动文件中的命令(我假设您的提示符为~/.cshrc;在非交互式会话中,~/.login无关紧要)因某些原因需要终端。< / p>

答案 3 :(得分:2)

我最近遇到了相同症状的问题,但确定问题是我的登录脚本中存在问题。相反,我的本地.ssh/config文件配置了RequestTTY force,用于我尝试复制到的主机。

答案 4 :(得分:2)

在解决其他新问题之后,我在fedora服务器22上遇到了这个问题。

ssh -t ziimp / bin / true还可以,但不是ssh ziimp / bin / true,所有我的git + ssh和scp都被锁定了。

我找到的解决方案是在 authorized_keys 文件中。我不得不删除命令=&#34; / usr / bin / bash&#34;我信任的密钥的前缀......

答案 5 :(得分:2)

我们通过添加-n(以从/ dev / null重定向标准输入)和-t(强制伪伪分配)来解决此问题

示例:

v2  1  2
v1
a   2  0
b   1  1

答案 6 :(得分:0)

我最终找到了对我有用的“ $-”变量:

if [[ $- =~ i ]] ; then
    [ -x /bin/tcsh ] && exec /bin/tcsh
    # Bash startup stuff goes here...
fi

从: https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html