暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

自动化登录神器sshpass!交互无需手动输入密码

编程与架构 2024-10-17
1370
关注下方公众号,获取更多热点资讯

自动化登录神器sshpass!交互无需手动输入密码


1. 什么是sshpass

sshpass
 是一个用于非交互式 SSH 登录的开源工具。通常情况下,当我们使用 SSH 连接到远程服务器时,需要手动输入密码或使用密钥认证。然而,在自动化脚本和任务中,手动输入密码是不切实际的,尤其是需要批量执行任务时。sshpass
 提供了一种简单的方式,通过传递密码使得 SSH 操作能够自动化完成。

在大多数自动化场景中,推荐使用SSH密钥,因为它更加安全且便于管理。然而,在某些特殊情况下:

  • • 无法使用SSH密钥(例如目标服务器不支持密钥登录)

  • • 批量操作多个不支持密钥的服务器

  • • 临时访问多个新服务器,并且没有准备SSH密钥

这些场景中,手动输入密码变得不实际甚至繁琐。这时,sshpass
 提供了一种无需交互式输入密码的方式,可以直接在脚本中处理SSH登录,并支持批量执行。

使用场景

  1. 1. 自动化任务调度:定时执行脚本时自动化登录远程服务器。

  2. 2. 批量任务执行:自动批量登录多台服务器,执行任务后返回结果。

  3. 3. 文件同步:结合rsync
    scp
    等工具,自动化执行文件传输。


2. sshpass的安装与配置

在不同操作系统中,sshpass
 的安装方法有所不同,下面将介绍如何在Linux、macOS和Windows系统中安装并配置sshpass

2.1 在Linux系统中安装sshpass

在大多数Linux发行版中,sshpass
 都可以通过系统的包管理器直接安装。以下是几个常见的Linux发行版的安装步骤。

Ubuntu/Debian

在Ubuntu或Debian系统中,你可以使用apt-get
来安装sshpass

sudo apt-get update
sudo apt-get install sshpass

CentOS/RedHat

在CentOS或RedHat系统中,使用yum
进行安装:

sudo yum install epel-release -y
sudo yum install sshpass -y

Arch Linux

在Arch Linux上,使用pacman
进行安装:

sudo pacman -S sshpass

2.2 在macOS系统中安装sshpass

macOS系统中没有预装包管理器,但你可以使用Homebrew来安装sshpass
。如果尚未安装Homebrew,可以使用以下命令安装:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装Homebrew后,执行以下命令安装sshpass

brew install esolitos/ipa/sshpass

2.3 在Windows系统中安装sshpass

