我正在尝试通过直接从程序中提取密码来登录 ssh 服务器,pass
而无需任何 GUI 交互。
GUI (Gnome) 中的正常工作流程是执行以下操作。
- 将密码拉入剪贴板:
pass -c Misc/MyAccount
执行 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 虚拟终端中实现此功能?
期望的行为
- 运行上面的脚本。
- 请参阅程序密码提示
pass
。 - 无需手动输入服务器密码即可成功登录
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