之前部署环境,一个命令一个命令的敲;
然后是写shell脚本——
但是我不会在执行shell脚本的时候输入需要的信息
——要不然命令本身不支持要不然需要装插件
然后我想,能不能用py搞一个一键自动部署!
然后百度(谷歌除了镜像,还有真正的谷歌么?)发现了paramiko,他可以让你的命令在需要输入信息的时候,
自动输入信息
,最让人兴奋的是,他可以
根据你之前命令的返回值,进行if判断,发送新的需要输入的信息
,比如是否输入‘yes’,这是一个可能选项。
——
一切皆有可能,亚斯蒂大帝如是说。
1.连接he断开连接
两种连接方式,paramiko.SSHClient()和paramiko.Transport()我选择后一种。第一种cd后会回到连接的初始状态,第二种不会。
def
__init__
(self)
:
self._transport =
None
self._channel =
None
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
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')
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']
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 ('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 自动化运维》 一书,书中提到
使用paramiko的
send和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() 方法返回三个文件对象,分别表示标准输入、标准输出和标准错误输出。你可以通过读取标准输出来获取命令执行结果。