网站搜索

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

sshpassssh 一起使用,您可以通过发出以下命令查看所有 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 更安全的公钥身份验证机制。

请通过下面的反馈部分留下问题或评论,以便进一步讨论。