这是无量测试之道的第209篇原创
前言
FTP 服务器是日常工作中比较常用的一种配置,可用于与外部文件共享。 例如:作为与 A 公司合作的第三方 B 公司,A 公司每天需要获取 B 公司提供的某些关键数据信息,那么 A 公司可以通过何种方式来获取 B 公司的数据信息呢?
答案:A 公司与 B 公司共同协商搭建一台 FTP 的共享服务器,设置好IP,Port,用户名,密码等关键信息,B 公司将 A 公司所需的数据信息以文件形式上传到该台 FTP 的共享服务器上,A 公司再进入到该 FTP 服务器上进行读取。
这个过程通过 FTP 服务器完成了数据信息的共享。当然这只是 FTP 服务器比较常用的一个功能。除了使用 FTP 服务器共享数据的方式来获取数据,也可以将 A 公司与 B 公司的网络打通,通过接口调用的方式来实现数据的传输。
工作中曾遇到过将 FTP 服务器上的文件与本地文件进行 diff 的需求,为此我使用 Python 代码实现了此需求。供大家参考。
今日分享主题:远端 FTP 服务器上的文件与本地文件如何进行 diff。
Python 代码实现
1、远端服务器配置信息
代码语言:javascript复制import paramiko
import stat
import os
server_ip='ftps.test.com'
server_port=22
username='test'
password='123456'
2、从远端服务器上获取所有文件的列表
代码语言:javascript复制def get_all_files_in_remote_dir(sftp,remote_dir):
all_files=[]
if(remote_dir[-1]=='/'):
remote_dir=remote_dir[0:-1]
print("-----------------",remote_dir)
files=sftp.listdir_attr(remote_dir)
print("=================",files)
for file in files:
filename=remote_dir '/' file.filename
#判断文件是否是目录
if(stat.S_ISDIR(file.st_mode)):
all_files.extend(get_all_files_in_remote_dir(sftp,filename))
else:
all_files.append(filename)
return all_files
3、从远端服务器下载指定目录下的文件
代码语言:javascript复制def sftp_get_dir(remote_dir,local_dir):
t = paramiko.Transport((server_ip, server_port))
t.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
#获取sftp上所有文件列表
all_files=get_all_files_in_remote_dir(sftp,remote_dir)
for file in all_files:
print(file)
dir1 = local_dir os.path.split(file)[0]
print("the direction is:", dir1)
print('the mkdir command is:mkdir -p ' dir1)
os.popen('mkdir -p ' dir1)
filename = file.split('/')[-1]
local_filename = os.path.join(dir1, filename)
print("the file name is:", local_filename)
if (filename.startswith('.')):
pass
else:
try:
print("the %s file is downing" % filename)
sftp.get(file, local_filename)
except:
print("the %s file is download fail " % filename)
4、diff 远端服务器下载下来文件的md5值与本地文件的 md5 值
代码语言:javascript复制def diff_file_md5sum(remote_dir,local_dir):
for root,dirs,files in os.walk(remote_dir):
for dir_list in dirs:
print(os.path.join(root,dir_list))
for files_list in files:
remote_filename=os.path.join(root,files_list)
local_filename=remote_filename.replace("tony","sftp")
if(os.path.exists(local_filename)):
print('md5sum remote_file---' str(remote_filename))
print('md5sum local_file---' str(local_filename))
remote_cmd='md5sum ' str(remote_filename)
local_cmd='md5sum ' str(local_filename)
list1=os.popen(remote_cmd).readlines()
list2=os.popen(local_cmd).readlines()
try:
remote_md5sum=str(list1[0]).split(" ")[0]
local_md5sum=str(list2[0]).split(" ")[0]
except:
print("the list1 or list2 is null")
#对比远端文件与本地文件的md5值
if(remote_md5sum==local_md5sum):
print("the remote_md5sum is:%s, the local_md5sum is:%s" %(remote_md5sum,local_md5sum))
print(remote_filename," is ok")
else:
print(remote_filename,"----------------------------------------------------------------------------------------------------------------------------- of the file is error")
if __name__ == "__main__":
sftp_get_dir('/CoBrand/','/home/q/tony')
sftp_get_dir('/COMM/','/home/q/tony')
diff_file_md5sum('/home/q/tony','/home/q/sftp')
end