Recipe 6.2 Invoking Remote Programs

6.2.1 Problem

You want to invoke a program on a remote machine over a secure network connection.

6.2.2 Solution

For noninteractive commands:

$ ssh -l remoteuser remotehost uptime

For interactive programs, add the -t option:

$ ssh -t -l remoteuser remotehost vi

For X Window applications, add the -X option to enable X forwarding. Also add the -f option to background the program after authentication, and to redirect standard input from /dev/null to avoid dangling connections.

$ ssh -X -f -l remoteuser remotehost xterm

6.2.3 Discussion

For noninteractive commands, simply append the remote program invocation to the end of the ssh command line. After authentication, ssh will run the program remotely and exit. It will not establish a login session.

For interactive commands that run in your existing terminal window, such as a terminal-based text editor or game, supply the -t option to force ssh to allocate a pseudo-tty. Otherwise the remote program can get confused or refuse to run:

$ ssh emacs -nw
emacs: standard input is not a tty
$ ssh /usr/games/nethack
NetHack (gettty): Invalid argument
NetHack (settty): Invalid argument Terminal must backspace.

If your program is an X application, use the -X option to enable X forwarding. This forces the connection between the X client and X server?normally insecure?to pass through the SSH connection, protecting the data.

$ ssh -X -f xterm

If X forwarding fails, make sure that your remote session is not manually setting the value of the DISPLAY environment variable. ssh sets it automatically to the correct value. Check your shell startup files (e.g., .bash_profile or .bashrc) and their systemwide equivalents (such as /etc/profile) to ensure they are not setting DISPLAY. Alternatively, X forwarding might be disabled in the SSH server: check the remote /etc/ssh/sshd_config for the setting X11Forwarding no.

6.2.4 See Also

ssh(1). We keep lots of SSH tips at The official OpenSSH site is

    Chapter 9. Testing and Monitoring