当前位置: 欣欣网 > 码农

用python代替xftp从linux服务器下载文件

2024-06-19码农

大家好,我是了不起。

我们经常需要从linux服务器上同步文件,但是xftp等工具都需要注册了,这里用免费的python代码来下载文件,还可以扩展更多的自定义用法。

准备工作

本文需要使用paramiko库,可以使用以下命令进行安装:

pip install paramiko

下载文件

先创建一个SSHClient对象,并设置缺失主机密钥的策略为自动添加,然后使用connect方法连接到服务器。需要提供服务器IP地址、端口号、用户名和密码。连接成功后,打开SFTP通道,使用open_sftp方法创建SFTP对象。SFTP是SSH协议的一部分,用于在服务器和本地之间传输文件。使用SFTP对象的open方法打开要下载的远程文件,并指定打开模式为只读。假设要下载的文件是UTF-8编码的文本文件,进行编码转换。下面是一个使用paramiko库从Linux服务器上下载文件的示例代码:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')
sftp = ssh.open_sftp()
remote_file = sftp.open('/path/to/remote/file''r')
remote_file.read().decode('utf-8').encode('gbk')

在上面的代码中,将your_server_ip替换为您的Linux服务器的IP地址,your_username替换为用户名,your_password替换为密码,/path/to/remote/file替换为要下载的远程文件的路径,/path/to/local/file替换为要保存的本地文件的路径。

保存文件

在本地创建一个文件对象,使用open方法打开,指定写入模式,并将远程文件的内容写入本地文件。最后,关闭所有的文件对象、SFTP对象和SSH连接。

在这里插入图片描述

local_file.write(remote_file.read().decode('utf-8'))
remote_file.close()
local_file.close()
sftp.close()
ssh.close()

文件是否存在

为了保证每次下载都是最新,如果存在就删除后创建新文件,如果不存在就创建新文件。

# 检查文件是否存在,如果不存在则创建
if not os.path.exists('/path/to/local/file'):
with open('/path/to/local/file''w') as f:
pass # 创建空文件
# 打开本地文件,指定追加模式
local_file = open('/path/to/local/file''a')

使用os.path.exists函数检查文件是否存在,如果不存在则创建空文件。在打开本地文件时,指定模式为追加模式('a'),这样可以在已有内容的基础上追加新内容。

由于windows中文件是进程独占,可能未释放,会报错:

os.remove(local_path)
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。

可以使用文件对象的truncate()方法。该方法将文件截断为指定的大小,若文件大小为零,所有内容都将被删除。

with open('file.txt''w') as file:
file.truncate(0)

使用with语句打开文件file.txt,并将文件对象分配给变量file,调用truncate(0)方法以将文件截断为零,删除文件中的所有内容。此方法仅适用于文本文件。如果要清除二进制文件的内容,可以使用类似的方法,但是需要将文件对象打开为二进制模式(例如'wb')。

PS Python都知道技术交流群(技术交流、摸鱼、白嫖课程为主)又不定时开放了,感兴趣的朋友,可以在下方公号内回复: 666 ,即可进入。

老规矩 ,道友们还记得么, 右下角的 「在看」 点一下 如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!