tramp: Remote processes

 
 5.4 Integration with other Emacs packages
 =========================================
 
 TRAMP supports starting new running processes on the remote host for
 discovering remote file names.  Emacs packages on the remote host need
 no specific modifications for TRAMP’s use.
 
    This type of integration does not work with the ‘ftp’ method, and
 does not support the pty association as specified in
 ‘start-file-process’.
 
    ‘process-file’ and ‘start-file-process’ work on the remote host when
 the variable ‘default-directory’ is remote:
 
      (let ((default-directory "/ssh:remote.host:"))
        (start-file-process "grep" (get-buffer-create "*grep*")
                            "/bin/sh" "-c" "grep -e tramp *"))
 
 methods::) because the remote file system is mounted on the local host
 and TRAMP just accesses by changing the ‘default-directory’.
 
    TRAMP starts a remote process when a command is executed in a remote
 file or directory buffer.  As of now, these packages have been
 integrated to work with TRAMP: ‘compile.el’ (commands like ‘compile’ and
 ‘grep’) and ‘gud.el’ (‘gdb’ or ‘perldb’).
 
    For TRAMP to find the command on the remote, it must be accessible
 through the default search path as setup by TRAMP upon first connection.
 Alternatively, use an absolute path or extend ‘tramp-remote-path’ (see
 SeeRemote programs):
 
      (add-to-list 'tramp-remote-path "~/bin")
      (add-to-list 'tramp-remote-path "/appli/pub/bin")
 
    Customize ‘tramp-remote-process-environment’ to suit the remote
 program’s environment for the remote host.
 ‘tramp-remote-process-environment’ is a list of strings structured
 similar to ‘process-environment’, where each element is a string of the
 form ‘ENVVARNAME=VALUE’.
 
    To avoid any conflicts with local host variables set through local
 configuration files, such as ‘~/.profile’, use ‘ENVVARNAME=’ to unset
 them for the remote environment.
 
 Use ‘add-to-list’ to add entries:
 
      (add-to-list 'tramp-remote-process-environment "JAVA_HOME=/opt/java")
 
    Modifying or deleting already existing values in the
 ‘tramp-remote-process-environment’ list may not be feasible on
 restricted remote hosts.  For example, some system administrators
 disallow changing ‘HISTORY’ variable.  To accommodate such restrictions
 when using TRAMP, fix the ‘tramp-remote-process-environment’ by the
 following code in the local ‘.emacs’ file:
 
      (let ((process-environment tramp-remote-process-environment))
        (setenv "HISTORY" nil)
        (setq tramp-remote-process-environment process-environment))
 
    TRAMP does not use the defaults specified in ‘process-environment’
 for running ‘process-file’ or ‘start-file-process’ on remote hosts.
 When values from ‘process-environment’ are needed for remote processes,
 then set them as follows:
 
      (let ((process-environment (cons "HGPLAIN=1" process-environment)))
        (process-file ...))
 
    This works only for environment variables not already set in the
 ‘process-environment’.
 
    For integrating other Emacs packages so TRAMP can execute remotely,
 please file a bug report.  SeeBug Reports.
 
 5.4.1 Running remote programs that create local X11 windows
 -----------------------------------------------------------
 
 To allow a remote program to create an X11 window on the local host, set
 the ‘DISPLAY’ environment variable for the remote host as follows in the
 local ‘.emacs’ file:
 
      (add-to-list 'tramp-remote-process-environment
                   (format "DISPLAY=%s" (getenv "DISPLAY")))
 
 ‘(getenv "DISPLAY")’ should return a recognizable name for the local
 host that the remote host can redirect X11 window interactions.  If
 querying for a recognizable name is not possible for whatever reason,
 then replace ‘(getenv "DISPLAY")’ with a hard-coded, fixed name.  Note
 that using ‘:0’ for X11 display name here will not work as expected.
 
    An alternate approach is specify ‘ForwardX11 yes’ or
 ‘ForwardX11Trusted yes’ in the file ‘~/.ssh/config’ on the local host.
 
 5.4.2 Running ‘shell’ on a remote host
 --------------------------------------
 
 Set ‘explicit-shell-file-name’ to the appropriate shell name when using
 TRAMP between two hosts with different operating systems, such as
 ‘windows-nt’ and ‘gnu/linux’.  This option ensures the correct name of
 the remote shell program.
 
    Starting with Emacs 24, when ‘explicit-shell-file-name’ is equal to
 ‘nil’, calling ‘shell’ interactively will prompt for a shell name.
 
 5.4.3 Running ‘shell-command’ on a remote host
 ----------------------------------------------
 
 ‘shell-command’ executes commands synchronously or asynchronously on
 remote hosts and displays output in buffers on the local host.  Example:
 
      C-x C-f /sudo:: <RET>
      M-! tail -f /var/log/syslog.log & <RET>
 
    ‘tail’ command outputs continuously to the local buffer, ‘*Async
 Shell Command*’
 
    ‘M-x auto-revert-tail-mode’ runs similarly showing continuous output.
 
 5.4.4 Running ‘eshell’ on a remote host
 ---------------------------------------
 
 TRAMP is integrated into ‘eshell.el’, which enables interactive eshell
 sessions on remote hosts at the command prompt.  You must add the module
 ‘eshell-tramp’ to ‘eshell-modules-list’.  Here’s a sample interaction
 after opening ‘M-x eshell’ on a remote host:
 
      ~ $ cd /sudo::/etc <RET>
      /sudo:root@host:/etc $ hostname <RET>
      host
      /sudo:root@host:/etc $ id <RET>
      uid=0(root) gid=0(root) groups=0(root)
      /sudo:root@host:/etc $ find-file shadow <RET>
      #<buffer shadow>
      /sudo:root@host:/etc $
 
    ‘eshell’ in Emacs 23.2 added custom ‘su’ and ‘sudo’ commands that set
 the default directory correctly for the ‘*eshell*’ buffer.  TRAMP
 silently updates ‘tramp-default-proxies-alist’ with an entry for this
 directory (SeeMulti-hops):
 
      ~ $ cd /ssh:user@remotehost:/etc <RET>
      /ssh:user@remotehost:/etc $ find-file shadow <RET>
      File is not readable: /ssh:user@remotehost:/etc/shadow
      /ssh:user@remotehost:/etc $ sudo find-file shadow <RET>
      #<buffer shadow>
 
      /ssh:user@remotehost:/etc $ su - <RET>
      /su:root@remotehost:/root $ id <RET>
      uid=0(root) gid=0(root) groups=0(root)
      /su:root@remotehost:/root $
 
 5.4.5 Running a debugger on a remote host
 -----------------------------------------
 
 ‘gud.el’ provides a unified interface to symbolic debuggers (See
 (emacs)Debuggers).  TRAMP can run debug on remote hosts by calling
 ‘gdb’ with a remote file name:
 
      M-x gdb <RET>
      Run gdb (like this): gdb --annotate=3 /ssh:host:~/myprog <RET>
 
    Relative file names are based on the remote default directory.  When
 ‘myprog.pl’ exists in ‘/ssh:host:/home/user’, valid calls include:
 
      M-x perldb <RET>
      Run perldb (like this): perl -d myprog.pl <RET>
 
    Just the local part of a remote file name, such as ‘perl -d
 /home/user/myprog.pl’, is not possible.
 
    Arguments of the program to be debugged must be literal, can take
 relative or absolute paths, but not remote paths.
 
 5.4.6 Running remote processes on Windows hosts
 -----------------------------------------------
 
 ‘winexe’ runs processes on a remote Windows host, and TRAMP can use it
 for ‘process-file’ and ‘start-file-process’.
 
    ‘tramp-smb-winexe-program’ specifies the local ‘winexe’ command.
 Powershell V2.0 on the remote host is required to run processes
 triggered from TRAMP.
 
    ‘explicit-shell-file-name’ and ‘explicit-*-args’ have to be set
 properly so ‘M-x shell’ can open a proper remote shell on a Windows
 host.  To open ‘cmd’, set it as follows:
 
      (setq explicit-shell-file-name "cmd"
            explicit-cmd-args '("/q"))
 
 To open ‘powershell’ as a remote shell, use this:
 
      (setq explicit-shell-file-name "powershell"
            explicit-powershell-args '("-file" "-"))