paramiko工具
用法
- 可以在多个服务器之间多级跳转,同时抓取各个服务器上的log并分析,实现对各个服务器上的服务的状态监控
- 可以同时批量控制多个服务器,实现对多个服务器的批量处理
- 可以同时更新部署多个服务器
注意
- 建立channel时,需要定义timeout,timeout可以重复定义,当recv超时时会抛错退出,
- recv方法是一个阻塞函数
- recv方法取值时可能中途出现空字符串的情况
- 当返回的log刷新时间较长时,建议加长timeout的设置
- 当不确定返回log的样式时,建议以超时时长作为结束条件
- 可以如果需要执行的命令过多的情况下,将各服务器命令封装到json文件中,循环解释并执行各服务器上的命令
- 如果服务器IP过多时,可额外单建一个配置py
代码样式
import paramiko
ip = "127.0.0.1"
username = "u1"
password = "p1"
ip2 = "127.0.0.1"
username2 = "u1"
password2 = "p1"
def get_log(channel: paramiko.SSHClient.invoke_shell(), timeout=5, keyword=""):
if keyword:
log = ""
try:
while keyword not in log:
msg = channel.recv(65535).decode()
log += msg
print(log)
return "getkeyword", log
except:
print(log)
return "no_keyword_appear",log
else:
log = ""
channel.settimeout(timeout)
try:
while True:
msg = channel.recv(65535).decode()
log += msg
except:
print(log)
return "timeout", log
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip, username=username, password=password)
channel = ssh_client.invoke_shell()
channel.settimeout(5)
channel.send(b"ssh {username2}@{ip2} \n")
respose=get_log(channel=channel, keyword="password:",timeout=5)
if respose[0]=="getkeyword":
channel.send(b"{password2}\n")
channel.send(b"pwd\n")
channel.closed
ssh_client.close()