你将如何简化这个命令?

我是strace / netstat /等新手。我使用这个命令来获取处理我的请求(telnet)的apache进程的跟踪,有没有办法简化它呢?

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \ grep $(lsof -p `pidof telnet` | grep TCP | \ perl -n -e'/localhost:(\d+)/ && print $1') | grep apache2 | \ perl -n -e'/ESTABLISHED (\d+)/ && print $1') 

谢谢!

我可以改善Mark Henderson的一点,用$()代替“,并用更好的sed去除grep:

 sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \ sed -e "/telnet/s/^.*ESTABLISHED\ \|\/.*$//g") 

就我个人而言,我认为这种反作用很难阅读。 此外,它们不像$()语法那样嵌套

strace -p $(ss -npt|sed -n "/:$(ss -npt|sed -n '/telnet/s/^.*\?:\([0-9]\+\).*/\1/p') \+u/s/.*,\(.*\),.*/\1/p")

只要你只有一个telnet运行,如果有的话,这将对相应的服务器进行strace

如果没有一个( 例如 ,最后telnet到外部服务器), strace将失败, strace: option requires an argument -- 'p'

 strace -p $(netstat -tnp|awk -F'[ /]+' "/:$(netstat -tnp|awk -F'[ :]+' "/\/telnet/{print \$5}") /&&/apache2/{print \$7}") 

或者,为便于阅读而格式化,并且OP的strace标志保持不变:

 sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \ awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \ {print \$5}") / && /apache2/ {print \$7}") 

细分,最里面的第一:

 netstat -tnp | awk -F'[ :]+' "/\/telnet/ {print \$5}" 

在不parsingDNS名称的IP地址的情况下,让我看看所有活动的TCP连接。 pipeawk,打印任何结束于/telnet行上的第五个字段,其中字段由一个或多个空格和冒号分隔。 这个字段将是源端口。

改进 :可以通过添加| head -n 1来使得更加健壮 | head -n 1到awk的动作部分内部,或者;exit ,但是你原来的版本缺less一个等价的东西,所以我不想让这个更长。

 netstat -tnp | awk -F'[ /]+' "/:**** / && /apache2/ {print \$7}") 

这里的****是我上面已经解释过的部分。 在这里,我正在寻找netstat -tnp中的任何一行,它与我上面发现的源端口具有相同的端口,并且归Apache所有; 当我find它时,我打印第七个字段(由一个或多个空格或斜杠分隔)。 这是Apache孩子的PID。

为了改善 :除了只返回一个PID(通过与上面相同的方法)之外,我能想象的最重要的事情是在实际上匹配dport时与其他恰好符合该模式的其他事物相比更具有区别性。 通过向FS( -F )添加冒号很容易,但是在混合的IPv4和IPv6的情况下会出现这种问题,在这种情况下,地址本身可能有冒号,因此可能会变得很快。 这似乎非常强大,特别是在尾部空间。

 sudo strace -o /tmp/strace -f -s4096 -r -p 

这是你原来的问题的直接副本; 我没有修改它。

如果你允许我多加一些字符,我运行的版本可能是:

 sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \ awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \ {print \$5;exit}") / && /apache2/ {print \$7;exit}") 

试试这个,希望它有帮助:

 sudo strace -o /tmp/strace -f -s4096 -r -p `netstat -antlp | \ grep telnet | sed -e "s/^.*ESTABLISHED\ \|\/.*$//g"`