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

如何用Python将本地.wav文件复制到Linux服务器?求解决方案

解决Python通过SCP复制.wav文件到Linux服务器的问题

首先咱们先拆解下你原代码里的几个核心问题,这大概率是导致失败的原因:

  1. 返回值判断逻辑错误:os.system返回的是命令的退出状态码(0代表成功,非0代表失败),不是布尔值。你用success != True来判断会完全搞反——比如成功时返回0,0在Python里等价于False,会误判成连接错误。
  2. 交互式密码无法自动处理:直接用scp带root账号执行时,会弹出密码输入提示,但os.system没法自动处理这种交互式输入,脚本会卡住或者直接失败。
  3. Windows环境的scp可用性:从你的本地路径D:/...来看,你应该是Windows系统,默认系统里没有scp命令,得先确保环境里能调用到scp(比如安装Git Bash或者OpenSSH客户端)。

下面给你几个可行的解决方案,按推荐程度排序:

方案1:用paramiko库(纯Python实现,最稳定)

这个方案不依赖系统的scp命令,完全用Python代码实现SSH和文件传输,跨平台性强,还能更清晰地捕获错误。

步骤1:安装依赖库

pip install paramiko

步骤2:编写代码(支持免密登录)

首先得先配置SSH密钥对实现免密登录(避免每次输密码):

  • 在本地生成密钥对:Windows用PowerShell/Git Bash,Linux/macOS用终端执行ssh-keygen -t rsa,一路回车默认配置即可。
  • 把本地生成的公钥(路径一般是C:\Users\你的用户名\.ssh\id_rsa.pub)复制到服务器的/root/.ssh/authorized_keys文件里,确保服务器上.ssh文件夹权限是700,authorized_keys权限是600。

然后编写Python代码:

import paramiko

def copyToServer():
    local_file = "D:/AMRITESH/ContractMonitoring/newtext.wav"
    remote_file = "/usr/share/asterisk/sounds/newtext.wav"
    server_ip = "xxx.xxx.x.xxx"
    username = "root"
    # Windows下私钥路径用原始字符串避免转义问题
    private_key_path = r"C:\Users\你的用户名\.ssh\id_rsa"

    try:
        # 加载本地私钥
        private_key = paramiko.RSAKey.from_private_key_file(private_key_path)
        # 创建SSH客户端并连接
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname=server_ip, username=username, pkey=private_key)
        
        # 开启SFTP通道上传文件
        sftp = ssh_client.open_sftp()
        sftp.put(local_file, remote_file)
        
        # 关闭连接
        sftp.close()
        ssh_client.close()
        print("文件复制成功,连接正常!")
    except Exception as e:
        print(f"复制失败:{str(e)}")
        print("连接或文件传输出现错误")

方案2:修复os.system逻辑 + 配置免密登录

如果你坚持用系统scp命令,那得先解决免密和路径问题:

步骤1:同样先配置SSH免密登录(和方案1的步骤一致)

步骤2:修改Python代码

import os

def copyToServer():
    # Windows下如果用Git Bash的scp,路径要改成Linux风格的/d/开头;用OpenSSH的话给路径加引号也可以
    # cmd = 'scp "D:/AMRITESH/ContractMonitoring/newtext.wav" root@xxx.xxx.x.xxx:/usr/share/asterisk/sounds'
    cmd = "scp /d/AMRITESH/ContractMonitoring/newtext.wav root@xxx.xxx.x.xxx:/usr/share/asterisk/sounds"
    exit_code = os.system(cmd)
    if exit_code != 0:
        print(f"复制失败,退出码:{exit_code}")
        print("连接或文件复制出错")
    else:
        print("文件复制成功,连接正常!")

额外注意事项

  • 确保服务器防火墙允许22端口的SSH连接。
  • 确认目标路径/usr/share/asterisk/sounds有写入权限(root账号默认有,但如果换其他用户需要提前设置)。
  • Windows下如果用OpenSSH,要先在「设置-应用-可选功能」里安装OpenSSH客户端。

内容的提问来源于stack exchange,提问作者Amritesh Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:39:39