zoukankan      html  css  js  c++  java
  • python学习之---- paramiko 模块

    paramiko 模块

    功能:提供了ssh及sftp进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。

    1  基于用户名和密码的 sshclient 方式登录

    执行过程:传统的连接服务器、执行命令、关闭的一个操作

     1 import paramiko
     2 
     3 # 实例化一个客户端
     4 ssh_client = paramiko.SSHClient()
     5 # 实现自动添加ssh信任关系knows_hosts
     6 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     7 # 连接远程linux目标机
     8 ssh_client.connect(hostname='ip',port=22,username='root',password='paswd')
     9 # 在远程服务器执行命令
    10 stdin,stdout,stderr = ssh_client.exec_command('df -h')
    11 # 读取标准输出和标准错误
    12 out,err = stdout.read(),stderr.read()
    13 # 打印输出的信息
    14 mess = out if out else err
    15 print(mess.decode())
    16 # 关闭客户端连接
    17 ssh_client.close()
    View Code

     2 基于用户名和密码的 transport 方式登录

    执行过程:连接服务器,执行上传,下载,关闭操作

     1 import paramiko
     2 # 定义传输的ip和端口
     3 transfer = paramiko.Transport('10.10.2.12',22)
     4 # 定义传输的账号,密码
     5 transfer.connect(username='root',password='passwd')
     6 # 建立sftp连接
     7 sftp = paramiko.SFTPClient.from_transport(transfer)
     8 # 上传
     9 sftp.put('源文件','目标文件')
    10 # 下载
    11 sftp.get('服务器文件,'本地文件')
    12 # 关闭连接
    13 transfer.close()
    View Code

    3  基于公钥密钥的 SSHClient 方式登录

     1 # 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数
     2 pkey = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa', password='12345')
     3 # 建立连接
     4 ssh = paramiko.SSHClient()
     5 ssh.connect(hostname='ip',port=22,username='user',pkey=pkey)
     6 # 执行命令
     7 stdin, stdout, stderr = ssh.exec_command('df -hl')
     8 # 结果放到stdout中,如果有错误将放到stderr中
     9 print(stdout.read().decode())
    10 # 关闭连接
    11 ssh.close()
    View Code

    4  基于密钥的 Transport 方式登录

     1 # 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数
     2 pkey = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa', password='12345')
     3 # 建立连接
     4 trans = paramiko.Transport(('ip', 22))
     5 trans.connect(username='user', pkey=pkey)
     6 
     7 # 将sshclient的对象的transport指定为以上的trans
     8 ssh = paramiko.SSHClient()
     9 ssh._transport = trans
    10 
    11 # 执行命令,和传统方法一样
    12 stdin, stdout, stderr = ssh.exec_command('df -hl')
    13 print(stdout.read().decode())
    14 
    15 # 
    16 sftp = paramiko.SFTPClient.from_transport(trans)
    17 sftp.put('src_file,'dst_file')
    18 sftp.get('dst_file,'src_file)
    19 # 关闭连接
    20 trans.close()
    View Code

     小技巧:

    修改 paramiko模块的源码,将用户的输入进行文件保存
    首先从github下载模块的源码包,打开 demmosinteractive.py文件,跳转到49行,添加如下:
    # 这里开始输入命令的监听
    cmd_list = [] # 用于记录用户的输入的每个键
    while True:
    r, w, e = select.select([chan, sys.stdin], [], []) # 进入监听状态
    if chan in r:
    try:
    x = u(chan.recv(1024))
    if len(x) == 0:
    sys.stdout.write(' *** EOF ')
    break
    sys.stdout.write(x)
    sys.stdout.flush()
    except socket.timeout:
    pass
    if sys.stdin in r:
    x = sys.stdin.read(1) # 这里的1 代表读取用户敲击的每一个键
    if len(x) == 0:
    break
    # 将用户输入的命令进行写文件保存,当遇到键盘输入为回车,则开发文件写入用户输入的命令,如果没有回车,则
    # 将用户键盘输入的每一个键进行列表添加
    if x == ' ': # 为回车则写文件
    f = open('./stdin.log','w')
    cmd_str = ''.join(cmd_list)
    f.write(cmd_str+' ')
    f.close()
    else:
    cmd_list.append(x)
    chan.send(x)
    这样就把用户的输入保存到stdin.log文件中了。
  • 相关阅读:
    qt的.pro配置总结
    【GOJ 1489】Monster Hunter
    CPU 杂谈
    【CF 1061C|GOJ 3505】Multiplicity
    【CF 1039D|GOJ 3502】You Are Given a Tree
    我跳过的坑
    【CF 1101D|GOJ 3501】GCD Counting
    【HDU 5269|GOJ 739】xor的最低位
    beta阶段组间的140字互评
    【第七周】【新蜂站会】3
  • 原文地址:https://www.cnblogs.com/zy6103/p/6955753.html
Copyright © 2011-2022 走看看