Функция emacs для отправки пароля в минибуфер, когда его попросят
Я обычно подключаюсь к машине через SSH и использую ssh.el
, Я определил команду, чтобы я мог сделать это быстро:
(defun ssh-me()
(interactive)
(ssh "myuser@myhost"))
После этого мини-буфер запрашивает у меня пароль и все отлично работает. Мне интересно, есть ли способ установить мой пароль в моей функции, чтобы мне не приходилось писать его каждый раз, когда я хочу подключиться к этой машине, чтобы у меня было что-то вроде:
(defun ssh-me()
(interactive)
(ssh "myuser@myhost")
(send-password-to-minibuffer "mypasswd"))
Это возможно?
1 ответ
Вот пример использования небольшого пользовательского файла, который не зашифрован. В этом примере имя файла .authinfo_iphone
и он содержит только одну строку - я использую его для подключения к джейлбрейкнутому iphone через ssh:
machine localhost login root password alpine port ssh
Затем я использую небольшую функцию для подключения:
(defun lawlist-remote-iphone-data ()
(interactive)
(let ((auth-sources '("/Users/HOME/.0.data/.0.emacs/.authinfo_iphone")))
(find-file "/ssh:root@localhost#2222:/private/var/mobile/.0.data/")))
Вы также можете использовать внешнюю утилиту, такую как sshpass
а затем написать функцию - командная строка выглядит так:
/usr/bin/sshpass -p 'my-password' ssh my-username@12.34.56.789
А вот пример функции, которая включает в себя эту командную строку для входа в iPhone через ssh. Это предполагает, что уже есть открытый буфер режима оболочки с процессом, названным *shell*
,
(defun shell-iphone ()
"From an existing shell buffer with a process named `*shell*`,
log-in to the iPhone using sshpass."
(interactive)
(let* (
(password "alpine")
(port "2222")
(username "root")
(host "localhost")
(sshpass "/Users/HOME/.0.data/.0.emacs/bin/sshpass")
(ssh "/usr/bin/ssh")
(dir "/private/var/mobile/.0.data"))
(comint-send-string "*shell*"
(mapconcat 'identity `(
,sshpass
"-p"
,password
,ssh
"-p"
,port
"-l"
,username
,host
"-t"
"\"cd " ,dir " && bash --login\"") " "))
(comint-send-input)))