ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

实现,提供客户端和服务器功能

实现,提供客户端和服务器功能 它是SSHv2协议的实现, 提供客户端和服务器功能。它本身是一个纯粹的接口, 这个接口紧密围绕着SSH网络的概念来构建。我们可以使用它, 通过这样的方式来进行ssh操作, 而且这个过程会变得相当的方便。该方案由两个核心组件构成, 具体表现为: 和。它的作用, 实际上就跟咱们平时用的Linux里面的ssh命令差不多, 基本上是一样的意思。你可以把它理解为一种技术上的操作手段, 专门用来对SSH会话进行封装和处理的。该类进行了封装, 封装的内容包含了传输方面的事项、通道方面的事项以及建立方面的事项, 通常情况下, 它被用于执行远程命令。API我们来创建实例, 让那个SSH客户端出现。# 参数解释- hostname连接的目标主机- portSSH_PORT指定端口- usernameNone验证的用户名- passwordNone验证的用户密码- pkeyNone私钥方式用于身份验证- key_filenameNone一个文件名或文件列表指定私钥文件- timeoutNone可选的tcp连接超时时间- allow_agentTrue是否允许连接到ssh代理默认为True 允许- look_for_keysTrue是否在~/.ssh中搜索私钥文件默认为True 允许- compressFalse是否打开压缩可以通过验证方法去连接那个处于远程位置的服务器端来进行操作。# 参数解释- command要执行的命令- bufsize与Python中文件对象的同名函数解释相同缓冲区大小- timeout设置命令的超时相应事件- get_pty从服务器请求一个伪终端默认为假- environment一个当前shell环境的字典远程命令的默认执行环境参数指的是那些需要被执行的那些shell命令, 其操作会去打开一个全新的通道, 并且会在这新开的通道里执行你所请求的那个具体的命令。这个函数最后给出来的那个玩意儿是元组, 它里面有这些东西: 一个是标准输入也就是stdin, 还有标准输出以及出错。一般来说, 对于命令的执行结果, 我们通常是通过执行相关操作来进行获取的。把那个SSH的连接给关了。# 参数解释- term模拟终端类型- width终端长度- height终端宽度- width_pixels终端的像素宽度- height_pixels终端的像素高度- environment命令的shell环境就是在ssh服务器上面把交互式的shell会话给开启。一个全新的通信通道被顺利开辟, 它接着便通过调用相应的接口, 成功与指定的伪终端进行了对接连接。在这个过程中, 系统使用了请求所指定的那个终端类型, 以及对应的大小的参数配置, 最终将此作为返回的价值予以反馈。从一种通俗的角度来进行理解, 其核心含义就是去建立了一个真正存在的 shell 窗口空间, 以此来执行命令方面的交互操作。当需要连接到那些服务器端并不存在已知主机密钥的情况时, 应该去设置用来决定如何进行处理的策略选项内容。常见的使用策略是, 其作用是自动把主机名和新主机密钥加到本地主机密钥对象里面去, 然后进行保存。实例代码这是一个简单的代码,它是通过建立的通道进行命令的传输与返回结果的获取的代码import paramikodef connect(hostname,username,password):client paramiko.SSHClient()# 初始化client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 设置密钥策略client.connect(hostname,usernameusername,passwordpassword)# 连接主机return clientdef exec_cmd(client,cmd):stdin,stdout,stderr client.exec_command(cmd)return stdout.read().decode(),stderr.read().decode()def main():hostname 192.168.0.104username pipassword 123456cmd ps -auxclient connect(hostname,username,password)res exec_cmd(client, cmd)if res[0]:print(res[0])if res[1]:print([E]:\n,res[1])client.close()if __name__ __main__:main()上面的代码是使用了默认建立好的那个连接对象, 来进行命令的传输工作, 同时也完成了返回结果的获取动作。class SSHChannle:def __init__(self, host, username, password, port22):初始化SSH通道self.sh paramiko.SSHClient()self.sh.set_missing_host_key_policy(paramiko.AutoAddPolicy())self.sh.connect(host, usernameusername, passwordpassword)self.channle self.sh.invoke_shell()def get_ssh_recv(self):接收SSH通道中发来的消息while not self.channle.exit_status_ready():# 如果远程进程已退出并返回退出状态则返回truetime.sleep(0.1)try:buf self.channle.recv(1024).decode(utf-8)print(buf,end)sys.stdout.flush()except Exception as ex:print(ex)def send_ssh_cmd(self):发送命令给SSH通道while not self.channle.exit_status_ready():cmd input()try:self.channle.send(cmd \r)except Exception as ex:print(ex)sys.stdin.flush()def run(self):ssh_recv_thread threading.Thread(targetself.get_ssh_recv)ssh_send_thread threading.Thread(targetself.send_ssh_cmd)ssh_recv_thread.start()ssh_send_thread.start()ssh_recv_thread.join()ssh_send_thread.join()self.sh.close() # 关闭通道其作用类似于Linux系统中的sftp命令, 该工具是对SFTP客户端进行的封装。用来实现远程文件的各项操作, 比如说, 把文件弄上去, 或者是把文件拿下来, 又或者是去改一改这个文件应该有什么样的权限这些事儿。API# 参数解释- t该参数可以通过paramiko.Transport( (ip,port ))创建一个已通过验证的传输通道参数为IP和端口的二元组SFTP客户端的创建, 是根据参数t所指定的已经通过验证的传输通道来实现的。把那个本地的路径所指的文件, 给传到目标主机那儿去。将路径这个远程路径里面的那个文件, 给下载下来放到本地主机那里去。把那个位于远程主机上面的文件给打开, 这一点是和open这个函数非常类似的, 最后会返回一个文件对象。返回给定路径下的文件列表以及目录列表, 如果未提供指定路径的话, 那么默认使用当前工作目录作为路径。修改当前正在使用的SFTP连接会话里面的工作目录。检索当前path所指向的文件信息根据路径, 在目标主机上创建目录, 并且设置的默认权限是511。我们要把给定了路径的这个目录删除掉。删除给定path所指向的文件实例代码以下是一段关于的测试代码, 虽然它相对而言比较简陋。import paramikodef connecnt(hostname,username,password): #创建连接对象client paramiko.Transport( (hostname,22))try:client.connect(usernameusername,passwordpassword)except paramiko.SSHException:return Nonesftp_client paramiko.SFTPClient.from_transport(client)return sftp_clientdef main():hostname 192.168.0.104username pipassword 123456sftp_client connecnt(hostname,username,password)remotefile_path /home/pi/test # 目标主机文件路径localfile_path /home/test # 本地主机文件路径sftp_client.put(localfile_path, remotefile_path) #上传本地test文件到远程sftp_client.get(remotefile_path, localfile_path) #下载远程test文件到本地print(sftp_client.listdir())print(sftp_client.lstat(remotefile_path))with sftp_client.open(remotefile_path) as fp:print(fp.read().decode())#print(sftp_client.remove(remotefile_path))if __name__ __main__:main()
返回列表