我想在脚本中运行以下命令(意味着我无法在终端中以交互方式运行,因此只能在提示时输入密码):
ssh -o StrictHostKeyChecking=no[电子邮件保护] '回显我的密码| sudo -kS ufw 状态
‘
这将通过 ssh 进入远程主机并在远程主机上运行命令 ufw status。
该命令运行良好,但我需要能够从名为的环境变量中引用“密码”
SSHPASS = 我的密码
它存储密码是为了不让密码在命令中暴露。如何做到这一点?
答案1
ssh
您可以通过以下命令将包含密码的变量传递给sshpass
:
sshpass -p "$SSHPASS" ssh -o StrictHostKeyChecking=no [email protected]
也就是说,这并不比在脚本中设置密码更安全!
当你需要通过脚本访问服务器时,更好的解决方案ssh
是基于密钥的身份验证。
答案2
ssh
对于使用环境变量中的密码这一特定问题,有一个答案。尽管在大多数情况下,ssh 密钥可能是更好的方法,但在某些情况下,这可能会有所帮助。
Shunz 先生的做法是正确sshpass
的,他建议不要这样做,sshpass -p "$SSHPASS"
因为它会打印出密码。
相反,我们可以使用sshpass -e
,它ssh
直接从环境变量中调用密码SSHPASS
而不将其打印出来。
export SSHPASS
进入你的环境(手动、通过.bashrc
或其他配置)ssh
在命令前加上sshpass -e
,例如sshpass -e ssh -o StrictHostKeyChecking=no [email protected] <command>
阅读sshpass 手册页了解详细信息。
答案3
实现此目的的更好方法是为远程系统上的 root 用户设置一个 SSH 密钥,该密钥仅限于调用“ufw status”。
话虽如此,如果我理解你要做什么,你只需要向sudo
程序提供一个密码。为此,以下任何一种方法都可以:
echo "$PASSWORD" | ssh -o ... [email protected] 'sudo -kS ufw status'
ssh -o ... [email protected] "echo $PASSWORD | sudo -kS ufw status"
它们之间的主要区别在于第一个版本echo
在本地系统上运行,而第二个版本echo
在远程系统上运行。运行带有密码作为其命令行参数之一的命令可能会使其他用户看到密码。通过在一个主机或另一个主机上运行echo
,您可以使密码对不同的用户组可见。