如何利用sshpass结合GNU Parallel原生选项在多服务器执行命令?
需求与问题梳理
核心需求
- 使用密码认证(优先采用sshpass),而非公私钥认证;
- 支持将服务器列表保存至文件,便于编辑;
- 服务器使用不同端口,部分为默认22端口,部分为非默认端口。
环境与基础测试
环境中已导出SSHPASS变量,不使用GNU Parallel时,命令sshpass -e ssh <user>:@<ip> -p <port>可正常运行。
测试中发现特殊现象:parallel -S <user>@<ip>:<port> echo ::: 1无法正常工作,但parallel -S <user>:@<ip>:<port> echo ::: 1(注意<user>后额外添加的冒号)可正常运行,后续测试均保留该冒号格式。
已尝试方案及问题
- 将服务器列表存入iplist文件(每行格式为
sshpass -e ssh <user>:@<ip> -p <port>),执行parallel --slf iplist echo ::: env时出现权限拒绝错误;改用env_parallel --env SSHPASS --slf iplist echo ::: env仍报错。 - 简化命令为
cat iplist | env_parallel --env SSHPASS sshpass -e "ssh {} -p <port> 'env;hostname'",可部分运行但无法灵活配置端口;若将端口写入iplist文件,会出现hostname contains invalid characters错误。 - 最终可行方案:使用
--colsep选项,命令为cat iplist | env_parallel --colsep ' ' --env SSHPASS "sshpass -e ssh {1} -p {2} 'env;hostname'" > results.txt,iplist每行格式为<ip> <port>,但默认22端口的服务器需硬编码22,仍不够理想。
期望优化方向
- 希望利用GNU Parallel原生选项简化语法,但不清楚各选项的影响与交互逻辑;
- 希望调试GNU Parallel的Perl脚本,了解各选项的工作机制(尤其是
--onall参数)。
使用反馈
GNU Parallel整体表现优秀,--dry-run和--joblog参数对调试帮助很大,但针对这类未覆盖的场景,建议新增调试/贡献指南。
内容的提问来源于stack exchange,提问作者Han Qi
相关产品推荐
相关产品推荐

