无需输入即可将密码输入SSH

jos*_*osh 7 ssh

在工作中,我通过 SSH 访问远程系统和通过 LDAP 登录的一些 Web 界面。我使用 1password 来管理我的密码,但我似乎无法找到一种简单的方法将密码从密码管理器输入到 SSH。我看到了,sshpass但它可以在 中显示密码ps,这真的很糟糕,而且在我的情况下也不起作用。有没有办法直接通过 SSH 从外部程序或脚本输入密码,或者 SSH 中是否有可以利用并保持密码同步的设施?例如保留一个我为 SSH 解锁的具有相同密码的密钥文件,每当我更新密码时都会更新。注意我不能直接使用密钥登录系统,因为它不是为了支持它而构建的。

编辑:一位评论者指出,sshpass将在 中显示密码ps,这是不行的。我也不能直接为之类ssh的东西设置别名,sshpass ... ssh因为我仍然登录使用密钥的系统。

编辑 2:我确认密码管理器没问题,我尝试使用sshpass文件描述符登录服务器,但它似乎不起作用 - 而不是提示我输入我的 RSA 令牌,我一无所获,这让我认为它不会运行相同的代码并且不会接受sshpass.

Jak*_*uje 8

sshpass不必在 ps 中显示密码。它可能会读取环境变量:

SSHPASS=12345 sshpass -e ssh user@host
Run Code Online (Sandbox Code Playgroud)

或从文件:

sshpass -f /path/to/password_file ssh user@host
Run Code Online (Sandbox Code Playgroud)


meu*_*euh 5

我的 sshpass 有一个-f从文件读取的选项。所以用 bash 进程替换你可以做

sshpass -f <(myscript_call_1password) ssh host
Run Code Online (Sandbox Code Playgroud)


jos*_*osh 0

由于sshpass不使用我的工作设置并且我不想使用另一个命令来登录,我最终走了另一条路线。expect我使用了ssh 配置参数和 Node 脚本的组合LocalCommand来获取密码。请参阅是否可以在 LocalCommand 中退出 SSH?以及。

本质上我的解决方案是这样的:

  1. 设置一个 ssh 主机,例如Host work指向HostName我的机器,例如HostName localhost

  2. PermitLocalCommand yes将和添加LocalComamnd <path to my expect script>; kill $PPID到Host配置中

  3. 使用expect脚本来:

    1. 运行我的 Node 脚本,它将获取我的密码并将其保存到变量中

    2. 在预期期间使用保存的密码然后进行交互(见下文)

  4. 当 SSH 会话完成时,LocalCommand将运行kill $PPID,这将使我返回到原来的终端会话。

这是我的示例expect脚本:

set password [exec node <script>]
spawn -noecho ssh <work_host>
expect "Password"
send "${password}\n"
interact
Run Code Online (Sandbox Code Playgroud)