emacs功能在被要求时向迷你缓冲区发送密码

时间:2014-11-03 13:03:48

标签: emacs ssh passwords prompt minibuffer

我通常通过SSH连接到机器并使用ssh.el。我定义了一个命令,所以我可以快速完成:

(defun ssh-me()
  (interactive)
  (ssh "myuser@myhost"))

之后,迷你缓冲区要求我输入密码,一切正常。我想知道是否有办法在我的函数中设置我的密码所以每次我想连接到那台机器时我都不必写它,所以我会有类似的东西:

(defun ssh-me()
  (interactive)
  (ssh "myuser@myhost")
  (send-password-to-minibuffer "mypasswd"))

这可能吗?

1 个答案:

答案 0 :(得分:0)

以下是使用未加密的小型自定义文件的示例。在这个例子中,文件名是.authinfo_iphone,它只包含一行 - 我用它通过ssh连接到我的越狱iphone:

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

这是一个示例函数,它包含该命令行以通过ssh登录到iPhone。它考虑到已经有一个开放的shell模式缓冲区,其过程名为*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)))