如何简化这个命令?

如何简化这个命令?

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

谢谢!

答案1

我可以对 Mark Henderson 的方法稍加改进,用 $() 代替 ``,并用更好的 sed 删除 grep:

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

我个人认为反引号使其难以阅读;此外,它们不像 $() 语法那样嵌套

答案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'

答案3

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,其中字段由一个或多个空格和冒号分隔。此字段将是源端口。

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

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

答案4

尝试一下,希望它有所帮助:

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

相关内容