"""
对app进行一些路由设置
""" """
对socketio进行一些监听设置
"""
#!/usr/bin/python

import paramiko

import traceback

user='root'

ipfile = '/root/ipfile'

cmd = r'''

#!/bin/sh

/usr/local/nginx/sbin/nginx -t

if [ $? -eq 0 ]; then

        /usr/local/nginx/sbin/nginx -s reload

fi

'''

def get_ip():

    iplist = []

    f = file(ipfile,'r')

    while True:

        ip = f.readline().strip()

        if len(ip) == 0:

            break

        else:

           iplist.append(ip)

    f.close()

    return iplist

if __name__ == "__main__":

    iplist = get_ip()

    for ip in iplist:

        try:

            ssh = paramiko.SSHClient()

            ssh.load_system_host_keys()

            ssh.connect(ip,username=user,timeout=5)

            print "%s" % (ip)

            stdin,stdout,stderr = ssh.exec_command(cmd)

            printstdout.read()

            printstderr.read()

           ssh.close()

        except:

            exstr=traceback.format_exc()

            print "[%s] : %s" % (ip.ljust(18),exstr)

           ssh.close()

            continue

######### 转自 https://www.cnblogs.com/franknihao/p/6536255.html

paramiko

  *paramiko需要PyCrypto模块的支持

  paramiko支持通过SSH协议进行一些操作,比如远程执行命令,上下传文件等等

  用法:

  ①  远程命令

#encoding:utf-8
#-*- coding: UTF-8 -*-
#!/usr/bin/python
#coding=UTF-8
'''
Created on 2018氓忙7忙
@author: Administrator
'''
import os
import paramiko
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())    #指定当对方主机没有本机公钥的情况时应该怎么办,AutoAddPolicy表示自动在对方主机保存下本机的秘钥
ssh.connect('ip',22,'user','passwd') #SSH端口默认22,可改
stdin,stdout,stderr = ssh.exec_command("命令内容") #这三个得到的都是类文件对象
outmsg,errmsg = stdout.read(),stderr.read() #读一次之后,stdout和stderr里就没有内容了,所以一定要用变量把它们带的信息给保存下来,否则read一次之后就没有了
if errmsg == "":
print outmsg
ssh.close()

  ②  文件交流

tra = paramiko.Transport(('ip',22))    #参数是一个tuple
tra.connect(username='...',password='...') #一定要指明参数名的username和password。否则会报错str has no attribute 'get_name'
sftp = paramiko.SFTPClient.from_transport(tra)
sftp.put('本地路径','远程路径') #上传文件
sftp.get('远程路径','本地路径') #下载文件
tra.close()

  需要注意的是在put和get方法中,两个路径都是需要完整的(要带文件名!)

  sftp的put和get方法还有callback这个参数。这个参数指定一个函数对象,这个函数应该接受两个int型参数,分别代表了已上传/已下载的字节数;总的要上传/下载的字节数。利用callback的指定可以做出一个类似进度条的功能。另外,还需要注意的是callback会在传输完成之前不断地被调用但是具体是怎么样的时机下调用我不是很清楚,需要研究下paramiko的源码。但是可以确定的一点是这个callback函数也是在主线程中调用的,所以最好不要在里面写什么sleep,这样会导致整个传输过程变慢的。

■  Transport的更多扩展

  今天想通过python做一个SSH模拟终端。想法非常简单,就是通过SSHClient类建立连接然后进行命令和返回的交互嘛。不过发生了很多问题,去网上一找才发现,原来SSHClient类的exec_command方法是个单session包装的方法。即调用这个方法只能执行一趟命令,执行完成之后就断开了连接,再次执行时又是新的session。比如:

  ssh.exec_command('cd /tmp;pwd')的返回是/tmp,但如果把cd和pwd分成两个exec_command写的话,pwd最终返回的是HOME目录,这表明了exec_command的单会话特性。那么怎么样才能从更底层开始建立命令交互的通信? 网上小查了一种方法还是需要Transport这个我们之前在SFTP时候用的类。

  做法:

