相关文章推荐

之前部署环境,一个命令一个命令的敲;
然后是写shell脚本—— 但是我不会在执行shell脚本的时候输入需要的信息 ——要不然命令本身不支持要不然需要装插件
然后我想,能不能用py搞一个一键自动部署!
然后百度(谷歌除了镜像,还有真正的谷歌么?)发现了paramiko,他可以让你的命令在需要输入信息的时候, 自动输入信息 ,最让人兴奋的是,他可以 根据你之前命令的返回值,进行if判断,发送新的需要输入的信息 ,比如是否输入‘yes’,这是一个可能选项。
—— 一切皆有可能,亚斯蒂大帝如是说。

1.连接he断开连接

两种连接方式,paramiko.SSHClient()和paramiko.Transport()我选择后一种。第一种cd后会回到连接的初始状态,第二种不会。

def __init__ (self) : self._transport = None self._channel = None #info是list,【"某IP地址",port,"用户名", "口令"】 def transport_connect (self,info) : self._transport = paramiko.Transport((info[ 0 ], int(info[ 1 ]))) # 建立一个加密的管道 self._transport.start_client() # 用户名密码方式 self._transport.auth_password(info[ 2 ], info[ 3 ]) # 打开一个通道 self._channel = self._transport.open_session() self._channel.settimeout( 7200 ) # 获取一个终端 self._channel.get_pty() # 激活器 self._channel.invoke_shell() return self._transport,self._channel #断开连接 def transport_disconnect (self) : if self._channel: self._channel.close() if self._transport: self._transport.close()

2.发送命令

打开我的linux,执行命令开始是:[root@emsmain version]#
执行完以后,也是这种。
那么在我看来, 发送命令有两种状态 ,一种是最后显示 [.*]# 命令完全执行完毕,另一种是命令在执行中,需要你输入一些参数信息。
所以发送命令也分为两种:

命令会执行完,参数cmd是命令,末尾不需要带回车\r,
返回值是这个命令的所有执行信息,
到时候可以根据里面的信息判断需不需要再次发送命令
def send(self,cmd,channel):
    commod = cmd
    cmd += '\r'
    # 通过命令执行提示符来判断命令是否执行完成
    p = re.compile(r']#')
    result = ''
    # 发送要执行的命令
    channel.send(cmd)
    # 回显很长的命令可能执行较久,通过循环分批次取回回显
    while True:
        sleep(0.2)
        ret = channel.recv(65535)
        ret = ret.decode('utf-8')
        result += ret
        print ret
        if p.search(ret):
            break
    # print(commod+'结束')
    return result
命令执行到一半需要输入信息,输入完成后继续
def sendMiddle(self,cmd,channel):
    commod = cmd
    cmd += '\r'
    # 通过命令执行提示符来判断命令是否执行完成
    # 发送要执行的命令
    channel.send(cmd)
    # 回显很长的命令可能执行较久,通过循环分批次取回回显
    sleep(0.5)
    ret = channel.recv(65535)
    ret = ret.decode('utf-8')
    # printLine(commod + '结束')
    print ret
    return ret
(8-31更新)今天突然想到了一个问题,万一linux的字符编码不是utf-8咋整?会报错停止啊。我要不先获取一下?可是我都发不出去echo $LANG;恩,处理异常吧。
ret = ret.decode('utf-8') except: ret = ret.decode('gbk')

不得不说,老子太他喵的哼哼哼了!

用scp测试

info = ['ip','22','root','passwd']
#类名是operator_shell_command()
transport = operator_shell_command()
channel = transport.transport_connect(info)[1]
transport.send('cd /home/version',channel)
transport.send('rm -f or.sh',channel)
transport.send('ls -l',channel)
str1 = transport.sendMiddle('scp root@ip:/home/version/or.sh  /home/version',channel)
#可能会出现的用if判断
if ('Are you sure you want to continue connecting (yes/no)' in str1):
    transport.sendMiddle('yes',channel)
str1 = transport.sendMiddle('passwd',channel)
if('Permission denied, please try again'  in  str1):
    str1 = transport.sendMiddle('passwd',channel)
transport.send('ls -l', channel)

部分运行结果

[root@emsmain version]#
n #这个可能是scp的命令,但是不知道为什么没有打印完整
Authorized uses only. All activity may be monitored and reported.
[email protected]’s password:

or.sh 100% 594 0.6KB/s 00:00
[root@emsmain version]#
ls -l
total 2773832

4.完结撒花——欢呼吧,为了蓝色的天空!

参考网页:
https://www.cnblogs.com/haigege/p/5513759.html
使用paramiko执行远程linux主机命令
https://www.cnblogs.com/haigege/p/5517422.html
使用paramiko的SFTP get或put整个目录
当然还有paramiko的官网,用谷歌翻译看。。。

参考链接:https://www.cnblogs.com/sch01ar/p/8024380.html 本文是在windows本机上进行的 需要用到paramiko库,安装方法:pip install paramiko import paramiko ssh = paramiko.SSHClient()#创建SSH对象 ssh.set_missing_host_key_policy(paramik...
一. paramiko简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输。 在python项目中需要远程操作linux服务器,在服务器上进行文件的拷贝以及linux命令操作。给python安装paramiko 远程连接操作linux
一. 简介   paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用paramiko来现实。 二. 使用 1. 下载安装 pycrypto,由于 paramiko 模块内部依赖py...
t = paramiko.Transport(('x.x.x.x',22))   # 设置SSH连接的远程主机地址和端口 t.connect(username='xxx',password='xxx')   # 设置登陆用户名和密码等参数 chan=t.open_session()   # 连接成功后打开一个channel chan.settimeout
最近在学习《python 自动化运维》 一书,书中提到使用paramikosend和recv来进行远程ssh的命令输入和结果获取,我也尝试使用了下。 开始在连接connect 目标host和port后准备按照书中所说连接堡垒机 channel.send(‘ssh ’ +…………………………….) 准备输入密码 while not buff.endswith(“password: “) transport = paramiko.Transport('x.x.x.x', 22) 当我连接2202端口时,如下写法发现连不上,联系服务器告诉我,我还是使用22端口连接 transport = paramiko.Transport('10.70.67.109', 2202) 通过检查源代码Transport发现,后面的数字并不是代表端口号,而是类似窗口大小的参数(具体含义大佬可以解答下)
你可以使用 paramiko 库中的 SSHClient 类来连接远程服务器,并使用 exec_command() 方法发送命令。示例代码如下: ```python import paramiko # 连接远程服务器 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='remote_host', port=22, username='username', password='password') # 发送命令 stdin, stdout, stderr = ssh.exec_command('ls -l') print(stdout.read().decode()) # 关闭连接 ssh.close() 其中,hostname、port、username、password 分别为远程服务器的主机名、端口号、用户名和密码。exec_command() 方法返回三个文件对象,分别表示标准输入、标准输出和标准错误输出。你可以通过读取标准输出来获取命令执行结果。
 
推荐文章