SSH Command Execution Hangs, although interactive shell functions fine

linux, remote-execution, ssh

Solution

The problem was indeed my login script, although not to do with requiring a terminal (I'd suspected that and tested with the `-t` and `-T` options). The problem was that my `.bashrc` was running an `exec` (in this case to `zsh` - because our system doesn't allow `chsh` to `zsh`).

The offending line:

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

Solved by first checking for interactive shell and exiting if so:

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

So, essentially, because the shell was execing into `zsh`, `ssh` was waiting for this to finish - which never happened.

I am a little confused why my `.bashrc` was being called at all - I thought this was only for interactive shells, but the exact purpose and order of the various init scripts is something I don't think I'll ever learn.

I hope this can be useful to others who have some kind of `exec` in their startup scripts.

BTW - the other two answers were on the right track so I was completely unsure if I should 'answer' or just comment their answers. If answering my own question is morally wrong on stackoverflow, let me know and I'll do penitence. Thank you to the other answerers.

Problem

When I attempt to execute a command on a remote server with ssh, the ssh command hangs after the `exec request accepted` debug message, and eventually times out. The failing command: `ssh -v -v <username>@<server> uptime` (also tried `echo hello` etc.) ``` 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 ``` And there it hangs, indefinitely. When I ssh without a command into my remote server, however, I get an interactive shell and all is good. Successful Command: `ssh -v -v <username>@<server>` Output: ``` 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>% ... ``` Has anyone an idea why an interactive session would be successful but a command execution not? Has been haunting me for months now because I cannot use unison to sync my files any more (it used to work). Any help much appreciated.

Original source