paramiko包含两个核心组件:SSHClient和SFTPClient。
1.SSHClient常用的方法介绍
import paramiko ssh = paramiko.SSHClient() # 第一次连接的时候一般都会提示yes/no,这是因为远程服务器没有在know_hosts文件中记录时的应对策略 # set_missing_host_key_policy()设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种: # AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认 # WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接 # RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项 # 我一般使用第一种方式 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数 # 常用参数: # hostname 连接的目标主机 # port=SSH_PORT 指定端口 # username=None 验证的用户名 # password=None 验证的用户密码 # pkey=None 私钥方式用于身份验证 # key_filename=None 一个文件名或文件列表,指定私钥文件 # timeout=None 可选的tcp连接超时时间 # allow_agent=True, 是否允许连接到ssh代理,默认为True 允许l # ook_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许 # compress=False, 是否打开压缩 ssh = connect(hostname='192.168.153.32' ,port='22', username='root', password='mypassword') # exec_command():在远程服务器执行Linux命令的方法,他会返回一个元祖一共有三个值 # stdin # stdout返回的是执行结果,如果执行失败stdout返回None # stderr返回的是错误信息,如果命令执行成功stderr返回的是None # stdout和stderr返回的都是字节,我们需要decode解码一下 stdin, stdout, stderr = ssh.exec_command('ls') print(stdout.read().decode('utf-8')) # open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。 # 利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作. sftp = client.open_sftp() sftp.put('test.txt','text.txt')
由于工作需要自己封装了一个工具类,提供远程操作服务器,与上传文件。
import paramiko class Ssh(object): def __init__(self, ip, username="root", password=None, private_key_path=None, port=22): # key = paramiko.RSAKey.from_private_key_file(private_key_path) self.ssh = paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh.connect(hostname=ip, port=port, username=username, password=password,key_filename=private_key_path) # self.t = paramiko.Transport((ip,port)) # self.t.connect(username='root',pkey=key) # self.sftp = paramiko.SFTPClient.from_transport(self.t) def cmd(self,cmd): _,stdout,stderr = self.ssh.exec_command(cmd) msg = stdout.read().decode() err = stderr.read().decode() data = { "code": 0, "msg": "" } if len(err) != 0: data['code'] = 1 data['msg'] = err else: data['code'] = 0 data['msg'] = msg return data def put(self, src, desc): try: sftp = self.ssh.open_sftp() sftp.put(src,desc) except Exception as e: return e ssh = Ssh(ip="192.168.153.32", private_key_path="C:\\Users\\Administrator\\.testssh\\linux_fyh_rsa", port=22) # print(ssh.put("C:\\Users\\Administrator\\Desktop\\sh_auto\\test\\ssh_linux.py",'/root/ssh_linux.py')) print(ssh.cmd('ls'))