在 Linux 自动化运维中,SSH 身份验证通常需要交互式输入密码。SSHpass 作为一个轻量级的免交互工具,通过模拟终端输入,让脚本能够自动处理 SSH 登录请求。
1. 安装方法
在大多数 Linux 发行版中,你可以直接通过包管理器安装:
- Ubuntu/Debian:
sudo apt install sshpass - CentOS/RHEL:
sudo yum install epel-release && sudo yum install sshpass - macOS:
brew install httpie(或通过源码编译)
2. 核心工作原理
SSHpass 的核心在于伪终端(PTY)模拟。
- 捕获提示: SSHpass 启动 SSH 进程并监控其输出。
- 模拟终端: 它创建一个伪终端,欺骗 SSH 客户端认为有一个真实用户在键盘前。
- 自动填充: 当监听到
password:等匹配字符时,SSHpass 立即将预存的密码推送到输入流。 - 透明执行: 验证通过后,SSHpass 将控制权移交给远程指令,整个过程对用户透明。
3. 具体命令用法
SSHpass 提供了多种方式来传递密码,按安全性从低到高排列如下:
A. 直接通过参数传递(不推荐用于生产)
这是最简单但最不安全的方式,因为密码会暴露在进程列表(ps 命令)中。
sshpass -p 'your_password' ssh user@remote_host "uptime"
B. 通过环境变量传递(较安全)
将密码存入变量,避免直接出现在命令行参数中。
export SSHPASS='your_password'
sshpass -e ssh user@remote_host "df -h"
C. 通过文件读取密码(推荐)
将密码写入受保护的文件,并使用 -f 参数读取。
# 创建密码文件并限制权限
echo 'your_password' > .ssh_pass
chmod 600 .ssh_pass
# 使用文件登录
sshpass -f .ssh_pass ssh user@remote_host "free -m"
4. 实战场景案例
场景一:批量远程执行指令
配合 Shell 循环,可以快速获取多台服务器的状态:
for ip in $(cat server_list.txt); do
echo "Checking $ip..."
sshpass -f .pass_file ssh -o StrictHostKeyChecking=no user@$ip "uptime"
done
注意:
-o StrictHostKeyChecking=no用于跳过首次连接时的 SSH 指纹确认。
场景二:自动化文件传输(SCP)
SSHpass 同样适用于 scp 或 rsync:
sshpass -f .pass_file scp local_file.tar.gz user@remote_host:/tmp/
5. 安全建议与替代方案
虽然 SSHpass 极大地方便了自动化,但由于密码是以明文形式处理或存储的,使用时建议遵循以下原则:
- 权限控制:若使用密码文件,确保其权限设置为
600(仅当前用户可读)。 - 日志防护:避免在生产环境的 Shell 历史记录中留下明文密码(推荐使用环境变量方式)。
- 进阶方案:对于长期、高安全性的自动化需求,建议优先考虑 SSH 密钥对(Key-based auth) 验证。
原文 https://blog.csdn.net/2301_79518550/article/details/149319034