Remove gateway methods in Tramp

* doc/misc/tramp.texi (Top, Configuration): Remove section
`Gateway methods', insert section `Firewalls' in menu.
(History): Gateways are removed now.
(Gateway methods): Remove section.
(Multi-hops, Traces and Profiles): Don't reference to gateways anymore.
(Firewalls): New section.

* etc/NEWS: Gateway methods in Tramp have been removed.

* lisp/net/tramp.el (tramp-methods): Adapt docstring.
(tramp-file-name-port, tramp-accept-process-output): Simplify.

* lisp/net/tramp-gw.el: Remove.

* lisp/net/tramp-sh.el (tramp-gw-tunnel-method)
(tramp-gw-socks-method): Remove declarations.
(tramp-methods) <scp, scpx, ssh, sshx, telnet, nc, plink, pscp>:
Remove `tramp-gw-args' and `tramp-default-port'.  (Bug#18967)
(tramp-do-copy-or-rename-file-out-of-band)
(tramp-compute-multi-hops, tramp-maybe-open-connection):
Remove gateway support.

* test/lisp/net/tramp-tests.el (tramp-test03-file-name-defaults):
Remove gateway tests.
This commit is contained in:
Michael Albinus 2016-12-21 12:42:22 +01:00
parent 221d3a9767
commit 8661313efd
6 changed files with 82 additions and 540 deletions

View file

