当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    python通过SSH登陆linux并操作的实现

    栏目:win服务器问题汇总 时间:2019-10-19 22:08

    用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的。

    代码:

    >>> import paramiko
    
    >>> ssh = paramiko.SSHClient()
    >>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    >>> ssh.connect('10.104.6.8',username = 'xiaopeng',password='******')
    >>> cmd = 'cd'  #进入用户目录home
    >>> stdin,stdout,stderr = ssh.exec_command(cmd)
    >>> cmd = 'ls >test' #管道,ls命名的输出到文件test里面
    >>> stdin,stdout,stderr = ssh.exec_command(cmd)
    >>> cmd = 'cat test' # 显示test的内容,即ls命名的结果
    >>> stdin,stdout,stderr = ssh.exec_command(cmd)
    >>> print stdout.readlines()  #结果 汉字用的字符显示
    ['code\n', 'Desktop\n', 'order.cpp\n', 'python\n', 'test\n', '\xe5\x85\xac\xe5\x85\xb1\xe7\x9a\x84\n', '\xe6\xa8\xa1\xe6\x9d\xbf\n', '\xe8\xa7\x86\xe9\xa2\x91\n', '\xe5\x9b\xbe\xe7\x89\x87\n', '\xe6\x96\x87\xe6\xa1\xa3\n', '\xe4\xb8\x8b\xe8\xbd\xbd\n', '\xe9\x9f\xb3\xe4\xb9\x90\n']
    

    这里我们都会发现,使用exec_command('cd dirname')时并不会切换目录,execute_command() 是a single session,每次执行完后都要回到缺省目录。所以可以 .execute_command('cd /var; pwd')。

    python里面的paramiko模块,用这个实现ssh登录更加简单。看下面的代码:

    #-*- coding: utf-8 -*- 
    #!/usr/bin/python  
    import paramiko 
    import threading 
    def ssh2(ip,username,passwd,cmd): 
      try: 
        ssh = paramiko.SSHClient() 
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
        ssh.connect(ip,22,username,passwd,timeout=5) 
        for m in cmd: 
          stdin, stdout, stderr = ssh.exec_command(m) 
    #      stdin.write("Y")  #简单交互,输入 ‘Y'  
          out = stdout.readlines() 
          #屏幕输出 
          for o in out: 
            print o, 
        print '%s\tOK\n'%(ip) 
        ssh.close() 
      except : 
        print '%s\tError\n'%(ip) 
    if __name__=='__main__': 
      cmd = ['cal','echo hello!']#你要执行的命令列表 
      username = "" #用户名 
      passwd = ""  #密码 
      threads = []  #多线程 
      print "Begin......" 
      for i in range(1,254): 
        ip = '192.168.1.'+str(i) 
        a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))  
        a.start() 
    

    上面的程序还是有些技巧的:

    1.利用多线程,同时发出登录请求,同时去连接电脑,这样速度快很多,我试了一下,如果不用多线程,直接一个一个挨着执行的话,大约5~10秒钟才能对一台电脑操作完,具体时间要根据命令的来决定,如果是软件安装或者卸载时间要更长一些。这样下来怎么也要一二十分钟,用多线程后就快多了,所有的命令执行完用了不到2分钟!

    2.最好用root用户登录,因为安装或者卸载软件的时候如果用普通用户又会提示输入密码,这样又多了一次交互,处理起来就比较麻烦!安装软件时apt-get install xxx 最好加上“-y”参数,因为有时安装或删除软件时提示是否继续安装或卸载,这又是一次自动交互!加上那个参数后就没有人机交互了。

    3.循环时循环所有ip,因为计算机的ip是路由器自动分配的,保险起见,最好全部都执行,保证没有遗漏的主机

    4.远端执行命令时如果有交互,可以这样用 stdin.write("Y")来完成交互,“Y”就是输入“Y”。

    5.把所有的命令放到一个列表里面,遍历列表可以依次执行列表里面的命令