在Windows上,sshpass
并没有直接提供的可执行程序,但你可以通过以下方式使用它:

  1. 1. 使用WSL (Windows Subsystem for Linux)

    • • 首先安装WSL,参考微软官方文档进行安装。

    • • 启动WSL,并在WSL的Linux环境中安装sshpass
      ,可以参考上面的Linux系统安装步骤。

  2. 2. 使用Cygwin

    安装完成后,你可以在Cygwin终端中使用sshpass

    • • 下载并安装Cygwin(https://cygwin.com/install.html)。

    • • 在安装时选择sshpass作为软件包的一部分。


3. 使用sshpass进行自动化登录

安装完成后,我们就可以开始使用sshpass
来自动化SSH登录。sshpass
支持多种方式传递密码,包括通过命令行、文件或环境变量。下面我们将逐一介绍不同的使用方法。

3.1 使用密码文件登录

将密码存储在一个文件中,并让sshpass
从该文件中读取密码进行登录。假设密码文件为/path/to/password.txt
,文件内容只有一行,即密码:

sshpass -f /path/to/password.txt ssh user@192.168.1.100

这种方法避免了在命令行中直接暴露密码,但需要确保密码文件的权限设置得当,防止未经授权的用户读取。

3.2 通过环境变量传递密码

你也可以通过设置环境变量SSHPASS
,让sshpass
读取密码:

export SSHPASS='your_password'
sshpass -e ssh user@192.168.1.100

这种方法可以在脚本中灵活使用,但同样要注意确保环境变量的安全性。

3.3 直接在命令行传递密码

虽然不推荐,但你可以直接将密码作为命令行参数传递:

sshpass -p 'your_password' ssh user@192.168.1.100

这种方式可能会在终端历史记录或进程列表中暴露密码,存在较大的安全风险,除非在一些非常简单且安全的场景下,否则不建议使用。

3.4 使用脚本实现批量自动化登录

如果你需要批量自动化登录多台服务器,可以使用for
循环和sshpass
结合实现批量登录。比如我们有多个服务器的IP列表,并且需要在这些服务器上执行同样的命令:

#!/bin/bash
SERVER_LIST=("192.168.1.101" "192.168.1.102" "192.168.1.103")
PASSWORD="your_password"
for SERVER in "${SERVER_LIST[@]}"
do
    sshpass -p "$PASSWORD" ssh user@$SERVER 'uptime'
done

这段脚本会遍历SERVER_LIST
中的所有服务器,使用sshpass
自动登录并执行uptime
命令,输出服务器的运行时长信息。


4. sshpass的高级用法

除了登录远程服务器,sshpass
 还可以结合其他常用的工具,如rsync
scp
等,进一步扩展它的应用范围,尤其是在自动化文件传输和批量任务处理时非常有用。

4.1 结合rsync实现自动化文件同步

rsync
是Linux系统中非常常用的文件同步工具,通过结合sshpass
,你可以在没有SSH密钥的情况下,自动化将文件从本地同步到远程服务器。例如,我们要将本地目录/local/dir
 同步到远程服务器的/remote/dir

sshpass -p 'your_password' rsync -avz /local/dir user@192.168.1.100:/remote/dir

在这条命令中,rsync
会使用-a
选项保持文件的元数据属性(如权限和时间戳),-v
是显示同步过程中的详细信息,-z
是压缩传输,节省带宽。通过sshpass
,可以避免每次同步时都需要手动输入密码。

这种方法非常适合于定期文件备份或内容部署场景中使用,结合crontab
等工具,你可以设置自动化的定时任务来定期同步数据。

4.2 结合scp实现自动化文件传输

scp
(Secure Copy)是用于通过SSH进行安全文件传输的命令。类似于rsync
sshpass
也可以与scp
结合,实现文件的自动化传输。假设你要将本地文件/local/file.txt
传输到远程服务器/remote/dir/
,可以使用以下命令:

sshpass -p 'your_password' scp /local/file.txt user@192.168.1.100:/remote/dir/

如果你要从远程服务器下载文件到本地,也可以使用同样的方法:

sshpass -p 'your_password' scp user@192.168.1.100:/remote/file.txt /local/dir/

通过scp
,你可以实现远程文件的自动化传输,而无需手动输入密码或配置SSH密钥。

4.3 结合expect实现更加复杂的交互式任务

在某些场景下,除了输入密码,你可能还需要处理一些更加复杂的交互,例如多步骤的认证或其他提示信息。这时,sshpass
可能无法满足需求,而expect
可以提供更多的灵活性。

expect
是一个自动化工具,用于模拟与应用程序的交互。你可以结合expect
sshpass
来自动化处理更复杂的任务。以下是一个简单的expect
脚本示例,自动化执行SSH登录并处理更多的交互信息:

#!/usr/bin/expect
set timeout 10
set password "your_password"

spawn ssh user@192.168.1.100
expect "password:"
send "$password\r"
expect "$ "
send "uptime\r"
expect "$ "
send "exit\r"

这种方法适用于需要处理多种交互提示的场景,expect
可以灵活捕捉到远程终端的输出并自动化输入相应的内容。


5. sshpass使用中的注意事项

密码泄露的风险

sshpass
允许通过命令行参数、环境变量或密码文件传递密码,而这些方式都有可能导致密码泄露:

  • • 命令行传递密码:当你通过命令行直接传递密码时,密码可能会出现在终端历史记录中,或在ps
    等进程监控工具中暴露。这是最不安全的方式,除非在完全受控的环境中,否则不推荐使用。

  • • 环境变量传递密码:虽然环境变量比命令行传递更安全,但密码依然可能被误导出,特别是在共享环境或多用户系统中。

  • • 密码文件:通过文件传递密码相对较为安全,但一定要确保文件的访问权限设置正确,只有执行该脚本的用户才能读取文件。

sshpass
作为一个非交互式SSH登录工具,为批量任务、自动化脚本、文件传输等场景提供了极大的便利,特别是在无法使用SSH密钥的情况下,sshpass
可以帮助我们快速实现自动化的密码登录。


欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。



文章转载自编程与架构,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论