SSH 没有通过标准输入发送密码的简单方法,因此很难实现自动化。虽然它在安全性方面并不理想,但您可以使用该sshpass 实用程序在 bash 脚本中自动执行 SSH 密码身份验证。
在我们开始之前——出于某种原因,对 SSH 使用自动密码被认为是不好的做法。在几乎所有情况下,最好使用 SSH 密钥,我们将在下面展示。但是,密码确实具有更易于管理、记住和分发给团队成员的优点。这些同时都是安全方面的缺点,但这是您可以选择进行的权衡。
使用 SSHPass
常规ssh 命令没有–password 允许您轻松自动执行此操作的标志。您必须安装一个工具sshpass 来明确处理这个问题。你可以从大多数 Linux 包管理器下载它;对于像 Ubuntu 这样的基于 Debian 的系统,这将是:
sudo apt-get install sshpass
如果您sshpass 从脚本文件内部使用,则可以直接将其与-p 标志一起传递,然后是标准的 SSH 命令:
sshpass -p 'password' ssh user@remote
但是,由于以下几个原因,这不是一个好的做法:
- 如果在脚本文件之外使用,它会将明文密码暴露给 Linux 命令历史记录和其他系统。其他 Linux 用户可能能够看到它。
- 可能不清楚此脚本文件中是否隐藏了密码,这可能会导致暴露它的不良文件权限。
- 它可能会在版本控制中被意外跟踪,并且不允许更改客户端使用的密码。
因此,您应该将密码存储在文件中。确保为其设置权限以确保其他用户无法访问它。
echo "password" > password_file
chmod 600 password_file
然后,将其传递给sshpass with -f:
sshpass -f password_file ssh user@remote
改为设置 SSH 密钥
大多数系统首选 SSH 密钥。它们更长,也更难意外泄漏,使它们成为安全的理想选择。它们还鼓励基于身份的身份验证,因为 SSH 密钥通常与创建它们的机器相关联。
SSH 将您的公钥存储在 中~/.ssh/id_rsa.pub,它用于所有请求。生成新的密钥文件很容易:
ssh-keygen
您需要将此添加到~/.ssh/authorized_keys 要连接的服务器上的文件中。有一个内置的 SSH 命令可以为您轻松完成此操作:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
完成后,您将不再需要输入密码。您可以将此密钥复制到其他机器上,但通常只需添加多个密钥即可。
您仍然希望在远程服务器上禁用密码登录,并可能设置速率限制、白名单,甚至两因素身份验证。您可以阅读我们的保护 SSH 可访问机器的指南以了解更多信息。