-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ssh-agent.el
104 lines (90 loc) · 3.3 KB
/
ssh-agent.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
;; run ssh-agent from within emacs
;;
;; Copyright (C) 2003 Will Glozer
;;
;; This program 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 2 of the License, or
;; (at your option) any later version.
;;
;; This program 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
;; this program; if not, write to the Free Software Foundation, Inc., 59
;; Temple Place, Suite 330, Boston, MA 02111-1307 USA
;;
;; ----------------------------------------------------------------------
;;
;; Run ssh-agent and ssh-add as emacs processes, setting the proper env
;; variables, and accepting password input
(defcustom ssh-agent-buffer "*ssh-agent*"
"buffer to display ssh-agent output in"
:type 'string
:group 'ssh-agent)
(defcustom ssh-agent-program "ssh-agent"
"ssh-agent program"
:type 'string
:group 'ssh-agent)
(defcustom ssh-agent-args ""
"ssh-agent program arguments"
:type 'string
:group 'ssh-agent)
(defcustom ssh-add-program "ssh-add"
"ssh-add program"
:type 'string
:group 'ssh-agent)
(defcustom ssh-add-args ""
"ssh-add program arguments"
:type 'string
:group 'ssh-agent)
(defcustom ssh-add-prompt "Enter passphrase for \\([^:]+\\):"
"ssh-add prompt for passphrases"
:type 'string
:group 'ssh-agent)
(defcustom ssh-add-invalid-prompt "Bad passphrase, try again:"
"ssh-add prompt indicating an invalid passphrase"
:type 'string
:group 'ssh-agent)
(defun ssh-agent ()
"execute the ssh-agent"
(interactive)
(let ((args (split-string ssh-agent-args)))
(set-process-filter
(apply #'start-process "ssh-agent" nil ssh-agent-program args)
#'ssh-agent-process-filter)))
(defun ssh-add-run ()
"run ssh-add"
(let ((args (split-string ssh-add-args)))
(set-process-filter
(apply #'start-process "ssh-add" nil ssh-add-program args)
#'ssh-add-process-filter)))
(defun ssh-agent-process-filter (process input)
"filter for ssh-agent input"
(cond ((ssh-agent-read-var "SSH_AUTH_SOCK" input)
(ssh-add-run))
((ssh-agent-read-var "SSH_AGENT_PID" input))))
(defun ssh-agent-read-var (var line)
"read a shell script variable from ssh-agent's output"
(if (string-match (format "%s[= ]\\([^;]+\\)" var) line)
(with-current-buffer (get-buffer-create ssh-agent-buffer)
(let ((value (match-string 1 line)))
(setenv var value)
(insert line))
t)))
(defun ssh-add-process-filter (process input)
"filter for ssh-add input"
(cond ((string-match ssh-add-prompt input)
(ssh-send-passwd process input))
((string-match ssh-add-invalid-prompt input)
(ssh-send-passwd process input))
(t (with-current-buffer (get-buffer-create ssh-agent-buffer)
(insert input)))))
(defun ssh-send-passwd (process prompt)
"read a password with `read-passwd` and pass it to the ssh-add process"
(let ((passwd (read-passwd prompt)))
(process-send-string process passwd)
(process-send-string process "\n")
(clear-string passwd)))