通过 SSH 非交互方式连接(可能的选项)

通过 SSH 非交互方式连接(可能的选项)

我正在尝试创建一个通用的 bash 脚本,以使用非交互式方法(使用sshpass)通过 SSH 连接到远程服务器。我需要知道的是通过 SSH 连接的可能方式。

到目前为止,我知道您可以使用密码和密钥文件(带有密码,如果设置)来连接:

  1. 通过密码登录

    sshpass -p {ssh-pass} ssh {ssh-user}@{ssh-host} -p {ssh-port}
    
  2. 通过密钥登录(无需密码)

    ssh -i {ssh-key} {ssh-user}@{ssh-host} -p {ssh-port}
    
  3. 通过密钥登录(使用密码)

    sshpass -Ppassphrase -p {passphrase} ssh -i {ssh-key} {ssh-user}@{ssh-host} -p {ssh-port}
    
  4. ???

答案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:~$ 

(实际指纹已被伪造)

此外,如果您希望自动化远程脚本,我不建议您研究安西布尔足够的。

相关内容