使用Python Paramiko实现远程Unix服务器间SFTP文件传输问题
解决方法:在已登录的Unix服务器上执行远程文件传输命令
你遇到的问题核心是混淆了SFTP连接的方向:当前代码里的ssh.open_sftp()是建立本地机器到目标Unix服务器的SFTP通道,所以sftp.get()会把Unix服务器上的文件拉到你的本地电脑,这和你要把文件从另一台SFTP服务器下载到Unix服务器的需求完全相反。
要实现你的需求,正确的思路是在已经登录的Unix服务器上,发起对另一台SFTP服务器的连接并执行下载操作,而不是从本地操作。下面是两种可行的方案:
方案一:使用Unix服务器自带的sftp命令行工具
大多数Unix系统都预装了OpenSSH的sftp客户端,我们可以通过exec_command()在远程服务器上执行sftp批处理命令来完成下载。
修改后的代码示例:
import paramiko # 第一步:连接到目标Unix服务器 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("unix_server_ip", port=22, username="unix_user", password="unix_password") # 定义SFTP下载命令:从另一台SFTP服务器拉取文件到当前Unix服务器 # 替换成你的SFTP服务器信息和文件路径 sftp_batch_cmd = """ sftp sftp_user@sftp_server_ip <<EOF get /remote/sftp/file/path /path/on/unix/server/save/file.txt bye EOF """ # 执行命令并获取输入输出流 stdin, stdout, stderr = ssh.exec_command(sftp_batch_cmd) # 如果SFTP服务器需要密码验证,在这里输入密码(注意要加换行符) stdin.write("sftp_server_password\n") stdin.flush() # 读取执行结果 output = ''.join(stdout.readlines()) error = ''.join(stderr.readlines()) print("命令执行输出:") print(output) if error: print("错误信息:") print(error) # 关闭连接 ssh.close()
注意事项:
- 如果SFTP服务器支持密钥认证,推荐把Unix服务器的公钥添加到SFTP服务器的
~/.ssh/authorized_keys中,这样就不需要手动输入密码,命令也更安全。 - 确保Unix服务器上的
sftp命令可用(一般OpenSSH安装后就自带)。 - 路径要写绝对路径,避免因工作目录不同导致的问题。
方案二:使用scp命令替代sftp
如果SFTP服务器支持SCP协议,也可以用更简洁的scp命令来完成下载:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("unix_server_ip", port=22, username="unix_user", password="unix_password") # 替换为你的实际信息 scp_cmd = "scp sftp_user@sftp_server_ip:/remote/sftp/file/path /path/on/unix/server/save/file.txt" stdin, stdout, stderr = ssh.exec_command(scp_cmd) stdin.write("sftp_server_password\n") stdin.flush() output = ''.join(stdout.readlines()) error = ''.join(stderr.readlines()) print("执行结果:") print(output) if error: print("错误:") print(error) ssh.close()
为什么你的原代码会报错?
原代码中的sftp = ssh.open_sftp()创建的是本地到Unix服务器的SFTP会话,sftp.get(filepath, localpath)的作用是把Unix服务器上的filepath文件下载到你的本地电脑的localpath,这和你的需求完全相反,所以会出现不符合预期的结果。
内容的提问来源于stack exchange,提问作者vaishali bisht
相关产品推荐
相关产品推荐

