sshpass:非交互式 SSH 登录的优秀工具 - 切勿在生产服务器上使用
在大多数情况下,Linux 系统管理员通过提供密码、无密码 SSH 登录或基于密钥的 SSH 身份验证,使用 SSH 登录远程 Linux 服务器。
如果您想向 SSH 提示本身提供密码和用户名怎么办?这就是 sshpass 发挥作用的地方。
sshpass 是一个简单且轻量级的命令行工具,它使我们能够向命令提示符本身提供密码(非交互式密码身份验证),以便可以执行自动 shell 脚本以通过 cron 调度程序进行备份。
ssh 使用直接 TTY 访问来确保密码实际上是由交互式键盘用户提供的。 Sshpass 在专用 tty 中运行 ssh,误导它相信它正在从交互式用户接收密码。
重要:使用 sshpass 被认为是最不安全的,因为它通过简单的 在命令行上向所有系统用户泄露密码“ps”命令。我强烈建议使用 SSH 无密码身份验证。
在 Linux 系统上安装 sshpass
在基于 RedHat/CentOS 的系统中,首先您需要在系统上启用 Epel 存储库,以便使用 yum 命令安装它,如图所示。
yum install sshpass
dnf install sshpass [On Fedora 22+ versions]
在 Debian/Ubuntu 及其衍生版本上,您可以使用 apt-get 命令安装它,如图所示。
sudo apt-get install sshpass
或者,您可以从源代码安装最新版本的 sshpass,首先下载源代码,然后提取 tar 文件的内容并安装它,如下所示:
wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz
tar -xvf sshpass.tar.gz
cd sshpass-1.06
./configure
sudo make install
如何在 Linux 中使用 sshpass
sshpass 与 ssh 一起使用,您可以通过发出以下命令查看所有 sshpass 使用选项及其完整说明:
sshpass -h
Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
-f filename Take password to use from file
-d number Use number as file descriptor for getting password
-p password Provide password as argument (security unwise)
-e Password is passed as env-var "SSHPASS"
With no parameters - password will be taken from stdin
-h Show help (this screen)
-V Print version information
At most one of -f, -d, -p or -e should be used
正如我之前提到的,sshpass 对于脚本编写来说更可靠、更有用,请考虑下面的示例命令。
使用用户名和密码登录远程 Linux ssh 服务器(10.42.0.1),并检查远程系统的文件系统磁盘使用情况,如图所示。
sshpass -p 'my_pass_here' ssh [email 'df -h'
重要:这里的密码是在命令行上提供的,这实际上是不安全的,不建议使用此选项。
但是,为了防止在屏幕上显示密码,您可以使用 -e
标志并输入密码作为 SSHPASS 环境变量的值,如下所示:
export SSHPASS='my_pass_here'
echo $SSHPASS
sshpass -e ssh [email 'df -h'
注意:在上面的示例中,SSHPASS 环境变量仅用于临时目的,将在重新启动时删除。
要永久设置 SSHPASS 环境变量,请打开 /etc/profile 文件并在文件开头键入导出语句:
export SSHPASS='my_pass_here'
保存文件并退出,然后运行以下命令以使更改生效:
source /etc/profile
另一方面,您还可以使用 -f
标志并将密码放入文件中。这样,您就可以从文件中读取密码,如下所示:
sshpass -f password_filename ssh [email 'df -h'
您还可以使用 sshpass 使用 scp 传输文件或使用 SSH 通过 rsync 备份/同步文件,如下所示:
------- Transfer Files Using SCP -------
scp -r /var/www/html/example.com --rsh="sshpass -p 'my_pass_here' ssh -l aaronkilik" 10.42.0.1:/var/www/html
------- Backup or Sync Files Using Rsync -------
rsync --rsh="sshpass -p 'my_pass_here' ssh -l aaronkilik" 10.42.0.1:/data/backup/ /backup/
要了解更多用法,我建议您阅读 sshpass 手册页,输入:
man sshpass
在本文中,我们解释了 sshpass 一个支持非交互式密码身份验证的简单工具。虽然这个工具可能会有帮助,但强烈建议使用 ssh 更安全的公钥身份验证机制。
请通过下面的反馈部分留下问题或评论,以便进一步讨论。