之前找了挺多上传下载文件的工具类的,但是感觉这么多轮子始终没有现成的scp功能来的实在
使用方法很简单, 无论是文件还是文件夹都可以套用, 如下
下载文件
os.system(
f'scp -P {remote_port} -r {remote_username}@{remote_ip}:{remote_folder} {local_folder}')
上传文件:
os.system(
f'scp -P {remote_port} -r {local_folder} {remote_username}@{remote_ip}:{remote_folder}')
-r 表示递归到子文件
执行成功os.system() 会返回 0 ,失败返回 1
这样用的好处是执行成功,终端会实时显示scp原生的信息,(毕竟是直接调用scp命令)
另外,不建议将这两条代码封装为工具类, 笔者在封装成工具类,调用工具类的时候出现了循环卡死现象,直接使用即可
下面是一个笔者使用的demo
# 服务器的信息
serverinfo = config[name]
# 输入本地文件的路径,并且判断是否存在
while True:
local_folder = input('请输入本地上传的文件的路径: ')
# 判断文件是否存在
if os.path.exists(local_folder):
break # 如果文件存在,则跳出循环
else:
print('\033[31m' +
f'文件 {local_folder} 不存在,请重新输入。' + '\033[0m')
local_folder = r"{}".format(local_folder)
remote_folder = input('请输入保存到远程服务器端的路径: ')
remote_ip = serverinfo['ip']
remote_port = serverinfo['port']
remote_username = serverinfo['user']
try:
print('正在上传文件...')
result_code = os.system(
f'scp -P {remote_port} -r {local_folder} {remote_username}@{remote_ip}:{remote_folder}')
if result_code != 0:
print('\033[32m' + '文件上传失败,请确认服务器或路径信息正确后重新上传' + '\033[0m')
else:
print('\033[32m' + '所有文件上传完毕!' + '\033[0m')
except Exception as e:
print('\033[31m' + f'文件上传失败,报错信息为: {e}' + '\033[0m')