通过 SSH 运行自动脚本

我们已经向您展示了如何使用 SSH 安全地传输文件。 但是 SSH 的默认行为存在一个主要问题。 只有在您手动输入密码后,您才能与远程计算机连接,该密码排除了您想在无人值守的情况下运行的任何任务。 或者是吗?

以下是关于如何 OpenSSH CLI 工具(scp 和 sftp) 工作,以便您可以更好地理解这个问题。 当您想将文件复制到远程主机或从远程主机复制文件时,可以使用 scp 自动启动与远程主机的 SSH 连接。 每次您运行 scp 命令时,它都会建立与远程的新连接。 因此,如果您有多个 scp 命令,您将多次输入相同的密码。

这就是为什么你不想在任何你想在无人看管的情况下运行的脚本中使用 scp。 还有一个事实是,如果您在网络上的多台机器上拥有多个帐户,那么您将很难记住每个帐户的唯一、强密码。

为了克服这个问题,您需要将 OpenSSH 的默认身份验证机制切换到基于密钥的系统。

成功的关键

默认情况下,OpenSSH 仅在客户端第一次遇到新的远程机器时使用密钥来验证服务器的身份:

当您通过键入“yes”进行响应时,远程主机将添加到已知主机列表中。 因此,除了服务器通过询问密码来验证客户端之外,客户端还使用密钥来验证服务器。

同样,您也可以获得一组密钥来证明您的身份。 OpenSSH 使用一对密钥来证明您的身份并创建与远程服务器的安全连接。 私钥仅供您查看,您的 OpenSSH 客户端使用该私钥向服务器证明您的身份。 然后是您应该将公钥保存在您想要通过 SSH 连接的所有远程计算机上的所有帐户下。

要创建密钥,请在您的客户端上输入:

请记住不要将密码留空,并记下存储密钥的位置。 “id_rsa”文件只能由您的帐户读取,其内容使用您在生成期间提供的密码进行加密。

下一步是将公钥复制到远程服务器。 假设您希望登录用户“admin”在名为“atlantis.remote.com”的远程计算机上,您可以使用单个命令移动键:

在您为您的私钥提供密码后,公钥将自动放置在远程服务器上的正确位置,默认情况下是“~/.ssh/authorized_keys”文件。

当您现在 ssh 进入远程机器时,系统会提示您输入密码。 使用密钥的唯一优点是,远程服务器和您的客户端不是使用未加密传输的密码来验证您的身份,而是根据密钥建立您的身份。

您现在也可以使用相同的密码 ssh 进入多个远程机器,只要这些远程机器拥有您的公钥。 因此,您不必记住多个密码。

但是您仍然无法在不被密码中断的情况下运行脚本。

SSH 代理来救援

OpenSSH 捆绑了一个名为 ssh-agent 的工具,它将您的私钥保存在内存中。 代理运行后,SSH 客户端将与代理交互,而不是提示您输入密码。

您可以使用“ssh-agent /bin/bash“,假设您正在使用 bash 贝壳。

任何需要访问您的 OpenSSH 私钥的命令都将被代理拦截和回答。

代理运行时,您需要为其配备密钥。 这是通过调用“ssh-add”程序来完成的,该程序默认从默认身份文件(~/.ssh/id_rsa)加载密钥。

现在,当您使用“ssh [email protected]“,不输入密码就可以了!

同样,scp 和 sftp 也可以连接到远程主机,而无需询问您的密码。 因此,您现在可以安排和运行自动操作远程计算机上的文件的脚本。

此外,现在您正在使用密钥,最好禁用通过密码进行的身份验证。 为此,请编辑远程服务器的配置文件 (/etc/ssh/.sshd_config) 并更改“PasswordAuthentication”参数从“是”到“否”。 从现在开始,如果任何人试图连接到您的 SSH 服务但在服务器上没有公钥,他们将被拒绝访问,甚至不会看到登录提示。

图片来源: 卡鲁纳卡尔·雷克

订阅我们的新闻!

我们最新的教程直接发送到您的收件箱

注册所有时事通讯。 注册即表示您同意我们的隐私政策并且欧洲用户同意数据传输政策。 我们不会共享您的数据,您可以随时取消订阅。 订阅