【发布时间】:2022-02-02 19:10:59
【问题描述】:
我正在开发一个脚本来搜索从 CRON 通过 SSH 在一堆远程服务器上执行的脚本中的模式。
Script on client machine -- SSH --> Remote Servers CRON/Scripts
目前我无法获得正确的输出。
客户端机器上的脚本
#!/bin/bash
server_list=( '172.x.x.x' '172.x.x.y' '172.x.x.z' )
for s in ${server_list[@]}; do
ssh -i /home/user/.ssh/my_key.rsa user@${s} crontab -l | grep -v '^#\|^[[:space:]]*$' | cut -d ' ' -f 6- | awk '{print $1}' | grep -v '^$\|^echo\|^find\|^PATH\|^/usr/bin\|^/bin/' | xargs -0 grep -in 'server.tld\|10.x.x.x'
done
这只会给我来自 crontab 的脚本路径,而不是匹配的行和行号加上第一行以“grep:”关键字为前缀(示例如下):
grep: /opt/directory/script1.sh
/opt/directory/script2.sh
/opt/directory/script3.sh
/opt/directory/script4.sh
如何获得正确的输出,即脚本路径加上行号加上匹配模式的行?
远程 CRON 示例
OO 6 * * * /opt/directory/script1.sh foo
30 6 * * * /opt/directory/script2.sh bar
远程脚本内容示例
1 ) 这将匹配 grep 模式
#!/bin/bash
ping -c 4 server.tld && echo "server.tld ($1)"
2 ) 这与 grep 模式不匹配
#!/bin/bash
ping -c 4 8.x.x.x && echo "8.x.x.x ($1)"
【问题讨论】:
-
我不知道它应该做什么。哪些部分应该在远程计算机上执行,哪些部分应该在本地执行?目前只有
crontab -l远程运行,其余管道在本地。此外,xargs -0仅在其输入以 null 分隔时才有意义(这就是-0的含义),而grep的输出则不会。 -
@gordon-davisson:我需要获取由远程 crontab 触发的脚本的内容,当然只有那些匹配 grep 搜索模式(server.tld 或 10.x.x.x)的脚本跨度>