您将如何简化此命令?


10

我对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')

谢谢!


您是在启动telnet进程之前还是之后运行此程序?
deltaray 2012年

它启动后,您需要等待几秒钟以使其连接到apache,然后才能运行strace
Andrei Serdeliuc 2012年

1
如果您的命令有效,请不要简化它。
汤姆·奥康纳

Answers:


1

我可以用$()代替``''来改善Mark Henderson的功能,并使用更好的sed删除grep:

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

我个人认为反引号很难阅读。此外,它们不嵌套,与$()语法不同


+1,出色的Script Fu和一些shell功能的良好学习示例。
杰夫·弗兰

该脚本strace位于telnet中,而不是在为其提供服务的Apache进程中。
BMDan 2012年

2

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'


1
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}"

请向我展示所有活动的TCP连接,而无需将IP地址解析为DNS名称。用管道将其传输到awk,它将在以结尾的任何行上打印第五个字段/telnet,其中字段由一个或多个空格和冒号分隔。该字段将成为源端口。

改进:可以通过在awk的操作部分| head -n 1的末尾或;exit内部添加a 来使其更加健壮,但是您的原始版本缺少等效项,因此我不想将其更长。

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

****是我上面已经解释过的部分。在这里,我要寻找的任何netstat -tnp与我上面发现的源端口具有相同端口且归Apache所有的行;找到它时,我将打印第七个字段(由一个或多个空格或斜杠分隔)。这是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}")

0

试试这个,希望对您有帮助:

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

如果您不必向右滚动以查看全部内容,答案会更好。
djangofan

stracetelnet,而不是Apache。
皮埃尔·卡里尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.