zoukankan      html  css  js  c++  java
  • Paramiko使用

    1、下载安装 pycrypto-2.6.1.tar.gz  (apt-get install python-dev)

        解压,进入,python setup.py build【编译】,python setup.py install 【安装】  ----》import Crypto

      2、下载安装 paramiko-1.10.1.tar.gz  

        解压,进入,python setup.py build【编译】,python setup.py install 【安装】---》  import paramiko

     

    1、连接远程服务器,并执行操作
    用户名和密码连接1

    import paramiko
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('10.10.50.30', 22, 'root', '123456')
    stdin, stdout, stderr = ssh.exec_command('ifconfig')
    print stdout.read()
    ssh.close();
    用户名和密码连接2  (SSHClient 封装 Transport)推荐
    transport = paramiko.Transport(('10.10.50.30', 22))
    transport.connect(username='root', password='jichuang')
    ssh = paramiko.SSHClient()
    ssh._transport = transport
    stdin, stdout, stderr = ssh.exec_command('ifconfig')
    print stdout.read()
    transport.close()
    
    
    

    公钥私钥链接
    ssh-keygen -t rsa
    ssh-copy-id -i .ssh/id_rsa.pub "-p 22 root@10.10.50.30"

    import paramiko
    private_key_path = '/root/.ssh/id_rsa' #本机私钥存放位置
    key = paramiko.RSAKey.from_private_key_file(private_key_path)
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('10.10.50.31 ', 22, 'root' ,pkey=key)
    stdin, stdout, stderr = ssh.exec_command('df')
    print stdout.read()
    ssh.close();
    

      

    公钥私钥链接2 (SSHClient 封装 Transport)推荐

    import paramiko
    private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
    transport = paramiko.Transport(('10.10.50.30', 22))
    transport.connect(username='root', pkey=private_key)
    ssh = paramiko.SSHClient()
    ssh._transport = transport
    stdin, stdout, stderr = ssh.exec_command('df')
    transport.close()
    

      

    2、SFTP上传下载
    基于用户名和密码
    import os,sys
    import paramiko
    t = paramiko.Transport(('10.10.50.30',22))
    t.connect(username='yangmv',password='123456')
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('C:\Users\yangmingwei\Desktop\error.jpg','/home/yangmv/error.jpg')
    #将error.jpg上传到服务器/home/yangmv目录
    sftp.get('/home/yangmv/sftp.txt','C:\Users\yangmingwei\Desktop\sftp.txt')
    #将sftp.txt下载到本机桌面
    t.close()
    

      

    基于公钥秘钥上传下载
    import paramiko
     
    private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
     
    transport = paramiko.Transport(('hostname', 22))
    transport.connect(username='yangmv', pkey=private_key )
     
    sftp = paramiko.SFTPClient.from_transport(transport)
    # 将location.py 上传至服务器 /tmp/test.py
    sftp.put('/tmp/location.py', '/tmp/test.py')
    # 将remove_path 下载到本地 local_path
    sftp.get('remove_path', 'local_path')
     
    transport.close()
    

      

     
     
    Paramiko 批量执行命令
    版本一:
    缺点: 每次执行一个操作,就要进行一次连接
    import paramiko
    import uuid
    class Comm(object):
        def __init__(self):     #初始化参数
    self.host = '10.10.50.30'
    self.port = 22
    self.username = 'root'
    self.pwd = '123456'
    self.file_name = ''
    
    def create_file(self):  #本地创建文件
    file_name = str(uuid.uuid4())   #uuid创建一个不会重复的随机字符串作为文件名
    with open(file_name,'w') as f_obj:
                f_obj.write('sb')
            return file_name    #返回文件名
    def run(self):
            self.upload()       #执行上传
    self.rename()       #执行重命名
            
    def upload(self):       #用于上传
    self.file_name = self.create_file()
            t = paramiko.Transport((self.host,self.port))
            t.connect(username=self.username,password=self.pwd)
            sftp = paramiko.SFTPClient.from_transport(t)
            sftp.put(self.file_name,'/home/yangmv/%s'%self.file_name)
            t.close()
        def rename(self):       #用于重命名
    ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(self.host, self.port, self.username, self.pwd)
            stdin, stdout, stderr = ssh.exec_command('mv /home/yangmv/%s /home/yangmv/xxxx.txt'%(self.file_name))
            print stdout.read()
            ssh.close();
    startcmd = Comm()
    startcmd.run()
    

      


    版本二:(推荐)
    优点:不管执行多少个操作,都只连接一次
    import paramiko
    import uuid
    class Comm(object):
        def __init__(self):     #初始化参数
    self.host = '10.10.50.30'
    self.port = 22
    self.username = 'root'
    self.pwd = '123456'
    
    def create_file(self):  #本地创建文件
    file_name = str(uuid.uuid4())   #uuid创建一个不会重复的随机字符串作为文件名
    with open(file_name,'w') as f_obj:
                f_obj.write('sb2')
            return file_name    #返回文件名
    def run(self):
            self.connect()
            self.upload()       #执行上传
    self.rename()       #执行重命名
    self.close()
    
        def connect(self):        #用于ssh连接
    t = paramiko.Transport((self.host,self.port))
            t.connect(username=self.username,password=self.pwd)
            self.__transport = t
        def close(self):          #用于ssh关闭
    self.__transport.close()
        def upload(self):       #用于上传
    self.file_name = self.create_file()
            sftp = paramiko.SFTPClient.from_transport(self.__transport)
            sftp.put(self.file_name,'/home/yangmv/%s'%self.file_name)
        def rename(self):       #用于重命名
    ssh = paramiko.SSHClient()
            ssh._transport = self.__transport
            stdin, stdout, stderr = ssh.exec_command('mv /home/yangmv/%s /home/yangmv/ssss.txt'%self.file_name)
            result = stdout.read()
    startcmd = Comm()
    startcmd.run()
    

      

     
    Paramiko持续连接服务器1 select
    import paramiko
    import select   #无法在windows下操作
    import sys
    t = paramiko.Transport(('10.10.50.31', 22))
    t.start_client()
    #基于公钥验证
    ##default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
    #key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
    #t.auth_publickey('root',key)
    #基于用户密码验证
    t.auth_password('root', '123456')
    
    #打开一个通道
    chan = t.open_session()
    #获取一个终端
    chan.get_pty()
    #激活器
    chan.invoke_shell()
    
    #########
    # 利用sys.stdin,肆意妄为执行操作
    # 用户在终端输入内容,并将内容发送至远程服务器
    # 远程服务器执行命令,并将结果返回
    # 用户终端显示内容
    while True:
        # 监视用户输入和服务器返回数据
    # sys.stdin 处理用户输入
    # chan 是之前创建的通道,用于接收服务器返回信息
    r_list,w_list,error = select.select([chan,sys.stdin,],[],[],1)
        if chan in r_list:                  #接收命令执行后返回的结果
    try:
                x = chan.recv(1024)
                if len(x) == 0:
                    print '\r\n*** EOF\r\n',
    break
    sys.stdout.write(x)
                sys.stdout.flush()
            except socket.timeout:
                pass
        if sys.stdin in r_list:             #用户输入
    inp = sys.stdin.readline()
            chan.sendall(inp)               #把用户输入命令发送执行
    #########
    chan.close()
    t.close()
    

      

    成功登陆机器,并可以持续连接,不断输入命令,并到达返回结果
     
    Paramiko持续连接服务器2 改进
    1的缺点:
        输入端,以行为单位,敲回车后才执行命令     ( ls + 回车 → 发送远端)
        无法使用tab补全
    2的改进:
        改变默认终端,由 行stdin, 一个字符stdin    ( l  → 发送远端,s → 发送远端  
        每输入一次,向远端发送一次 
        无法使用tab补全
    import paramiko
    import select   #无法在windows下操作
    import sys
    import termios
    import tty
    
    t = paramiko.Transport(('10.10.50.31', 22))
    t.start_client()
    #基于公钥验证
    ##default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
    #key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
    #t.auth_publickey('root',key)
    #基于用户密码验证
    t.auth_password('root', '123456')
    
    #打开一个通道
    chan = t.open_session()
    #获取一个终端
    chan.get_pty()
    #激活器
    chan.invoke_shell()
    
    #########
    #获取原tty属性
    oldtty = termios.tcgetattr(sys.stdin)
    try:
        # 为tty设置新属性
    # 默认当前tty设备属性:
    # 输入一行回车,执行
    # CTRL+C 进程退出,遇到特殊字符,特殊处理。
    # 这是为原始模式,不认识所有特殊符号
    # 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
    tty.setraw(sys.stdin.fileno())
        chan.settimeout(0.0)
        while True:
            #监视用户输入和远程服务器的返回数据socket
            #阻塞,直到句柄可用
    r_list,w_list,error = select.select([chan,sys.stdin,],[],[],1)
            if chan in r_list:
                try:
                    x = chan.recv(1024)
                    if len(x) == 0:
                        print '\r\n*** EOF\r\n',
    break
    sys.stdout.write(x)
                    sys.stdout.flush()
                except socket.timeout:
                    pass
            if sys.stdin in r_list:
                inp = sys.stdin.read(1)     #每次读1个字符
    if len(inp) == 0:
                    break
    chan.sendall(inp)
    finally:
        #退出后恢复终端属性
    termios.tcsetattr(sys.stdin,termios.TCSADRAIN,oldtty)
    
    #########
    chan.close()
    t.close()
    

      

    
    
     
    Paramiko持续连接服务器3  记录操作日志
    import paramiko
    import select   #无法在windows下操作
    import sys
    import termios
    import tty
    
    t = paramiko.Transport(('10.10.50.31', 22))
    t.start_client()
    t.auth_password('root', '123456')
    
    chan = t.open_session()
    chan.get_pty()
    chan.invoke_shell()
    
    #########
    oldtty = termios.tcgetattr(sys.stdin)
    try:
        tty.setraw(sys.stdin.fileno())
        chan.settimeout(0.0)
        f  = open('record.log','a')
        records = []
        while True:
            r_list,w_list,error = select.select([chan,sys.stdin,],[],[],1)
            if chan in r_list:
                try:
                    x = chan.recv(1024)
                    if len(x) == 0:
                        print '\r\n*** EOF\r\n',
    f.close()   #异常中断,或者exit退出时保存
    break
    sys.stdout.write(x)
                    sys.stdout.flush()
                except socket.timeout:
                    pass
            if sys.stdin in r_list:
                inp = sys.stdin.read(1)
                records.append(inp)  #把个字符键入列表暂时保存 ['l','s']
    if len(inp) == 0:
                    break
                if inp == '\t':     #tab键不记录
    pass
                if inp == '\r':     #每次回车
    cmd = ''.join(records).replace('\r','\n') #[ls]+换行
    f.write(cmd)
                    records = []    #每次记录一个条命令
    chan.sendall(inp)
    finally:
        termios.tcsetattr(sys.stdin,termios.TCSADRAIN,oldtty)
    #########
    chan.close()
    t.close()
    

      

    成功记录
     
    Paramiko持续连接服务器4 适用windows
    import paramiko
    import sys
    import threading
    
    t = paramiko.Transport(('10.10.50.31', 22))
    t.start_client()
    t.auth_password('root', '123456')
    
    chan = t.open_session()
    chan.get_pty()
    chan.invoke_shell()
    
    #########
    sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n")
    def writeall(sock):
        while True:
            data = sock.recv(256)
            if not data:
                sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
                sys.stdout.flush()
                break
    sys.stdout.write(data)
            sys.stdout.flush()
    
    writer = threading.Thread(target=writeall, args=(chan,))
    writer.start()
    
    try:
        while True:
            d = sys.stdin.read(1)
            if not d:
                break
    chan.send(d)
    except EOFError:
        # user hit ^Z or F6
    pass
    #########
    chan.close()
    t.close()
    

      

     
     
     
     
  • 相关阅读:
    sqlalchemy-数据目录集合整合
    算法-lowb三人组
    ipython ---matplotlib:绘图和可视化
    ipython --pandas
    ipython --之Numpy
    字符编码
    Markdown——入门使用
    python集合操作和内置方法
    python字典操作和内置方法
    python元祖操作和内置方法
  • 原文地址:https://www.cnblogs.com/yangmv/p/5169924.html
Copyright © 2011-2022 走看看