如何在Python中执行scp命令时自动输入密码实现批量文件传输
问题描述
我需要用scp把多个文件从一台PC复制到另一台,文件数量多且单个传输耗时约1小时,手动逐个操作效率太低,想用Python脚本实现自动化。目前使用的代码如下:
import subprocess FILES_NAMES = [ 'file_1.raw', 'file_2.raw', ] for fname in FILES_NAMES: subprocess.run(['scp', f'user@pc:/path/to/files/{fname}', '.'])
但每次循环都会提示输入密码,想问能不能像下面这样自动传入密码:
for fname in FILES_NAMES: subprocess.run(['scp', f'user@pc:/path/to/files/{fname}', '.'], propmt_password='hardcode_your_super_secure_password_here')
解决方案
首先明确:subprocess.run并没有propmt_password这个参数,无法通过这种方式传入密码。下面提供几种可行的自动化方案:
方法1:SSH密钥认证(推荐)
这是最安全、可靠的方式,彻底避免密码输入:
- 在本地生成SSH密钥对(无则生成):
ssh-keygen -t ed25519
一路回车使用默认配置即可,若不想每次用密钥都输密码,可跳过密钥密码设置。
2. 将本地公钥复制到目标PC的授权列表:
ssh-copy-id user@pc
仅需输入一次目标PC密码,后续所有scp/ssh操作都无需再输密码。
3. 你的原Python脚本无需修改,直接运行就能自动批量传输文件。
方法2:用pexpect库模拟密码输入
如果必须使用密码认证,可借助pexpect库模拟手动输入密码的操作:
- 先安装依赖库:
pip install pexpect
- 修改Python脚本:
import pexpect import os FILES_NAMES = [ 'file_1.raw', 'file_2.raw', ] # 建议通过环境变量读取密码,避免硬编码泄露 PASSWORD = os.getenv('SCP_TARGET_PASSWORD') for fname in FILES_NAMES: cmd = f'scp user@pc:/path/to/files/{fname} .' child = pexpect.spawn(cmd) # 匹配目标PC的密码提示(不同系统可能显示"Password:"或"password:",按需调整) child.expect('password:') child.sendline(PASSWORD) child.wait()
运行前先设置环境变量:
export SCP_TARGET_PASSWORD='你的目标PC密码'
方法3:使用sshpass工具
如果系统支持sshpass工具(Ubuntu/Debian可通过apt install sshpass安装,CentOS用yum install sshpass),可直接在scp命令前添加密码参数:
修改Python脚本:
import subprocess import os FILES_NAMES = [ 'file_1.raw', 'file_2.raw', ] PASSWORD = os.getenv('SCP_TARGET_PASSWORD') for fname in FILES_NAMES: subprocess.run([ 'sshpass', '-p', PASSWORD, 'scp', f'user@pc:/path/to/files/{fname}', '.' ])
同样建议通过环境变量传递密码,避免硬编码。
内容的提问来源于stack exchange,提问作者user171780
相关产品推荐
相关产品推荐

