无需键入即可在 SSH 中输入密码

无需键入即可在 SSH 中输入密码

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

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

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

答案1

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

SSHPASS=12345 sshpass -e ssh user@host

或来自文件:

sshpass -f /path/to/password_file ssh user@host

答案2

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

sshpass -f <(myscript_call_1password) ssh host

答案3

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

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

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

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

  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

答案4

回答有关自动化和击键消除的原始问题:

我看到了,sshpass但是需要sshpass在运行之前输入命令ssh,这有点不方便。

根据您的评论:

我有一个与 1password 数据库通信的脚本,因此我希望将该脚本与 SSH 集成。

定义别名(例如在 bash 中):

alias ssh='sshpass -p$(<your_script>) ssh'

并将其用作常规ssh呼叫。

相关内容