python复制远程linux文件,python paramiko+scpclient SCP远程文件拷贝应用

de4fbd5435fb

image.png

git链接:https://github.com/monkeyish-smart/python-paramiko-scpclient.git

1、实现scp协议的远程文件拷贝,注意:不是FTP 也不是SFTP。

2、为什么要做scp, 因为scp使用ssh 对资源有限的嵌入式linux 比较常用

3、scp文件拷贝使用paramiko 和 SCPClient库开发

4、gui开发使用tkinter库

5、本人第一个python 程序 mark 下

废话不多说上代码:

ScpClient_intface.py 文件拷贝操作

import paramiko # 用于调用scp命令

from scp import SCPClient

import os

class ScpClient_intface:

__host = "192.168.0.232" # 服务器ip地址

__port = 22 # 端口号

__username = "root" # ssh 用户名

__password = "root" # 密码

file_name = "C6SE_project.log" # 操作的文件明

remote_path = "/A8/"

local_path = "D:\python_eg"

def set_scp_server_information(self,host_ip="192.168.0.232",port = 22,username = "root",password = "root"):

self.__host = host_ip

self.__port = port

self.__username = username

self.__password = password

def get_file_from_scp_service(self,file_name, remote_path="/A8/", local_path="D:\python_eg"):

ssh_client = paramiko.SSHClient()

ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)

ssh_client.connect(self.__host, self.__port, self.__username, self.__password)

scpclient = SCPClient(ssh_client.get_transport(), socket_timeout=15.0)

# local_path = file_path + "\\" + img_name

file_path_lo = local_path

file_path_re = remote_path + '/' + file_name

#file_path_re = remote_path

print(file_path_lo)

print(file_path_re)

try:

# print(local_path)

# scpclient.put(localpath, remotepath) # 上传到服务器指定文件

scpclient.get(file_path_re, file_path_lo) # 从服务器中获取文件

except FileNotFoundError as e:

print(e)

print("system could not find the specified file" + local_path)

result = "system could not find the specified file" + local_path

else:

print("File downloaded successfully")

result ="File downloaded successfully"

ssh_client.close()

return result

def put_file_to_scp_service(self,file_name, remote_path="/A8/", local_path="D:\python_eg"):

ssh_client = paramiko.SSHClient()

ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)

ssh_client.connect(self.__host, self.__port, self.__username, self.__password)

scpclient = SCPClient(ssh_client.get_transport(), socket_timeout=15.0)

# local_path = file_path + "\\" + img_name

file_path_lo = local_path + '/' + file_name

file_path_re = remote_path

print(file_path_lo)

print(file_path_re)

try:

scpclient.put(file_path_lo, file_path_re) # 上传到服务器指定文件

#scpclient.get(file_path_re, file_path_lo) # 从服务器中获取文件

except FileNotFoundError as e:

print(e)

print("system could not find the specified file" + local_path)

result = "system could not find the specified file" + local_path

else:

print("文件上传成功")

result = "File uploaded successfully"

ssh_client.close()

return result

if __name__ == "__main__":

#upload_img("C6SE")

#print(os.getcwd())

scp_cc = ScpClient_intface()

scp_cc.set_scp_server_information()

scp_cc.get_file_from_scp_service("C6SE_project.log",local_path=os.getcwd() )

#scp_cc.put_file_to_scp_service("ScpClient_intface.py",local_path=os.getcwd())

scp_client_file_cmd.py 页面与回调接口

#!/usr/bin/python3

#-*- encoding=UTF-8 -*-

import tkinter as tk

import ScpClient_intface as sci

import os

def scp_put_file():

print(En_host.get(),En_port.get(),En_username.get(),En_password.get(),En_file_name_put.get(),En_remote_path_put.get())

if En_username.get() == "" or En_password.get() == "":

scp_put = sci.ScpClient_intface()

scp_put.set_scp_server_information( host_ip=En_host.get(), port = En_port.get())

result = scp_put.put_file_to_scp_service(En_file_name_put.get(), remote_path=En_remote_path_put.get(),local_path=os.getcwd())

else:

scp_put = sci.ScpClient_intface()

scp_put.set_scp_server_information( host_ip=En_host.get(), port = En_port.get(), username = En_username.get(), password = En_password.get())

result = scp_put.put_file_to_scp_service(En_file_name_put.get(), remote_path=En_remote_path_put.get(),local_path=os.getcwd())

root1 = tk.Tk()

root1.title('result')

root1.geometry('200x100') # 这里的乘是小x

tk.Label(root1, text=result, fg='blue', font=('Arial', 10)).pack()

#scp_put = sci.ScpClient_intface()

#scp_put.set_scp_server_information()

#scp_put.get_file_from_scp_service("C6SE_project.log", local_path=os.getcwd())

#scp_put.put_file_to_scp_service("ScpClient_intface.py", local_path=os.getcwd())

