You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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密钥认证(推荐)

这是最安全、可靠的方式,彻底避免密码输入:

  1. 在本地生成SSH密钥对(无则生成):
ssh-keygen -t ed25519

一路回车使用默认配置即可,若不想每次用密钥都输密码,可跳过密钥密码设置。
2. 将本地公钥复制到目标PC的授权列表:

ssh-copy-id user@pc

仅需输入一次目标PC密码,后续所有scp/ssh操作都无需再输密码。
3. 你的原Python脚本无需修改,直接运行就能自动批量传输文件。

方法2:用pexpect库模拟密码输入

如果必须使用密码认证,可借助pexpect库模拟手动输入密码的操作:

  1. 先安装依赖库:
pip install pexpect
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:57:12