少于 1 分钟阅读 次阅读

sshpass 是一个极为实用的命令行工具,它的核心功能是在非交互模式下为 SSH 提供密码

在默认情况下,当你使用 sshscp 命令连接远程服务器时,系统会弹出一个交互式提示框要求你手动输入密码。这种机制在日常人工操作时没有问题,但在编写自动化脚本(如定时备份、批量部署、CI/CD 流程)时,会导致脚本卡住等待人工输入。sshpass 就是为了解决这个“无法自动输入密码”的痛点而诞生的。


⚠️ 核心安全警告

在使用 sshpass 之前,必须了解它的安全隐患:

  • 密码泄露风险:如果你在命令行中直接使用 -p 参数传递密码,其他用户可以通过 pshistory 命令轻易看到你的明文密码。
  • 最佳替代方案:在 99% 的企业级生产环境中,配置 SSH 密钥对(Public Key Authentication) 才是实现免密登录的正确且安全的做法。sshpass 通常只用在无法修改目标机器配置、或者临时性的测试场景中。

安装方法

在大多数主流 Linux 发行版中,sshpass 都可以直接通过包管理器安装:

  • Ubuntu / Debian:
sudo apt-get install sshpass


常用参数与提供密码的三种方式

sshpass 提供了三种传递密码的方式,安全性依次递增:

1. 直接在命令行提供密码 (-p)

最简单,但也最不安全

# 语法: sshpass -p '你的密码' ssh user@host
sshpass -p '123456' ssh [email protected] "df -h"

2. 从环境变量中读取密码 (-e)

比上一种安全,密码不会显示在进程列表中。默认读取名为 SSHPASS 的环境变量。

export SSHPASS='123456'
sshpass -e ssh [email protected] "uptime"

3. 从文件中读取密码 (-f)

这是相对最安全的方式。你可以把密码写进一个文本文件,并严格限制该文件的权限(如 chmod 600 password.txt)。

# password.txt 中只包含密码文本
sshpass -f password.txt ssh [email protected] "free -m"


典型使用场景示例

场景 1:远程执行一条命令并退出

sshpass -p 'mypassword' ssh [email protected] "systemctl restart nginx"

场景 2:使用 SCP 自动上传/下载文件 sshpass 不仅支持 ssh,还支持 scpsftp 等基于 SSH 协议的命令。

# 将本地文件拷贝到远程服务器
sshpass -p 'mypassword' scp /local/path/backup.tar.gz [email protected]:/remote/path/

# 将远程文件拉取到本地
sshpass -p 'mypassword' scp [email protected]:/remote/path/log.txt /local/path/

场景 3:结合 Rsync 进行自动同步

sshpass -p 'mypassword' rsync -avz /local/dir [email protected]:/remote/dir


💡 常见“坑点”与解决方案

初学者使用 sshpass 时最常遇到的问题是命令直接静默失败,没有任何输出

原因: 如果你是第一次连接某台远程主机,SSH 客户端会弹出一个 Are you sure you want to continue connecting (yes/no)? 的提示,要求你确认主机的指纹(Host Key Verification)。sshpass 无法处理这种提示,遇到它会直接退出。

解决方案: 在 ssh 命令中加入 -o StrictHostKeyChecking=no 参数,强制忽略主机指纹检查。

sshpass -p 'mypassword' ssh -o StrictHostKeyChecking=no [email protected] "echo Hello"

留下评论