python - 如何使用 python 子进程 Popen 调用通过 SSH 连接到远程服务器来执行 awk 命令?
问题描述
我在远程服务器 198.168.111.222 的位置 /a/logs/file.log 上有一个日志文件,其中每一行的格式如下所示 -
1538966781.794|7f5059db5940| 31aaa010| core-0: load 0% perf 1%/0.90 count 3600000
1538966791.798|7f5059db5940| 31aaa010| core-0: load 0% perf 2%/0.90 count 4600000
1538966801.803|7f5059db5940| 31aaa010| core-0: load 0% perf 3%/0.90 count 5600000
1538966811.809|7f5059db5940| 31aaa010| core-0: load 0% perf 4%/0.90 count 6600000
每行都以 Unix 时间戳开始。我有兴趣获取所有包含字符串“perf”并且介于给定 startTime 和 endTime 参数之间的行。对于上面的例子,它应该返回 -
1538966791.798|7f5059db5940| 31aaa010| core-0: load 0% perf 2%/0.90 count 4600000
1538966801.803|7f5059db5940| 31aaa010| core-0: load 0% perf 3%/0.90 count 5600000
这是我尝试过的 -
import subprocess
ip = '198.168.111.222'
startTime = '1538966781.794'
endTime = '1538966811.809'
linetype = 'perf'
cmd = '''ssh -oHostKeyAlgorithms=+ssh-dss root@'''+ ip + ''' \'awk '$0 ~ "''' +
linetype + '''" && $0 > "''' + startTime + '''" && $0 < "''' + endTime + '''"'
/a/logs/file.log\''''
print(cmd)
loglines = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
output = loglines.stdout.read().decode('utf-8').strip()
print(output)
我得到的输出是 -
ssh -oHostKeyAlgorithms=+ssh-dss root@198.168.111.222 'awk '$0 ~ "perf" && $0 >
"1538966781.794" && $0 < "1538966811.809"' /a/logs/file.log'
awk: fatal: cannot open file `/Users/ira' for reading (No such file or directory)
我尝试了 ',' '," " 和 ' ' ' 的不同组合,但没有运气。请指导。谢谢!
解决方案
推荐阅读
- laravel - Laravel 是否会在一段时间后自动注销用户?
- android - 地理围栏监控和通知
- pyspark - 要列出的 Pyspark 数据框列
- python - 将独立表单与DetailView结合起来
- vector - 如何对 20newsgroups_vectorized 数据集进行向量运算?
- reactjs - 强制组件在 redux 状态更改后重新渲染
- sql - 从定义的第一行开始查询
- web - 如何阻止 httrack 复制网站?
- javascript - 我在 js 中的 2D 建表功能无法正常工作
- python - 在 Django 中使用表单时如何将对象添加到不同的模型?