このコマンドをどのように簡略化しますか?


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

起動したら、Apacheに接続するまで数秒待つ必要があります。その後、straceを実行できます
Andrei Serdeliuc

1
コマンドが機能する場合は、単純化する必要はありません。
トム・オコナー

回答:


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、およびいくつかのシェル機能の優れた学習例。
ジェフファーランド

このスクリプトstraceは、Telnetにサービスを提供するApacheプロセスではなく、Telnetにアクセスします。
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サーバーが1つだけの場合は、対応するサーバーがあれば実行されます。

ない場合(たとえば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}"

IPアドレスをDNS名に解決せずに、すべてのアクティブなTCP接続を表示します。それをawkにパイプし/telnetます。これは、フィールドが1つ以上のスペースとコロンで区切られている、で終わるすべての行に5番目のフィールドを出力します。このフィールドは送信元ポートになります。

改善するには:awkのアクション部分の| head -n 1末尾または;exit内部にa を追加することにより、はるかに堅牢にすることができますが、元のバージョンには同等のものがなかったため、これを長くしたくありませんでした。

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

****ここで私はすでに上で、説明してきた部分があります。ここでnetstat -tnpは、上記で発見したソースポートと同じポートを持ち、Apacheが所有している行を探しています。見つかったら、7番目のフィールドを出力します(1つ以上のスペースまたはスラッシュで区切られています)。これは、Apacheの子のPIDです。

改善するには:(上記と同じ方法で)1つの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

これはstraceにねtelnet、Apacheのではありません。
ピエールキャリア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.