tran = paramiko.Transport(sock=(ip,22))
tran.connect(username='xxx',password='xxx')
channel = tran.open_session()
channel.get_pty()
channel.invoke_shell() channel.send('ls\n')
result = ''
while True:
time.sleep(0.5)
res = channel.recv(65535).decode('utf8')
result += res
if result:
sys.stdout.write(result.strip('\n'))
if res.endswith('# ') or res.endswith('$ '):
break

  通过这样的方式搭建出来的一个SSH命令通道是和Xshell这种软件建立出来的终端差不多的,比如有终端命令行提示符,也支持cd等命令。

  在获取命令运行的返回(recv方法的返回)时,我们用了一个while True的逐次取数据的方式。这么做的一个好处就是当返回比较多比较大的时候可以顺利读取完全。其实这么写也是有其必要性在里面的。如果直接在这个代码的循环外面直接recv一下,返回得到的会是'\r\n'而不是ls返回的文件信息。什么原理不清楚但是既然while True这个方式有必要性又有优点的话就可以考虑用下。

  跳出循环的方式是判断返回的结尾是不是终端命令提示符的结尾#+"空格"或者$+"空格",这种判断方法比较不健壮。网上也有用正则匹配或者其他的一些方法来识别返回结果读取到头了,可参考。这种方法建立的SSH通道的话,是自带命令行提示符的,而且每条命令的返回实质上是“真的返回”+"\n"+"命令提示符",所以可以做到每一个命令返回之后后面就有命令提示符。

  另一方面,这个通道也并不是很万能的,比如对通过stdin进行交互要怎么做目前我还没有找到办法、因此也就也意味着对vim,crontab -e之类的对交互有需求的软件就不是支持很好了。

■  更多扩展

●  在connect方法里还有参数timeout = float设置连接超时时间

  在connect方法中,还可用参数pkey指定本机私钥文件用于身份验证,内容可以是个PKey类对象。也可以用key_filename = '路径' 这个参数来指定一个文件。而在SSHClient类还有方法load_system_host_keys用于指定对方主机存放本机公钥的位置,默认不加参数的话是将这个位置设置为~/.ssh/known_hosts。SSHClient类对象connect之前,先用load_system_host_keys指定本机公钥存放位置,再在connect的时候指明本机私钥的话,就不用password,只要username就可以登录了。

●  关于set_missing_host_key_policy

  这个方法的参数有三种选择,分别对应三种当对方主机没有在相关文件中找到本机的公钥时做的动作:

  paramiko.AutoAddPolicy()  自动添加本机的公钥和主机名进相关文件

  paramiko.RejectPolicy()  自动拒绝未知的主机名和密钥,“未知”指的是没有在相关文件中有记录的主机

  paramiko.WarningPolicy()  和AutoAdd没差,只不过在出现没有记录的情况时警告一下

●  SFTPClient类除了上面提到的那些方法以外,还有:

  sftp.mkdir('路径',mode)  #mode不用加引号,直接写755之类的即可,方法直接创建目录并按mode设置其权限

  sftp.remove('路径')  #删除某目录

  sftp.stat("文件路径")  #获取文件信息

  sftp.listdir("路径")  #以列表方式返回目录下的内容

  以上这些方法和exec_command执行一些特定的命令是差不多的,实践的时候也不必一棵树吊死在exec_command上,也可以适当考虑这些方法。

●  ssh.exec_command的异步原理

  据我估计ssh.exec_command应该是单独开一条线程来远程执行命令,而当我们对命令的输出不感兴趣,在exec_command执行之后不调用read来收集远程返回的信息的话,那么这个线程是不阻塞的。这是个小坑的地方。比如下面两个例子,ssh是一个已经配置好的SSHClient对象:

