使用 sshpass 进行非交互式的 SSH 连接

首先,抱歉,这个标题很拗口。
说一下,sshpass 能干吗。我们在终端命令行下直接用 ssh 连接远程主机时,默认状态下,会提示输入密码。可以看到,这个步骤实际上是在终端下以交互式的方式完成的 — 终端给提示,用户手动输入密码。

由于需要人工参与,在脚本中进行自动化的 ssh 远程连接就不可能实现了。

在自动化脚本中进行 ssh 连接,我知道的方式有三种:

1. 通过 ssh-key 的方式建立两台机器间的互相信任关系
2. 借助 sshpass 工具,将密码以参数的方式提供
3. 借助 expect,将密码在脚本中提供

本文只介绍第 2 种方式。

sshpass 是一个工具,通过它可以做这样一件事:将远程主机的密码以参数的形式提供给 sshpass 之后,再执行 ssh 连接时就不需要交互式的人工输入密码了。

用法很简单:

$ sshpass -p password ssh username@host

但是,实际使用时发现,当第一次连接某台主机时,执行上面这条 sshpass 命令没有任何反应。把 sshpass 部分去掉,单独使用 ssh 连接该主机时,发现了规律。

$ ssh [email protected]
The authenticity of host ’10.x.x.x (10.x.x.x)' can't be established.
RSA key fingerprint is a4:eb:8c:7d:2a:ef:d6:1c:a3:0c:e8:e5:00:d2:eb:60.
Are you sure you want to continue connecting (yes/no)?

即:ssh 结合 sshpass 使用,碰到首次连接一台主机的情况时,上面这行提示被吞没掉了。

如果确定首次连接的主机是安全的,可以对 sshpass 命令下的 ssh 添加选项:-o StrictHostKeychecking=no

完整命令如下:

$ sshpass -p password ssh -o StrictHostKeychecking=no username@host

另外,由于 scp 使用 ssh 方式进行远程主机间文件复制,因此,sshpass 也可以作用于 scp。

scp  + sshpass 例子如下:

$ sshpass -p password scp -o StrictHostKeychecking=no -r username@host:~/test ~

--------------


好玩儿的地方:

在 Mac OS X 下通过 brew install 方式安装 sshpass 时,碰到下面的话:

$ brew install sshpass
Error: No available formula for sshpass
We won't add sshpass because it makes it too easy for novice SSH users to
ruin SSH's security.

看来 sshpass 这种方式并不安全,因此,实际生产环境下建议只在内网使用。

你可能感兴趣的:(linux,shell,ssh,bash)