一、功能
- 使用paramiko打开ssh连接远程服务器
- tail命令监控服务器上某日志文件
- 日志文件中出现期望的文字,停止日志文件监控
- 执行相关命令
二、实现
代码如下(示例):
import sys
import traceback
import paramiko
import time
from paramiko_expect import SSHClientInteraction
etx = '\x03'
host = "192.168.3.189"
sshport = 22
uname = 'root'
pwd = 'root'
prompt = '.*]#.*'
filepath = '/dev/shm/err.log'
msg_expect = 'xpro-ns ready for test! gogo...'
time_signalling = 2
# 自行修改输出函数
json_list = []
def output_func(msg):
sys.stdout.write(msg)
json_list.append(msg)
sys.stdout.flush()
def stop_func(msg):
if msg_expect in msg:
return True
def signalling_send(path):
try:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, port=sshport, username=uname, password=pwd)
interact = SSHClientInteraction(client, timeout=10, display=False)
interact.send('\n')
interact.expect(prompt)
cmd = 'tailf %s' % path
print(cmd)
interact.send(cmd)
interact.tail(output_callback=output_func, stop_callback=stop_func, timeout=60)
except KeyboardInterrupt:
print('Ctrl+C interruption detected, stopping tail')
print(interact.current_output)
except Exception:
traceback.print_exc()
finally:
pass
time.sleep(time_signalling)
print('Send Ctrl+C to interrupte err.log file')
interact.send(etx)
time.sleep(time_signalling)
interact.expect(prompt)
interact.send('cd /home/ns/tools/mcisim\n')
interact.expect(prompt)
print('Send signaling: ./udp_media_attach -f udp_media_attach.cfg_ipv4')
interact.send('./udp_media_attach -f udp_media_attach.cfg_ipv4\n')
time.sleep(time_signalling)
client.close()
if __name__ == '__main__':
signalling_send(filepath)