SSH inside SSH fails with "stdin: is not a tty"

By default, when you run a command on the remote machine using ssh, a TTY is not allocated for the remote session. This lets you transfer binary data, etc. without having to deal with TTY quirks. This is the environment provided for the command executed on computerone.

However, when you run ssh without a remote command, it DOES allocate a TTY, because you are likely to be running a shell session. This is expected by the ssh [email protected] command, but because of the previous explanation, there is no TTY available to that command.

If you want a shell on computertwo, use this instead, which will force TTY allocation during remote execution:

ssh -t [email protected] 'ssh [email protected]'

This is typically appropriate when you are eventually running a shell or other interactive process at the end of the ssh chain. If you were going to transfer data, it is neither appropriate nor required to add -t, but then every ssh command would contain a data-producing or -consuming command, like:

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'

There's a better way to use SSH as a relay: use the ProxyCommand option. You'll need to have a key on the client machine that lets you log in into the second computer (public key is the recommended way of using SSH in most circumstances anyway). Put this in your ~/.ssh/config and run ssh computertwo.

Host computerone
HostName computerone.com
User user

Host computertwo
HostName computertwo.com
User otheruser
ProxyCommand ssh computerone exec nc %h %p

nc is netcat. Any of the several versions available will do.


It's expecting an interactive terminal on a tty device on the intermediate server.

If you try this command, it should work:

ssh user@computer1 -t "ssh otheruser@computer2"

See man ssh for the -t option.