如何使 unix `pass` 程序与 Linux 虚拟终端中的 `ssh` 配合良好?

如何使 unix `pass` 程序与 Linux 虚拟终端中的 `ssh` 配合良好?

我正在尝试通过直接从程序中提取密码来登录 ssh 服务器,pass而无需任何 GUI 交互。

GUI (Gnome) 中的正常工作流程是执行以下操作。

  1. 将密码拉入剪贴板:pass -c Misc/MyAccount
  2. 执行 ssh 程序并使用 GUI 剪贴板进行粘贴

    ssh myserver
    Right-Click + Paste
    

因为我想在没有 GUI 组件的情况下完成此操作,所以我想我可以做这样的事情

 pass Misc/MyAccount | ssh myserver

显然,这不起作用,因为ssh没有精确读取密码stdin。我发现这个问题并创建了以下脚本。

export SSH_ASKPASS="/path/to/script/calling/pass"
setsid ssh "myserver"

gnome-terminal当我在 GUI 中运行它时,这非常有用。

然而,它在Linux虚拟终端(从Control-Alt-F1)中失败,因为密码提示pass无法像通常那样弹出(直接在终端中),因此登录失败。

如何在 Linux 虚拟终端中实现此功能?

期望的行为

  1. 运行上面的脚本。
  2. 请参阅程序密码提示pass
  3. 无需手动输入服务器密码即可成功登录ssh

答案1

要使其发挥作用,需要满足一些要求:

  • DISPLAY您需要在环境变量中设置一些内容(任何内容都可以)才能激活SSH_ASKPASS功能。
  • 你需要gpg-agent基于 tty皮恩特里程序。在 Debian/Ubuntu 系统上运行apt-get install pinentry-curses并使用/usr/bin/pinentry-curses.

运行脚本如下:

export DISPLAY=anything
export SSH_ASKPASS="/path/to/script/calling/pass"
gpg-agent --pinentry-program /usr/bin/pinentry-curses --daemon setsid ssh myserver

请注意,setsid最近发行版(Debian 8.0 或更高版本、Ubuntu 14.10 或更高版本)中的 util-linux 需要-w等待子进程终止,否则您会对后台运行的 ssh 会话感到困惑。

gpg-agent --pinentry-program /usr/bin/pinentry-curses --daemon setsid -w ssh myserver

相关内容