stdin,stdout,stderr = ssh.exec_command("sleep 5s;echo foo")
stdin,stdout,stderr = ssh.exec_command("echo bar")
out,err = stdout.read(),stderr.read()
if err:
print err
else:
print out
#这种情况下的输出只有bar
######另一种情况######
stdin,stdout,stderr = ssh.exec_command("sleep 5s;echo foo")
out,err = stdout.read(),stderr.read()
stdin,stdout,stderr = ssh.exec_command("echo bar")
out,err = stdout.read(),stderr.read()
if err:
print err
else:
print out
#这种情况下先等5秒然后输出foo和bar

  可以看到第一种情况中,没有读取stdout等的信息,那么本地程序直接往下执行,不管之前的命令是否还未给出结果,而第二种情况,由于我要读取内容,所以必须等到上一条命令执行完成给出结果本地才继续跑下一条命令。

  ●  stdin的用法

  之前由于基本上都是从服务器上面读数据,对于stdin这个变量一直感觉很鸡肋。直到那天要批量改服务器密码。。试了一下果然stdin是可以拿来进行write的。记得在write的时候要适当插入回车\n来模拟敲回车的过程,否则很可能会出现SSH被堵塞的情况。比如改密码这个过程:

##前面配置过程省略##
stdin,stdout,stderr = ssh.exec_command("passwd")
stdin.write("old_password\nnew_password\nnew_password\n") #因为密码要确认,所以要输两遍
out,err = stdout.read(),stderr.read()
if err != '':
print err
else:
print out
 

paramiko

  *paramiko需要PyCrypto模块的支持

  paramiko支持通过SSH协议进行一些操作,比如远程执行命令,上下传文件等等

  用法:

  ①  远程命令

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #指定当对方主机没有本机公钥的情况时应该怎么办,AutoAddPolicy表示自动在对方主机保存下本机的秘钥
ssh.connect('ip',22,'user','passwd') #SSH端口默认22,可改
stdin,stdout,stderr = ssh.exec_command("命令内容") #这三个得到的都是类文件对象
outmsg,errmsg = stdout.read(),stderr.read() #读一次之后,stdout和stderr里就没有内容了,所以一定要用变量把它们带的信息给保存下来,否则read一次之后就没有了
if errmsg == "":
print outmsg
ssh.close()

  ②  文件交流

tra = paramiko.Transport(('ip',22))    #参数是一个tuple
tra.connect(username='...',password='...') #一定要指明参数名的username和password。否则会报错str has no attribute 'get_name'
sftp = paramiko.SFTPClient.from_transport(tra)
sftp.put('本地路径','远程路径') #上传文件
sftp.get('远程路径','本地路径') #下载文件
tra.close()

  需要注意的是在put和get方法中,两个路径都是需要完整的(要带文件名!)

  sftp的put和get方法还有callback这个参数。这个参数指定一个函数对象,这个函数应该接受两个int型参数,分别代表了已上传/已下载的字节数;总的要上传/下载的字节数。利用callback的指定可以做出一个类似进度条的功能。另外,还需要注意的是callback会在传输完成之前不断地被调用但是具体是怎么样的时机下调用我不是很清楚,需要研究下paramiko的源码。但是可以确定的一点是这个callback函数也是在主线程中调用的,所以最好不要在里面写什么sleep,这样会导致整个传输过程变慢的。

■  Transport的更多扩展

  今天想通过python做一个SSH模拟终端。想法非常简单,就是通过SSHClient类建立连接然后进行命令和返回的交互嘛。不过发生了很多问题,去网上一找才发现,原来SSHClient类的exec_command方法是个单session包装的方法。即调用这个方法只能执行一趟命令,执行完成之后就断开了连接,再次执行时又是新的session。比如:

  ssh.exec_command('cd /tmp;pwd')的返回是/tmp,但如果把cd和pwd分成两个exec_command写的话,pwd最终返回的是HOME目录,这表明了exec_command的单会话特性。那么怎么样才能从更底层开始建立命令交互的通信? 网上小查了一种方法还是需要Transport这个我们之前在SFTP时候用的类。

  做法:

