我正在尝试创建一个通用的 bash 脚本,以使用非交互式方法(使用sshpass
)通过 SSH 连接到远程服务器。我需要知道的是通过 SSH 连接的可能方式。
到目前为止,我知道您可以使用密码和密钥文件(带有密码,如果设置)来连接:
通过密码登录
sshpass -p {ssh-pass} ssh {ssh-user}@{ssh-host} -p {ssh-port}
通过密钥登录(无需密码)
ssh -i {ssh-key} {ssh-user}@{ssh-host} -p {ssh-port}
通过密钥登录(使用密码)
sshpass -Ppassphrase -p {passphrase} ssh -i {ssh-key} {ssh-user}@{ssh-host} -p {ssh-port}
???
答案1
恭喜,您已经学到了安全方面重要且有时令人痛苦的教训之一:
自动化和安全性不一致。
为了自动在脚本中运行,您需要确保脚本可以访问所有凭据,而无需您进一步交互。但这意味着需要提供上述凭据不知何故,这意味着在命令行上传递它们(坏的想法,因为任何可以阅读的人ps
都可以预测它们)或在只能由脚本用户读取的文件中。
对于通过调度程序运行并需要非交互式 SSH 的自动化脚本,我的首选解决方案是创建一个无密码密钥,该密钥将专门用于该目的且仅用于该目的;这可以让我通过authorized_keys
接收端的文件来控制它可以做什么和不能做什么。然后,该密钥存储在只有运行脚本的用户可读的文件中。
另一方面,如果这是一个您打算手动运行的脚本,并且只是不想在其中被提示输入密码而烦恼,那么您想要的是SSH 密钥代理。
如果您使用的是 GNOME 桌面环境,我知道 gnome-keyring 可以并且确实充当 SSH 密钥代理,您可以简单地将密钥读入其中ssh-add
-- 此时任何 ssh 进程都可以从其中的任何位置启动gnome 桌面环境将能够联系代理并使用其存储的凭据,直到您结束会话或从密钥环中清除密钥。
shadur@luminosity:~$ ssh-add .ssh/id_ed25519
Enter passphrase for .ssh/id_ed25519:
Identity added: .ssh/id_ed25519 (Shadur - 2020)
shadur@luminosity:~$ ssh-add -l
256 SHA256:e3gvrdo**************FxJCtPo7DYN Shadur - 2020 (ED25519)
shadur@luminosity:~$
(实际指纹已被伪造)
此外,如果您希望自动化远程脚本,我不建议您研究安西布尔足够的。