@ -143,11 +143,11 @@ Configuring @value{tramp} for use
* Inline methods:: Inline methods.
* External methods:: External methods.
* GVFS based methods:: GVFS based external methods.
* Gateway methods:: Gateway 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.
@ -406,10 +406,11 @@ 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. GVFS integration started in February 2009. Remote
commands on 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}.
since April 2007 (and removed in December 2016). GVFS integration
started in February 2009. Remote commands on 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 has been stopped in January 2016.
@ -453,7 +454,6 @@ installed and loaded:
* Inline methods:: Inline methods.
* External methods:: External methods.
* GVFS based methods:: GVFS based external methods.
* Gateway methods:: Gateway methods.
* Default Method:: Selecting a default method.
Here we also try to help those who
don't have the foggiest which method
@ -461,6 +461,7 @@ installed and loaded:
* 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.
@ -997,51 +998,6 @@ Other methods to include are: @option{ftp} and @option{smb}.
@end defopt
@node Gateway methods
@section Gateway methods
@cindex methods, gateway
@cindex gateway methods
Gateway methods are for proxy host declarations (@pxref{Multi-hops})
so as to pass through firewalls and proxy servers. They are not like
the other methods that declare direct connections to a remote host.
A gateway method always comes with a port setting. @value{tramp}
targets the port number with the gateway method
@file{localhost#random_port} from where the firewall or proxy server
is accessed.
Gateway methods support user name and password declarations for
authenticating the corresponding firewall or proxy server. Such
authentication can be passed through only if granted access by system
administrators.
@table @asis
@item @option{tunnel}
@cindex method tunnel
@cindex tunnel method
This method implements an HTTP tunnel via the @command{CONNECT}
command (conforming to RFC 2616, 2817 specifications). Proxy servers
using HTTP version 1.1 or later protocol support this command.
For authentication, this protocol uses only @option{Basic
Authentication} (see RFC 2617). When no port number is specified, this
protocol defaults to @option{8080}.
@item @option{socks}
@cindex method socks
@cindex socks method
The @option{socks} method connects to SOCKSv5 servers (see RFC 1928)
and supports @option{Username/Password Authentication}.
The default port number for the socks server is @option{1080}, if not
specified otherwise.
@end table
@node Default Method
@section Selecting a default method
@cindex default method
@ -1244,9 +1200,8 @@ 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 or gateway method (@pxref{Inline
methods}, @pxref{Gateway methods}).
If @var{proxy} is @code{nil}, no additional hop is required reaching
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
@ -1313,32 +1268,6 @@ local one, first connect via @command{ssh}, and then apply
'((regexp-quote (system-name)) nil nil))
@end group
@end lisp
The above configuration allows @value{tramp} connection as @samp{root}
to remote Ubuntu hosts.
@option{tramp-default-proxies-alist} is also used for passing through
firewalls or proxy servers.
For example, the local host @samp{proxy.your.domain} on port 3128
serves as HTTP proxy to the outer world. User has access rights to
another proxy server on @samp{host.other.domain}.@footnote{HTTP tunnels
are intended for secure SSL/TLS communication. Therefore, many proxy
servers restrict the tunnels to related target ports. You might need
to run your ssh server on your target host @samp{host.other.domain} on
such a port, like 443 (https). See
@uref{http://savannah.gnu.org/maintenance/CvsFromBehindFirewall} for
discussion of ethical issues.} Then the configuration is:
@lisp
@group
(add-to-list 'tramp-default-proxies-alist
'("\\`host\\.other\\.domain\\'" nil
"@trampfn{tunnel,proxy.your.domain#3128,}"))
@end group
@end lisp
Gateway methods in a multiple hop chain can be declared only as the first hop.
@end defopt
Passing through hops involves dealing with restricted shells, such as
@ -1362,6 +1291,50 @@ restricted shell:
@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 version 1.1 or later
protocol support this command.
@subsection Tunneling with ssh
With ssh, you could use the @code{ProxyCommand} entry in the
@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
@ -3618,14 +3591,12 @@ have to be specifically enabled as shown in this code:
(dolist (elt (all-completions "tramp-" obarray 'functionp))
(trace-function-background (intern elt)))
(untrace-function 'tramp-read-passwd)
(untrace-function 'tramp-gw-basic-authentication)
@end group
@end lisp
The buffer @file{*trace-output*} contains the output from the function
call traces. Disable @code{tramp-read-passwd} and
@code{tramp-gw-basic-authentication} to stop password strings from
being written to @file{*trace-output*}.
call traces. Disable @code{tramp-read-passwd} to stop password
strings from being written to @file{*trace-output*}.
@node GNU Free Documentation License

View file

@ -566,6 +566,10 @@ different group ID.
*** New connection method "gdrive", which allows to access Google
Drive onsite repositories.
+++
*** Gateway methods in Tramp have been removed. Instead, the Tramp
manual documents how to configure ssh and PuTTY accordingly.
+++
Setting the "ENV" environment variable in 'tramp-remote-process-environment'
enables reading of shell initialization files.

View file

@ -1,339 +0,0 @@
;;; tramp-gw.el --- Tramp utility functions for HTTP tunnels and SOCKS gateways
;; Copyright (C) 2007-2016 Free Software Foundation, Inc.
;; Author: Michael Albinus <michael.albinus@gmx.de>
;; Keywords: comm, processes
;; Package: tramp
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Access functions for HTTP tunnels and SOCKS gateways from Tramp.
;; SOCKS functionality is implemented by socks.el from the w3 package.
;; HTTP tunnels are partly implemented in socks.el and url-http.el;
;; both implementations are not complete. Therefore, it is
;; implemented in this package.
;;; Code:
(require 'tramp)
;; Pacify byte-compiler.
(eval-when-compile
(require 'cl)
(require 'custom))
(defvar socks-noproxy)
;; We don't add the following methods to `tramp-methods', in order to
;; exclude them from file name completion.
;; Define HTTP tunnel method ...
;;;###tramp-autoload
(defconst tramp-gw-tunnel-method "tunnel"
"Method to connect HTTP gateways.")
;; ... and port.
(defconst tramp-gw-default-tunnel-port 8080
"Default port for HTTP gateways.")
;; Define SOCKS method ...
;;;###tramp-autoload
(defconst tramp-gw-socks-method "socks"
"Method to connect SOCKS servers.")
;; ... and port.
(defconst tramp-gw-default-socks-port 1080
"Default port for SOCKS servers.")
;; Autoload the socks library. It is used only when we access a SOCKS server.
(autoload 'socks-open-network-stream "socks")
(defvar socks-username (user-login-name))
(defvar socks-server
(list "Default server" "socks" tramp-gw-default-socks-port 5))
;; Add a default for `tramp-default-user-alist'. Default is the local user.
;;;###tramp-autoload
(add-to-list
'tramp-default-user-alist
(list (concat "\\`"
(regexp-opt (list tramp-gw-tunnel-method tramp-gw-socks-method))
"\\'")
nil (user-login-name)))
;; Internal file name functions and variables.
(defvar tramp-gw-vector nil
"Keeps the remote host identification. Needed for Tramp messages.")
(defvar tramp-gw-gw-vector nil
"Current gateway identification vector.")
(defvar tramp-gw-gw-proc nil
"Current gateway process.")
;; This variable keeps the listening process, in order to reuse it for
;; new processes.
(defvar tramp-gw-aux-proc nil
"Process listening on local port, as mediation between SSH and the gateway.")
(defun tramp-gw-gw-proc-sentinel (proc _event)
"Delete auxiliary process when we are deleted."
(unless (tramp-compat-process-live-p proc)
(tramp-message
tramp-gw-vector 4 "Deleting auxiliary process `%s'" tramp-gw-gw-proc)
(let* ((tramp-verbose 0)
(p (tramp-get-connection-property proc "process" nil)))
(when (processp p) (delete-process p)))))
(defun tramp-gw-aux-proc-sentinel (proc _event)
"Activate the different filters for involved gateway and auxiliary processes."
(when (tramp-compat-process-live-p proc)
;; A new process has been spawned from `tramp-gw-aux-proc'.
(tramp-message
tramp-gw-vector 4
"Opening auxiliary process `%s', speaking with process `%s'"
proc tramp-gw-gw-proc)
(set-process-query-on-exit-flag proc nil)
;; We don't want debug messages, because the corresponding debug
;; buffer might be undecided.
(let ((tramp-verbose 0))
(tramp-set-connection-property tramp-gw-gw-proc "process" proc)
(tramp-set-connection-property proc "process" tramp-gw-gw-proc))
;; Set the process-filter functions for both processes.
(set-process-filter proc 'tramp-gw-process-filter)
(set-process-filter tramp-gw-gw-proc 'tramp-gw-process-filter)
;; There might be already some output from the gateway process.
(with-current-buffer (process-buffer tramp-gw-gw-proc)
(unless (= (point-min) (point-max))
(let ((s (buffer-string)))
(delete-region (point) (point-max))
(tramp-gw-process-filter tramp-gw-gw-proc s))))))
(defun tramp-gw-process-filter (proc string)
"Resend the string to the other process."
(let ((tramp-verbose 0))
;; The other process might have been stopped already. We don't
;; want to be interrupted then.
(ignore-errors
(process-send-string
(tramp-get-connection-property proc "process" nil) string))))
;;;###tramp-autoload
(defun tramp-gw-open-connection (vec gw-vec target-vec)
"Open a remote connection to VEC (see `tramp-file-name' structure).
Take GW-VEC as SOCKS or HTTP gateway, i.e. its method must be a
gateway method. TARGET-VEC identifies where to connect to via
the gateway, it can be different from VEC when there are more
hops to be applied.
It returns a string like \"localhost#port\", which must be used
instead of the host name declared in TARGET-VEC."
;; Remember vectors for property retrieval.
(setq tramp-gw-vector vec
tramp-gw-gw-vector gw-vec)
;; Start listening auxiliary process.
(unless (tramp-compat-process-live-p tramp-gw-aux-proc)
(let ((aux-vec
(vector "aux" (tramp-file-name-user gw-vec)
(tramp-file-name-host gw-vec) nil nil)))
(setq tramp-gw-aux-proc
(make-network-process
:name (tramp-buffer-name aux-vec) :buffer nil :host 'local
:server t :noquery t :service t :coding 'binary))
(set-process-sentinel tramp-gw-aux-proc 'tramp-gw-aux-proc-sentinel)
(set-process-query-on-exit-flag tramp-gw-aux-proc nil)
(tramp-message
vec 4 "Opening auxiliary process `%s', listening on port %d"
tramp-gw-aux-proc (process-contact tramp-gw-aux-proc :service))))
(let* ((gw-method
(intern
(tramp-find-method
(tramp-file-name-method gw-vec)
(tramp-file-name-user gw-vec)
(tramp-file-name-host gw-vec))))
(socks-username
(tramp-find-user
(tramp-file-name-method gw-vec)
(tramp-file-name-user gw-vec)
(tramp-file-name-host gw-vec)))
;; Declare the SOCKS server to be used.
(socks-server
(list "Tramp temporary socks server list"
;; Host name.
(tramp-file-name-real-host gw-vec)
;; Port number.
(or (tramp-file-name-port gw-vec)
(case gw-method
(tunnel tramp-gw-default-tunnel-port)
(socks tramp-gw-default-socks-port)))
;; Type. We support only http and socks5, NO socks4.
;; 'http could be used when HTTP tunnel works in socks.el.
5))
;; The function to be called.
(socks-function
(case gw-method
(tunnel 'tramp-gw-open-network-stream)
(socks 'socks-open-network-stream)))
socks-noproxy)
;; Open SOCKS process.
(setq tramp-gw-gw-proc
(funcall
socks-function
(let ((tramp-verbose 0)) (tramp-get-connection-name gw-vec))
(let ((tramp-verbose 0)) (tramp-get-connection-buffer gw-vec))
(tramp-file-name-real-host target-vec)
(tramp-file-name-port target-vec)))
(set-process-sentinel tramp-gw-gw-proc 'tramp-gw-gw-proc-sentinel)
(set-process-coding-system tramp-gw-gw-proc 'binary 'binary)
(set-process-query-on-exit-flag tramp-gw-gw-proc nil)
(tramp-message
vec 4 "Opened %s process `%s'"
(case gw-method ('tunnel "HTTP tunnel") ('socks "SOCKS"))
tramp-gw-gw-proc)
;; Return the new host for gateway access.
(format "localhost#%d" (process-contact tramp-gw-aux-proc :service))))
(defun tramp-gw-open-network-stream (name buffer host service)
"Open stream to proxy server HOST:SERVICE.
Resulting process has name NAME and buffer BUFFER. If
authentication is requested from proxy server, provide it."
(let ((command (format (concat
"CONNECT %s:%d HTTP/1.1\r\n"
"Host: %s:%d\r\n"
"Connection: keep-alive\r\n"
"User-Agent: Tramp/%s\r\n")
host service host service tramp-version))
(authentication "")
(first t)
found proc)
(while (not found)
;; Clean up.
(when (processp proc) (delete-process proc))
(with-current-buffer buffer (erase-buffer))
;; Open network stream.
(setq proc (open-network-stream
name buffer (nth 1 socks-server) (nth 2 socks-server)))
(set-process-coding-system proc 'binary 'binary)
(set-process-query-on-exit-flag proc nil)
;; Send CONNECT command.
(process-send-string proc (format "%s%s\r\n" command authentication))
(tramp-message
tramp-gw-vector 6 "\n%s"
(format
"%s%s\r\n" command
(replace-regexp-in-string ;; no password in trace!
"Basic [^\r\n]+" "Basic xxxxx" authentication t)))
(with-current-buffer buffer
;; Trap errors to be traced in the right trace buffer. Often,
;; proxies have a timeout of 60". We wait 65" in order to
;; receive an answer this case.
(ignore-errors
(let ((tramp-verbose 0))
(tramp-wait-for-regexp proc 65 "\r?\n\r?\n")))
;; Check return code.
(goto-char (point-min))
(narrow-to-region
(point-min)
(or (search-forward-regexp "\r?\n\r?\n" nil t) (point-max)))
(tramp-message tramp-gw-vector 6 "\n%s" (buffer-string))
(goto-char (point-min))
(search-forward-regexp "^HTTP/[1-9]\\.[0-9]" nil t)
(case (condition-case nil (read (current-buffer)) (error))
;; Connected.
(200 (setq found t))
;; We need basic authentication.
(401 (setq authentication (tramp-gw-basic-authentication nil first)))
;; Access forbidden.
(403 (tramp-error-with-buffer
(current-buffer) tramp-gw-vector 'file-error
"Connection to %s:%d forbidden." host service))
;; Target host not found.
(404 (tramp-error-with-buffer
(current-buffer) tramp-gw-vector 'file-error
"Host %s not found." host))
;; We need basic proxy authentication.
(407 (setq authentication (tramp-gw-basic-authentication t first)))
;; Connection failed.
(503 (tramp-error-with-buffer
(current-buffer) tramp-gw-vector 'file-error
"Connection to %s:%d failed." host service))
;; That doesn't work at all.
(t (tramp-error-with-buffer
(current-buffer) tramp-gw-vector 'file-error
"Access to HTTP server %s:%d failed."
(nth 1 socks-server) (nth 2 socks-server))))
;; Remove HTTP headers.
(delete-region (point-min) (point-max))
(widen)
(setq first nil)))
;; Return the process.
proc))
(defun tramp-gw-basic-authentication (proxy pw-cache)
"Return authentication header for CONNECT, based on server request.
PROXY is an indication whether we need a Proxy-Authorization header
or an Authorization header. If PW-CACHE is non-nil, check for
password in password cache. This is done for the first try only."
;; `tramp-current-*' must be set for `tramp-read-passwd'.
(let ((tramp-current-method (tramp-file-name-method tramp-gw-gw-vector))
(tramp-current-user (tramp-file-name-user tramp-gw-gw-vector))
(tramp-current-host (tramp-file-name-host tramp-gw-gw-vector)))
(unless pw-cache (tramp-clear-passwd tramp-gw-gw-vector))
;; We are already in the right buffer.
(tramp-message
tramp-gw-vector 5 "%s required"
(if proxy "Proxy authentication" "Authentication"))
;; Search for request header. We accept only basic authentication.
(goto-char (point-min))
(search-forward-regexp
"^\\(Proxy\\|WWW\\)-Authenticate:\\s-*Basic\\s-+realm=")
;; Return authentication string.
(format
"%s: Basic %s\r\n"
(if proxy "Proxy-Authorization" "Authorization")
(base64-encode-string
(format
"%s:%s"
socks-username
(tramp-read-passwd
nil
(format
"Password for %s@[%s]: " socks-username (read (current-buffer)))))))))
(add-hook 'tramp-unload-hook
(lambda ()
(unload-feature 'tramp-gw 'force)))
(provide 'tramp-gw)
;;; TODO:
;; * Provide descriptive Commentary.
;;
;; * Enable it for several gateway processes in parallel.
;;
;; * Use `url-https-proxy-connect' as of Emacs 26.
;;; tramp-gw.el ends here

View file

@ -32,8 +32,6 @@
(eval-when-compile
(require 'cl)
(require 'dired))
(defvar tramp-gw-tunnel-method)
(defvar tramp-gw-socks-method)
(defvar vc-handled-backends)
(defvar vc-bzr-program)
(defvar vc-git-program)
@ -172,11 +170,7 @@ The string is used in `tramp-methods'.")
(tramp-copy-program "scp")
(tramp-copy-args (("-P" "%p") ("-p" "%k") ("-q") ("-r") ("%c")))
(tramp-copy-keep-date t)
(tramp-copy-recursive t)
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
("-o" "UserKnownHostsFile=/dev/null")
("-o" "StrictHostKeyChecking=no")))
(tramp-default-port 22)))
(tramp-copy-recursive t)))
;;;###tramp-autoload
(add-to-list 'tramp-methods
'("scpx"
@ -191,11 +185,7 @@ The string is used in `tramp-methods'.")
(tramp-copy-args (("-P" "%p") ("-p" "%k")
("-q") ("-r") ("%c")))
(tramp-copy-keep-date t)
(tramp-copy-recursive t)
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
("-o" "UserKnownHostsFile=/dev/null")
("-o" "StrictHostKeyChecking=no")))
(tramp-default-port 22)))
(tramp-copy-recursive t)))
;;;###tramp-autoload
(add-to-list 'tramp-methods
'("rsync"
@ -237,11 +227,7 @@ The string is used in `tramp-methods'.")
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
("-o" "UserKnownHostsFile=/dev/null")
("-o" "StrictHostKeyChecking=no")))
(tramp-default-port 22)))
(tramp-remote-shell-args ("-c"))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
'("sshx"
@ -251,11 +237,7 @@ The string is used in `tramp-methods'.")
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
("-o" "UserKnownHostsFile=/dev/null")
("-o" "StrictHostKeyChecking=no")))
(tramp-default-port 22)))
(tramp-remote-shell-args ("-c"))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
'("telnet"
@ -263,8 +245,7 @@ The string is used in `tramp-methods'.")
(tramp-login-args (("%h") ("%p") ("2>/dev/null")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-default-port 23)))
(tramp-remote-shell-args ("-c"))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
'("nc"
@ -280,8 +261,7 @@ The string is used in `tramp-methods'.")
;; We use "-p" as required for newer busyboxes. For older
;; busybox/nc versions, the value must be (("-l") ("%r")). This
;; can be achieved by tweaking `tramp-connection-properties'.
(tramp-remote-copy-args (("-l") ("-p" "%r") ("2>/dev/null")))
(tramp-default-port 23)))
(tramp-remote-copy-args (("-l") ("-p" "%r") ("2>/dev/null")))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
'("su"
@ -353,8 +333,7 @@ The string is used in `tramp-methods'.")
("/bin/sh") ("\"")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-login ("-l"))
(tramp-remote-shell-args ("-c"))
(tramp-default-port 22)))
(tramp-remote-shell-args ("-c"))))
;;;###tramp-autoload
(add-to-list 'tramp-methods
`("plinkx"
@ -386,8 +365,7 @@ The string is used in `tramp-methods'.")
(tramp-copy-args (("-l" "%u") ("-P" "%p") ("-scp") ("-p" "%k")
("-q") ("-r")))
(tramp-copy-keep-date t)
(tramp-copy-recursive t)
(tramp-default-port 22)))
(tramp-copy-recursive t)))
;;;###tramp-autoload
(add-to-list 'tramp-methods
`("psftp"
@ -2395,10 +2373,6 @@ The method used must be an out-of-band method."
v "login-as" nil))
tramp-current-host (tramp-file-name-real-host v))
;; Expand hops. Might be necessary for gateway methods.
(setq v (car (tramp-compute-multi-hops v)))
(aset v 3 localname)
;; Check which ones of source and target are Tramp files.
(setq source (funcall
(if (and (file-directory-p filename)
@ -2412,15 +2386,9 @@ The method used must be an out-of-band method."
(tramp-make-copy-program-file-name v)
(tramp-unquote-shell-quote-argument newname)))
;; Check for host and port number. We cannot use
;; `tramp-file-name-port', because this returns also
;; `tramp-default-port', which might clash with settings in
;; "~/.ssh/config".
(setq host (tramp-file-name-host v)
port "")
(when (string-match tramp-host-with-port-regexp host)
(setq port (string-to-number (match-string 2 host))
host (string-to-number (match-string 1 host))))
;; Check for host and port number.
(setq host (tramp-file-name-real-host v)
port (tramp-file-name-port v))
;; Check for user. There might be an interactive setting.
(setq user (or (tramp-file-name-user v)
@ -4504,8 +4472,7 @@ Goes through the list `tramp-inline-compress-commands'."
vec 2 "Couldn't find an inline transfer compress command")))))
(defun tramp-compute-multi-hops (vec)
"Expands VEC according to `tramp-default-proxies-alist'.
Gateway hops are already opened."
"Expands VEC according to `tramp-default-proxies-alist'."
(let ((target-alist `(,vec))
(hops (or (tramp-file-name-hop vec) ""))
(item vec)
@ -4562,32 +4529,6 @@ Gateway hops are already opened."
;; Start next search.
(setq choices tramp-default-proxies-alist)))))
;; Handle gateways.
(when (and (boundp 'tramp-gw-tunnel-method) (boundp 'tramp-gw-socks-method)
(string-match
(format
"^\\(%s\\|%s\\)$" tramp-gw-tunnel-method tramp-gw-socks-method)
(tramp-file-name-method (car target-alist))))
(let ((gw (pop target-alist))
(hop (pop target-alist)))
;; Is the method prepared for gateways?
(unless (tramp-file-name-port hop)
(tramp-error
vec 'file-error
"Connection `%s' is not supported for gateway access." hop))
;; Open the gateway connection.
(push
(vector
(tramp-file-name-method hop) (tramp-file-name-user hop)
(tramp-gw-open-connection vec gw hop) nil nil)
target-alist)
;; For the password prompt, we need the correct values.
;; Therefore, we must remember the gateway vector. But we
;; cannot do it as connection property, because it shouldn't
;; be persistent. And we have no started process yet either.
(let ((tramp-verbose 0))
(tramp-set-file-property (car target-alist) "" "gateway" hop))))
;; Foreign and out-of-band methods are not supported for multi-hops.
(when (cdr target-alist)
(setq choices target-alist)
@ -4802,13 +4743,6 @@ connection if a previous connection has died for some reason."
(connection-timeout
(tramp-get-method-parameter
hop 'tramp-connection-timeout))
(gw-args
(tramp-get-method-parameter hop 'tramp-gw-args))
(gw (let ((tramp-verbose 0))
(tramp-get-file-property hop "" "gateway" nil)))
(g-method (and gw (tramp-file-name-method gw)))
(g-user (and gw (tramp-file-name-user gw)))
(g-host (and gw (tramp-file-name-real-host gw)))
(command login-program)
;; We don't create the temporary file. In
;; fact, it is just a prefix for the
@ -4832,12 +4766,6 @@ connection if a previous connection has died for some reason."
(when (and process-name async-args)
(setq login-args (append async-args login-args)))
;; Add gateway arguments if necessary.
(when gw
(tramp-set-connection-property p "gateway" t)
(when gw-args
(setq login-args (append gw-args login-args))))
;; Check for port number. Until now, there's no
;; need for handling like method, user, host.
(when (string-match tramp-host-with-port-regexp l-host)
@ -4850,11 +4778,10 @@ connection if a previous connection has died for some reason."
(setq r-shell t)))
;; Set variables for computing the prompt for
;; reading password. They can also be derived
;; from a gateway.
(setq tramp-current-method (or g-method l-method)
tramp-current-user (or g-user l-user)
tramp-current-host (or g-host l-host))
;; reading password.
(setq tramp-current-method l-method
tramp-current-user l-user
tramp-current-host l-host)
;; Add login environment.
(when login-env

View file

@ -241,12 +241,7 @@ pair of the form (KEY VALUE). The following KEYs are defined:
* `tramp-copy-recursive'
Whether the operation copies directories recursively.
* `tramp-default-port'
The default port of a method is needed in case of gateway connections.
Additionally, it is used as indication which method is prepared for
passing gateways.
* `tramp-gw-args'
As the attribute name says, additional arguments are specified here
when a method is applied via a gateway.
The default port of a method.
* `tramp-tmpdir'
A directory on the remote host for temporary files. If not
specified, \"/tmp\" is taken as default.
@ -277,8 +272,7 @@ See the variables `tramp-local-coding-commands' and
So, to summarize: if the method is an out-of-band method, then you
must specify `tramp-copy-program' and `tramp-copy-args'. If it is an
inline method, then these two parameters should be nil. Methods which
are fit for gateways must have `tramp-default-port' at least.
inline method, then these two parameters should be nil.
Notes:
@ -1139,8 +1133,7 @@ entry does not exist, return nil."
(defun tramp-file-name-port (vec)
"Return the port number of VEC."
(save-match-data
(let ((method (tramp-file-name-method vec))
(host (tramp-file-name-host vec)))
(let ((host (tramp-file-name-host vec)))
(or (and (stringp host)
(string-match tramp-host-with-port-regexp host)
(string-to-number (match-string 2 host)))
@ -1267,9 +1260,6 @@ values."
(defun tramp-buffer-name (vec)
"A name for the connection buffer VEC."
;; We must use `tramp-file-name-real-host', because for gateway
;; methods the default port will be expanded later on, which would
;; tamper the name.
(let ((method (tramp-file-name-method vec))
(user (tramp-file-name-user vec))
(host (tramp-file-name-real-host vec)))
@ -1359,9 +1349,6 @@ version, the function does nothing."
(defun tramp-debug-buffer-name (vec)
"A name for the debug buffer for VEC."
;; We must use `tramp-file-name-real-host', because for gateway
;; methods the default port will be expanded later on, which would
;; tamper the name.
(let ((method (tramp-file-name-method vec))
(user (tramp-file-name-user vec))
(host (tramp-file-name-real-host vec)))
@ -3632,17 +3619,13 @@ connection buffer."
This is needed in order to hide `last-coding-system-used', which is set
for process communication also."
(with-current-buffer (process-buffer proc)
;; FIXME: If there is a gateway process, we need communication
;; between several processes. Too complicate to implement, so we
;; read output from all processes.
(let ((p (if (tramp-get-connection-property proc "gateway" nil) nil proc))
buffer-read-only last-coding-system-used)
(let (buffer-read-only last-coding-system-used)
;; Under Windows XP, accept-process-output doesn't return
;; sometimes. So we add an additional timeout.
(with-timeout ((or timeout 1))
(accept-process-output p timeout timeout-msecs (and proc t)))
(tramp-message proc 10 "%s %s %s\n%s"
proc (process-status proc) p (buffer-string)))))
(accept-process-output proc timeout timeout-msecs (and proc t)))
(tramp-message proc 10 "%s %s\n%s"
proc (process-status proc) (buffer-string)))))
(defun tramp-check-for-regexp (proc regexp)
"Check, whether REGEXP is contained in process buffer of PROC.

View file

@ -583,10 +583,6 @@ handled properly. BODY shall not contain a timeout."
(when (and (load "tramp-gvfs" 'noerror 'nomessage)
(symbol-value 'tramp-gvfs-enabled))
(should (string-equal (file-remote-p "/synce::" 'user) nil)))
;; Default values in tramp-gw.el.
(dolist (m '("tunnel" "socks"))
(should
(string-equal (file-remote-p (format "/%s::" m) 'user) (user-login-name))))
;; Default values in tramp-sh.el.
(dolist (h `("127.0.0.1" "[::1]" "localhost" "localhost6" ,(system-name)))
(should (string-equal (file-remote-p (format "/root@%s:" h) 'method) "su")))