tran = paramiko.Transport(sock=(ip,22))
tran.connect(username='xxx',password='xxx')
channel = tran.open_session()
channel.get_pty()
channel.invoke_shell() channel.send('ls\n')
result = ''
while True:
time.sleep(0.5)
res = channel.recv(65535).decode('utf8')
result += res
if result:
sys.stdout.write(result.strip('\n'))
if res.endswith('# ') or res.endswith('$ '):
break

  通过这样的方式搭建出来的一个SSH命令通道是和Xshell这种软件建立出来的终端差不多的,比如有终端命令行提示符,也支持cd等命令。

  在获取命令运行的返回(recv方法的返回)时,我们用了一个while True的逐次取数据的方式。这么做的一个好处就是当返回比较多比较大的时候可以顺利读取完全。其实这么写也是有其必要性在里面的。如果直接在这个代码的循环外面直接recv一下,返回得到的会是'\r\n'而不是ls返回的文件信息。什么原理不清楚但是既然while True这个方式有必要性又有优点的话就可以考虑用下。

  跳出循环的方式是判断返回的结尾是不是终端命令提示符的结尾#+"空格"或者$+"空格",这种判断方法比较不健壮。网上也有用正则匹配或者其他的一些方法来识别返回结果读取到头了,可参考。这种方法建立的SSH通道的话,是自带命令行提示符的,而且每条命令的返回实质上是“真的返回”+"\n"+"命令提示符",所以可以做到每一个命令返回之后后面就有命令提示符。

  另一方面,这个通道也并不是很万能的,比如对通过stdin进行交互要怎么做目前我还没有找到办法、因此也就也意味着对vim,crontab -e之类的对交互有需求的软件就不是支持很好了。

■  更多扩展

●  在connect方法里还有参数timeout = float设置连接超时时间

  在connect方法中,还可用参数pkey指定本机私钥文件用于身份验证,内容可以是个PKey类对象。也可以用key_filename = '路径' 这个参数来指定一个文件。而在SSHClient类还有方法load_system_host_keys用于指定对方主机存放本机公钥的位置,默认不加参数的话是将这个位置设置为~/.ssh/known_hosts。SSHClient类对象connect之前,先用load_system_host_keys指定本机公钥存放位置,再在connect的时候指明本机私钥的话,就不用password,只要username就可以登录了。

●  关于set_missing_host_key_policy

  这个方法的参数有三种选择,分别对应三种当对方主机没有在相关文件中找到本机的公钥时做的动作:

  paramiko.AutoAddPolicy()  自动添加本机的公钥和主机名进相关文件

  paramiko.RejectPolicy()  自动拒绝未知的主机名和密钥,“未知”指的是没有在相关文件中有记录的主机

  paramiko.WarningPolicy()  和AutoAdd没差,只不过在出现没有记录的情况时警告一下

●  SFTPClient类除了上面提到的那些方法以外,还有:

  sftp.mkdir('路径',mode)  #mode不用加引号,直接写755之类的即可,方法直接创建目录并按mode设置其权限

  sftp.remove('路径')  #删除某目录

  sftp.stat("文件路径")  #获取文件信息

  sftp.listdir("路径")  #以列表方式返回目录下的内容

  以上这些方法和exec_command执行一些特定的命令是差不多的,实践的时候也不必一棵树吊死在exec_command上,也可以适当考虑这些方法。

●  ssh.exec_command的异步原理

  据我估计ssh.exec_command应该是单独开一条线程来远程执行命令,而当我们对命令的输出不感兴趣,在exec_command执行之后不调用read来收集远程返回的信息的话,那么这个线程是不阻塞的。这是个小坑的地方。比如下面两个例子,ssh是一个已经配置好的SSHClient对象:

stdin,stdout,stderr = ssh.exec_command("sleep 5s;echo foo")
stdin,stdout,stderr = ssh.exec_command("echo bar")
out,err = stdout.read(),stderr.read()
if err:
print err
else:
print out
#这种情况下的输出只有bar
######另一种情况######
stdin,stdout,stderr = ssh.exec_command("sleep 5s;echo foo")
out,err = stdout.read(),stderr.read()
stdin,stdout,stderr = ssh.exec_command("echo bar")
out,err = stdout.read(),stderr.read()
if err:
print err
else:
print out
#这种情况下先等5秒然后输出foo和bar

  可以看到第一种情况中,没有读取stdout等的信息,那么本地程序直接往下执行,不管之前的命令是否还未给出结果,而第二种情况,由于我要读取内容,所以必须等到上一条命令执行完成给出结果本地才继续跑下一条命令。

  ●  stdin的用法

  之前由于基本上都是从服务器上面读数据,对于stdin这个变量一直感觉很鸡肋。直到那天要批量改服务器密码。。试了一下果然stdin是可以拿来进行write的。记得在write的时候要适当插入回车\n来模拟敲回车的过程,否则很可能会出现SSH被堵塞的情况。比如改密码这个过程:

