如何用Python将本地.wav文件复制到Linux服务器?求解决方案
解决Python通过SCP复制.wav文件到Linux服务器的问题
首先咱们先拆解下你原代码里的几个核心问题,这大概率是导致失败的原因:
- 返回值判断逻辑错误:
os.system返回的是命令的退出状态码(0代表成功,非0代表失败),不是布尔值。你用success != True来判断会完全搞反——比如成功时返回0,0在Python里等价于False,会误判成连接错误。 - 交互式密码无法自动处理:直接用scp带root账号执行时,会弹出密码输入提示,但
os.system没法自动处理这种交互式输入,脚本会卡住或者直接失败。 - 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
相关产品推荐
相关产品推荐

