Loading

paramiko模块

概述

ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。

使用paramiko需要先安装pycrypto

Paramiko介绍

paramiko包含两个核心组件:SSHClient和SFTPClient

  • SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
  • SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。

Paramiko中的几个基础名词:

  • Channel:是一种类Socket,一种安全的SSH传输通道;
  • Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
  • Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。

Paramiko的基本使用

SSHClient常用的方法介绍

  1. 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, 是否打开压缩

  2. set_missing_host_key_policy()

    设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:

    设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:

    • AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认

    • WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接

    • RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项

  3. exec_command()

    在远程服务器执行Linux命令的方法。

    使用exec_command()方法执行例如ls,pwd等命令的时候,都执行的还不错。

    但是cd /path这个命令就有点问题了,发现cd到其他路径下,但是使用pwd发现还是在登录的时候的默认路径,/home/

    这是因为exec_command()执行完成之后默认返回到初始路径。

    要把后续的想要执行的命令和cd放在同一个字符串中传入exec_command方法中才会生效。

    # 在Linux中可以通过‘;’拼接两条命令
    ssh.exec_command('cd /home/<user>/xxx/yyy; ls -al')
    
    # stdin,stdout,stderr 对应标准输入,标准输出,标准错误
    stdin,stdout,stderr = ssh.exec_command('pwd')
    print(stdout.read())		# 打印出输出结果
    print(stdout.readline())
    print(stdout.readlines())
    
  4. invoke_shell()

    可以创建一个交互式shell

    # 创建一个shell
    chan = ssh.invoke_shell()
    # 利用send函数发送cmd到SSH server,添加'\n'做回车来执行shell命令
    chan.send(cmd+'\n')
    # 通过recv函数获取回显
    chan.recv(bufsize) 
    
  5. open_sftp()

    在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。

    利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.

    sftp = client.open_sftp() 
    sftp.put('D:/test.txt','/home/text.txt') 
    sftp.get('/home/text.txt','D:/test.txt') 
    

示例

import paramiko
import time

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='10.1.1.32',username='root',password='admin@123',port=22)

stdin,stdout,stderr = ssh.exec_command('pwd')
print(stdout.read())
print(stdout.readline())
print(stdout.readlines())

channel = ssh.invoke_shell()
channel.send('cd /'+'\n')
channel.send('ls'+'\n')		        # '\n'命令才会执行
time.sleep(5)				# 命令执行需要时间
res = channel.recv(1024).decode('utf8') # 通过decode函数转为utf8格式
print(res)
channel.close()				# 关闭shell通道连接

sftp = ssh.open_sftp()		        # 打开sftp
sftp.get('/home/1.txt','d:/1.txt')
sftp.put('d:/2.txt','/home/2.txt')

sftp.close()	        # 关闭SFTP连接
ssh.close()		# 关闭SSH连接
posted @ 2020-10-08 15:30  北兢王  阅读(275)  评论(0)    收藏  举报