Come semplificheresti questo comando?


10

Sono abbastanza nuovo per strace / netstat / ecc. Sto usando questo comando per ottenere una traccia del processo apache che gestisce la mia richiesta (telnet), c'è un modo per semplificarlo un po '?

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

Grazie!


Lo stai eseguendo prima o dopo aver avviato il processo telnet?
deltaray,

dopo che è stato avviato, devi attendere alcuni secondi affinché si connetta ad apache, quindi puoi eseguire strace
Andrei Serdeliuc,

1
Se il tuo comando funziona, non preoccuparti di semplificarlo.
Tom O'Connor,

Risposte:


1

Posso migliorare un po 'su Mark Henderson, con $ () invece di `` e rimuovere il grep con una sed migliore:

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

Personalmente penso che i backtick rendano difficile la lettura; inoltre, non si annidano, diversamente dalla sintassi $ ()


+1, script Fu superiore e buon esempio di apprendimento per alcune funzionalità della shell.
Jeff Ferland,

Questo script straceè nel telnet, non nel processo Apache che lo sta servendo.
BMDan,

2

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

Finché ne hai solo uno in telnetesecuzione, questo sarà straceil server corrispondente se presente.

Se non ce n'è uno ( ad es. È stato modificato telnetper ultimo su un server esterno), stracefalliràstrace: option requires an argument -- 'p'


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

Oppure, formattato per una lettura più semplice e con i flag strace dell'OP intatti:

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

Ripartizione, prima di tutto:

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

Fammi vedere, senza risolvere gli indirizzi IP in nomi DNS, tutte le connessioni TCP attive. Installa quello su awk, che stampa il quinto campo su qualsiasi linea che termina in /telnet, dove i campi sono separati da uno o più spazi e due punti. Questo campo sarà la porta di origine.

Per migliorare : potrebbe essere reso molto più robusto aggiungendo un | head -n 1alla fine o un ;exitinterno alla parte dell'azione di awk, ma la tua versione originale mancava di un equivalente, quindi non volevo prolungarlo.

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

Il ****qui è la parte che ho già spiegato, al di sopra. Qui sto cercando qualsiasi linea netstat -tnpche abbia la stessa porta della porta di origine che ho scoperto sopra ed è di proprietà di Apache; quando lo trovo, stampo il settimo campo (delimitato da uno o più spazi o barre). Questo è il PID del bambino Apache.

Per migliorare : Oltre a restituire un solo PID (tramite gli stessi metodi di cui sopra), la cosa più grande che posso immaginare è quella di essere più discriminante quando si tratta di abbinare effettivamente il dport al contrario di qualcos'altro che si adatta allo schema. Questo sarebbe stato facile da fare aggiungendo due punti a FS ( -F), ma il problema si verifica in situazioni miste IPv4 contro IPv6, dove potrebbero esserci due punti nell'indirizzo stesso e come tali potrebbero diventare cattivi piuttosto rapidamente. Sembrava dannatamente robusto, specialmente con lo spazio finale.

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

Questa è una copia diretta della tua domanda originale; Non l'ho modificato per niente.

Se mi permettessi qualche personaggio in più, la versione che eseguirò potrebbe essere:

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

Prova questo, spero che ti aiuti:

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

La risposta sarebbe più bella se non dovessi scorrere verso destra per vedere tutto.
Djangofan,

Questo straceè in telnet, non Apache.
Pierre Carrier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.