使用paramiko上传文件到Linux并且解压
思路是,使用zipfile对文件进行压缩,之后使用paramiko提供的SFTPClient()上传文件,之后使用paramiko的SSHClient()执行Linux命令操作文件
import os
import zipfile
import paramiko
# 使用zipfile压缩文件
def zip_code(dir_name, zip_name):
file_list = []
if os.path.isfile(dir_name):
file_list.append(dir_name)
else:
for root, dirs, files in os.walk(dir_name):
for name in files:
file_list.append(os.path.join(root, name))
zf = zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED)
for tar in file_list:
arc_name = tar[len(dir_name):]
zf.write(tar, arc_name)
zf.close()
# 使用zipfile解压文件(这是直接在本地解压)
# def unzip_file(zip_file_name, unzip_dir):
# zf = zipfile.ZipFile(zip_file_name)
# file_list = zf.namelist()
# for file in file_list:
# zf.extract(file, unzip_dir)
# zf.close()
def upload_code(host, port, username, pwd, local_file, target_path, target_file_name):
transport = paramiko.Transport((host, port))
transport.connect(username=username, password=pwd)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(local_file, target_path + target_file_name)
client = paramiko.SSHClient()
client._transport = transport
cmd_ls = "ls -l " + target_path + target_file_name
_, stdout, stderr = client.exec_command(cmd_ls)
if not stdout.read().decode('utf-8'):
print("失败: ", stderr.read().decode('utf-8'))
return
# 这里使用unzip解压,但是zipfile压缩的时候对中文不友好,所以unzip解压需要指定CP936编码
cmd = "cd " + target_path + " && sudo rm -rf web_code/* && unzip -O CP936 " + target_file_name + " -d web_code/ && rm " + target_file_name
print("cmd: ", cmd)
_, stdout, stderr = client.exec_command(cmd)
print("stdout:", stdout.read().decode('utf-8'))
print("stderr:", stderr.read().decode('utf-8'))
print("finish")
def start():
username = "root"
pwd = "12345"
host = "localhost"
port = 22
target_file_name = "dist.zip"
local_file = "./{}".format(target_file_name)
target_path = "/test/"
zip_code(r"D:\工作", "./{}".format(target_file_name))
upload_code(host, port, username, pwd, local_file, target_path, target_file_name)
input()
if __name__ == '__main__':
start()
浙公网安备 33010602011771号