##前面配置过程省略##
stdin,stdout,stderr = ssh.exec_command("passwd")
stdin.write("old_password\nnew_password\nnew_password\n") #因为密码要确认,所以要输两遍
out,err = stdout.read(),stderr.read()
if err != '':
print err
else:
print out
 

python 之 paramiko的更多相关文章

  1. python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改

    python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...

  2. 如何进行服务器的批量管理以及python 的paramiko的模块

    最近对公司的通道机账号进行改造管理,全面的更加深入的理解了公司账号管理的架构.(注:基本上所有的机器上的ssh不能使用,只有部分机器能够使用.为了安全的角度考虑,安装的不是公版的ssh,而都是定制版的 ...

  3. python 多线程 paramiko实现批量命令输入输出

    远程批量执行命令 实现多线程执行 速度快 实现多并发登录 #-*- coding: utf-8 -*- #!/usr/bin/python import paramiko import threadi ...

  4. python的paramiko模块

        paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BSD, MacOS X, ...

  5. Python之paramiko模块

    今天我们来了解一下python的paramiko模块 paramiko是python基于SSH用于远程服务器并执行相应的操作. 我们先在windows下安装paramiko 1.cmd下用pip安装p ...

  6. (转)python通过paramiko实现,ssh功能

    python通过paramiko实现,ssh功能 1 import paramiko 2 3 ssh =paramiko.SSHClient()#创建一个SSH连接对象 4 ssh.set_missi ...

  7. 使用python的Paramiko模块登陆SSH

    使用python的Paramiko模块登陆SSH paramiko是用Python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. python的paramiko模块 ...

  8. 利用python 下paramiko模块无密码登录

    利用python 下paramiko模块无密码登录   上次我个大家介绍了利用paramiko这个模块,可以模拟ssh登陆远程服务器,并且可以返回执行的命令结果,这次给大家介绍下如何利用已经建立的密钥 ...

  9. (转)python的paramiko模块

    python的paramiko模块  原文:http://www.cnblogs.com/breezey/p/6663546.html     paramiko是用python语言写的一个模块,遵循S ...

  10. Python之paramiko模块和SQL连接API

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: i ...

随机推荐

  1. SRA数据转成fastq

    Downloading and installing the SRA Toolkit step1: 下载并安装SRAtoolkit    (Download the Toolkit from the ...

  2. bzoj4318 OSU!

    传送门 题目 osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n ...

  3. 数据库commit问题

    对数据库进行修改后,需要commit!---之前也是忘记commit导致数据库反应不过来.

  4. Excel课程学习第二课单元格格式设置

    今天要讲的是单元格格式的设置,字体字号的设置,边框设置,合并单元格之类的. 下面看看具体的内容: 1.使用单元格格式工具美化表格 1.1设置单元格格式的对话框在哪里? 下图中三个小箭头都能打开设置单元 ...

  5. JavaWeb_增强for循环

    引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需要先获得数组的长度或集合的迭代器,比较麻烦. JDK5中定义了一种新的语法----增强for循环,以简化此类操作.增强for ...

  6. sql语句增加字段 索引

    alter table order_info add area varchar(50) create index group_compar on ry_order (group_compar);   ...

  7. C#根据弹窗标题获取窗体句柄并模拟点击按钮(FindWindow,FindWindowEx,SendMessage)

    任务:将下面弹窗自动关闭 /// <summary> /// 找到窗口 /// </summary> /// <param name="lpClassName& ...

  8. Gazebo学习随记5 杂记

    模拟建筑编辑器 将卫星图导入世界,方便空中机器人模拟 录像和回放 记录筛选 给关节添加力/扭矩  一开始不知道哪里出现了偏差以一动不动,重启就好了 HDF5数据集 代码内省 模型插件   !!!我终于 ...

  9. c# 中virtual与abstract

    在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...

  10. 缩点【洛谷P2860】 [USACO06JAN]冗余路径Redundant Paths

    P2860 [USACO06JAN]冗余路径Redundant Paths 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了 ...