在工作中,我通过 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
不使用我的工作设置并且我不想使用另一个命令来登录,我最终走了另一条路线。我使用了expect
ssh 配置参数和 Node 脚本的组合LocalCommand
来获取密码。看是否可以在 LocalCommand 中退出 SSH?以及。
本质上我的解决方案是这样的:
设置一个 ssh 主机,例如
Host work
指向HostName
我的机器,例如HostName localhost
将
PermitLocalCommand yes
和添加LocalComamnd <path to my expect script>; kill $PPID
到Host
配置中使用expect脚本来:
运行我的 Node 脚本,它将获取我的密码并将其保存到变量中
在预期期间使用保存的密码然后进行交互(见下文)
当 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
呼叫。