Bagaimana Anda menyederhanakan perintah ini?


10

Saya cukup baru untuk strace / netstat / dll. Saya menggunakan perintah ini untuk mendapatkan jejak proses apache yang menangani permintaan saya (telnet), apakah ada cara untuk menyederhanakannya sedikit?

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

Terima kasih!


Apakah Anda menjalankan ini sebelum atau setelah Anda memulai proses telnet?
deltaray

setelah dimulai, Anda harus menunggu beberapa detik untuk tersambung ke apache, lalu Anda dapat menjalankan strace
Andrei Serdeliuc

1
Jika perintah Anda berhasil, jangan repot-repot menyederhanakannya.
Tom O'Connor

Jawaban:


1

Saya dapat meningkatkan sedikit pada Mark Henderson, dengan $ () daripada `` dan menghapus grep dengan sed yang lebih baik:

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

Secara pribadi saya pikir backtick membuatnya sulit dibaca; lebih jauh, mereka tidak bersarang, tidak seperti sintaksis $ ()


+1, Script Fu yang unggul dan contoh pembelajaran yang bagus untuk beberapa fitur shell.
Jeff Ferland

Script ini stracemasuk ke telnet, bukan ke proses Apache yang menyajikannya.
BMDan

2

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

Selama Anda hanya memiliki satu yang telnetberjalan, ini akan stracemenjadi server yang sesuai jika ada.

Jika tidak ada ( mis. Anda terakhir kali telnetke server eksternal), straceakan gagalstrace: option requires an argument -- 'p'


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

Atau, diformat untuk membaca lebih mudah, dan dengan bendera strace OP utuh:

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

Kerusakan, terdalam terlebih dahulu:

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

Tunjukkan pada saya, tanpa menyelesaikan alamat IP ke nama DNS, semua koneksi TCP aktif. Pipa itu untuk awk, yang mencetak bidang kelima pada setiap garis yang berakhir /telnet, di mana bidang dipisahkan oleh satu atau lebih spasi dan titik dua. Bidang ini akan menjadi port sumber.

Untuk meningkatkan : Bisa dibuat lebih kuat dengan menambahkan a | head -n 1ke bagian akhir atau bagian ;exitdalam aksi awk, tetapi versi asli Anda kurang setara, jadi saya tidak ingin membuatnya lebih lama.

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

Di ****sini adalah bagian yang sudah saya jelaskan di atas. Di sini, saya mencari baris apa pun netstat -tnpyang memiliki port yang sama dengan port sumber yang saya temukan di atas, dan dimiliki oleh Apache; ketika saya menemukannya, saya mencetak bidang ketujuh (dibatasi oleh satu atau lebih spasi atau garis miring). Ini adalah PID anak Apache.

Untuk meningkatkan : Selain hanya mengembalikan satu PID (melalui metode yang sama seperti di atas), hal terbesar yang dapat saya bayangkan adalah menjadi lebih diskriminatif ketika benar-benar cocok dengan dport dibandingkan dengan sesuatu yang lain yang kebetulan cocok dengan polanya. Ini akan mudah dilakukan dengan menambahkan titik dua ke FS ( -F), tetapi masalah terjadi dalam situasi IPv4 dan IPv6 campuran, di mana mungkin ada titik dua dalam alamat itu sendiri, dan dengan demikian bisa menjadi jahat dengan cepat. Ini tampaknya cukup kuat, terutama dengan ruang gerak.

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

Ini adalah salinan langsung dari pertanyaan awal Anda; Saya tidak memodifikasinya sama sekali.

Jika Anda mengizinkan saya beberapa karakter tambahan, versi yang saya jalankan mungkin:

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

Coba ini, semoga membantu:

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

Jawaban akan terlihat lebih bagus jika Anda tidak perlu menggulir ke kanan untuk melihat semuanya.
djangofan

Ini straceke dalam telnet, bukan Apache.
Pierre Carrier
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.