def scp_get_file():

print(En_host.get(), En_port.get(), En_username.get(), En_password.get(), En_file_name_get.get(), En_remote_path_get.get())

if En_username.get() == "" or En_password.get() == "":

scp_get = sci.ScpClient_intface()

scp_get.set_scp_server_information(host_ip=En_host.get(), port=En_port.get())

result = scp_get.get_file_from_scp_service(En_file_name_get.get(), remote_path=En_remote_path_get.get(), local_path=os.getcwd())

else:

scp_get = sci.ScpClient_intface()

scp_get.set_scp_server_information(host_ip=En_host.get(), port=En_port.get(), username=En_username.get(),password=En_password.get())

result = scp_get.get_file_from_scp_service(En_file_name_get.get(), remote_path=En_remote_path_get.get(),local_path=os.getcwd())

root1 = tk.Tk()

root1.title('result')

root1.geometry('200x100') # 这里的乘是小x

tk.Label(root1, text=result, fg='blue', font=('Arial', 10)).pack()

def about():

root1 = tk.Tk()

root1.title('about')

root1.geometry('200x100') # 这里的乘是小x

tk.Label(root1, text='versions 1.0', fg='blue', font=('Arial', 10)).pack()

tk.Label(root1, text='zhanyongli@xcharge.com', fg='blue', font=('Arial', 10)).pack()

if __name__ == "__main__":

# 第1步,实例化object,建立窗口window

root = tk.Tk() # 创建窗口对象的背景色

# 第2步,给窗口的可视化起名字

root.title('SCP client for file operation')

# 第3步,设定窗口的大小(长 * 宽)

root.geometry('520x220') # 这里的乘是小x

tk.Label(root, text='Host name(ip)', font=('Arial', 10)).place(x=10, y=10)

tk.Label(root, text='port', font=('Arial', 10)).place(x=150, y=10)

tk.Label(root, text='User name:', font=('Arial', 10)).place(x=250, y=10)

tk.Label(root, text='Password:', font=('Arial', 10)).place(x=400, y=10)

# 第4步,在图形界面上设定输入框控件entry并放置控件

En_host = tk.StringVar()

En_port = tk.StringVar()

En_username = tk.StringVar()

En_password = tk.StringVar()

En_file_name_get = tk.StringVar()

En_remote_path_get = tk.StringVar()

En_file_name_put = tk.StringVar()

En_remote_path_put = tk.StringVar()

tk.Entry(root, textvariable = En_host,show=None, font=('Arial', 10)).place(x=10, y=30,width= 120) # 显示成密文形式

tk.Entry(root, textvariable = En_port, show=None, font=('Arial', 10)).place(x=150, y=30,width= 50) # 显示成明文形式

tk.Entry(root, textvariable = En_username, show=None, font=('Arial', 10)).place(x=250, y=30,width= 100) # 显示成密文形式

tk.Entry(root, textvariable = En_password, show='*', font=('Arial', 10)).place(x=400, y=30,width= 100) # 显示成明文形式

En_port.set("22")

tk.Label(root, text='Remote Directory:', font=('Arial', 10)).place(x=10, y=70)

tk.Label(root, text='File name:', font=('Arial', 10)).place(x=10, y=100)

tk.Label(root, text='Remote Directory:', font=('Arial', 10)).place(x=10, y=150)

tk.Label(root, text='File name:', font=('Arial', 10)).place(x=10, y=180)

tk.Entry(root, textvariable = En_remote_path_put, show=None, font=('Arial', 10)).place(x=150, y=70,width= 300) # 显示成密文形式

tk.Entry(root, textvariable = En_file_name_put, show=None, font=('Arial', 10)).place(x=150, y=100,width= 300) # 显示成明文形式

tk.Entry(root, textvariable = En_remote_path_get, show=None, font=('Arial', 10)).place(x=150, y=150,width= 300) # 显示成密文形式

tk.Entry(root, textvariable = En_file_name_get, show=None, font=('Arial', 10)).place(x=150, y=180,width= 300) # 显示成明文形式

tk.Button(root, text='put', anchor='c', width=6, height=1, command=scp_put_file).place(x=450, y=80,height=50,width= 50)

tk.Button(root, text='get', anchor='c', width=6, height=1, command=scp_get_file).place(x=450, y=150,height=50,width= 50)

menubar = tk.Menu(root)

#创建下拉菜单Help

helpmenu = tk.Menu(menubar, tearoff=0)

helpmenu.add_command(label="About", command=about)

menubar.add_cascade(label="Help", menu=helpmenu)

#显示菜单

root.config(menu=menubar)

root.mainloop()

调试时候有个问题 我是用PyCharm ide 开发的,刚开始下载的是scpclient库会提示缺库 搞了好久才发现应该下载scp库使用,希望大家能注意下。

de4fbd5435fb

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值