在 Linux 和 Unix 的 shell 脚本中使用 sshpass 实现 SSH 密码自动化
在本指南中,我们将了解什么是 sshpass实用程序,如何在 Linux和FreeBSD系统中安装 sshpass,以及如何在 Linux 和 Unix 的 shell 脚本中使用 sshpass 进行非交互式 SSH 登录。
介绍
作为 Linux 系统管理员,您可能需要每天多次访问远程机器并在它们之间传输文件。访问远程系统的一种方法是ssh。两种最常用的 SSH 身份验证方法是基于密码的方法和基于密钥的身份验证方法。
在基于密码的身份验证方法中,用户每次向远程系统进行身份验证时都必须手动输入密码。这种方法有点乏味,也不适合通过脚本自动化任务。因为,用户每次还是要手动输入密码。因此,如果您想在脚本中实现基于密码的 SSH 身份验证,您可能需要尝试sshpass命令行实用程序。
什么是sshpass?
sshpass 实用程序设计用于使用键盘交互密码身份验证模式运行 ssh,但以非交互方式运行。简而言之 – sshpass 提供了非交互式方式来验证 SSH 会话。
SSH 使用直接 TTY 访问来确保密码确实是由交互式键盘用户发出的。sshpass 在专用的 tty 中运行 ssh,使其误以为它正在从交互式用户那里获取密码。
在 Linux 中安装 sshpass
许多 Linux 发行版的默认存储库中都提供了 sshpass 实用程序。例如,您可以使用以下命令在 Arch Linux 及其变体(如 EndeavourOS 和 Manjaro Linux)中安装 sshpass:
$ sudo pacman -S sshpass
在 Debian、Ubuntu 及其衍生产品中安装 sshpass:
$ sudo apt install sshpass
在 Fedora、RHEL、CentOS、AlmaLinux 和 Rocky Linux 中安装 sshpass:
$ sudo dnf install sshpass
在 openSUSE 中安装 sshpass:
$ sudo zypper install sshpass
要在 FreeBSD 中安装 sshpass,请运行以下命令root
用户:
# cd /usr/ports/security/sshpass/ && make install clean
# pkg install sshpass
提醒一句:所有这些方法都是极度不安全. 所有系统用户只需发出ps
命令即可查看命令中的密码。不建议在生产中使用这些方法。最好使用基于密钥的 SSH 身份验证。
使用 sshpass 进行非交互式 SSH 登录
让我们举几个例子来了解如何使用 sshpass 进行非交互式 SSH 登录,即无需输入 SSH 密码。
示例 1 – 使用 sshpass 通过 ssh 登录到远程系统
sshpass 可以接受密码作为参数,或者通过环境变量读取密码,或者从文本文件中读取密码。
让我们看一下每种方法的示例。
提供密码作为参数
要提供密码作为参数,请使用如下-p
选项。
$ sshpass -p <remote-password> ssh remoteuser@ip-address
例子:
$ sshpass -p almalinux ssh ostechnix@192.168.1.20
这里,
-p almalinux
– 提供远程系统的密码(即 ubuntu)。ostechnix@192.168.1.20
– 远程用户名和 IP 地址。
输出:
Last login: Tue Oct 11 12:33:20 2022 from 192.168.1.101 [ostechnix@Almalinux8CT ~]$
您也可以在不实际登录的情况下在远程系统上执行命令。
$ sshpass -p almalinux ssh ostechnix@192.168.1.20 uname -a
提供密码作为环境变量
在这个方法中,我们声明了一个名为SSHPASS的环境变量,它的值是远程系统的密码。这比直接提供密码作为参数要好一点。
首先,使用export
命令将密码保存在一个名为SSHPASS
如下的环境变量中:
$ export SSHPASS=almalinux
然后我们提供带有-e
如下标志的密码:
$ sshpass -e ssh ostechnix@192.168.1.20
您还可以组合这两个命令并将它们作为单个命令运行,如下所示。
$ SSHPASS=almalinux sshpass -e ssh ostechnix@192.168.1.20
此方法还将密码暴露给历史文件,所有用户都可以使用history
命令查看它。为了防止用户查看密码,只需清除 bash 历史记录即可。
从文本文件中读取密码
mypassword.txt
将密码附加到使用命令调用的文本文件中echo
:
$ echo "almalinux" > mypassword.txt
chmod
使用命令保护密码文件:
$ chmod 0400 mypassword.txt
现在,将密码文件传递给带有-f
如下标志的 sshpass:
$ sshpass -f mypassword.txt ssh ostechnix@192.168.1.20
使用 gpg 加密密码文件
在前面的示例中,我们将密码保存在一个名为“”的纯文本文件中,并使用标志mysshpassword.txt
传递它。-f
我们还可以使用gpg加密明文密码文件。
mysshpassword
将密码附加到使用命令调用的文本文件中echo
:
$ echo "almalinux" > ~/.mysshpassword
你注意到我在 mysshpassword 前面加了一个点吗?这意味着我已将密码文件隐藏在我的 $HOME 目录中。
gpg
使用命令加密密码文件:
$ gpg -c ~/.mysshpassword
您将被要求在新的弹出框中输入密码。输入密码两次,然后单击“确定”关闭该框。
删除明文密码文件:
$ rm ~/.mysshpassword
现在,您可以使用以下命令在远程计算机上运行命令:
$ gpg -d -q ~/.mysshpassword.gpg | sshpass ssh ostechnix@192.168.1.20 uname -a
请注意,上述命令不会 ssh 进入远程系统。它只执行uname -a
远程系统中的“”命令。
示例 2 – 使用带有 sshpass 的 Rsync 传输文件
要使用 Rsync over SSH 将文件从本地系统传输到远程系统,请运行:
$ rsync ~/file.txt --rsh="sshpass -p almalinux ssh -l ostechnix" 192.168.1.20:/home/ostechnix/
您还可以使用-e
示例 1 部分中所示的选项以稍微不那么暴露的方式传输文件。
$ export SSHPASS=almalinux
$ rsync ~/file.txt --rsh="sshpass -e ssh -l ostechnix" 192.168.1.20:/home/ostechnix/
示例 3 – 使用 scp 和 sshpass 复制文件
我们可以使用 sshpass 和scp
命令以非交互模式在本地和远程系统之间复制文件。
$ scp ~/file.txt --rsh="sshpass -p almalinux ssh -l ostechnix" 192.168.1.20:/home/ostechnix/
示例 4 – 在 shell 脚本中使用 sshpass 实现 SSH 密码自动化
在前面的部分中,我们讨论了如何使用 sshpass 以非交互方式通过 SSH 登录到远程。现在让我们看看如何使用 sshpass 在 shell 脚本中管理 SSH 连接。
创建一个名为的新脚本diskusage_sript.sh
,其中包含以下内容。
#!/usr/bin/env bash #------------------------------------------------------- #Author: Ostechnix #Purpose: Report file system disk space usage of remote systems #------------------------------------------------------- SSHPASS=almalinux sshpass -e ssh ostechnix@192.168.1.20 'df -h'
使用命令执行脚本:
$ sh diskusage_sript.sh
输出:
Filesystem Size Used Avail Use% Mounted on /dev/loop0 20G 1.4G 18G 8% / none 492K 4.0K 488K 1% /dev udev 16G 0 16G 0% /dev/tty tmpfs 16G 0 16G 0% /dev/shm tmpfs 16G 8.6M 16G 1% /run tmpfs 3.1G 0 3.1G 0% /run/user/1000
如果您不想将密码放在纯文本脚本中,您可以简单地使用 gpg 加密密码文件,如示例 1 部分所示,并将脚本中的最后一行替换为以下行。
gpg -d -q ~/.mysshpassword.gpg | sshpass ssh ostechnix@192.168.1.20 'df -h'
修改该行后,实际脚本应如下所示:
#!/usr/bin/env bash #------------------------------------------------------- #Author: Ostechnix #Purpose: Report file system disk space usage of remote systems #------------------------------------------------------- gpg -d -q ~/.mysshpassword.gpg | sshpass ssh ostechnix@192.168.1.20 'df -h'
有关 sshpass 使用的更多详细信息,请参阅手册页。
$ man sshpass
结论
在本指南中,我们了解了 sshpass 是什么,如何在各种 Linux 和 FreeBSD 系统中安装 sshpass,如何使用 sshpass 进行非交互式 SSH 登录,最后如何借助 sshpass 实用程序在 shell 脚本中执行 SSH 密码自动化Linux 和 FreeBSD 系统。
请注意,sshpass 不能替代基于 SSH 密钥的身份验证方法。您可以在需要在非交互模式下实现基于密码的身份验证的任何地方使用 sshpass。
正如我已经警告过的,不推荐在共享系统中使用 sshpass 。因为,密码记录在 shell 的历史中,所有系统用户都可以通过查看 bash 历史文件来查看。
如果您是唯一使用该系统的人,那么这没什么大不了的。您可以使用 sshpass 实现基于密码的自动 SSH 身份验证。
参考:

获取更多建站运营运维新知!互联网创业、前沿技术......
最新评论
感谢分享,谢谢站长!!@天天下载
求同型号
能别用城通吗,缺钱缺这样啊
你好,请问有华硕ac68U可以使用的版本吗
xiaomi mini 是什么架构阿 是mipsel_24kc架构ma