使用python 链接 ADCS FTP 服务批量下载和上传文件
基础环境
1 | PyCharm IDE |
准备工作
- ADCS开启FTP服务,端口20或21
- python编写程序操作
测试环境
1 | ubuntu >= 22.04 |
代码编写
FTP服务开启
基于ubuntu 22.04 系统开启ftp服务,使用python代码测试是否连接成功。
FTP服务开启
ssh服务开启
1
2
3sudo apt update
sudo apt install openssh-server
lsof -i:21ftp服务开启
1
2
3
4
5
6
7sudo apt-get install vsftpd
# 更改配置
sudo vi /etc/vsftpd.conf
local_enable=YES
write_enable=YES
# 重启服务生效
sudo service vsftpd restartftp与ssh测试
1
2
3
4
5# ftp
ftp ip
# ssh
ssh root@ip
sfpt链接服务器
- 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def ftp_connect(host, port, username, password):
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
myHostname = host
myUsername = username
myPassword = password
sftp = pysftp.Connection(host=myHostname, username=myUsername, password=myPassword, cnopts=cnopts)
logger.debug("Connection succesfully stablished ... ")
directory_structure = sftp.listdir_attr()
for attr in directory_structure:
logger.debug(attr.filename, attr)
return sftp, directory_structure
sftp批量下载文件
- 使用sftp.get()方法下载文件,构造指定函数下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def download_file(sftp, LocalFile, RemoteFile): # 下载当个文件
"""
download point file from remote PDCU
:param sftp:
:param LocalFile: local file dir
:param RemoteFile: remote pdcu file
:return:
"""
file_handler = open(LocalFile, 'wb')
logger.debug(" download file dir : " + LocalFile)
sftp.get(RemoteFile, LocalFile) # 下载目录中文件
file_handler.close()
return True - 抑或目录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def download_filetree(sftp, LocalDir, RemoteDir): # 下载整个目录下的文件
"""
download point file and dir from remote PDCU
:param sftp:
:param LocalDir: local file dir
:param RemoteDir: remote pdcu file
:return:
"""
if not os.path.exists(LocalDir):
os.makedirs(LocalDir)
logger.debug(" download file dir : " + LocalDir)
for file in sftp.listdir(RemoteDir):
Local = os.path.join(LocalDir, file)
Remote = RemoteDir + "/" + file
if sftp.isdir(Remote): # 判断是否是文件
if not os.path.exists(Local):
os.makedirs(Local)
download_filetree(sftp, Local, Remote)
elif sftp.isfile(Remote): # 文件
download_file(sftp, Local, Remote)
else:
logger.error(" you input path or file is incorrect!, detail path or file :" + Remote)
return "complete"
sftp上传指定文件
- 参考如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41# 判断sftp服务端中文件路径是否存在,若不存在则创建
def create_dir(sftp, remoteDir):
try:
if stat.S_ISDIR(sftp.stat(remoteDir).st_mode): # 如果remoteDir存在且为目录,则返回True
pass
except Exception as e:
sftp.mkdir(remoteDir)
print("在远程sftp上创建目录:{}".format(remoteDir))
# 上传
def sftp_upload(sftp, localDir, remoteDir):
if os.path.isdir(localDir): # 判断本地localDir是否为目录
for file in os.listdir(localDir):
remoteDirTmp = os.path.join(remoteDir, file)
localDirTmp = os.path.join(localDir, file)
if os.path.isdir(localDirTmp): # 如果本地localDirTmp为目录,则对远程sftp服务器进行判断
create_dir(sftp, remoteDirTmp) # 判断sftp服务端文件目录是否存在,若不存在则创建
sftp_upload(sftp, localDirTmp, remoteDirTmp)
else:
print("upload file:", localDir)
try:
sftp.put(localDir, remoteDir)
except Exception as e:
print('upload error:', e)
if __name__ == '__main__':
host = '192.168.149.153' # sftp主机
port = 22 # 端口
username = 'sftpuser' # sftp用户名
password = 'passwd' # 密码
localDir = '/test/sftp' # 本地文件或目录
remoteDir = '/sftp' # 远程文件或目录(注意远程路径要存在)
sf = paramiko.Transport((host, port))
sf.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(sf)
sftp_upload(sftp, localDir, remoteDir)
sf.close()
sftp获取文件状态
1 |
|
UI编写
UI绘制采用tkinter 第三方库绘制 ,示例代码如下:
1 |
|
其他部分
linux系统目录无法找到解决办法
- 在代码首部添加如下代码:
1
2
3
4
5
6
7
8
9# encoding:utf-8
# coding=utf-8
# 导入OS模块
import os
import sys
# 把当前文件所在文件夹的父文件夹路径加入到PYTHONPATH
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))