使用rsync同步远程机器指定编号文件,无需重复输入SSH密码
rsync指定文件同步免重复输入密码解决方案
方案1:sshpass自动填密 + 单次rsync批量同步
你之前的脚本循环调用rsync会重复创建SSH连接,导致需要多次输入密码。改为单次调用rsync传递所有目标文件,仅需建立一次SSH连接,配合sshpass工具自动填充密码,全程仅需验证一次。
- 安装sshpass
- Debian/Ubuntu 执行:
sudo apt install sshpass - RHEL/CentOS 执行:
sudo yum install sshpass
- Debian/Ubuntu 执行:
- 修正后的Python代码示例:
import subprocess import getpass # 目标文件编号列表,修正原语法错误 file_numbers = ( '0074', '0080', '0125', '0322', '0323', '0324', '0325', '0326', '0328', '0329' ) # 拼接所有远程文件路径 remote_prefix = "host:path/to/directory/file" remote_files = [f"{remote_prefix}{num}" for num in file_numbers] local_dir = "local/directory" # 交互式读取SSH密码,输入内容不会明文显示 ssh_pass = getpass.getpass(prompt="请输入SSH密码:") # 构造rsync命令 cmd = [ "sshpass", "-p", ssh_pass, "rsync", "-rv" ] + remote_files + [local_dir] # 执行同步 subprocess.run(cmd, check=True)
注意:多用户环境下建议把-p参数替换为-e,通过SSHPASS环境变量传递密码,避免密码出现在进程参数列表中造成泄露。
方案2:SSH控制连接复用(无需额外安装工具)
如果无法安装第三方工具,可以使用SSH原生的连接复用功能,仅需首次输入密码,后续所有rsync调用会复用同一个SSH连接,无需重复验证。
- 手动操作流程
- 建立后台控制连接,默认保留30分钟:
ssh -o ControlMaster=yes -o ControlPath=~/.ssh/rsync_control -o ControlPersist=30m 你的用户名@远程主机地址 -fN
执行后输入一次密码即可 - 运行你原本的同步脚本,所有rsync调用会自动复用连接,无需重复输密
- 同步完成后手动关闭后台连接:
ssh -o ControlPath=~/.ssh/rsync_control 你的用户名@远程主机地址 -O exit
- 建立后台控制连接,默认保留30分钟:
- 你也可以在Python脚本中自动完成控制连接的创建和销毁,无需手动操作。
内容的提问来源于stack exchange,提问作者Nihrion
相关产品推荐
相关产品推荐

