使用 sshpass 在 Linux 中实现 SSH 密码自动化
[编者注,2021 年 11 月 29 日:所有在命令行上提供密码的示例都存在密码被用户 shell 历史记录捕获(如果支持)或被进程列表中的所有系统用户看到的风险。安全专家建议删除所有文件并清除 shell 日志。]
连接远程系统并向其传输文件是系统管理员经常要做的事情。Linux 平台上许多系统管理员使用的一个基本工具是 SSH。SSH 支持两种形式的身份验证:
- 密码认证
- 公钥认证
公钥认证被认为是这两种方法中最安全的形式,尽管密码认证是最流行和最简单的。但是,使用密码认证时,总是要求用户输入密码。这种重复很乏味。此外,在 shell 脚本中使用 SSH 时还需要手动干预。如果在使用 SSH 密码认证时需要自动化,那么一个名为 的简单工具sshpass
是必不可少的。
sshpass 是什么?
该sshpass
实用程序旨在使用键盘交互式密码验证模式运行 SSH,但以非交互式方式。
SSH 使用直接 TTY 访问来确保密码确实是由交互式键盘用户发出的。sshpass
在专用 TTY 中运行 SSH,欺骗 SSH 认为它正在从交互式用户那里获取密码。
安装 sshpass
您可以sshpass
使用这个简单的命令进行安装:
# yum install sshpass
使用 sshpass
在选项后指定要运行的命令sshpass
。通常,命令带有ssh
参数,但也可以是任何其他命令。但是,SSH 密码提示当前已硬编码到 中sshpass
。
该命令的概要sshpass
如下:
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
在哪里:
-ppassword
The password is given on the command line.
-ffilename
The password is the first line of the file filename.
-dnumber
number is a file descriptor inherited by sshpass from the runner. The password is read from the open file descriptor.
-e
The password is taken from the environment variable "SSHPASS".
示例
为了更好地理解的价值和用途sshpass
,让我们看一些包含不同实用程序的示例,包括 SSH、Rsync、Scp 和 GPG。
示例 1:SSH
用于sshpass
通过 SSH 登录远程服务器。假设密码为!4u2tryhack
。以下是使用 sshpass 选项的几种方法。
A. 使用-p
(这被认为是最不安全的选择,不应使用):
$ sshpass -p !4u2tryhack ssh username@host.example.com
在 shell 脚本中使用时,该-p
选项如下所示:
$ sshpass -p !4u2tryhack ssh -o StrictHostKeyChecking=no username@host.example.com
B. 使用-f
选项(密码应为文件名的第一行):
$ echo '!4u2tryhack' >pass_file
$ chmod 0400 pass_file
$ sshpass -f pass_file ssh username@host.example.com
这 $ chmod 0400 pass_file
对于确保密码文件的安全至关重要。RHEL 上的默认 umask 为 033,这将允许所有人读取该文件。
-f
在 shell 脚本中使用时的选项如下:
$ sshpass -f pass_file ssh -o StrictHostKeyChecking=no username@host.example.com
C. 使用-e
选项(密码应该是文件名的第一行):
$ SSHPASS='!4u2tryhack' sshpass -e ssh username@host.example.com
在 shell 脚本中使用时该-e
选项如下所示:
$ SSHPASS='!4u2tryhack' sshpass -e ssh -o StrictHostKeyChecking=no username@host.example.com
示例 2:Rsync
使用:sshpass
rsync
$ SSHPASS='!4u2tryhack' rsync --rsh="sshpass -e ssh -l username" /custom/ host.example.com:/opt/custom/
上面使用了-e
选项,将密码传递给环境变量SSHPASS
我们可以-f
像这样使用开关:
$ rsync --rsh="sshpass -f pass_file ssh -l username" /custom/ host.example.com:/opt/custom/
示例 3:Scp
sshpass
与使用scp:
$ scp -r /var/www/html/example.com --rsh="sshpass -f pass_file ssh -l user" host.example.com:/var/www/html
示例 4:GPG
您还可以使用sshpass
GPG 加密文件。-f
使用开关时,参考文件为纯文本。让我们看看如何使用 GPG 加密文件并使用它。
首先创建一个文件如下:
$ echo '!4u2tryhack' > .sshpasswd
接下来,使用以下命令加密文件gpg
:
$ gpg -c .sshpasswd
删除包含明文的文件:
$ rm .sshpasswd
最后使用如下:
$ gpg -d -q .sshpasswd.gpg | sshpass ssh user@srv1.example.com
包起来
sshpass
是一款简单的工具,但对系统管理员来说却大有裨益。它绝不会取代最安全的 SSH 身份验证形式,即公钥身份验证。不过,sshpass
也可以将其添加到系统管理员工具箱中。
[ 免费在线课程:Red Hat Enterprise Linux 技术概述。 ]