\input texinfo   @c -*- mode: texinfo; coding: utf-8 -*-
@setfilename ../../info/tramp.info
@c %**start of header
@include docstyle.texi
@c In the Tramp repository, the version number is auto-frobbed from
@c configure.ac, so you should edit that file and run
@c "autoconf && ./configure" to change the version number.
@include trampver.texi
@settitle @value{tramp} @value{trampver} User Manual
@c %**end of header

@c This is *so* much nicer :)
@footnotestyle end

@c Macro for formatting a file name according to the respective
@c syntax.  Macro arguments should not have any leading or trailing
@c whitespace.  Not very elegant, but I don't know it better.

@macro trampfn {method, userhost, localname}
@value{prefix}@c
\method\@value{postfixhop}@c
\userhost\@value{postfix}\localname\
@end macro

@copying
Copyright @copyright{} 1999--2019 Free Software Foundation, Inc.

@quotation
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover Texts being ``A GNU Manual'',
and with the Back-Cover Texts as in (a) below.  A copy of the license
is included in the section entitled ``GNU Free Documentation License''.

(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual.''
@end quotation
@end copying

@c Entries for @command{install-info} to use
@dircategory Emacs network features
@direntry
* @value{tramp}: (tramp).               Transparent Remote Access, Multiple Protocol
                                  Emacs remote file access via ssh and scp.
@end direntry

@titlepage
@title @value{tramp} @value{trampver} User Manual
@author by Daniel Pittman
@author based on documentation by Kai Großjohann
@end titlepage

@contents


@node Top, Overview, (dir), (dir)
@top @value{tramp} @value{trampver} User Manual

This file documents @value{tramp} @value{trampver}, a remote file
editing package for Emacs.

@value{tramp} stands for ``Transparent Remote (file) Access, Multiple
Protocol''.  This package provides remote file editing, similar to
Ange FTP.

The difference is that Ange FTP uses FTP to transfer files between the
local and the remote host, whereas @value{tramp} uses a combination of
@command{rsh} and @command{rcp} or other work-alike programs, such as
@command{ssh}/@command{scp}.

You can find the latest version of this document on the web at
@uref{https://www.gnu.org/software/tramp/}.

@ifhtml
The latest release of @value{tramp} is available for
@uref{https://ftp.gnu.org/gnu/tramp/, download}, or you may see
@ref{Obtaining @value{tramp}} for more details, including the Git
server details.

@value{tramp} also has a @uref{https://savannah.gnu.org/projects/tramp/,
Savannah Project Page}.
@end ifhtml

There is a mailing list for @value{tramp}, available at
@email{tramp-devel@@gnu.org}, and archived at
@uref{https://lists.gnu.org/r/tramp-devel/, the
@value{tramp} Mail Archive}.

@page
@insertcopying

@menu
* Overview::                    What @value{tramp} can and cannot do.

For the end user:

* Obtaining @value{tramp}::             How to obtain @value{tramp}.
* History::                     History of @value{tramp}.
@ifset installchapter
* Installation::                Installing @value{tramp} with your Emacs.
@end ifset
* Quick Start Guide::           Short introduction how to use @value{tramp}.
* Configuration::               Configuring @value{tramp} for use.
* Usage::                       An overview of the operation of @value{tramp}.
* Bug Reports::                 Reporting Bugs and Problems.
* Frequently Asked Questions::  Questions and answers from the mailing list.

For the developer:

* Files directories and localnames::
                                How file names, directories and localnames
                                  are mangled and managed.
* Traces and Profiles::         How to Customize Traces.

* GNU Free Documentation License:: The license for this documentation.
* Function Index::              @value{tramp} functions.
* Variable Index::              User options and variables.
* Concept Index::               An item for each concept.

@detailmenu
 --- The Detailed Node Listing ---
@c
@ifset installchapter
Installing @value{tramp} with your Emacs

* Installation parameters::     Parameters in order to control installation.
* Testing::                     A test suite for @value{tramp}.
* Load paths::                  How to plug-in @value{tramp} into your environment.
@end ifset

Configuring @value{tramp} for use

* Connection types::            Types of connections to remote hosts.
* Inline methods::              Inline methods.
* External methods::            External methods.
* GVFS based methods::          GVFS based external methods.
* Default Method::              Selecting a default method.
* Default User::                Selecting a default user.
* Default Host::                Selecting a default host.
* Multi-hops::                  Connecting to a remote host using multiple hops.
* Firewalls::                   Passing firewalls.
* Customizing Methods::         Using Non-Standard Methods.
* Customizing Completion::      Selecting config files for user/host name completion.
* Password handling::           Reusing passwords for several connections.
* Connection caching::          Reusing connection related information.
* Predefined connection information::
                                Setting own connection related information.
* Remote programs::             How @value{tramp} finds and uses programs on the remote host.
* Remote shell setup::          Remote shell setup hints.
* Android shell setup::         Android shell setup hints.
* Auto-save and Backup::        Auto-save and Backup.
* Windows setup hints::         Issues with Cygwin ssh.

Using @value{tramp}

* File name syntax::            @value{tramp} file name conventions.
@ifset unified
* Change file name syntax::     Alternative file name syntax.
@end ifset
* File name completion::        File name completion.
* Ad-hoc multi-hops::           Declaring multiple hops in the file name.
* Remote processes::            Integration with other Emacs packages.
* Cleanup remote connections::  Cleanup remote connections.

How file names, directories and localnames are mangled and managed

* Localname deconstruction::    Breaking a localname into its components.
* External packages::           Integration with external Lisp packages.

@end detailmenu
@end menu


@node Overview
@chapter An overview of @value{tramp}
@cindex overview

@value{tramp} is for transparently accessing remote files from within
Emacs.  @value{tramp} enables an easy, convenient, and consistent
interface to remote files as if they are local files.  @value{tramp}'s
transparency extends to editing, version control, and @code{dired}.

@value{tramp} can access remote hosts using any number of access
methods, such as @command{rsh}, @command{rlogin}, @command{telnet},
and related programs.  If these programs can successfully pass
@acronym{ASCII} characters, @value{tramp} can use them.
@value{tramp} does not require or mandate 8-bit clean connections.

@value{tramp}'s most common access method is through @command{ssh}, a
more secure alternative to @command{ftp} and other older access
methods.

@value{tramp} on MS Windows operating systems is integrated with the
PuTTY package, and uses the @command{plink} program.

@value{tramp} mostly operates transparently in the background using
the connection programs.  As long as these programs enable remote login
and can use the terminal, @value{tramp} can adapt them for seamless
and transparent access.

@value{tramp} temporarily transfers a remote file's contents to the
local host editing and related operations.  @value{tramp} can also
transfer files between hosts using standard Emacs interfaces, a
benefit of direct integration of @value{tramp} in Emacs.

@value{tramp} can transfer files using any number of available host
programs for remote files, such as @command{rcp}, @command{scp},
@command{rsync} or (under MS Windows) @command{pscp}.  @value{tramp}
provides easy ways to specify these programs and customize them to
specific files, hosts, or access methods.

For faster small-size file transfers, @value{tramp} supports encoded
transfers directly through the shell using @command{mimencode} or
@command{uuencode} provided such tools are available on the remote
host.


@subsubheading @value{tramp} behind the scenes
@cindex behind the scenes
@cindex details of operation
@cindex how it works

Accessing a remote file through @value{tramp} entails a series of
actions, many of which are transparent to the user.  Yet some actions
may require user response (such as entering passwords or completing
file names).  One typical scenario, opening a file on a remote host, is
presented here to illustrate the steps involved:

@kbd{C-x C-f} to initiate find-file, enter part of the @value{tramp}
file name, then hit @kbd{@key{TAB}} for completion.  If this is the
first time connection to that host, here's what happens:

@itemize
@item
@value{tramp} invokes @samp{telnet @var{host}} or @samp{rsh @var{host}
-l @var{user}} and establishes an external process to connect to the
remote host.  @value{tramp} communicates with the process through an
Emacs buffer, which also shows output from the remote host.

@item
The remote host may prompt for a login name (for @command{telnet}, for
example) in the buffer.  If on the other hand, the login name was
included in the file name portion, @value{tramp} sends the login name
followed by a newline.

@item
The remote host may then prompt for a password or pass phrase (for
@command{rsh} or for @command{telnet}).  @value{tramp} displays the
password prompt in the minibuffer.  @value{tramp} then sends whatever
is entered to the remote host, followed by a newline.

@item
@value{tramp} now waits for either the shell prompt or a failed login
message.

If @value{tramp} does not receive any messages within a timeout period
(a minute, for example), then @value{tramp} responds with an error
message about not finding the remote shell prompt.  If any messages
from the remote host, @value{tramp} displays them in the buffer.

For any @samp{login failed} message from the remote host,
@value{tramp} aborts the login attempt, and repeats the login steps
again.

@item
Upon successful login and @value{tramp} recognizes the shell prompt
from the remote host, @value{tramp} prepares the shell environment by
turning off echoing, setting shell prompt, and other housekeeping
chores.

@strong{Note} that for the remote shell, @value{tramp} invokes
@command{/bin/sh}.  The remote host must recognize @samp{exec /bin/sh}
and execute the appropriate shell.  This shell must support Bourne
shell syntax.

@item
@value{tramp} executes @command{cd} and @command{ls} commands to find
which files exist on the remote host.  @value{tramp} sometimes uses
@command{echo} with globbing.  @value{tramp} checks if a file or
directory is writable with @command{test}.  After each command,
@value{tramp} parses the output from the remote host for completing
the next operation.

@item
After remote file name completion, @value{tramp} transfers the file
contents from the remote host.

For inline transfers, @value{tramp} sends a command, such as
@samp{mimencode -b /path/to/remote/file}, waits until the output has
accumulated in the buffer, decodes that output to produce the file's
contents.

For external transfers, @value{tramp} sends a command as follows:
@example
rcp user@@host:/path/to/remote/file /tmp/tramp.4711
@end example
@value{tramp} reads the local temporary file @file{/tmp/tramp.4711}
into a buffer, and then deletes the temporary file.

@item
Edit, modify, change the buffer contents as normal, and then save the
buffer with @kbd{C-x C-s}.

@item
@value{tramp} transfers the buffer contents to the remote host in
a reverse of the process using the appropriate inline or external
program.
@end itemize

I hope this has provided you with a basic overview of what happens
behind the scenes when you open a file with @value{tramp}.


@c For the end user
@node Obtaining @value{tramp}
@chapter Obtaining @value{tramp}
@cindex obtaining @value{tramp}

@value{tramp} is included as part of Emacs (since Emacs 22.1).

@value{tramp} is also freely packaged for download on the Internet at
@uref{https://ftp.gnu.org/gnu/tramp/}.

@value{tramp} development versions are available on Git servers.
Development versions contain new and incomplete features.

One way to obtain from Git server is to visit the Savannah project
page at the following URL and then clicking on the Git link in the
navigation bar at the top.

@noindent
@uref{https://savannah.gnu.org/projects/tramp/}

@noindent
Another way is to follow the terminal session below:

@example
@group
$ cd ~/emacs
$ git clone git://git.savannah.gnu.org/tramp.git
@end group
@end example

@noindent
From behind a firewall:

@example
@group
$ git config --global http.proxy http://user:pwd@@proxy.server.com:8080
$ git clone https://git.savannah.gnu.org/r/tramp.git
@end group
@end example

@noindent
@value{tramp} developers:

@example
$ git clone login@@git.sv.gnu.org:/srv/git/tramp.git
@end example

@noindent
After one of the above commands, @file{~/emacs/tramp} will
containing the latest version of @value{tramp}.

@noindent
To fetch updates from the repository, use git pull:

@example
@group
$ cd ~/emacs/tramp
$ git pull
@end group
@end example

@noindent
Run @command{autoconf} as follows to generate an up-to-date
@file{configure} script:

@example
@group
$ cd ~/emacs/tramp
$ autoconf
@end group
@end example


@node History
@chapter History of @value{tramp}
@cindex history
@cindex development history

@value{tramp} development started at the end of November 1998 as
@file{rssh.el}.  It provided only one method of access.  It used
@command{ssh} for login and @command{scp} to transfer file contents.
The name was changed to @file{rcp.el} before it got its present name
@value{tramp}.  New methods of remote access were added, so was support
for version control.

April 2000 was the first time when multi-hop methods were added.  In
July 2002, @value{tramp} unified file names with Ange FTP@.  In July
2004, proxy hosts replaced multi-hop methods.  Running commands on
remote hosts was introduced in December 2005.  Support for gateways
since April 2007 (and removed in December 2016).  GVFS integration
started in February 2009.  Remote commands on MS Windows hosts since
September 2011.  Ad-hoc multi-hop methods (with a changed syntax)
re-enabled in November 2011.  In November 2012, added Juergen
Hoetzel's @file{tramp-adb.el}.

XEmacs support was stopped in January 2016.  Since March 2017,
@value{tramp} syntax mandates a method.

@c Installation chapter is necessary only in case of standalone
@c installation.  Text taken from trampinst.texi.
@ifset installchapter
@include trampinst.texi
@end ifset


@node Quick Start Guide
@chapter Short introduction how to use @value{tramp}
@cindex quick start guide

@value{tramp} extends the Emacs file name syntax by a remote
component.  A remote file name looks always like
@file{@trampfn{method,user@@host,/path/to/file}}.

You can use remote files exactly like ordinary files, that means you
could open a file or directory by @kbd{C-x C-f
@trampfn{method,user@@host,/path/to/file} @key{RET}}, edit the file,
and save it.  You can also mix local files and remote files in file
operations with two arguments, like @code{copy-file} or
@code{rename-file}.  And finally, you can run even processes on a
remote host, when the buffer you call the process from has a remote
@code{default-directory}.


@anchor{Quick Start Guide: File name syntax}
@section File name syntax
@cindex file name syntax

Remote file names are prepended by the @code{method}, @code{user} and
@code{host} parts.  All of them, and also the local file name part,
are optional, in case of a missing part a default value is assumed.
The default value for an empty local file name part is the remote
user's home directory.  The shortest remote file name is
@file{@trampfn{-,,}}, therefore.  The @samp{-} notation for the
default host is used for syntactical reasons, @ref{Default Host}.

The @code{method} part describes the connection method used to reach
the remote host, see below.

The @code{user} part is the user name for accessing the remote host.
For the @option{smb} method, this could also require a domain name, in
this case it is written as @code{user%domain}.

The @code{host} part must be a host name which could be resolved on
your local host.  It could be a short host name, a fully qualified
domain name, an IPv4 or IPv6 address, @ref{File name syntax}.  Some
connection methods support also a notation of the port to be used, in
this case it is written as @code{host#port}.


@anchor{Quick Start Guide: @option{ssh} and @option{plink} methods}
@section Using @option{ssh} and @option{plink}
@cindex method ssh
@cindex ssh method
@cindex method plink
@cindex plink method

If your local host runs an SSH client, and the remote host runs an SSH
server, the most simple remote file name is
@file{@trampfn{ssh,user@@host,/path/to/file}}.  The remote file name
@file{@trampfn{ssh,,}} opens a remote connection to yourself on the
local host, and is taken often for testing @value{tramp}.

On MS Windows, PuTTY is often used as SSH client.  Its @command{plink}
method can be used there to open a connection to a remote host running
an @command{ssh} server:
@file{@trampfn{plink,user@@host,/path/to/file}}.


@anchor{Quick Start Guide: @option{su}, @option{sudo} and @option{sg} methods}
@section Using @option{su}, @option{sudo} and @option{sg}
@cindex method su
@cindex su method
@cindex method sudo
@cindex sudo method
@cindex method sg
@cindex sg method

Sometimes, it is necessary to work on your local host under different
permissions.  For this, you could use the @option{su} or @option{sudo}
connection method.  Both methods use @samp{root} as default user name
and the return value of @code{(system-name)} as default host name.
Therefore, it is convenient to open a file as
@file{@trampfn{sudo,,/path/to/file}}.

The method @option{sg} stands for ``switch group''; the changed group
must be used here as user name.  The default host name is the same.


@anchor{Quick Start Guide: @option{smb} method}
@section Using @command{smbclient}
@cindex method smb
@cindex smb method
@cindex ms windows (with smb method)
@cindex smbclient

In order to access a remote MS Windows host or Samba server, the
@command{smbclient} client is used.  The remote file name syntax is
@file{@trampfn{smb,user%domain@@host,/path/to/file}}.  The first part
of the local file name is the share exported by the remote host,
@samp{path} in this example.


@anchor{Quick Start Guide: GVFS-based methods}
@section Using GVFS-based methods
@cindex methods, gvfs
@cindex gvfs based methods
@cindex method sftp
@cindex sftp method
@cindex method afp
@cindex afp method
@cindex method dav
@cindex method davs
@cindex dav method
@cindex davs method

On systems, which have installed the virtual file system for the Gnome
Desktop (GVFS), its offered methods could be used by @value{tramp}.
Examples are @file{@trampfn{sftp,user@@host,/path/to/file}},
@file{@trampfn{afp,user@@host,/path/to/file}} (accessing Apple's AFP
file system), @file{@trampfn{dav,user@@host,/path/to/file}} and
@file{@trampfn{davs,user@@host,/path/to/file}} (for WebDAV shares).


@anchor{Quick Start Guide: Google Drive}
@section Using Google Drive
@cindex method gdrive
@cindex gdrive method
@cindex google drive

Another GVFS-based method allows to access a Google Drive file system.
The file name syntax is here always
@file{@trampfn{gdrive,john.doe@@gmail.com,/path/to/file}}.
@samp{john.doe@@gmail.com} stands here for your Google Drive account.


@anchor{Quick Start Guide: Android}
@section Using Android
@cindex method adb
@cindex adb method
@cindex android

An Android device, which is connected via USB to your local host, can
be accessed via the @command{adb} command.  No user or host name is
needed.  The file name syntax is @file{@trampfn{adb,,/path/to/file}}.


@node Configuration
@chapter Configuring @value{tramp}
@cindex configuration
@cindex default configuration

@value{tramp} is initially configured to use the @command{scp} program
to connect to the remote host.  Just type @kbd{C-x C-f} and then enter
file name @file{@trampfn{scp,user@@host,/path/to/file}}.  For details,
@xref{Default Method}, @xref{Default User}, @xref{Default Host}.

For problems related to the behavior of the remote shell, @xref{Remote
shell setup}.

For changing the connection type and file access method from the
defaults to one of several other options, @xref{Connection types}.

@strong{Note} that some user options described in these examples are
not auto loaded by Emacs.  All examples require @value{tramp} is
installed and loaded:

@lisp
(customize-set-variable 'tramp-verbose 6 "Enable remote command traces")
@end lisp


@menu
* Connection types::            Types of connections to remote hosts.
* Inline methods::              Inline methods.
* External methods::            External methods.
* GVFS based methods::          GVFS based external methods.
* Default Method::              Selecting a default method.
                                  Here we also try to help those who
                                  don't have the foggiest which method
                                  is right for them.
* Default User::                Selecting a default user.
* Default Host::                Selecting a default host.
* Multi-hops::                  Connecting to a remote host using multiple hops.
* Firewalls::                   Passing firewalls.
* Customizing Methods::         Using Non-Standard Methods.
* Customizing Completion::      Selecting config files for user/host name completion.
* Password handling::           Reusing passwords for several connections.
* Connection caching::          Reusing connection related information.
* Predefined connection information::
                                Setting own connection related information.
* Remote programs::             How @value{tramp} finds and uses programs on the remote host.
* Remote shell setup::          Remote shell setup hints.
* Android shell setup::         Android shell setup hints.
* Auto-save and Backup::        Auto-save and Backup.
* Windows setup hints::         Issues with Cygwin ssh.
@end menu


@node Connection types
@section Types of connections to remote hosts
@cindex connection types, overview

@dfn{Inline method} and @dfn{external method} are the two basic types
of access methods.  While they both use the same remote shell access
programs, such as @command{rsh}, @command{ssh}, or @command{telnet},
they differ in the file access methods.  Choosing the right method
becomes important for editing files, transferring large files, or
operating on a large number of files.

The performance of the external methods is generally better than that
of the inline methods, at least for large files.  This is caused by
the need to encode and decode the data when transferring inline.

The one exception to this rule are the @option{scp}-based access
methods.  While these methods do see better performance when actually
transferring files, the overhead of the cryptographic negotiation at
startup may drown out the improvement in file transfer times.

External methods should be configured such a way that they don't
require a password (with @command{ssh-agent}, or such alike).  Modern
@command{scp} implementations offer options to reuse existing
@command{ssh} connections, which will be enabled by default if
available.  If it isn't possible, you should consider @ref{Password
handling}, otherwise you will be prompted for a password every copy
action.


@node Inline methods
@section Inline methods
@cindex inline methods
@cindex methods, inline

Inline methods use the same login connection to transfer file
contents.  Inline methods are quick and easy for small files.  They
depend on the availability of suitable encoding and decoding programs
on the remote host.  For local source and destination, @value{tramp}
may use built-in equivalents of such programs in Emacs.

Inline methods can work in situations where an external transfer
program is unavailable.  Inline methods also work when transferring
files between different @emph{user identities} on the same host.

@cindex uuencode
@cindex mimencode
@cindex base-64 encoding

@value{tramp} checks the remote host for the availability and
usability of @command{mimencode} (part of the @command{metamail}
package) or @command{uuencode}.  @value{tramp} uses the first reliable
command it finds.  @value{tramp}'s search path can be customized, see
@ref{Remote programs}.

In case both @command{mimencode} and @command{uuencode} are
unavailable, @value{tramp} first transfers a small Perl program to the
remote host, and then tries that program for encoding and decoding.

@vindex tramp-inline-compress-start-size
To increase transfer speeds for large text files, use compression
before encoding.  The user option
@code{tramp-inline-compress-start-size} specifies the file size for
such optimization.

@table @asis
@item @option{rsh}
@cindex method rsh
@cindex rsh method

@command{rsh} is an option for connecting to hosts within local
networks since @command{rsh} is not as secure as other methods.

@item @option{ssh}
@cindex method ssh
@cindex ssh method

@command{ssh} is a more secure option than others to connect to a
remote host.

@command{ssh} can also take extra parameters as port numbers.  For
example, a host on port 42 is specified as @file{host#42} (the real
host name, a hash sign, then a port number).  It is the same as passing
@samp{-p 42} to the @command{ssh} command.

@item @option{telnet}
@cindex method telnet
@cindex telnet method

Connecting to a remote host with @command{telnet} is as insecure
as the @option{rsh} method.

@item @option{su}
@cindex method su
@cindex su method

Instead of connecting to a remote host, @command{su} program allows
editing as another user.  The host can be either @samp{localhost} or
the host returned by the function @command{(system-name)}.  See
@ref{Multi-hops} for an exception to this behavior.

@item @option{sudo}
@cindex method sudo
@cindex sudo method

Similar to @option{su} method, @option{sudo} uses @command{sudo}.
@command{sudo} must have sufficient rights to start a shell.

@item @option{doas}
@cindex method doas
@cindex doas method

This method is used on OpenBSD like the @command{sudo} command.

@item @option{sg}
@cindex method sg
@cindex sg method

The @command{sg} program allows editing as different group.  The host
can be either @samp{localhost} or the host returned by the function
@command{(system-name)}.  The user name must be specified, but it
denotes a group name.  See @ref{Multi-hops} for an exception to this
behavior.

@item @option{sshx}
@cindex method sshx
@cindex sshx method

Works like @option{ssh} but without the extra authentication prompts.
@option{sshx} uses @samp{ssh -t -t @var{host} -l @var{user} /bin/sh}
to open a connection with a ``standard'' login shell.

@strong{Note} that @option{sshx} does not bypass authentication
questions.  For example, if the host key of the remote host is not
known, @option{sshx} will still ask ``Are you sure you want to
continue connecting?''.  @value{tramp} cannot handle such questions.
Connections will have to be setup where logins can proceed without
such questions.

@option{sshx} is useful for MS Windows users when @command{ssh}
triggers an error about allocating a pseudo tty.  This happens due to
missing shell prompts that confuses @value{tramp}.

@option{sshx} supports the @samp{-p} argument.

@item @option{krlogin}
@cindex method krlogin
@cindex krlogin method
@cindex kerberos (with krlogin method)

This method is also similar to @option{ssh}.  It uses the
@command{krlogin -x} command only for remote host login.

@item @option{ksu}
@cindex method ksu
@cindex ksu method
@cindex kerberos (with ksu method)

This is another method from the Kerberos suite.  It behaves like @option{su}.

@item @option{plink}
@cindex method plink
@cindex plink method

@option{plink} method is for MS Windows users with the PuTTY
implementation of SSH@.  It uses @samp{plink -ssh} to log in to the
remote host.

Check the @samp{Share SSH connections if possible} control for that
session.

@option{plink} method supports the @samp{-P} argument.

@item @option{plinkx}
@cindex method plinkx
@cindex plinkx method

Another method using PuTTY on MS Windows with session names instead of
host names.  @option{plinkx} calls @samp{plink -load @var{session}
-t}.  User names and port numbers must be defined in the session.

Check the @samp{Share SSH connections if possible} control for that
session.

@end table


@node External methods
@section External methods
@cindex methods, external
@cindex external methods

External methods operate over multiple channels, using the remote
shell connection for some actions while delegating file transfers to
an external transfer program.

External methods save on the overhead of encoding and decoding of
inline methods.

Since external methods have the overhead of opening a new channel,
files smaller than @code{tramp-copy-size-limit} still use inline
methods.

@table @asis
@item @option{rcp}
@cindex method rcp
@cindex rcp method
@cindex rcp (with rcp method)
@cindex rsh (with rcp method)

This method uses the @command{rsh} and @command{rcp} commands to
connect to the remote host and transfer files.  This is the fastest
access method available.

The alternative method @option{remcp} uses the @command{remsh} and
@command{rcp} commands.

@item @option{scp}
@cindex method scp
@cindex scp method
@cindex scp (with scp method)
@cindex ssh (with scp method)

Using a combination of @command{ssh} to connect and @command{scp} to
transfer is the most secure.  While the performance is good, it is
slower than the inline methods for smaller files.  Though there is no
overhead of encoding and decoding of the inline methods,
@command{scp}'s cryptographic handshake negates those speed gains.

@option{ssh}-based methods support @samp{-p} feature for specifying
port numbers.  For example, @file{host#42} passes @samp{-p 42} in the
argument list to @command{ssh}, and @samp{-P 42} in the argument list
to @command{scp}.

@item @option{rsync}
@cindex method rsync
@cindex rsync method
@cindex rsync (with rsync method)
@cindex ssh (with rsync method)

@command{ssh} command to connect in combination with @command{rsync}
command to transfer is similar to the @option{scp} method.

@command{rsync} performs much better than @command{scp} when
transferring files that exist on both hosts.  However, this advantage
is lost if the file exists only on one side of the connection.

This method supports the @samp{-p} argument.

@item @option{scpx}
@cindex method scpx
@cindex scpx method
@cindex scp (with scpx method)
@cindex ssh (with scpx method)

@option{scpx} is useful to avoid login shell questions.  It is similar
in performance to @option{scp}.  @option{scpx} uses @samp{ssh -t -t
@var{host} -l @var{user} /bin/sh} to open a connection.

@option{scpx} is useful for MS Windows users when @command{ssh}
triggers an error about allocating a pseudo tty.  This happens due to
missing shell prompts that confuses @value{tramp}.

This method supports the @samp{-p} argument.

@item @option{pscp}
@item @option{psftp}
@cindex method pscp
@cindex pscp method
@cindex pscp (with pscp method)
@cindex plink (with pscp method)
@cindex putty (with pscp method)
@cindex method psftp
@cindex psftp method
@cindex pscp (with psftp method)
@cindex plink (with psftp method)
@cindex putty (with psftp method)

These methods are similar to @option{scp} or @option{sftp}, but they
use the @command{plink} command to connect to the remote host, and
they use @command{pscp} or @command{psftp} for transferring the files.
These programs are part of PuTTY, an SSH implementation for MS Windows.

Check the @samp{Share SSH connections if possible} control for that
session.

These methods support the @samp{-P} argument.

@item @option{fcp}
@cindex method fcp
@cindex fcp method
@cindex fsh (with fcp method)
@cindex fcp (with fcp method)

This method is similar to @option{scp}, but uses @command{fsh} to
connect and @command{fcp} to transfer files.  @command{fsh/fcp}, a
front-end for @command{ssh}, reuse @command{ssh} session by
submitting several commands.  This avoids the startup overhead due to
@command{scp}'s secure connection.  Inline methods have similar
benefits.

The command used for this connection is: @samp{fsh @var{host} -l
@var{user} /bin/sh -i}

@cindex method fsh
@cindex fsh method

@option{fsh} has no inline method since the multiplexing it offers is
not useful for @value{tramp}.  @command{fsh} connects to remote host
and @value{tramp} keeps that one connection open.

@item @option{nc}
@cindex method nc
@cindex nc method
@cindex nc (with nc method)
@cindex telnet (with nc method)

Using @command{telnet} to connect and @command{nc} to transfer files
is sometimes the only combination suitable for accessing routers or
NAS hosts.  These dumb devices have severely restricted local shells,
such as the @command{busybox} and do not host any other encode or
decode programs.

@item @option{ftp}
@cindex method ftp
@cindex ftp method

When @value{tramp} uses @option{ftp}, it forwards requests to whatever
ftp program is specified by Ange FTP.  This external program must be
capable of servicing requests from @value{tramp}.

@item @option{smb}
@cindex method smb
@cindex smb method
@cindex ms windows (with smb method)
@cindex smbclient

This non-native @value{tramp} method connects via the Server Message
Block (SMB) networking protocol to hosts running file servers that are
typically based on @url{https://www.samba.org/,,Samba} or MS Windows.

Using @command{smbclient} requires a few tweaks when working with
@value{tramp}:

The first directory in the localname must be a share name on the
remote host.

Since some SMB share names end in the @code{$} character,
@value{tramp} must use @code{$$} when specifying those shares to avoid
environment variable substitutions.

When @value{tramp} is not specific about the share name or uses the
generic remote directory @file{/}, @command{smbclient} returns all
available shares.

Since SMB authentication is based on each SMB share, @value{tramp}
prompts for a password even when accessing a different share on the
same SMB host.  This prompting can be suppressed by @ref{Password
handling}.

To accommodate user name/domain name syntax required by MS Windows
authorization, @value{tramp} provides for an extended syntax in
@code{user%domain} format (where @code{user} is the user name,
@code{%} is the percent symbol, and @code{domain} is the MS Windows
domain name).  An example:

@example
@trampfn{smb,daniel%BIZARRE@@melancholia,/daniel$$/.emacs}
@end example

where user @code{daniel} connects as a domain user to the SMB host
@code{melancholia} in the MS Windows domain @code{BIZARRE} to edit
@file{.emacs} located in the home directory (share @code{daniel$}).

Alternatively, for local WINS users (as opposed to domain users),
substitute the domain name with the name of the local host in
UPPERCASE as shown here:

@example
@trampfn{smb,daniel%MELANCHOLIA@@melancholia,/daniel$$/.emacs}
@end example

where user @code{daniel} connects as local user to the SMB host
@code{melancholia} in the local domain @code{MELANCHOLIA} to edit
@file{.emacs} located in the home directory (share @code{daniel$}).

The domain name and user name are optional for @command{smbclient}
authentication.  When user name is not specified, @command{smbclient}
uses the anonymous user (without prompting for password).  This
behavior is unlike other @value{tramp} methods, where local user name
is substituted.

The @option{smb} method is unavailable if Emacs is run under a local
user authentication context in MS Windows.  However such users can
still access remote files using UNC file names instead of @value{tramp}:

@example
//melancholia/daniel$$/.emacs
@end example

UNC file name specification does not allow the specification of a
different user name for authentication like the @command{smbclient}
can.


@item @option{adb}
@cindex method adb
@cindex adb method
@cindex android (with adb method)

@vindex tramp-adb-program
@vindex PATH@r{, environment variable}
This method uses Android Debug Bridge program for accessing Android
devices.  The Android Debug Bridge must be installed locally for
@value{tramp} to work.  Some GNU/Linux distributions provide Android
Debug Bridge as an installation package.  Alternatively, the program
is installed as part of the Android SDK@.  @value{tramp} finds the
@command{adb} program either via the @env{PATH} environment variable
or the absolute path set in the user option @code{tramp-adb-program}.

@vindex tramp-adb-connect-if-not-connected
@value{tramp} connects to Android devices with @option{adb} only when
the user option @code{tramp-adb-connect-if-not-connected} is not
@code{nil}.  Otherwise, the connection must be established outside
Emacs.

@value{tramp} does not require a host name part of the remote file
name when a single Android device is connected to @command{adb}.
@value{tramp} instead uses @file{@trampfn{adb,,}} as the default name.
@command{adb devices} shows available host names.

@option{adb} method normally does not need user name to authenticate
on the Android device because it runs under the @command{adbd}
process.  But when a user name is specified, however, @value{tramp}
applies an @command{su} in the syntax.  When authentication does not
succeed, especially on un-rooted Android devices, @value{tramp}
displays login errors.

For Android devices connected through TCP/IP, a port number can be
specified using @file{device#42} host name syntax or @value{tramp} can
use the default value as declared in @command{adb} command.  Port
numbers are not applicable to Android devices connected through USB@.

@end table


@node GVFS based methods
@section GVFS based external methods
@cindex methods, gvfs
@cindex gvfs based methods
@cindex dbus

GVFS is the virtual file system for the Gnome Desktop,
@uref{https://en.wikipedia.org/wiki/GVFS}.  Remote files on GVFS are
mounted locally through FUSE and @value{tramp} uses this locally
mounted directory internally.

Emacs uses the D-Bus mechanism to communicate with GVFS@.  Emacs must
have the message bus system, D-Bus integration active, @pxref{Top, ,
D-Bus, dbus}.

@table @asis
@item @option{afp}
@cindex method afp
@cindex afp method

This method is for connecting to remote hosts with the Apple Filing
Protocol for accessing files on macOS volumes.  @value{tramp} access
syntax requires a leading volume (share) name, for example:
@file{@trampfn{afp,user@@host,/volume}}.

@item @option{dav}
@item @option{davs}
@cindex method dav
@cindex method davs
@cindex dav method
@cindex davs method

@option{dav} method provides access to WebDAV files and directories
based on standard protocols, such as HTTP@.  @option{davs} does the same
but with SSL encryption.  Both methods support the port numbers.

Paths being part of the WebDAV volume to be mounted by GVFS, as it is
common for OwnCloud or NextCloud file names, are not supported by
these methods.

@item @option{gdrive}
@cindex method gdrive
@cindex gdrive method
@cindex google drive

Via the @option{gdrive} method it is possible to access your Google
Drive online storage.  User and host name of the remote file name are
your email address of the Google Drive credentials, like
@file{@trampfn{gdrive,john.doe@@gmail.com,/}}.  These credentials must
be populated in your @command{Online Accounts} application outside Emacs.

Since Google Drive uses cryptic blob file names internally,
@value{tramp} works with the @code{display-name} of the files.  This
could produce unexpected behavior in case two files in the same
directory have the same @code{display-name}, such a situation must be avoided.

@item @option{obex}
@cindex method obex
@cindex obex method

OBEX is an FTP-like access protocol for cell phones and similar simple
devices.  @value{tramp} supports OBEX over Bluetooth.

@item @option{sftp}
@cindex method sftp
@cindex sftp method

This method uses @command{sftp} in order to securely access remote
hosts.  @command{sftp} is a more secure option for connecting to hosts
that for security reasons refuse @command{ssh} connections.

@item @option{synce}
@cindex method synce
@cindex synce method

@option{synce} method allows connecting to MS Windows Mobile devices.
It uses GVFS for mounting remote files and directories via FUSE and
requires the SYNCE-GVFS plugin.

@end table

@defopt tramp-gvfs-methods
This user option is a list of external methods for GVFS@.  By default,
this list includes @option{afp}, @option{dav}, @option{davs},
@option{gdrive}, @option{obex}, @option{sftp} and @option{synce}.
Other methods to include are: @option{ftp} and @option{smb}.
@end defopt


@node Default Method
@section Selecting a default method
@cindex default method

In a remote file name, the use of a default method is indicated by the
pseudo method @option{-}, @ref{File name syntax}.

@defopt tramp-default-method
Default method is for transferring files.  The user option
@code{tramp-default-method} sets it.  @value{tramp} uses this user
option to determine the default method for remote file names that do
not have one specified.

@lisp
(customize-set-variable 'tramp-default-method "ssh")
@end lisp
@end defopt

@defopt tramp-default-method-alist
Default methods for transferring files can be customized for specific
user and host combinations through the user option
@code{tramp-default-method-alist}.

For example, the following two lines specify to use the @option{ssh}
method for all user names matching @samp{john} and the @option{rsync}
method for all host names matching @samp{lily}.  The third line
specifies to use the @option{su} method for the user @samp{root} on
the host @samp{localhost}.

@lisp
@group
(add-to-list 'tramp-default-method-alist '("" "john" "ssh"))
(add-to-list 'tramp-default-method-alist '("lily" "" "rsync"))
(add-to-list 'tramp-default-method-alist
             '("\\`localhost\\'" "\\`root\\'" "su"))
@end group
@end lisp
@end defopt

@noindent
External methods performance faster for large files.  @pxref{Inline
methods}.  @pxref{External methods}.

Choosing the access method also depends on the security environment.
For example, @option{rsh} and @option{telnet} methods that use clear
text password transfers are inappropriate for over the Internet
connections.  Secure remote connections should use @option{ssh} that
provide encryption.


@subsection Which method to use?
@cindex choosing the right method

@value{tramp} provides maximum number of choices for maximum
flexibility.  Choosing which method depends on the hosts, clients,
network speeds, and the security context.

Start by using an inline method.

External methods might be more efficient for large files, but most
@value{tramp} users edit small files more often than large files.

Enable compression, @code{tramp-inline-compress-start-size}, for a
performance boost for large files.

Since @command{ssh} has become the most common method of remote host
access and it has the most reasonable security protocols, use
@option{ssh} method.  Typical @option{ssh} usage to edit the
@file{/etc/motd} file on the otherhost:

@example
@kbd{C-x C-f @trampfn{ssh,root@@otherhost,/etc/motd} @key{RET}}
@end example

If @option{ssh} is unavailable for whatever reason, look for other
obvious options.  For MS Windows, try the @option{plink} method.  For
Kerberos, try @option{krlogin}.

For editing local files as @option{su} or @option{sudo} methods, try
the shortened syntax of @samp{root}:

@example
@kbd{C-x C-f @trampfn{su,,/etc/motd} @key{RET}}
@end example

For editing large files, @option{scp} is faster than @option{ssh}.
@option{pscp} is faster than @option{plink}.  But this speed
improvement is not always true.


@node Default User
@section Selecting a default user
@cindex default user

@defopt tramp-default-user
A @value{tramp} file name can omit the user name part since
@value{tramp} substitutes the currently logged-in user name.  However
this substitution can be overridden with @code{tramp-default-user}.
For example:

@lisp
(customize-set-variable 'tramp-default-user "root")
@end lisp
@end defopt

@defopt tramp-default-user-alist
Instead of a single default user, @code{tramp-default-user-alist}
allows multiple default user values based on access method or host
name combinations.  The alist can hold multiple values.  For example, to
use the @samp{john} as the default user for the domain
@samp{somewhere.else} only:

@lisp
@group
(add-to-list 'tramp-default-user-alist
             '("ssh" ".*\\.somewhere\\.else\\'" "john"))
@end group
@end lisp

A Caution: @value{tramp} will override any default user specified in
the configuration files outside Emacs, such as @file{~/.ssh/config}.
To stop @value{tramp} from applying the default value, set the
corresponding alist entry to nil:

@lisp
@group
(add-to-list 'tramp-default-user-alist
             '("ssh" "\\`here\\.somewhere\\.else\\'" nil))
@end group
@end lisp

The last entry in @code{tramp-default-user-alist} should be reserved
for catch-all or most often used login.

@lisp
@group
(add-to-list 'tramp-default-user-alist
             '(nil nil "jonas") t)
@end group
@end lisp
@end defopt


@node Default Host
@section Selecting a default host
@cindex default host

@defopt tramp-default-host
When host name is omitted, @value{tramp} substitutes the value from
the @code{tramp-default-host} user option.  It is initially
populated with the local host name where Emacs is running.  The
default method, default user and default host can be overridden as
follows:

@lisp
@group
(custom-set-variables
 '(tramp-default-method "ssh")
 '(tramp-default-user "john")
 '(tramp-default-host "target"))
@end group
@end lisp

With all defaults set, @samp{@trampfn{-,,}} will connect @value{tramp}
to John's home directory on @code{target} via @code{ssh}.
@end defopt

@defopt tramp-default-host-alist
Instead of a single default host, @code{tramp-default-host-alist}
allows multiple default host values based on access method or user
name combinations.  The alist can hold multiple values.  While
@code{tramp-default-host} is sufficient in most cases, some methods,
like @option{adb}, require defaults overwritten.
@end defopt


@node Multi-hops
@section Connecting to a remote host using multiple hops
@cindex multi-hop
@cindex proxy hosts

Multi-hops are methods to reach hosts behind firewalls or to reach the
outside world from inside a bastion host.  With multi-hops,
@value{tramp} can negotiate these hops with the appropriate user/host
authentication at each hop.  All methods until now have been the single
hop kind, where the start and end points of the connection did not
have intermediate check points.

@defopt tramp-default-proxies-alist
@code{tramp-default-proxies-alist} specifies proxy hosts to pass
through.  This user option is list of triples consisting of
@code{(@var{host} @var{user} @var{proxy})}.

The first match is the proxy host through which passes the file name
and the target host matching @var{user}@@@var{host}.  @var{host} and
@var{user} are regular expressions or @code{nil}, interpreted as a
regular expression which always matches.

@var{proxy} is a literal @value{tramp} file name whose local name part
is ignored, and the method and user name parts are optional.

The method must be an inline method (@pxref{Inline methods}).  If
@var{proxy} is @code{nil}, no additional hop is required reaching
@var{user}@@@var{host}.

For example, to pass through the host @samp{bastion.your.domain} as
user @samp{bird} to reach remote hosts outside the local domain:

@lisp
@group
(add-to-list 'tramp-default-proxies-alist
             '("\\." nil "@trampfn{ssh,bird@@bastion.your.domain,}"))
(add-to-list 'tramp-default-proxies-alist
             '("\\.your\\.domain\\'" nil nil))
@end group
@end lisp

@strong{Note}: @code{add-to-list} adds elements at the beginning of a
list.  Therefore, most relevant rules must come last in the list.

Proxy hosts can be cascaded in the alist.  If there is another host
called @samp{jump.your.domain}, which is the only host allowed to
connect to @samp{bastion.your.domain}, then:

@lisp
@group
(add-to-list 'tramp-default-proxies-alist
             '("\\`bastion\\.your\\.domain\\'"
               "\\`bird\\'"
               "@trampfn{ssh,jump.your.domain,}"))
@end group
@end lisp

@var{proxy} can take patterns @code{%h} or @code{%u} for @var{host} or
@var{user} respectively.

To login as @samp{root} on remote hosts in the domain
@samp{your.domain}, but login as @samp{root} is disabled for non-local
access, then use this alist entry:

@lisp
@group
(add-to-list 'tramp-default-proxies-alist
             '("\\.your\\.domain\\'" "\\`root\\'" "@trampfn{ssh,%h,}"))
@end group
@end lisp

Opening @file{@trampfn{sudo,randomhost.your.domain,}} first connects
to @samp{randomhost.your.domain} via @code{ssh} under your account
name, and then performs @code{sudo -u root} on that host.

It is key for the sudo method in the above example to be applied on
the host after reaching it and not on the local host.

@var{host}, @var{user} and @var{proxy} can also take Lisp forms.  These
forms when evaluated must return either a string or @code{nil}.

To generalize (from the previous example): For all hosts, except my
local one, first connect via @command{ssh}, and then apply
@command{sudo -u root}:

@lisp
@group
(add-to-list 'tramp-default-proxies-alist
             '(nil "\\`root\\'" "@trampfn{ssh,%h,}"))
(add-to-list 'tramp-default-proxies-alist
             '((regexp-quote (system-name)) nil nil))
@end group
@end lisp
@end defopt

Passing through hops involves dealing with restricted shells, such as
@command{rbash}.  If @value{tramp} is made aware, then it would use
them for proxies only.

@defopt tramp-restricted-shell-hosts-alist
An alist of regular expressions of hosts running restricted shells,
such as @command{rbash}.  @value{tramp} will then use them only as
proxies.

To specify the bastion host from the example above as running a
restricted shell:

@lisp
@group
(add-to-list 'tramp-restricted-shell-hosts-alist
             "\\`bastion\\.your\\.domain\\'")
@end group
@end lisp
@end defopt


@node Firewalls
@section Passing firewalls
@cindex http tunnel
@cindex proxy hosts, http tunnel

Sometimes, it is not possible to reach a remote host directly.  A
firewall might be in the way, which could be passed via a proxy
server.

Both ssh and PuTTY support such proxy settings, using an HTTP tunnel
via the @command{CONNECT} command (conforming to RFC 2616, 2817
specifications).  Proxy servers using HTTP 1.1 or later protocol
support this command.

@subsection Tunneling with ssh

With ssh, you could use the @code{ProxyCommand} entry in
@file{~/.ssh/config}:

@example
@group
Host host.other.domain
     ProxyCommand nc -X connect -x proxy.your.domain:3128 %h %p
@end group
@end example

@code{nc} is BSD's netcat program, which establishes HTTP tunnels. Any
other program with such a feature could be used as well.

In the example, opening @file{@trampfn{ssh,host.your.domain,}} passes
the HTTP proxy server @samp{proxy.your.domain} on port 3128.

@subsection Tunneling with PuTTY

PuTTY does not need an external program, HTTP tunnel support is
built-in.  In the PuTTY config program, create a session for
@samp{host.your.domain}.  In the @option{Connection/Data} entry,
select the @option{HTTP} option, and add @samp{proxy.your.domain} as
@option{Proxy hostname}, and 3128 as @option{Port}.

Opening @file{@trampfn{plinkx,host.your.domain,}} passes the HTTP
proxy server @samp{proxy.your.domain} on port 3128.


@node Customizing Methods
@section Using Non-Standard Methods
@cindex customizing methods
@cindex using non-standard methods
@cindex create your own methods

@vindex tramp-methods
The @code{tramp-methods} variable currently has an exhaustive list of
predefined methods.  Any part of this list can be modified with more
suitable settings.  Refer to the Lisp documentation of that variable,
accessible with @kbd{C-h v tramp-methods @key{RET}}.


@node Customizing Completion
@section Selecting config files for user/host name completion
@cindex customizing completion
@cindex selecting config files

@vindex tramp-completion-function-alist
@code{tramp-completion-function-alist} uses predefined files for user
and host name completion (@pxref{File name completion}).  For each
method, it keeps a set of configuration files and a function that can
parse that file.  Each entry in @code{tramp-completion-function-alist}
is of the form (@var{method} @var{pair1} @var{pair2} @dots{}).

Each @var{pair} is composed of (@var{function} @var{file}).
@var{function} is responsible for extracting user names and host names
from @var{file} for completion.  There are two functions which access
this variable:

@defun tramp-get-completion-function method
This function returns the list of completion functions for @var{method}.

Example:
@example
@group
(tramp-get-completion-function "rsh")

     @result{} ((tramp-parse-rhosts "/etc/hosts.equiv")
         (tramp-parse-rhosts "~/.rhosts"))
@end group
@end example
@end defun

@defun tramp-set-completion-function method function-list
This function sets @var{function-list} as list of completion functions
for @var{method}.

Example:
@example
@group
(tramp-set-completion-function "ssh"
 '((tramp-parse-sconfig "/etc/ssh_config")
   (tramp-parse-sconfig "~/.ssh/config")))

     @result{} ((tramp-parse-sconfig "/etc/ssh_config")
         (tramp-parse-sconfig "~/.ssh/config"))
@end group
@end example
@end defun

The following predefined functions parsing configuration files exist:

@table @asis
@item @code{tramp-parse-rhosts}
@findex tramp-parse-rhosts

This function parses files which are syntactical equivalent to
@file{~/.rhosts}.  It returns both host names and user names, if
specified.

@item @code{tramp-parse-shosts}
@findex tramp-parse-shosts

This function parses files which are syntactical equivalent to
@file{~/.ssh/known_hosts}.  Since there are no user names specified
in such files, it can return host names only.

@item @code{tramp-parse-sconfig}
@findex tramp-parse-sconfig

This function returns the host nicknames defined by @code{Host} entries
in @file{~/.ssh/config} style files.

@item @code{tramp-parse-shostkeys}
@findex tramp-parse-shostkeys

SSH2 parsing of directories @file{/etc/ssh2/hostkeys/*} and
@file{~/ssh2/hostkeys/*}.  Hosts are coded in file names
@file{hostkey_@var{portnumber}_@var{host-name}.pub}.  User names
are always @code{nil}.

@item @code{tramp-parse-sknownhosts}
@findex tramp-parse-sknownhosts

Another SSH2 style parsing of directories like
@file{/etc/ssh2/knownhosts/*} and @file{~/ssh2/knownhosts/*}.  This
case, hosts names are coded in file names
@file{@var{host-name}.@var{algorithm}.pub}.  User names are always @code{nil}.

@item @code{tramp-parse-hosts}
@findex tramp-parse-hosts

A function dedicated to @file{/etc/hosts} for host names.

@item @code{tramp-parse-passwd}
@findex tramp-parse-passwd

A function which parses @file{/etc/passwd} for user names.

@item @code{tramp-parse-etc-group}
@findex tramp-parse-etc-group

A function which parses @file{/etc/group} for group names.

@item @code{tramp-parse-netrc}
@findex tramp-parse-netrc

A function which parses @file{~/.netrc} and @file{~/.authinfo}-style files.

@end table

To keep a custom file with custom data in a custom structure, a custom
function has to be provided.  This function must meet the following
conventions:

@defun my-tramp-parse file
@var{file} must be either a file on the host, or @code{nil}.  The
function must return a list of (@var{user} @var{host}), which are
taken as candidates for completion for user and host names.

Example:
@example
@group
(my-tramp-parse "~/.my-tramp-hosts")

     @result{} ((nil "toto") ("daniel" "melancholia"))
@end group
@end example
@end defun


@node Password handling
@section Reusing passwords for several connections
@cindex passwords

To avoid repeated prompts for passwords, consider native caching
mechanisms, such as @command{ssh-agent} for @option{ssh}-like
methods, or @command{pageant} for @option{plink}-like methods.

@value{tramp} offers alternatives when native solutions cannot meet
the need.


@anchor{Using an authentication file}
@subsection Using an authentication file

@vindex auth-sources
The package @file{auth-source.el}, originally developed for No Gnus,
reads passwords from different sources, @xref{Help for users, ,
auth-source, auth}.  The default authentication file is
@file{~/.authinfo.gpg}, but this can be changed via the variable
@code{auth-sources}.

@noindent
A typical entry in the authentication file:

@example
machine melancholia port scp login daniel password geheim
@end example

The port can take any @value{tramp} method (@pxref{Inline methods},
@pxref{External methods}).  Omitting port values matches all
@value{tramp} methods.  Domain and ports, as used in @value{tramp}
file name syntax, must be appended to the machine and login items:

@example
machine melancholia#4711 port davs login daniel%BIZARRE password geheim
@end example

@vindex auth-source-debug
Set @code{auth-source-debug} to @code{t} to debug messages.


@anchor{Caching passwords}
@subsection Caching passwords

@value{tramp} can cache passwords as entered and reuse when needed for
the same user or host name independent of the access method.

@vindex password-cache-expiry
@code{password-cache-expiry} sets the duration (in seconds) the
passwords are remembered.  Passwords are never saved permanently nor
can they extend beyond the lifetime of the current Emacs session.  Set
@code{password-cache-expiry} to @code{nil} to disable expiration.

@vindex password-cache
Set @code{password-cache} to @code{nil} to disable password caching.


@node Connection caching
@section Reusing connection related information
@cindex caching

@vindex tramp-persistency-file-name
For faster initial connection times, @value{tramp} stores previous
connection properties in a file specified by the user option
@code{tramp-persistency-file-name}.

The default file name for @code{tramp-persistency-file-name} is
@file{~/.emacs.d/tramp}.

@value{tramp} reads this file during Emacs startup, and writes to it
when exiting Emacs.  Delete this file for @value{tramp} to recreate a
new one on next Emacs startup.

Set @code{tramp-persistency-file-name} to @code{nil} to disable
storing connections persistently.

When @value{tramp} detects a change in the operating system version in
a remote host (via the command @command{uname -sr}), it flushes all
connection related information for that host and creates a new entry.


@node Predefined connection information
@section Setting own connection related information

For more precise customization, parameters specified by
@code{tramp-methods} can be overwritten manually.

@vindex tramp-connection-properties
Set @code{tramp-connection-properties} to manually override
@code{tramp-methods}.  Properties in this list are in the form
@code{(@var{regexp} @var{property} @var{value})}.  @var{regexp}
matches remote file names.  Use @code{nil} to match all.
@var{property} is the property's name, and @var{value} is the
property's value.

@var{property} is any method specific parameter contained in
@code{tramp-methods}.  The parameter key in @code{tramp-methods} is a
symbol name @code{tramp-<foo>}.  To overwrite that property, use the
string @samp{<foo>} for @var{property}.  For example, this changes the
remote shell:

@lisp
@group
(add-to-list 'tramp-connection-properties
             (list (regexp-quote "@trampfn{ssh,user@@randomhost.your.domain,}")
                   "remote-shell" "/bin/ksh"))
@end group

@group
(add-to-list 'tramp-connection-properties
             (list (regexp-quote "@trampfn{ssh,user@@randomhost.your.domain,}")
                   "remote-shell-login" '("-")))
@end group
@end lisp

The parameters @code{tramp-remote-shell} and
@code{tramp-remote-shell-login} in @code{tramp-methods} now have new
values for the remote host.

@var{property} could also be any property found in
@code{tramp-persistency-file-name}.

To get around how restricted shells randomly drop connections, set the
special property @samp{busybox}.  For example:

@lisp
@group
(add-to-list 'tramp-connection-properties
             (list (regexp-quote "@trampfn{ssh,user@@randomhost.your.domain,}")
                   "busybox" t))
@end group
@end lisp


@node Remote programs
@section How @value{tramp} finds and uses programs on the remote host

@value{tramp} requires access to and rights to several commands on
remote hosts: @command{ls}, @command{test}, @command{find} and
@command{cat}.

Besides there are other required programs for @ref{Inline methods} and
@ref{External methods} of connection.

To improve performance and accuracy of remote file access,
@value{tramp} uses @command{perl} (or @command{perl5}) and
@command{grep} when available.

@defopt tramp-remote-path
@code{tramp-remote-path} specifies which remote directory paths
@value{tramp} can search for @ref{Remote programs}.

@vindex tramp-default-remote-path
@value{tramp} uses standard defaults, such as @file{/bin} and
@file{/usr/bin}, which are reasonable for most hosts.  To accommodate
differences in hosts and paths, for example, @file{/bin:/usr/bin} on
Debian GNU/Linux or
@file{/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin} on
Solaris, @value{tramp} queries the remote host with @command{getconf
PATH} and updates the symbol @code{tramp-default-remote-path}.

For instances where hosts keep obscure locations for paths for
security reasons, manually add such paths to local @file{.emacs} as
shown below for @value{tramp} to use when connecting.

@lisp
(add-to-list 'tramp-remote-path "/usr/local/perl/bin")
@end lisp

@vindex tramp-own-remote-path
Another way to find the remote path is to use the path assigned to the
remote user by the remote host.  @value{tramp} does not normally retain
this remote path after login.  However, @code{tramp-own-remote-path}
preserves the path value, which can be used to update
@code{tramp-remote-path}.

@lisp
(add-to-list 'tramp-remote-path 'tramp-own-remote-path)
@end lisp

@strong{Note} that this works only if your remote @command{/bin/sh}
shell supports the login argument @samp{-l}.
@end defopt

When remote search paths are changed, local @value{tramp} caches must
be recomputed.  To force @value{tramp} to recompute afresh, exit
Emacs, remove the persistent file (@pxref{Connection caching}), and
restart Emacs.


@node Remote shell setup
@section Remote shell setup hints
@cindex remote shell setup
@cindex @file{.profile} file
@cindex @file{.login} file
@cindex shell init files

@value{tramp} checks for the availability of standard programs in the
usual locations.  Common tactics include successively trying
@command{test -e}, @command{/usr/bin/test -e}, and @command{/bin/test
-e}.  @command{ls -d} is another approach.  But these approaches do not
help with these new login patterns.

When @value{tramp} encounters two-factor logins or additional challenge
questions, such as entering birth date or security code or passphrase,
@value{tramp} needs a few more configuration steps to accommodate
them.

The difference between a password prompt and a passphrase prompt is
that the password for completing the login while the passphrase is
for authorizing access to local authentication information, such as
the ssh key.

There is no one configuration to accommodate all the variations in
login security, especially not the exotic ones.  However, @value{tramp}
provides a few tweaks to address the most common ones.

@table @asis
@item @code{tramp-shell-prompt-pattern}
@vindex tramp-shell-prompt-pattern

@code{tramp-shell-prompt-pattern} is for remote login shell prompt,
which may not be the same as the local login shell prompt,
@code{shell-prompt-pattern}.  Since most hosts use identical prompts,
@value{tramp} sets a similar default value for both prompts.

@item @code{tramp-password-prompt-regexp}
@item @code{tramp-wrong-passwd-regexp}
@vindex tramp-password-prompt-regexp
@vindex tramp-wrong-passwd-regexp

@value{tramp} uses @code{tramp-password-prompt-regexp} to
distinguish between prompts for passwords and prompts for passphrases.
By default, @code{tramp-password-prompt-regexp} handles the
detection in English language environments.  See a localization
example below:

@lisp
@group
(customize-set-variable
 'tramp-password-prompt-regexp
  (concat
   "^.*"
   (regexp-opt
    '("passphrase" "Passphrase"
      ;; English
      "password" "Password"
      ;; Deutsch
      "passwort" "Passwort"
      ;; Français
      "mot de passe" "Mot de passe")
    t)
   ".*:\0? *"))
@end group
@end lisp

Similar localization may be necessary for handling wrong password
prompts, for which @value{tramp} uses @code{tramp-wrong-passwd-regexp}.

@item @code{tramp-terminal-type}
@vindex tramp-terminal-type
@vindex TERM@r{, environment variable}

@value{tramp} uses the user option @code{tramp-terminal-type} to set
the remote environment variable @env{TERM} for the shells it runs.
Per default, it is @samp{"dumb"}, but this could be changed.  A dumb
terminal is best suited to run the background sessions of
@value{tramp}.  However, running interactive remote shells might
require a different setting.  This could be achieved by tweaking the
@env{TERM} environment variable in @code{process-environment}.

@lisp
@group
(let ((process-environment
       (cons "TERM=xterm-256color" process-environment)))
  (shell))
@end group
@end lisp

@item Determining a @value{tramp} session
@vindex TERM@r{, environment variable}
@vindex INSIDE_EMACS@r{, environment variable}

Sometimes, it is needed to identify whether a shell runs under
@value{tramp} control.  The setting of environment variable @env{TERM}
will help:

@example
@group
if test "$TERM" = "dumb"; then
   ...
fi
@end group
@end example

Another possibility is to check the environment variable
@env{INSIDE_EMACS}.  Like for all subprocesses of Emacs, this is set
to the version of the parent Emacs process, @xref{Interactive Shell, ,
, emacs}.  @value{tramp} adds its own package version to this string,
which could be used for further tests in an inferior shell.  The
string of that environment variable looks always like

@example
@group
echo $INSIDE_EMACS
@result{} 26.2,tramp:2.3.4
@end group
@end example

@item @command{tset} and other questions
@cindex unix command @command{tset}
@cindex @command{tset} unix command

To suppress inappropriate prompts for terminal type, @value{tramp}
sets the @env{TERM} environment variable before the remote login
process begins via the user option @code{tramp-terminal-type} (see
above).  This will silence common @command{tset} related prompts.

@value{tramp}'s strategy for handling such prompts (commonly triggered
from login scripts on remote hosts) is to set the environment
variables so that no prompts interrupt the shell initialization
process.

@vindex tramp-actions-before-shell
An alternative approach is to configure @value{tramp} with strings
that can identify such questions using
@code{tramp-actions-before-shell}.  Example:

@lisp
@group
(defconst my-tramp-prompt-regexp
  (concat (regexp-opt '("Enter the birth date of your mother:") t)
          "\\s-*")
  "Regular expression matching my login prompt question.")
@end group

@group
(defun my-tramp-action (proc vec)
  "Enter \"19000101\" in order to give a correct answer."
  (save-window-excursion
    (with-current-buffer (tramp-get-connection-buffer vec)
      (tramp-message vec 6 "\n%s" (buffer-string))
      (tramp-send-string vec "19000101"))))
@end group

@group
(add-to-list 'tramp-actions-before-shell
             '(my-tramp-prompt-regexp my-tramp-action))
@end group
@end lisp


@item Conflicting names for users and variables in @file{.profile}

When a user name is the same as a variable name in a local file, such
as @file{.profile}, then @value{tramp} may send incorrect values for
environment variables.  To avoid incorrect values, change the local
variable name to something different from the user name.  For example,
if the user name is @env{FRUMPLE}, then change the variable name to
@env{FRUMPLE_DIR}.


@item Non-Bourne commands in @file{.profile}

When the remote host's @file{.profile} is also used for shells other
than Bourne shell, then some incompatible syntaxes for commands in
@file{.profile} may trigger errors in Bourne shell on the host and may
not complete client's @value{tramp} connections.

One example of a Bourne shell incompatible syntax in @file{.profile}:
using @command{export FOO=bar} instead of @command{FOO=bar; export
FOO}.  After remote login, @value{tramp} will trigger an error during
its execution of @command{/bin/sh} on the remote host because Bourne
shell does not recognize the export command as entered in
@file{.profile}.

Likewise, (@code{~}) character in paths will cause errors because
Bourne shell does not do (@code{~}) character expansions.

One approach to avoiding these incompatibilities is to make all
commands in @file{~/.shrc} and @file{~/.profile} Bourne shell
compatible so @value{tramp} can complete connections to that remote.
To accommodate using non-Bourne shells on that remote, use other
shell-specific config files.  For example, bash can use
@file{~/.bash_profile} and ignore @file{.profile}.


@item Interactive shell prompt

@vindex INSIDE_EMACS@r{, environment variable}
@vindex SHELLNAME@r{, environment variable}
@vindex ESHELL@r{, environment variable}
@value{tramp} redefines the remote shell prompt internally for robust
parsing.  This redefinition affects the looks of a prompt in an
interactive remote shell through commands, such as @kbd{M-x shell
@key{RET}}.  Such prompts, however, can be reset to something more
readable and recognizable using these @value{tramp} variables.

@value{tramp} sets the @env{INSIDE_EMACS} variable in the startup
script file @file{~/.emacs_SHELLNAME}.

@env{SHELLNAME} is @code{bash} or equivalent shell names.  Change it by
setting the environment variable @env{ESHELL} in the @file{.emacs} as
follows:

@lisp
(setenv "ESHELL" "bash")
@end lisp

Then re-set the prompt string in @file{~/.emacs_SHELLNAME} as follows:

@example
@group
# Reset the prompt for remote @value{tramp} shells.
if [ "$@{INSIDE_EMACS/*tramp*/tramp@}" == "tramp" ] ; then
   PS1="[\u@@\h \w]$ "
fi
@end group
@end example

@ifinfo
@xref{Interactive Shell, , , emacs}.
@end ifinfo

@item @command{busybox} / @command{nc}
@cindex unix command nc
@cindex nc unix command

@value{tramp}'s @option{nc} method uses the @command{nc} command to
install and execute a listener as follows (see @code{tramp-methods}):

@example
$ nc -l -p 42
@end example

The above command-line syntax has changed with @command{busybox}
versions.  If @command{nc} refuses the @samp{-p} parameter, then
overwrite as follows:

@lisp
@group
(add-to-list
 'tramp-connection-properties
 `(,(regexp-quote "192.168.0.1")
   "remote-copy-args" (("-l") ("%r"))))
@end group
@end lisp

@noindent
where @samp{192.168.0.1} is the remote host IP address
(@pxref{Predefined connection information}).

@end table


@node Android shell setup
@section Android shell setup hints
@cindex android shell setup for ssh

@value{tramp} uses the @option{adb} method to access Android devices.
Android devices provide a restricted shell access through an USB
connection.  The local host must have the @command{adb} program
installed.  Usually, it is sufficient to open the file
@file{@trampfn{adb,,/}}.  Then you can navigate in the filesystem via
@code{dired}.

Alternatively, applications such as @code{Termux} or @code{SSHDroid}
that run @command{sshd} process on the Android device can accept any
@option{ssh}-based methods provided these settings are adjusted:

@itemize
@item
@command{sh} must be specified for remote shell since Android devices
do not provide @command{/bin/sh}.  @command{sh} will then invoke
whatever shell is installed on the device with this setting:

@lisp
@group
(add-to-list 'tramp-connection-properties
	     (list (regexp-quote "192.168.0.26") "remote-shell" "sh"))
@end group
@end lisp

@noindent
where @samp{192.168.0.26} is the Android device's IP address.
(@pxref{Predefined connection information}).

@item
@value{tramp} requires preserving @env{PATH} environment variable from
user settings.  Android devices prefer @file{/system/xbin} path over
@file{/system/bin}.  Both of these are set as follows:

@lisp
@group
(add-to-list 'tramp-remote-path 'tramp-own-remote-path)
(add-to-list 'tramp-remote-path "/system/xbin")
@end group
@end lisp

@item
When the Android device is not @samp{rooted}, specify a writable
directory for temporary files:

@lisp
(add-to-list 'tramp-remote-process-environment "TMPDIR=$HOME")
@end lisp

@item
Open a remote connection with the command @kbd{C-x C-f
@trampfn{ssh,192.168.0.26#2222,} @key{RET}}, where @command{sshd} is
listening on port @samp{2222}.

To add a corresponding entry to the @file{~/.ssh/config} file
(recommended), use this:

@example
@group
Host android
     HostName 192.168.0.26
     User root
     Port 2222
@end group
@end example

@noindent
To use the host name @samp{android} instead of the IP address shown in
the previous example, fix the connection properties as follows:

@lisp
@group
(add-to-list 'tramp-connection-properties
	     (list (regexp-quote "android") "remote-shell" "sh"))
@end group
@end lisp

@noindent
Open a remote connection with a more concise command @kbd{C-x C-f
@trampfn{ssh,android,} @key{RET}}.
@end itemize


@node Auto-save and Backup
@section Auto-save and Backup configuration
@cindex auto-save
@cindex backup

@vindex backup-directory-alist
To avoid @value{tramp} from saving backup files owned by @samp{root}
to locations accessible to others, default backup settings in
@code{backup-directory-alist} have to be altered.

Here's a scenario where files could be inadvertently exposed.  Emacs
by default writes backup files to the same directory as the original
files unless changed to another location, such as
@file{~/.emacs.d/backups/}.  Such a directory will also be used by
default by @value{tramp} when using, say, a restricted file
@file{@trampfn{su,root@@localhost,/etc/secretfile}}.  The backup file
of the secretfile is now owned by the user logged in from
@value{tramp} and not @samp{root}.

When @code{backup-directory-alist} is @code{nil} (the default), such
problems do not occur.

To ``turn off'' the backup feature for remote files and stop
@value{tramp} from saving to the backup directory, use this:

@lisp
@group
(add-to-list 'backup-directory-alist
             (cons tramp-file-name-regexp nil))
@end group
@end lisp

@noindent
Disabling backups can be targeted to just the @option{su} and
@option{sudo} methods:

@lisp
@group
(setq backup-enable-predicate
      (lambda (name)
        (and (normal-backup-enable-predicate name)
             (not
              (let ((method (file-remote-p name 'method)))
                (when (stringp method)
                  (member method '("su" "sudo"))))))))
@end group
@end lisp

@vindex tramp-backup-directory-alist
Another option is to create better backup file naming with user and
host names prefixed to the file name.  For example, transforming
@file{/etc/secretfile} to
@file{~/.emacs.d/backups/!su:root@@localhost:!etc!secretfile}, set the
@value{tramp} user option @code{tramp-backup-directory-alist} from
the existing user option @code{backup-directory-alist}.

Then @value{tramp} backs up to a file name that is transformed with a
prefix consisting of the DIRECTORY name.  This file name prefixing
happens only when the DIRECTORY is an absolute local file name.

@noindent
Example:

@lisp
@group
(add-to-list 'backup-directory-alist
             (cons "." "~/.emacs.d/backups/"))
(customize-set-variable
 'tramp-backup-directory-alist backup-directory-alist)
@end group
@end lisp

@noindent
The backup file name of
@file{@trampfn{su,root@@localhost,/etc/secretfile}} would be
@ifset unified
@file{@trampfn{su,root@@localhost,~/.emacs.d/backups/!su:root@@localhost:!etc!secretfile~}}
@end ifset
@ifset separate
@file{@trampfn{su,root@@localhost,~/.emacs.d/backups/![su!root@@localhost]!etc!secretfile~}}
@end ifset

@vindex auto-save-file-name-transforms
Just as for backup files, similar issues of file naming affect
auto-saving remote files.  Auto-saved files are saved in the directory
specified by the user option @code{auto-save-file-name-transforms}.
By default this is set to the local temporary directory.  But in some
versions of Debian GNU/Linux, this points to the source directory
where the Emacs was compiled.  Reset such values to a valid directory.

Set @code{auto-save-file-name-transforms} to @code{nil} to save
auto-saved files to the same directory as the original file.

@vindex tramp-auto-save-directory
Alternatively, set the user option @code{tramp-auto-save-directory}
to direct all auto saves to that location.

@node Windows setup hints
@section Issues with Cygwin ssh
@cindex cygwin, issues

This section is incomplete.  Please share your solutions.

@cindex method sshx with cygwin
@cindex sshx method with cygwin

Cygwin's @command{ssh} works only with a Cygwin version of Emacs.  To
check for compatibility: type @kbd{M-x eshell @key{RET}}, and start
@kbd{ssh test.host @key{RET}}.  Incompatibilities trigger this
message:

@example
Pseudo-terminal will not be allocated because stdin is not a terminal.
@end example

Some older versions of Cygwin's @command{ssh} work with the
@option{sshx} access method.  Consult Cygwin's FAQ at
@uref{https://cygwin.com/faq/} for details.

@cindex cygwin and @command{fakecygpty}
@cindex @command{fakecygpty} and cygwin

On @uref{https://www.emacswiki.org/emacs/SshWithNTEmacs, the Emacs
Wiki} it is explained how to use the helper program
@command{fakecygpty} to fix this problem.

@cindex method scpx with cygwin
@cindex scpx method with cygwin

When using the @option{scpx} access method, Emacs may call
@command{scp} with MS Windows file naming, such as @code{c:/foo}.  But
the version of @command{scp} that is installed with Cygwin does not
know about MS Windows file naming, which causes it to incorrectly look
for a host named @code{c}.

A workaround: write a wrapper script for @option{scp} to convert
Windows file names to Cygwin file names.

@cindex cygwin and @command{ssh-agent}
@cindex @env{SSH_AUTH_SOCK} and emacs on ms windows
@vindex SSH_AUTH_SOCK@r{, environment variable}

When using the @command{ssh-agent} on MS Windows for password-less
interaction, @option{ssh} methods depend on the environment variable
@env{SSH_AUTH_SOCK}.  But this variable is not set when Emacs is
started from a Desktop shortcut and authentication fails.

One workaround is to use an MS Windows based SSH Agent, such as
Pageant.  It is part of the Putty Suite of tools.

The fallback is to start Emacs from a shell.


@node Usage
@chapter Using @value{tramp}
@cindex using @value{tramp}

@value{tramp} operates transparently, accessing remote files as if
they are local.  However, @value{tramp} employs a formalized remote
file naming syntax to perform its functions transparently.  This
syntax consists of many parts specifying access methods,
authentication, host names, and file names.  Ange FTP uses a similar
syntax.

@cindex type-ahead

Unlike opening local files in Emacs, which are instantaneous, opening
remote files in @value{tramp} is slower at first.  Sometimes there is
a noticeable delay before the prompts for passwords or authentication
appear in the minibuffer.  Hitting @kbd{@key{RET}} or other keys
during this gap will be processed by Emacs.  This type-ahead facility
is a feature of Emacs that may cause missed prompts when using
@value{tramp}.

@menu
* File name syntax::            @value{tramp} file name conventions.
@ifset unified
* Change file name syntax::     Alternative file name syntax.
@end ifset
* File name completion::        File name completion.
* Ad-hoc multi-hops::           Declaring multiple hops in the file name.
* Remote processes::            Integration with other Emacs packages.
* Cleanup remote connections::  Cleanup remote connections.
@end menu


@node File name syntax
@section @value{tramp} file name conventions
@cindex file name syntax
@cindex file name examples

@file{@trampfn{method,host,/path/to/file}} opens file @var{/path/to/file}
on the remote host @var{host}, using the method @var{method}.

@table @file
@item @value{prefix}ssh@value{postfixhop}melancholia@value{postfix}.emacs
For the file @file{.emacs} located in the home directory, on the host
@code{melancholia}, using method @code{ssh}.

@item @value{prefix}ssh@value{postfixhop}melancholia.danann.net@value{postfix}.emacs
For the file @file{.emacs} specified using the fully qualified domain name of
the host.

@item @value{prefix}ssh@value{postfixhop}melancholia@value{postfix}~/.emacs
For the file @file{.emacs} specified using the @file{~}, which is expanded.

@item @value{prefix}ssh@value{postfixhop}melancholia@value{postfix}~daniel/.emacs
For the file @file{.emacs} located in @code{daniel}'s home directory
on the host, @code{melancholia}.  The @file{~<user>} construct is
expanded to the home directory of that user on the remote host.

@item @value{prefix}ssh@value{postfixhop}melancholia@value{postfix}/etc/squid.conf
For the file @file{/etc/squid.conf} on the host @code{melancholia}.

@end table

@var{host} can take IPv4 or IPv6 address, as in
@file{@trampfn{ssh,127.0.0.1,.emacs}} or
@file{@trampfn{ssh,@value{ipv6prefix}::1@value{ipv6postfix},.emacs}}.
@ifset unified
For syntactical reasons, IPv6 addresses must be embedded in square
brackets @file{@value{ipv6prefix}} and @file{@value{ipv6postfix}}.
@end ifset

By default, @value{tramp} will use the current local user name as the
remote user name for log in to the remote host.  Specifying a different
name using the proper syntax will override this default behavior:

@example
@trampfn{method,user@@host,path/to/file}
@end example

@file{@trampfn{ssh,daniel@@melancholia,.emacs}} is for file
@file{.emacs} in @code{daniel}'s home directory on the host,
@code{melancholia}, accessing via method @code{ssh}.

For specifying port numbers, affix @file{#<port>} to the host
name.  For example: @file{@trampfn{ssh,daniel@@melancholia#42,.emacs}}.

All method, user name, host name, port number and local name parts are
optional, @xref{Default Method}, @xref{Default User}, @xref{Default Host}.
@ifset unified
For syntactical reasons, the default method must be indicated by the
pseudo method @file{-}.
@end ifset


@ifset unified
@node Change file name syntax
@section Alternative file name syntax
@cindex change file name syntax
@cindex alternative file name syntax

The syntax described in @ref{File name syntax} is the @code{default}
syntax, which is active after Emacs startup.  However, this can be
changed.

@deffn Command tramp-change-syntax syntax
This command changes the syntax @value{tramp} uses for remote file
names.  Beside the @code{default} value, @var{syntax} can be

@itemize
@item @code{simplified}
@cindex simplified syntax

The remote file name syntax is similar to the syntax used by Ange FTP.
A remote file name has the form
@code{@value{prefix}user@@host@value{postfix}path/to/file}.  The
@code{user@@} part is optional, and the method is determined by
@ref{Default Method}.

@item @code{separate}
@cindex separate syntax

@clear unified
@set separate
@include trampver.texi
The remote file name syntax is similar to the syntax used by XEmacs.
A remote file name has the form
@code{@trampfn{method,user@@host,path/to/file}}.  The @code{method}
and @code{user@@} parts are optional.
@clear separate
@set unified
@include trampver.texi
@end itemize
@end deffn

@defvar tramp-file-name-regexp
This variable keeps a regexp which matches the selected remote file
name syntax.  However, it is not recommended to use this variable in
external packages, a call of @code{file-remote-p} is much more
appropriate.
@ifinfo
@pxref{Magic File Names, , , elisp}
@end ifinfo
@end defvar
@end ifset


@node File name completion
@section File name completion
@cindex file name completion

@value{tramp} can complete the following @value{tramp} file name
components: method names, user names, host names, and file names
located on remote hosts.  Enable this by activating partial completion
in @file{.emacs}.
@ifinfo
@xref{Completion Options, , , emacs}.
@end ifinfo

For example, type @kbd{C-x C-f @value{prefixwithspace} s @key{TAB}},
@value{tramp} completion choices show up as

@example
@group
@multitable @columnfractions .2 .2 .2 .2 .2
@item @c
  sbin/ @tab @c
  @value{prefixhop}scp@value{postfix} @tab @c
  @value{prefixhop}scpx@value{postfix} @tab @c
  @value{prefixhop}sftp@value{postfix} @tab @c
  @value{prefixhop}sg@value{postfix}
@item @c
  @value{prefixhop}smb@value{postfix} @tab @c
  srv/ @tab @c
  @value{prefixhop}ssh@value{postfix} @tab @c
  @value{prefixhop}sshx@value{postfix} @tab @c
  @value{prefixhop}su@value{postfix}
@item @c
  @value{prefixhop}sudo@value{postfix} @tab @c
  sys/
@end multitable
@end group
@end example

@samp{@value{prefixhop}ssh@value{postfixhop}} is a possible
completion for the respective method, and @samp{sbin/} stands for the
directory @file{/sbin} on your local host.

Type @kbd{s h @value{postfixhop}} for the minibuffer completion to
@samp{@value{prefix}ssh@value{postfixhop}}.  Typing @kbd{@key{TAB}}
shows host names @value{tramp} extracts from @file{~/.ssh/config}
file, for example.

@example
@group
@multitable @columnfractions .5 .5
@item @c
  @value{prefixhop}ssh@value{postfixhop}127.0.0.1@value{postfix} @tab @c
  @value{prefixhop}ssh@value{postfixhop}192.168.0.1@value{postfix}
@item @c
  @value{prefixhop}ssh@value{postfixhop}@value{ipv6prefix}::1@value{ipv6postfix}@value{postfix} @tab @c
  @value{prefixhop}ssh@value{postfixhop}localhost@value{postfix}
@item @c
  @value{prefixhop}ssh@value{postfixhop}melancholia.danann.net@value{postfix} @tab @c
  @value{prefixhop}ssh@value{postfixhop}melancholia@value{postfix}
@end multitable
@end group
@end example

Choose a host from the above list and then continue to complete file
names on that host.

When the configuration (@pxref{Customizing Completion}) includes user
names, then the completion lists will account for the user names as well.

Remote hosts previously visited or hosts whose connections are kept
persistently (@pxref{Connection caching}) will be included in the
completion lists.

After remote host name completion comes completion of file names on
the remote host.  It works the same as with local host file completion
except that killing with double-slash @file{//} kills only the file
name part of the @value{tramp} file name syntax.  A triple-slash
stands for the default behavior.
@ifinfo
@xref{Minibuffer File, , , emacs}.
@end ifinfo

@noindent
Example:

@example
@group
@kbd{C-x C-f @trampfn{ssh,melancholia,/usr/local/bin//etc} @key{TAB}}
     @print{} @trampfn{ssh,melancholia,/etc}

@kbd{C-x C-f @trampfn{ssh,melancholia,//etc} @key{TAB}}
     @print{} /etc

@kbd{C-x C-f @trampfn{ssh,melancholia,/usr/local/bin///etc} @key{TAB}}
     @print{} /etc
@end group
@end example

During file name completion, remote directory contents are re-read
regularly to account for any changes in the filesystem that may affect
the completion candidates.  Such re-reads can account for changes to
the file system by applications outside Emacs (@pxref{Connection
caching}).

@defopt tramp-completion-reread-directory-timeout
The timeout is number of seconds since last remote command for
rereading remote directory contents.  A value of 0 re-reads
immediately during file name completion, @code{nil} uses cached
directory contents.
@end defopt


@node Ad-hoc multi-hops
@section Declaring multiple hops in the file name
@cindex multi-hop, ad-hoc
@cindex proxy hosts, ad-hoc

@value{tramp} file name syntax can accommodate ad hoc specification of
multiple proxies without using @code{tramp-default-proxies-alist}
configuration setup(@pxref{Multi-hops}).

Each proxy is specified using the same syntax as the remote host
specification minus the file name part.  Each hop is separated by a
@samp{|}.  Chain the proxies from the starting host to the destination
remote host name and file name.  For example, hopping over a single
proxy @samp{bird@@bastion} to a remote file on @samp{you@@remotehost}:

@example
@c @kbd{C-x C-f @trampfn{ssh@value{postfixhop}bird@@bastion|ssh,you,remotehost,/path} @key{RET}}
@kbd{C-x C-f @value{prefix}ssh@value{postfixhop}bird@@bastion|ssh@value{postfixhop}you@@remotehost@value{postfix}/path @key{RET}}
@end example

Each involved method must be an inline method (@pxref{Inline methods}).

Proxies can take patterns @code{%h} or @code{%u}.

@value{tramp} adds the ad-hoc definitions on the fly to
@code{tramp-default-proxies-alist} and is available for re-use
during that Emacs session.  Subsequent @value{tramp} connections to
the same remote host can then use the shortcut form:
@samp{@trampfn{ssh,you@@remotehost,/path}}.

@defopt tramp-save-ad-hoc-proxies
For ad-hoc definitions to be saved automatically in
@code{tramp-default-proxies-alist} for future Emacs sessions, set
@code{tramp-save-ad-hoc-proxies} to non-@code{nil}.

@lisp
(customize-set-variable 'tramp-save-ad-hoc-proxies t)
@end lisp
@end defopt


@node Remote processes
@section Integration with other Emacs packages
@cindex @code{compile}
@cindex @code{recompile}

@value{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 @value{tramp}'s use.

This type of integration does not work with the @option{ftp} method,
and does not support the pty association as specified in
@code{start-file-process}.

@code{process-file} and @code{start-file-process} work on the remote
host when the variable @code{default-directory} is remote:

@lisp
@group
(let ((default-directory "/ssh:remote.host:"))
  (start-file-process "grep" (get-buffer-create "*grep*")
                      "/bin/sh" "-c" "grep -e tramp *"))
@end group
@end lisp

Remote processes do not apply to GVFS (see @ref{GVFS based methods})
because the remote file system is mounted on the local host and
@value{tramp} just accesses by changing the @code{default-directory}.

@value{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 @value{tramp}: @file{compile.el} (commands
like @code{compile} and @code{grep}) and @file{gud.el} (@code{gdb} or
@code{perldb}).

For @value{tramp} to find the command on the remote, it must be
accessible through the default search path as setup by @value{tramp}
upon first connection.  Alternatively, use an absolute path or extend
@code{tramp-remote-path} (see @ref{Remote programs}):

@lisp
@group
(add-to-list 'tramp-remote-path "~/bin")
(add-to-list 'tramp-remote-path "/appli/pub/bin")
@end group
@end lisp

@vindex tramp-remote-process-environment
Customize user option @code{tramp-remote-process-environment} to
suit the remote program's environment for the remote host.
@code{tramp-remote-process-environment} is a list of strings
structured similar to @code{process-environment}, where each element
is a string of the form @samp{ENVVARNAME=VALUE}.

To avoid any conflicts with local host environment variables set
through local configuration files, such as @file{~/.profile}, use
@samp{ENVVARNAME=} to unset them for the remote environment.

@noindent
Use @code{add-to-list} to add entries:

@lisp
(add-to-list 'tramp-remote-process-environment "JAVA_HOME=/opt/java")
@end lisp

@vindex HISTORY@r{, environment variable}
Modifying or deleting already existing values in the
@code{tramp-remote-process-environment} list may not be feasible on
restricted remote hosts.  For example, some system administrators
disallow changing @env{HISTORY} environment variable.  To accommodate
such restrictions when using @value{tramp}, fix the
@code{tramp-remote-process-environment} by the following code in the
local @file{.emacs} file:

@lisp
@group
(let ((process-environment tramp-remote-process-environment))
  (setenv "HISTORY" nil)
  (setq tramp-remote-process-environment process-environment))
@end group
@end lisp

@vindex ENV@r{, environment variable}
Setting the @env{ENV} environment variable instructs some shells to
read an initialization file.  Per default, @value{tramp} has disabled
this.  You could overwrite this behavior by evaluating

@lisp
@group
(let ((process-environment tramp-remote-process-environment))
  (setenv "ENV" "$HOME/.profile")
  (setq tramp-remote-process-environment process-environment))
@end group
@end lisp

In addition to @code{tramp-remote-process-environment}, you can set
environment variables for individual remote process calls by
let-binding @code{process-environment}.  @value{tramp} applies any
entries not present in the global default value of
@code{process-environment} (overriding
@code{tramp-remote-process-environment} settings, if they conflict).
For example:

@lisp
@group
(let ((process-environment (cons "HGPLAIN=1" process-environment)))
  (process-file @dots{}))
@end group
@end lisp

@vindex HGPLAIN@r{, environment variable}
Let-binding in this way works regardless of whether the process to be
called is local or remote, since @value{tramp} would add just the
@env{HGPLAIN} setting and local processes would take whole value of
@code{process-environment} along with the new value of @env{HGPLAIN}.

For integrating other Emacs packages so @value{tramp} can execute
remotely, please file a bug report.  @xref{Bug Reports}.


@subsection Running remote programs that create local X11 windows

@vindex DISPLAY@r{, environment variable}
To allow a remote program to create an X11 window on the local host,
set the @env{DISPLAY} environment variable for the remote host as
follows in the local @file{.emacs} file:

@lisp
@group
(add-to-list 'tramp-remote-process-environment
             (format "DISPLAY=%s" (getenv "DISPLAY")))
@end group
@end lisp

@noindent
@code{(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 @code{(getenv "DISPLAY")} with a
hard-coded, fixed name.  Note that using @code{:0} for X11 display name
here will not work as expected.

An alternate approach is specify @code{ForwardX11 yes} or
@code{ForwardX11Trusted yes} in @file{~/.ssh/config} on the local
host.


@subsection Running @code{shell} on a remote host
@cindex @code{shell}

Set @code{explicit-shell-file-name} to the appropriate shell name
when using @value{tramp} between two hosts with different operating
systems, such as @samp{windows-nt} and @samp{gnu/linux}.  This option
ensures the correct name of the remote shell program.

When @code{explicit-shell-file-name} is equal to @code{nil}, calling
@code{shell} interactively will prompt for a shell name.

Starting with Emacs 26, you could use connection-local variables for
setting different values of @code{explicit-shell-file-name} for
different remote hosts.
@ifinfo
@pxref{Connection Local Variables, , , elisp}
@end ifinfo

@lisp
@group
(connection-local-set-profile-variables
  'remote-bash
  '((explicit-shell-file-name . "/bin/bash")
    (explicit-bash-args . ("-i"))))
@end group

@group
(connection-local-set-profile-variables
  'remote-ksh
  '((explicit-shell-file-name . "/bin/ksh")
    (explicit-ksh-args . ("-i"))))
@end group

@group
(connection-local-set-profiles
  '(:application tramp :protocol "ssh" :machine "localhost")
  'remote-bash)
@end group

@group
(connection-local-set-profiles
  `(:application tramp :protocol "sudo"
    :user "root" :machine ,(system-name))
  'remote-ksh)
@end group
@end lisp


@subsection Running @code{shell-command} on a remote host
@cindex @code{shell-command}

@code{shell-command} executes commands synchronously or asynchronously
on remote hosts and displays output in buffers on the local
host.  Example:

@example
@group
@kbd{C-x C-f @trampfn{sudo,,} @key{RET}}
@kbd{M-& tail -f /var/log/syslog.log @key{RET}}
@end group
@end example

@command{tail} command outputs continuously to the local buffer,
@file{*Async Shell Command*}

@kbd{M-x auto-revert-tail-mode @key{RET}} runs similarly showing
continuous output.


@subsection Running @code{eshell} on a remote host
@cindex @code{eshell}

@value{tramp} is integrated into @file{eshell.el}, which enables
interactive eshell sessions on remote hosts at the command prompt.
You must add the module @code{em-tramp} to @code{eshell-modules-list}.
Here's a sample interaction after opening @kbd{M-x eshell @key{RET}}
on a remote host:

@example
@group
@b{~ $} cd @trampfn{sudo,,/etc} @key{RET}
@b{@trampfn{sudo,root@@host,/etc} $} hostname @key{RET}
host
@b{@trampfn{sudo,root@@host,/etc} $} id @key{RET}
uid=0(root) gid=0(root) groups=0(root)
@b{@trampfn{sudo,root@@host,/etc} $} find-file shadow @key{RET}
#<buffer shadow>
@b{@trampfn{sudo,root@@host,/etc} $}
@end group
@end example

@code{eshell} added custom @code{su} and @code{sudo} commands that set
the default directory correctly for the @file{*eshell*} buffer.
@value{tramp} silently updates @code{tramp-default-proxies-alist}
with an entry for this directory (@pxref{Multi-hops}):

@example
@group
@b{~ $} cd @trampfn{ssh,user@@remotehost,/etc} @key{RET}
@b{@trampfn{ssh,user@@remotehost,/etc} $} find-file shadow @key{RET}
File is not readable: @trampfn{ssh,user@@remotehost,/etc/shadow}
@b{@trampfn{ssh,user@@remotehost,/etc} $} sudo find-file shadow @key{RET}
#<buffer shadow>
@end group

@group
@b{@trampfn{ssh,user@@remotehost,/etc} $} su - @key{RET}
@b{@trampfn{su,root@@remotehost,/root} $} id @key{RET}
uid=0(root) gid=0(root) groups=0(root)
@b{@trampfn{su,root@@remotehost,/root} $}
@end group
@end example


@anchor{Running a debugger on a remote host}
@subsection Running a debugger on a remote host
@cindex @code{gud}
@cindex @code{gdb}
@cindex @code{perldb}

@file{gud.el} provides a unified interface to symbolic debuggers
@ifinfo
(@ref{Debuggers, , , emacs}).
@end ifinfo
@value{tramp} can run debug on remote hosts by calling @code{gdb}
with a remote file name:

@example
@group
@kbd{M-x gdb @key{RET}}
@b{Run gdb (like this):} gdb -i=mi @trampfn{ssh,host,~/myprog} @key{RET}
@end group
@end example

Since the remote @code{gdb} and @code{gdb-inferior} processes do not
belong to the same process group on the remote host, there will be a
warning, which can be ignored:

@example
&"warning: GDB: Failed to set controlling terminal: Operation not permitted\n"
@end example

@noindent
As consequence, there will be restrictions in I/O of the process to be
debugged.

Relative file names are based on the remote default directory.  When
@file{myprog.pl} exists in @file{@trampfn{ssh,host,/home/user}}, valid
calls include:

@example
@group
@kbd{M-x perldb @key{RET}}
@b{Run perldb (like this):} perl -d myprog.pl @key{RET}
@end group
@end example

Just the local part of a remote file name, such as @command{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.


@subsection Running remote processes on MS Windows hosts
@cindex @command{winexe}
@cindex @command{powershell}

@command{winexe} runs processes on a remote MS Windows host, and
@value{tramp} can use it for @code{process-file} and
@code{start-file-process}.

@code{tramp-smb-winexe-program} specifies the local @command{winexe}
command.  Powershell V2.0 on the remote host is required to run
processes triggered from @value{tramp}.

@code{explicit-shell-file-name} and @code{explicit-*-args} have to
be set properly so @kbd{M-x shell @key{RET}} can open a proper remote
shell on a MS Windows host.  To open @command{cmd}, set it as follows:

@lisp
@group
(setq explicit-shell-file-name "cmd"
      explicit-cmd-args '("/q"))
@end group
@end lisp

@noindent
To open @command{powershell} as a remote shell, use this:

@lisp
@group
(setq explicit-shell-file-name "powershell"
      explicit-powershell-args '("-file" "-"))
@end group
@end lisp


@node Cleanup remote connections
@section Cleanup remote connections
@cindex cleanup

@value{tramp} provides several ways to flush remote connections.

@deffn Command tramp-cleanup-connection vec
This command flushes all connection related objects.  @option{vec} is
the internal representation of a remote connection.  When called
interactively, this command lists active remote connections in the
minibuffer.  Each connection is of the format
@file{@trampfn{method,user@@host,}}.  Flushing remote connections also
cleans the password cache (@pxref{Password handling}), file cache,
connection cache (@pxref{Connection caching}), and connection buffers.
@end deffn

@deffn Command tramp-cleanup-this-connection
Flushes only the current buffer's remote connection objects, the same
as in @code{tramp-cleanup-connection}.
@end deffn

@deffn Command tramp-cleanup-all-connections
Flushes all active remote connection objects, the same as in
@code{tramp-cleanup-connection}.
@end deffn

@deffn Command tramp-cleanup-all-buffers
Just as for @code{tramp-cleanup-all-connections}, all remote
connections are cleaned up in addition to killing buffers related to
that remote connection.
@end deffn


@node Bug Reports
@chapter Reporting Bugs and Problems
@cindex bug reports

@value{tramp}'s development team is actively engaged in solving bugs
and problems and looks to feature requests and suggestions.

@value{tramp}'s mailing list is the place for more advice and
information on working with @value{tramp}, solving problems,
discussing, and general discussions about @value{tramp}.

@value{tramp}'s mailing list is moderated but even non-subscribers can
post for moderator approval.  Sometimes this approval step may take as
long as 48 hours due to public holidays.

@email{tramp-devel@@gnu.org} is the mailing list.  Messages sent to
this address go to all the subscribers.  This is @emph{not} the
address to send subscription requests to.

To subscribe to the mailing list, visit:
@uref{https://lists.gnu.org/mailman/listinfo/tramp-devel/, the
@value{tramp} Mail Subscription Page}.

@ifset installchapter
Before sending a bug report, run the test suite first @ref{Testing}.
@end ifset

@findex tramp-bug
Check if the bug or problem is already addressed in @xref{Frequently
Asked Questions}.

Run @kbd{M-x tramp-bug @key{RET}} to generate a buffer with details of
the system along with the details of the @value{tramp} installation.
Please include these details with the bug report.

The bug report must describe in as excruciating detail as possible the
steps required to reproduce the problem.  These details must include
the setup of the remote host and any special or unique conditions that
exist.

Include a minimal test case that reproduces the problem.  This will
help the development team find the best solution and avoid unrelated
detours.

To exclude cache-related problems, flush all caches before running the
test, @ref{Cleanup remote connections}.

When including @value{tramp}'s messages in the bug report, increase
the verbosity level to 6 (@pxref{Traces and Profiles, Traces}) in the
@file{~/.emacs} file before repeating steps to the bug.  Include the
contents of the @file{*tramp/foo*} and @file{*debug tramp/foo*}
buffers with the bug report.

@strong{Note} that a verbosity level greater than 6 is not necessary
at this stage.  Also note that a verbosity level of 6 or greater, the
contents of files and directories will be included in the debug
buffer.  Passwords typed in @value{tramp} will never be included
there.


@node Frequently Asked Questions
@chapter Frequently Asked Questions
@cindex frequently asked questions
@cindex FAQ

@itemize @bullet
@item
Where is the latest @value{tramp}?

@value{tramp} is available at the GNU URL:

@noindent
@uref{https://ftp.gnu.org/gnu/tramp/}

@noindent
@value{tramp}'s GNU project page is located here:

@noindent
@uref{https://savannah.gnu.org/projects/tramp/}


@item
Which systems does it work on?

The package works successfully on Emacs 24, Emacs 25, and Emacs 26.

While Unix and Unix-like systems are the primary remote targets,
@value{tramp} has equal success connecting to other platforms, such as
MS Windows 7/8/10.


@item
How to speed up @value{tramp}?

@value{tramp} does many things in the background, some of which
depends on network speeds, response speeds of remote hosts, and
authentication delays.  During these operations, @value{tramp}'s
responsiveness slows down.  Some suggestions within the scope of
@value{tramp}'s settings include:

Use an external method, such as @option{scp}, which are faster than
internal methods.

Keep the file @code{tramp-persistency-file-name}, which is where
@value{tramp} caches remote information about hosts and files.  Caching
is enabled by default.  Don't disable it.

Set @code{remote-file-name-inhibit-cache} to @code{nil} if remote
files are not independently updated outside @value{tramp}'s control.
That cache cleanup will be necessary if the remote directories or
files are updated independent of @value{tramp}.

Set @code{tramp-completion-reread-directory-timeout} to @code{nil} to
speed up completions, @ref{File name completion}.

Disable version control to avoid delays:

@lisp
@group
(setq vc-ignore-dir-regexp
      (format "\\(%s\\)\\|\\(%s\\)"
              vc-ignore-dir-regexp
              tramp-file-name-regexp))
@end group
@end lisp

If this is too radical, because you want to use version control
remotely, trim @code{vc-handled-backends} to just those you care
about, for example:

@lisp
(setq vc-handled-backends '(SVN Git))
@end lisp

Disable excessive traces.  Set @code{tramp-verbose} to 3 or lower,
default being 3.  Increase trace levels temporarily when hunting for
bugs.

@item
@value{tramp} does not connect to the remote host

Three main reasons for why @value{tramp} does not connect to the remote host:

@itemize @minus
@item
Unknown characters in the prompt

@value{tramp} needs a clean recognizable prompt on the remote host for
accurate parsing.  Shell prompts that contain escape sequences for
coloring cause parsing problems.  @ref{Remote shell setup} for
customizing prompt detection using regular expressions.

To check if the remote host's prompt is being recognized, use this
test: switch to @value{tramp} connection buffer @file{*tramp/foo*},
put the cursor at the top of the buffer, and then apply the following
expression:

@example
@kbd{M-: (re-search-forward (concat tramp-shell-prompt-pattern "$")) @key{RET}}
@end example

If the cursor has not moved to the prompt at the bottom of the buffer,
then @value{tramp} has failed to recognize the prompt.

When using zsh on remote hosts, disable zsh line editor because zsh
uses left-hand side and right-hand side prompts in parallel.  Add the
following line to @file{~/.zshrc}:

@example
[[ $TERM == "dumb" ]] && unsetopt zle && PS1='$ ' && return
@end example

This uses the default value of @code{tramp-terminal-type},
@samp{"dumb"}, as value of the @env{TERM} environment variable.  If
you want to use another value for @env{TERM}, change
@code{tramp-terminal-type} and this line accordingly.

When using fish shell on remote hosts, disable fancy formatting by
adding the following to @file{~/.config/fish/config.fish}:

@example
@group
function fish_prompt
  if test $TERM = "dumb"
     echo "\$ "
  else
     @dots{}
  end
end
@end group
@end example

When using WinSSHD on remote hosts, @value{tramp} does not recognize
the strange prompt settings.

A similar problem exist with the iTerm2 shell integration, which sends
proprietary escape codes when starting a shell.  This can be
suppressed by changing the respective integration snippet in your
@file{~/.profile} like this:

@example
@group
[ $TERM = "dumb" ] || \
test -e "$@{HOME@}/.iterm2_shell_integration.bash" && \
source "$@{HOME@}/.iterm2_shell_integration.bash"
@end group
@end example

And finally, bash's readline should not use key bindings like
@samp{C-j} to commands.  Disable this in your @file{~/.inputrc}:

@example
@group
$if term=dumb
# Don't bind Control-J or it messes up @value{tramp}.
$else
"\C-j": next-history
$endif
@end group
@end example

@item
Echoed characters after login

@value{tramp} suppresses echos from remote hosts with the
@command{stty -echo} command.  But sometimes it is too late to suppress
welcome messages from the remote host containing harmful control
characters.  Using @option{sshx} or @option{scpx} methods can avoid
this problem because they allocate a pseudo tty.  @xref{Inline
methods}.

@item
@value{tramp} stops transferring strings longer than 500 characters

Set @code{tramp-chunksize} to 500 to get around this problem, which is
related to faulty implementation of @code{process-send-string} on
HP-UX, FreeBSD and Tru64 Unix systems.  Consult the documentation for
@code{tramp-chunksize} to see when this is necessary.

Set @code{file-precious-flag} to @code{t} for files accessed by
@value{tramp} so the file contents are checked using checksum by
first saving to a temporary file.
@ifinfo
@pxref{Saving Buffers, , , elisp}
@end ifinfo

@lisp
@group
(add-hook
 'find-file-hook
 (lambda ()
   (when (file-remote-p default-directory)
     (set (make-local-variable 'file-precious-flag) t))))
@end group
@end lisp
@end itemize


@item
@value{tramp} does not recognize if a @command{ssh} session hangs

@command{ssh} sessions on the local host hang when the network is
down.  @value{tramp} cannot safely detect such hangs.  The network
configuration for @command{ssh} can be configured to kill such hangs
with the following command in the @file{~/.ssh/config}:

@example
@group
Host *
     ServerAliveInterval 5
@end group
@end example


@item
@value{tramp} does not use default @command{ssh} @code{ControlPath}

@value{tramp} overwrites @code{ControlPath} settings when initiating
@command{ssh} sessions.  @value{tramp} does this to fend off a stall
if a master session opened outside the Emacs session is no longer
open.  That is why @value{tramp} prompts for the password again even
if there is an @command{ssh} already open.

@vindex tramp-ssh-controlmaster-options
Some @command{ssh} versions support a @code{ControlPersist} option,
which allows you to set the @code{ControlPath} provided the variable
@code{tramp-ssh-controlmaster-options} is customized as follows:

@lisp
@group
(customize-set-variable
 'tramp-ssh-controlmaster-options
 (concat
   "-o ControlPath=/tmp/ssh-ControlPath-%%r@@%%h:%%p "
   "-o ControlMaster=auto -o ControlPersist=yes"))
@end group
@end lisp

Note how "%r", "%h" and "%p" must be encoded as "%%r", "%%h" and
"%%p".

@vindex tramp-use-ssh-controlmaster-options
If the @file{~/.ssh/config} is configured appropriately for the above
behavior, then any changes to @command{ssh} can be suppressed with
this @code{nil} setting:

@lisp
(customize-set-variable 'tramp-use-ssh-controlmaster-options nil)
@end lisp


@item
File name completion does not work with @value{tramp}

@acronym{ANSI} escape sequences from the remote shell may cause errors
in @value{tramp}'s parsing of remote buffers.

To test if this is the case, open a remote shell and check if the output
of @command{ls} is in color.

To disable @acronym{ANSI} escape sequences from the remote hosts,
disable @samp{--color=yes} or @samp{--color=auto} in the remote host's
@file{.bashrc} or @file{.profile}.  Turn this alias on and off to see
if file name completion works.

@item
File name completion does not work in directories with large number of
files

This may be related to globbing, which is the use of shell's ability
to expand wild card specifications, such as @samp{*.c}.  For
directories with large number of files, globbing might exceed the
shell's limit on length of command lines and hang.  @value{tramp} uses
globbing.

To test if globbing hangs, open a shell on the remote host and then
run @command{ls -d * ..?* > /dev/null}.

When testing, ensure the remote shell is the same shell
(@command{/bin/sh}, @command{ksh} or @command{bash}), that
@value{tramp} uses when connecting to that host.


@item
How to get notified after @value{tramp} completes file transfers?

Make Emacs beep after reading from or writing to the remote host with
the following code in @file{~/.emacs}.

@lisp
@group
(defadvice tramp-handle-write-region
  (after tramp-write-beep-advice activate)
  "Make @value{tramp} beep after writing a file."
  (interactive)
  (beep))
@end group

@group
(defadvice tramp-handle-do-copy-or-rename-file
  (after tramp-copy-beep-advice activate)
  "Make @value{tramp} beep after copying a file."
  (interactive)
  (beep))
@end group

@group
(defadvice tramp-handle-insert-file-contents
  (after tramp-insert-beep-advice activate)
  "Make @value{tramp} beep after inserting a file."
  (interactive)
  (beep))
@end group
@end lisp


@item
How to get a Visual Warning when working with @samp{root} privileges?
Host indication in the mode line?

@cindex @value{tramp} theme
@vindex tramp-theme-face-remapping-alist
Install @file{tramp-theme} from GNU ELPA via Emacs' Package Manager.
Enable it via @kbd{M-x load-theme @key{RET} tramp @key{RET}}.  Further
customization is explained in user option
@code{tramp-theme-face-remapping-alist}.


@item
Remote host does not understand default options for directory listing

Emacs computes the @command{dired} options based on the local host but
if the remote host cannot understand the same @command{ls} command,
then set them with a hook as follows:

@lisp
@group
(add-hook
 'dired-before-readin-hook
 (lambda ()
   (when (file-remote-p default-directory)
     (setq dired-actual-switches "-al"))))
@end group
@end lisp


@item
Why is @file{~/.sh_history} on the remote host growing?

@vindex tramp-histfile-override
@vindex HISTFILE@r{, environment variable}
@vindex HISTFILESIZE@r{, environment variable}
@vindex HISTSIZE@r{, environment variable}
Due to the remote shell saving tilde expansions triggered by
@value{tramp}, the history file is probably growing rapidly.
@value{tramp} can suppress this behavior with the user option
@code{tramp-histfile-override}.  When set to @code{t}, environment
variable @env{HISTFILE} is unset, and environment variables
@env{HISTFILESIZE} and @env{HISTSIZE} are set to 0.  Don't use this
with @command{bash} 5.0.0.  There is a bug in @command{bash} which
lets @command{bash} die.

Alternatively, @code{tramp-histfile-override} could be a string.
Environment variable @env{HISTFILE} is set to this file name then.  Be
careful when setting to @file{/dev/null}; this might result in
undesired results when using @command{bash} as remote shell.

Another approach is to disable @value{tramp}'s handling of the
@env{HISTFILE} at all by setting @code{tramp-histfile-override} to
@code{nil}.  In this case, saving history could be turned off by
putting this shell code in @file{.bashrc} or @file{.kshrc}:

@example
@group
if [ -f $HOME/.sh_history ] ; then
   /bin/rm $HOME/.sh_history
fi
if [ "$@{HISTFILE-unset@}" != "unset" ] ; then
   unset HISTFILE
fi
if [ "$@{HISTSIZE-unset@}" != "unset" ] ; then
   unset HISTSIZE
fi
@end group
@end example

For @option{ssh}-based method, add the following line to your
@file{~/.ssh/environment}:

@example
HISTFILE=/dev/null
@end example


@item
How to shorten long file names when typing in @value{tramp}?

Adapt several of these approaches to reduce typing.  If the full name
is @file{@trampfn{ssh,news@@news.my.domain,/opt/news/etc}}, then:

@enumerate

@item
Use simplified syntax:

If you always apply the default method (@pxref{Default Method}), you
could use the simplified @value{tramp} syntax (@pxref{Change file name
syntax}):

@lisp
@group
(customize-set-variable 'tramp-default-method "ssh")
(tramp-change-syntax 'simplified)
@end group
@end lisp

The reduced typing: @kbd{C-x C-f
@code{@value{prefix}news@@news.my.domain@value{postfix}/opt/news/etc}
@key{RET}}.

@item
Use default values for method name and user name:

You can define default methods and user names for hosts,
(@pxref{Default Method}, @pxref{Default User}):

@lisp
@group
(custom-set-variables
 '(tramp-default-method "ssh")
 '(tramp-default-user "news"))
@end group
@end lisp

The reduced typing: @kbd{C-x C-f
@trampfn{-,news.my.domain,/opt/news/etc} @key{RET}}.

@strong{Note} that there are some useful shortcuts already.  Accessing
your local host as @samp{root} user, is possible just by @kbd{C-x C-f
@trampfn{su,,} @key{RET}}.

@item
Use configuration options of the access method:

Programs used for access methods already offer powerful configurations
(@pxref{Customizing Completion}).  For @option{ssh}, configure the
file @file{~/.ssh/config}:

@example
@group
Host xy
     HostName news.my.domain
     User news
@end group
@end example

The reduced typing: @kbd{C-x C-f @trampfn{ssh,xy,/opt/news/etc} @key{RET}}.

Depending on the number of files in the directories, host names
completion can further reduce key strokes: @kbd{C-x C-f
@value{prefix}ssh@value{postfixhop}x @key{TAB}}.

@item
Use environment variables to expand long strings

For long file names, set up environment variables that are expanded in
the minibuffer.  Environment variables are set either outside Emacs or
inside Emacs with Lisp:

@lisp
(setenv "xy" "@trampfn{ssh,news@@news.my.domain,/opt/news/etc/}")
@end lisp

The reduced typing: @kbd{C-x C-f $xy @key{RET}}.

@strong{Note} that file name cannot be edited here because the
environment variables are not expanded during editing in the
minibuffer.

@item Define own keys:

Redefine another key sequence in Emacs for @kbd{C-x C-f}:

@lisp
@group
(global-set-key
 [(control x) (control y)]
 (lambda ()
   (interactive)
   (find-file
    (read-file-name
     "Find @value{tramp} file: "
     "@trampfn{ssh,news@@news.my.domain,/opt/news/etc/}"))))
@end group
@end lisp

Simply typing @kbd{C-x C-y} would prepare minibuffer editing of file
name.

See @uref{https://www.emacswiki.org/emacs/TrampMode, the Emacs Wiki}
for a more comprehensive example.

@item
Define own abbreviation (1):

Abbreviation list expansion can be used to reduce typing long file names:

@lisp
@group
(add-to-list
 'directory-abbrev-alist
 '("^/xy" . "@trampfn{ssh,news@@news.my.domain,/opt/news/etc/}"))
@end group
@end lisp

The reduced typing: @kbd{C-x C-f /xy @key{RET}}.

@strong{Note} that file name cannot be edited here because the
abbreviations are not expanded during editing in the minibuffer.
Furthermore, the abbreviation is not expanded during @key{TAB}
completion.

@item
Define own abbreviation (2):

The @code{abbrev-mode} gives additional flexibility for editing in the
minibuffer:

@lisp
@group
(define-abbrev-table 'my-tramp-abbrev-table
  '(("xy" "@trampfn{ssh,news@@news.my.domain,/opt/news/etc/}")))
@end group

@group
(add-hook
 'minibuffer-setup-hook
 (lambda ()
   (abbrev-mode 1)
   (setq local-abbrev-table my-tramp-abbrev-table)))
@end group

@group
(defadvice minibuffer-complete
  (before my-minibuffer-complete activate)
  (expand-abbrev))
@end group

@group
;; If you use partial-completion-mode
(defadvice PC-do-completion
  (before my-PC-do-completion activate)
  (expand-abbrev))
@end group
@end lisp

The reduced typing: @kbd{C-x C-f xy @key{TAB}}.

The minibuffer expands for further editing.

@item Use bookmarks:

Use bookmarks to save @value{tramp} file names.
@ifinfo
@pxref{Bookmarks, , , emacs}.
@end ifinfo

Upon visiting a location with @value{tramp}, save it as a bookmark with
@kbd{@key{menu-bar} @key{edit} @key{bookmarks} @key{set}}.

To revisit that bookmark:
@kbd{@key{menu-bar} @key{edit} @key{bookmarks} @key{jump}}.

@item Use recent files:

@file{recentf} remembers visited places.
@ifinfo
@pxref{File Conveniences, , , emacs}.
@end ifinfo

Keep remote file names in the recent list without have to check for
their accessibility through remote access:

@lisp
(recentf-mode 1)
@end lisp

Reaching recently opened files: @kbd{@key{menu-bar} @key{file}
@key{Open Recent}}.

@item Use filecache:

Since @file{filecache} remembers visited places, add the remote
directory to the cache:

@lisp
@group
@c `with-eval-after-load' has been introduced with Emacs 24.4.  Shall
@c be used when appropriate.
(eval-after-load "filecache"
  '(file-cache-add-directory
    "@trampfn{ssh,news@@news.my.domain,/opt/news/etc/}"))
@end group
@end lisp

Then use directory completion in the minibuffer with @kbd{C-x C-f
C-@key{TAB}}.

@item Use bbdb:

@file{bbdb} has a built-in feature for Ange FTP files, which also
works for @value{tramp} file names.
@ifinfo
@pxref{bbdb-ftp, Storing FTP sites in the BBDB, , bbdb}.
@end ifinfo

Load @file{bbdb} in Emacs:

@lisp
@group
(require 'bbdb)
(bbdb-initialize)
@end group
@end lisp

Create a BBDB entry with @kbd{M-x bbdb-create-ftp-site @key{RET}}.
Then specify a method and user name where needed.  Examples:

@example
@group
@kbd{M-x bbdb-create-ftp-site @key{RET}}
@b{Ftp Site:} news.my.domain @key{RET}
@b{Ftp Directory:} /opt/news/etc/ @key{RET}
@b{Ftp Username:} ssh@value{postfixhop}news @key{RET}
@b{Company:} @key{RET}
@b{Additional Comments:} @key{RET}
@end group
@end example

In BBDB buffer, access an entry by pressing the key @kbd{F}.

@end enumerate

Thanks to @value{tramp} users for contributing to these recipes.

@item
Why saved multi-hop file names do not work in a new Emacs session?

When saving ad-hoc multi-hop @value{tramp} file names (@pxref{Ad-hoc
multi-hops}) via bookmarks, recent files, filecache, bbdb, or another
package, use the full ad-hoc file name including all hops, like
@file{@trampfn{ssh,bird@@bastion|ssh@value{postfixhop}news.my.domain,/opt/news/etc}}.

Alternatively, when saving abbreviated multi-hop file names
@file{@trampfn{ssh,news@@news.my.domain,/opt/news/etc}}, the user
option @code{tramp-save-ad-hoc-proxies} must be set non-@code{nil}
value.


@item
How to connect to a remote Emacs session using @value{tramp}?

Configure Emacs Client
@ifinfo
(@pxref{Emacs Server, , , emacs}).
@end ifinfo

Then on the remote host, start the Emacs Server:

@lisp
@group
(require 'server)
(setq server-host (system-name)
      server-use-tcp t)
(server-start)
@end group
@end lisp

If @code{(system-name)} of the remote host cannot be resolved on the
local host, use IP address instead.

Copy from the remote host the resulting file
@file{~/.emacs.d/server/server} to the local host, to the same
location.

Then start Emacs Client from the command line:

@example
emacsclient @trampfn{ssh,user@@host,/file/to/edit}
@end example

@code{user} and @code{host} refer to the local host.

To make Emacs Client an editor for other programs, use a wrapper
script @file{emacsclient.sh}:

@example
@group
#!/bin/sh
emacsclient @trampfn{ssh,$(whoami)@@$(hostname --fqdn),$1}
@end group
@end example

@vindex EDITOR@r{, environment variable}
Then change the environment variable @env{EDITOR} to point to the
wrapper script:

@example
export EDITOR=/path/to/emacsclient.sh
@end example


@item
How to disable other packages from calling @value{tramp}?

There are packages that call @value{tramp} without the user ever
entering a remote file name.  Even without applying a remote file
syntax, some packages enable @value{tramp} on their own.  How can users
disable such features.

@itemize @minus
@item
@file{ido.el}

Disable @value{tramp} file name completion:

@lisp
(customize-set-variable 'ido-enable-tramp-completion nil)
@end lisp

@item
@file{rlogin.el}

Disable remote directory tracking mode:

@lisp
(rlogin-directory-tracking-mode -1)
@end lisp
@end itemize


@item
How to disable @value{tramp}?

@itemize @minus
@item
To keep Ange FTP as default the remote files access package, set this
in @file{.emacs}:

@lisp
(customize-set-variable 'tramp-default-method "ftp")
@end lisp

@item
To disable both @value{tramp} (and Ange FTP), set @code{tramp-mode} to
@code{nil} in @file{.emacs}.  @strong{Note}, that we don't use
@code{customize-set-variable}, in order to avoid loading @value{tramp}.

@lisp
(setq tramp-mode nil)
@end lisp

@item
To unload @value{tramp}, type @kbd{M-x tramp-unload-tramp @key{RET}}.
Unloading @value{tramp} resets Ange FTP plugins also.
@end itemize
@end itemize


@c For the developer
@node Files directories and localnames
@chapter How file names, directories and localnames are mangled and managed.

@menu
* Localname deconstruction::    Splitting a localname into its component parts.
* External packages::           Integrating with external Lisp packages.
@end menu


@node Localname deconstruction
@section Splitting a localname into its component parts

@value{tramp} package redefines lisp functions
@code{file-name-directory} and @code{file-name-nondirectory} to
accommodate the unique file naming syntax that @value{tramp} requires.

The replacements dissect the file name, use the original handler for
the localname, take that result, and then re-build the @value{tramp}
file name.  By relying on the original handlers for localnames,
@value{tramp} benefits from platform specific hacks to the original
handlers.


@node External packages
@section Integrating with external Lisp packages
@subsection File name completion.

Sometimes, it is not convenient to open a new connection to a remote
host, including entering the password and alike.  For example, this is
nasty for packages providing file name completion. Such a package
could signal to @value{tramp}, that they don't want it to establish a
new connection.  Use the variable @code{non-essential} temporarily and
bind it to non-@code{nil} value.

@lisp
@group
(let ((non-essential t))
  @dots{})
@end group
@end lisp


@subsection File attributes cache.

Keeping a local cache of remote file attributes in sync with the
remote host is a time-consuming operation.  Flushing and re-querying
these attributes can tax @value{tramp} to a grinding halt on busy
remote servers.

To get around these types of slow-downs in @value{tramp}'s
responsiveness, set the @code{process-file-side-effects} to @code{nil}
to stop @value{tramp} from flushing the cache.  This is helpful in
situations where callers to @code{process-file} know there are no file
attribute changes.  The let-bind form to accomplish this:

@lisp
@group
(let (process-file-side-effects)
  @dots{})
@end group
@end lisp

For asynchronous processes, @value{tramp} uses a process sentinel to
flush file attributes cache.  When callers to @code{start-file-process}
know beforehand no file attribute changes are expected, then the
process sentinel should be set to the default state.  In cases where
the caller defines its own process sentinel, @value{tramp}'s process
sentinel is overwritten.  The caller can still flush the file
attributes cache in its process sentinel with this code:

@lisp
@group
(unless (memq (process-status proc) '(run open))
  (dired-uncache remote-directory))
@end group
@end lisp

Since @value{tramp} traverses subdirectories starting with the
root-directory, it is most likely sufficient to make the
@code{default-directory} of the process buffer as the root directory.


@node Traces and Profiles
@chapter How to Customize Traces

@value{tramp} messages are raised with verbosity levels ranging from 0
to 10.  @value{tramp} does not display all messages; only those with a
verbosity level less than or equal to @code{tramp-verbose}.

The verbosity levels are

          @w{ 0}  silent (no @value{tramp} messages at all)
@*@indent @w{ 1}  errors
@*@indent @w{ 2}  warnings
@*@indent @w{ 3}  connection to remote hosts (default verbosity)
@*@indent @w{ 4}  activities
@*@indent @w{ 5}  internal
@*@indent @w{ 6}  sent and received strings
@*@indent @w{ 7}  file caching
@*@indent @w{ 8}  connection properties
@*@indent @w{ 9}  test commands
@*@indent @w{10}  traces (huge)

With @code{tramp-verbose} greater than or equal to 4, messages are
also written to a @value{tramp} debug buffer.  Such debug buffers are
essential to bug and problem analyses.  For @value{tramp} bug reports,
set the @code{tramp-verbose} level to 6 (@pxref{Bug Reports}).

The debug buffer is in
@ifinfo
@ref{Outline Mode, , , emacs}.
@end ifinfo
@ifnotinfo
Outline Mode.
@end ifnotinfo
In this buffer, messages can be filtered by their level.  To see
messages up to verbosity level 5, enter @kbd{C-u 6 C-c C-q}.
@ifinfo
Other navigation keys are described in
@ref{Outline Visibility, , , emacs}.
@end ifinfo

@value{tramp} handles errors internally.  But to get a Lisp backtrace,
both the error and the signal have to be set as follows:

@lisp
@group
(setq debug-on-error t
      debug-on-signal t)
@end group
@end lisp

If @code{tramp-verbose} is greater than or equal to 10, Lisp
backtraces are also added to the @value{tramp} debug buffer in case of
errors.

To enable stepping through @value{tramp} function call traces, they
have to be specifically enabled as shown in this code:

@lisp
@group
(require 'trace)
(dolist (elt (all-completions "tramp-" obarray 'functionp))
  (trace-function-background (intern elt)))
(untrace-function 'tramp-read-passwd)
@end group
@end lisp

The buffer @file{*trace-output*} contains the output from the function
call traces.  Disable @code{tramp-read-passwd} to stop password
strings from being written to @file{*trace-output*}.


@node GNU Free Documentation License
@appendix GNU Free Documentation License
@include doclicense.texi


@node Function Index
@unnumbered Function Index
@printindex fn


@node Variable Index
@unnumbered Variable Index
@printindex vr


@node Concept Index
@unnumbered Concept Index
@printindex cp

@bye

@c TODO
@c
@c * Say something about the .login and .profile files of the remote
@c   shells.
@c * Explain how tramp.el works in principle: open a shell on a remote
@c   host and then send commands to it.
@c * Consistent small or capitalized words especially in menus.
