Bu komutu nasıl basitleştirirdiniz?


10

Strace / netstat / etc için oldukça yeniyim. Bu komutu, isteğimi (telnet) işleyen apache işleminin izini almak için kullanıyorum, biraz basitleştirmenin bir yolu var mı?

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

Teşekkürler!


Telnet işlemini başlatmadan önce veya sonra mı çalıştırıyorsunuz?
deltaray

başladıktan sonra,
apache'ye

1
Komutunuz işe yararsa, basitleştirmeyi zahmet etmeyin.
Tom O'Connor

Yanıtlar:


1

Mark Henderson'ın `` yerine $ () ile biraz daha gelişebilirim ve daha iyi bir sed ile grep'i kaldırabilirim:

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

Şahsen ben backticks okumayı zorlaştırıyor düşünüyorum; ayrıca, $ () sözdiziminin aksine yuva yapmazlar


+1, üstün Script Fu ve bazı kabuk özellikleri için iyi öğrenme örneği.
Jeff Ferland

Bu komut dosyası strace, hizmet veren Apache işlemine değil, telnet'e bağlanır.
BMDan

2

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

Yalnızca bir tane telnetçalıştığınız sürece , bu stracevarsa ilgili sunucuya sahip olacaktır.

Biri yoksa ( örneğin Eğer telnetharici bir sunucuya son etmek ed), stracebaşarısız olurstrace: option requires an argument -- 'p'


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

Veya daha kolay okuma için biçimlendirilmiş ve OP'nin strace bayrakları bozulmamış olarak:

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

Arıza, önce en içteki:

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

IP adreslerini DNS adlarına çözümlemeden tüm etkin TCP bağlantılarını göster. /telnetBir veya daha fazla boşluk ve iki nokta ile ayrılan herhangi bir satırda beşinci alanı basan, awk için boru . Bu alan kaynak bağlantı noktası olacaktır.

Geliştirmek için : awk'ın | head -n 1sonuna veya ;exitiçine bir bölüm ekleyerek çok daha sağlam hale getirilebilir , ancak orijinal sürümünüzde bir eşdeğer yoktu, bu yüzden bunu daha uzun yapmak istemedim.

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

****Burada zaten yukarıda izah ettik kısmıdır. Burada, netstat -tnpyukarıda keşfettiğim kaynak bağlantı noktasıyla aynı bağlantı noktasına sahip olan ve Apache'nin sahibi olduğu herhangi bir satır arıyorum ; bulduğumda, yedinci alanı yazdırıyorum (bir veya daha fazla boşluk veya eğik çizgi ile ayrılmış). Bu Apache çocuğunun PID'sidir.

Geliştirmek için : Sadece bir PID döndürmenin yanı sıra (yukarıdakiyle aynı yöntemlerle), hayal edebileceğim en büyük şey, desene uyacak şekilde başka bir şeye kıyasla aslında dport'u eşleştirmek söz konusu olduğunda daha ayrımcı olmaktır. Bu FS ( -F) sütunları ekleyerek yapmak kolay olurdu , ama sorun adresin içinde iki nokta üst üste olabilir ve bu nedenle oldukça çabuk kötü olabilir karışık IPv4 vs IPv6 durumlarda oluşur. Bu, özellikle arka boşlukta oldukça sağlam görünüyordu.

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

Bu, orijinal sorunuzun doğrudan kopyasıdır; En azından değiştirmedim.

Bana birkaç karakter daha izin verirseniz, çalıştırdığım sürüm şu olabilir:

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

Bunu deneyin, umarım yardımcı olur:

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

Hepsini görmek için sağa kaydırmak zorunda kalmazsanız cevap daha güzel görünecektir.
djangofan

Bu straceiçine s telnetApache değil.
Pierre Carrier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.