zoukankan      html  css  js  c++  java
  • day9-paramiko

    一、基于用户名密码认证SSH连接

    #!/usr/bin/env python
    #coding:utf8
    
    import paramiko
    
    ssh = paramiko.SSHClient()#创建SSH对象
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#允许连接不在know_hosts文件中的主机
    ssh.connect(hostname='172.16.230.95',username='root',password='123456')#SSH连接远程服务器
    stdin,stdout,stderr=ssh.exec_command('df -h')#执行的命令
    result=stdout.read()
    print result #打印执行结果
    ssh.close()#关闭SSH连接

    二、公钥秘钥SSH连接

    #!/usr/bin/env python
    #coding:utf8
    import paramiko
    private_key=paramiko.RSAKey.from_private_key('/root/.ssh/id_rsa')
    ssh=paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname='172.16.230.95',username='root',pkey=private_key)#SSH连接远程服务器
    stdin,stdout,stderr=ssh.exec_command('df -h')#执行的命令
    result=stdout.read()
    print result #打印执行结果
    ssh.close()#关闭SSH连接

    三、文件上传和下载

    #!/usr/bin/env python
    #coding:utf8
    
    import paramiko
    
    '''
    private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
    transport = paramiko.Transport(('172.16.230.95',22))
    transport.connect(username='root',pkey=private_key)
    公钥秘钥认证
    '''
    
    transport = paramiko.Transport(('172.16.230.95',22)) #用户名密码认证
    transport.connect(username='root',password='123456')
    
    
    sftp = paramiko.SFTPClient.from_transport(transport)
    # 123.py 上传至服务器 /tmp/test.py
    sftp.put('/tmp/123.py', '/tmp/test.py')
    # 将remote_path 下载到本地 local_path
    sftp.get('remote_path', 'local_path')
    
    transport.close()

    四、一个完整的例子

    #!/usr/bin/env python
    #coding:utf8
    
    import paramiko
    import threading
    import time
    import sys
    
    class Server_Run(threading.Thread):
        def __init__(self,argv,ip):
            threading.Thread.__init__(self)
            self.username=argv['username']
            self.password=argv['password']
            if argv.get('local_file') and argv.get('remote_file'):
                self.local_file=argv['local_file']#本地文件
                self.remote_file=argv['remote_file']#远程文件
                self.motion=argv['motion']#执行的动作 put还是get
            else:
                self.motion=''
            if argv.get('cmd'):
                self.cmd=argv['cmd']#命令
            else:
                self.cmd=''
            self.group=argv['group']#服务组
            self.server_ip=ip#服务器IP
    
    
        def conns(self):
            self.transport = paramiko.Transport((self.server_ip,22))
            self.transport.connect(username=self.username,password=self.password)
            self.ssh = paramiko.SSHClient()
            self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh._transport = self.transport
    
        #使用反射解析字符串并调用方法
        def argv_parse(self):
            if hasattr(self,self.motion):
                func=getattr(self,self.motion)
                func()
    
        #执行远端命令
        def ssh_cmd(self):
            stdin, stdout, stderr = self.ssh.exec_command(self.cmd)
            data=stdout.read()
            if data:
                print "33[32;1m%s execution [%s] command to succeed33[0m"%(self.server_ip,self.cmd)
                print "[%s]----result----:
    %s"%(self.server_ip,data)
            if stderr:
                print ("33[31;1m %s33[0m"%stderr.read())
    
        #文件上传
        def put(self):
            sftp = paramiko.SFTPClient.from_transport(self.transport)
            sftp.put(self.local_file, self.remote_file)
    
        #文件下载
        def get(self):
            sftp = paramiko.SFTPClient.from_transport(self.transport)
            sftp.get(self.remote_file, self.local_file)
    
        #重写run方法
        def run(self):
            paramiko.util.log_to_file('paramiko.log')
            try:
                self.conns()
            except paramiko.SSHException,AttributeError :
                print '[%s] connection timeout'%self.server_ip
                sys.exit()
            if self.cmd:
                self.ssh_cmd()
            self.argv_parse()
            self.conn_close()
    
        #关闭连接
        def conn_close(self):
            self.transport.close()
    
    
    if __name__=='__main__':
        server_ip=['172.16.230.95']
        response={
                  'username':'root','password':'password',
                  'local_file':'/Users/xym/install.log',
                  'remote_file':'/root/install.log',
                  'cmd':'df -h',
                  'group':'web',
                  'motion':'get',
                }
    
        for ip in server_ip:#循环IP
            server=Server_Run(response,ip)#实例化类把argv和IP传入
            server.start()#根据IP个数开启并执行多线程
  • 相关阅读:
    dubbo
    maven
    vue
    SSM框架整合
    MyBatis数据表注解开发
    MyBatis多表操作xml方式
    MyBatis映射配置文件
    Mybatis核心配置文件,传统开发和代理开发(主流)
    SpringMVC高级
    SpringMVC基础
  • 原文地址:https://www.cnblogs.com/xuyanmei/p/5305367.html
Copyright © 2011-2022 走看看