exit status of ssh?

Chris Quenelle chris.quenelle at oracle.com
Fri Mar 18 10:17:47 EST 2011

The man page for ssh says that the exit status of ssh should
be the exit status of the program that it runs.

The session terminates when the command or shell on the remote machine
exits and all X11 and TCP/IP connections have been closed. The exit sta‐
tus of the remote program is returned as the exit status of ssh.
ssh exits with the exit status of the remote command or with 255 if an
error occurred.

But it doesn't seem to work.

% bash -c '"/bin/ls /foo"' ; echo $?
bash: /bin/ls /foo: No such file or directory

% ssh cryo bash -c '"/bin/ls /foo"' ; echo $?
/bin/ls: /foo: No such file or directory

What's up?

I see the same thing on a Linux system and a Solaris system:

% ssh -V
OpenSSH_4.2p1, OpenSSL 0.9.8a 11 Oct 2005

% ssh -V
Sun_SSH_1.5, SSH protocols 1.5/2.0, OpenSSL 0x0090811f

Output of -v is:

% ssh -v cryo bash -c '"/bin/ls /foo"'
OpenSSH_4.2p1, OpenSSL 0.9.8a 11 Oct 2005
debug1: Reading configuration data /home/quenelle/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to cryo [] port 22.
debug1: Connection established.
debug1: identity file /home/quenelle/.ssh/identity type -1
debug1: identity file /home/quenelle/.ssh/id_rsa type 1
debug1: identity file /home/quenelle/.ssh/id_dsa type 2
debug1: Remote protocol version 1.99, remote software version OpenSSH_4.2
debug1: match: OpenSSH_4.2 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.2
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host 'cryo' is known and matches the RSA host key.
debug1: Found key in /home/quenelle/.ssh/known_hosts:33
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Trying private key: /home/quenelle/.ssh/identity
debug1: Offering public key: /home/quenelle/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 149
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending command: bash -c "/bin/ls /foo"
/bin/ls: /foo: No such file or directory
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: Transferred: stdin 0, stdout 0, stderr 0 bytes in 0.2 seconds
debug1: Bytes per second: stdin 0.0, stdout 0.0, stderr 0.0
debug1: Exit status 2

Since the expected exit status is "127", and the status
that the shell sees with $? is "0", I'm not sure how the "status 2"
on the last line fits in.

More information about the openssh-unix-dev mailing list