zoukankan      html  css  js  c++  java
  • 用paramiko模块写个ssh连接

    在学习了paramiko模块后,可以利用该模块连接linux服务器,然后进行一系列的linux操作。

    # -*- coding: utf-8 -*-
    
    import paramiko
    
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='IP地址', port=22, username='root', password='xxx')
    
    # 执行命令,可以执行linux命令或脚本
    stdin, stdout, stderr = ssh.exec_command('df')
    stdin2, stdout2, stderr2 = ssh.exec_command('pwd')
    # 获取命令结果
    result = stdout.read()
    result2 = stdout2.read()
    print result
    print result2
    # 关闭连接
    ssh.close()

    基于用户名和密码的 transport 方式登录 
    以上是传统的连接服务器、执行命令、关闭的一个操作,有时候需要登录上服务器执行多个操作,比如执行命令、上传/下载文件则无法实现,可以通过如下方式来操作

    import paramiko
      
    transport = paramiko.Transport(('IP地址',22))
    transport.connect(username='root',password='xxx')
      
    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()

     将连接封装成一个类,可以连接一次,多次操作

    import paramiko
    
    class SSHProxy(object):
        def __init__(self, hostname, port, username, password):
            self.hostname = hostname
            self.port = port
            self.username = username
            self.password = password
    
            self.transport = None
    
        def open(self):
            self.transport = paramiko.Transport((self.hostname, self.port))
            self.transport.connect(username=self.username, password=self.password)
    
        def command(self, cmd):
            ssh = paramiko.SSHClient()
            ssh._transport = self.transport
    
            stdin, stdout, stderr = ssh.exec_command(cmd)
            result = stdout.read()
            return result
    
        def upload(self, local_path, remote_path):
            sftp = paramiko.SFTPClient.from_transport(self.transport)
            sftp.put(local_path, remote_path)
            sftp.close()
    
        def close(self):
            self.transport.close()
    
        def __enter__(self):
            self.open()
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            self.close()
    
    if __name__ == '__main__':
    
        with SSHProxy("123.206.16.61",22,'root','xxx') as ssh:
            ssh.command('df')
            ssh.upload(r'D:wupeiqis27day014.基于paramiko操作xx', '/data/s27/xx')
  • 相关阅读:
    python2.7 使用super关键词 报错 TypeError: must be type, not classobj 解决办法
    ACM_高次同余方程
    既然选择了、再怎么艰难也要走下去
    ACM_扩展欧几里德算法
    Codeforces Round #328 (Div. 2)_B. The Monster and the Squirrel
    Codeforces Round #328 (Div. 2)_A. PawnChess
    HDU_5523Game
    POJ_2769同余问题
    poj1258prim算法
    最小生成树—prim算法
  • 原文地址:https://www.cnblogs.com/hulk-1029/p/11051453.html
Copyright © 2011-2022 走看看