From 15e4ed9c6a6fd9b5cc587a7318e7b82389ca1b56 Mon Sep 17 00:00:00 2001 From: Aidan Gauland Date: Wed, 27 Mar 2013 11:08:58 +1300 Subject: [PATCH] Added eshell-tramp module * lisp/eshell/em-unix.el: Moved su and sudo to... * lisp/eshell/em-tramp.el: ...Eshell tramp module * doc/misc/eshell.texi: Updated manual to reflect changes. External su and sudo commands are now the default; the internal, TRAMP-using variants can still be used by enabling the eshell-tramp module. --- ChangeLog | 10 +++ doc/misc/eshell.texi | 5 +- lisp/eshell/em-tramp.el | 143 ++++++++++++++++++++++++++++++++++++++++ lisp/eshell/em-unix.el | 81 +---------------------- 4 files changed, 157 insertions(+), 82 deletions(-) create mode 100644 lisp/eshell/em-tramp.el diff --git a/ChangeLog b/ChangeLog index 3d01040ca9..500c85d235 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2013-03-27 Aidan Gauland * configure.ac (HAVE_XKB): Define if Xkb is present. diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index ec01f731da..dca95da2d1 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -460,8 +460,9 @@ With @samp{cd -42}, you can access the directory stack by number. @cmindex su @itemx sudo @cmindex sudo -Uses TRAMP's @command{su} or @command{sudo} method to run a command via -@command{su} or @command{sudo}. +Uses TRAMP's @command{su} or @command{sudo} method @pxref{Inline methods, , , tramp} +to run a command via @command{su} or @command{sudo}. These commands +are in the eshell-tramp module, which is disabled by default. @end table diff --git a/lisp/eshell/em-tramp.el b/lisp/eshell/em-tramp.el new file mode 100644 index 0000000000..c60d0e6395 --- /dev/null +++ b/lisp/eshell/em-tramp.el @@ -0,0 +1,143 @@ +;;; em-tramp.el --- Eshell features that require TRAMP + +;; Copyright (C) 1999-2013 Free Software Foundation, Inc. + +;; Author: Aidan Gauland + +;; 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 . + +;;; Commentary: + +;; Eshell features that require TRAMP. + +;;; Code: + +(eval-when-compile + (require 'esh-mode) + (require 'eshell) + (require 'tramp)) + +(require 'esh-util) + +;;;###autoload +(progn + (defgroup eshell-tramp nil + "This module defines commands that use TRAMP in a way that is + not transparent to the user. So far, this includes only the + built-in su and sudo commands, which are not compatible with + the full, external su and sudo commands, and require the user + to understand how to use the TRAMP sudo method." + :tag "TRAMP Eshell features" + :group 'eshell-module)) + +(defun eshell-tramp-initialize () + "Initialize the TRAMP-using commands code." + (when (eshell-using-module 'eshell-cmpl) + (add-hook 'pcomplete-try-first-hook + 'eshell-complete-host-reference nil t)) + (make-local-variable 'eshell-complex-commands) + (setq eshell-complex-commands + (append '("su" "sudo") + eshell-complex-commands))) + +(defun eshell/su (&rest args) + "Alias \"su\" to call TRAMP. + +Uses the system su through TRAMP's su method." + (setq args (eshell-stringify-list (eshell-flatten-list args))) + (let ((orig-args (copy-tree args))) + (eshell-eval-using-options + "su" args + '((?h "help" nil nil "show this usage screen") + (?l "login" nil login "provide a login environment") + (? nil nil login "provide a login environment") + :usage "[- | -l | --login] [USER] +Become another USER during a login session.") + (throw 'eshell-replace-command + (let ((user "root") + (host (or (file-remote-p default-directory 'host) + "localhost")) + (dir (or (file-remote-p default-directory 'localname) + (expand-file-name default-directory))) + (prefix (file-remote-p default-directory))) + (dolist (arg args) + (if (string-equal arg "-") (setq login t) (setq user arg))) + ;; `eshell-eval-using-options' does not handle "-". + (if (member "-" orig-args) (setq login t)) + (if login (setq dir "~/")) + (if (and prefix + (or + (not (string-equal + "su" (file-remote-p default-directory 'method))) + (not (string-equal + user (file-remote-p default-directory 'user))))) + (eshell-parse-command + "cd" (list (format "%s|su:%s@%s:%s" + (substring prefix 0 -1) user host dir))) + (eshell-parse-command + "cd" (list (format "/su:%s@%s:%s" user host dir))))))))) + +(put 'eshell/su 'eshell-no-numeric-conversions t) + +(defun eshell/sudo (&rest args) + "Alias \"sudo\" to call Tramp. + +Uses the system sudo through TRAMP's sudo method." + (setq args (eshell-stringify-list (eshell-flatten-list args))) + (let ((orig-args (copy-tree args))) + (eshell-eval-using-options + "sudo" args + '((?h "help" nil nil "show this usage screen") + (?u "user" t user "execute a command as another USER") + :show-usage + :usage "[(-u | --user) USER] COMMAND +Execute a COMMAND as the superuser or another USER.") + (throw 'eshell-external + (let ((user (or user "root")) + (host (or (file-remote-p default-directory 'host) + "localhost")) + (dir (or (file-remote-p default-directory 'localname) + (expand-file-name default-directory))) + (prefix (file-remote-p default-directory))) + ;; `eshell-eval-using-options' reads options of COMMAND. + (while (and (stringp (car orig-args)) + (member (car orig-args) '("-u" "--user"))) + (setq orig-args (cddr orig-args))) + (let ((default-directory + (if (and prefix + (or + (not + (string-equal + "sudo" + (file-remote-p default-directory 'method))) + (not + (string-equal + user + (file-remote-p default-directory 'user))))) + (format "%s|sudo:%s@%s:%s" + (substring prefix 0 -1) user host dir) + (format "/sudo:%s@%s:%s" user host dir)))) + (eshell-named-command (car orig-args) (cdr orig-args)))))))) + +(put 'eshell/sudo 'eshell-no-numeric-conversions t) + +(provide 'em-tramp) + +;; Local Variables: +;; generated-autoload-file: "esh-groups.el" +;; End: + +;;; em-tramp.el ends here diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el index 94508d7159..60caf38710 100644 --- a/lisp/eshell/em-unix.el +++ b/lisp/eshell/em-unix.el @@ -148,7 +148,7 @@ Otherwise, Emacs will attempt to use rsh to invoke du on the remote machine." (make-local-variable 'eshell-complex-commands) (setq eshell-complex-commands (append '("grep" "egrep" "fgrep" "agrep" "glimpse" "locate" - "cat" "time" "cp" "mv" "make" "du" "diff" "su" "sudo") + "cat" "time" "cp" "mv" "make" "du" "diff") eshell-complex-commands))) (defalias 'eshell/date 'current-time-string) @@ -1038,85 +1038,6 @@ Show wall-clock time elapsed during execution of COMMAND.") (put 'eshell/occur 'eshell-no-numeric-conversions t) -(defun eshell/su (&rest args) - "Alias \"su\" to call Tramp." - (require 'tramp) - (setq args (eshell-stringify-list (eshell-flatten-list args))) - (let ((orig-args (copy-tree args))) - (eshell-eval-using-options - "su" args - '((?h "help" nil nil "show this usage screen") - (?l "login" nil login "provide a login environment") - (? nil nil login "provide a login environment") - :usage "[- | -l | --login] [USER] -Become another USER during a login session.") - (throw 'eshell-replace-command - (let ((user "root") - (host (or (file-remote-p default-directory 'host) - "localhost")) - (dir (or (file-remote-p default-directory 'localname) - (expand-file-name default-directory))) - (prefix (file-remote-p default-directory))) - (dolist (arg args) - (if (string-equal arg "-") (setq login t) (setq user arg))) - ;; `eshell-eval-using-options' does not handle "-". - (if (member "-" orig-args) (setq login t)) - (if login (setq dir "~/")) - (if (and prefix - (or - (not (string-equal - "su" (file-remote-p default-directory 'method))) - (not (string-equal - user (file-remote-p default-directory 'user))))) - (eshell-parse-command - "cd" (list (format "%s|su:%s@%s:%s" - (substring prefix 0 -1) user host dir))) - (eshell-parse-command - "cd" (list (format "/su:%s@%s:%s" user host dir))))))))) - -(put 'eshell/su 'eshell-no-numeric-conversions t) - -(defun eshell/sudo (&rest args) - "Alias \"sudo\" to call Tramp." - (require 'tramp) - (setq args (eshell-stringify-list (eshell-flatten-list args))) - (let ((orig-args (copy-tree args))) - (eshell-eval-using-options - "sudo" args - '((?h "help" nil nil "show this usage screen") - (?u "user" t user "execute a command as another USER") - :show-usage - :usage "[(-u | --user) USER] COMMAND -Execute a COMMAND as the superuser or another USER.") - (throw 'eshell-external - (let ((user (or user "root")) - (host (or (file-remote-p default-directory 'host) - "localhost")) - (dir (or (file-remote-p default-directory 'localname) - (expand-file-name default-directory))) - (prefix (file-remote-p default-directory))) - ;; `eshell-eval-using-options' reads options of COMMAND. - (while (and (stringp (car orig-args)) - (member (car orig-args) '("-u" "--user"))) - (setq orig-args (cddr orig-args))) - (let ((default-directory - (if (and prefix - (or - (not - (string-equal - "sudo" - (file-remote-p default-directory 'method))) - (not - (string-equal - user - (file-remote-p default-directory 'user))))) - (format "%s|sudo:%s@%s:%s" - (substring prefix 0 -1) user host dir) - (format "/sudo:%s@%s:%s" user host dir)))) - (eshell-named-command (car orig-args) (cdr orig-args)))))))) - -(put 'eshell/sudo 'eshell-no-numeric-conversions t) - (provide 'em-unix) ;; Local Variables: -- 2.20.1