Cum să omorâți un proces Linux după numărul de port
Publicat: 2022-10-08Pentru a distruge un proces Linux, aveți nevoie de ID-ul sau de numele acestuia. Dacă tot ceea ce știi este portul pe care îl folosește, mai poți să-l omorâți? Da, în mai multe moduri diferite.
Procese de ucidere
Ocazional, un proces Linux poate deveni fără răspuns. Poate să nu mai funcționeze corect sau să continue să funcționeze, dar să ignore cererile de închidere sau să înceapă să înghită memoria, procesorul sau lățimea de bandă a rețelei.
Oricare ar fi motivele tale, există modalități de a ucide un proces din linia de comandă Linux. Metoda clasică este să utilizați comanda kill cu ID-ul procesului pe care doriți să îl încheiați. Comanda de kill
are niște rude apropiate. Comanda pkill
va ucide un proces după nume, iar killall
va ucide toate procesele pe care le poate găsi care partajează o parte a unui nume.
Dacă tot ceea ce știi despre un proces este că folosește un port pe computer, mai există modalități de a-l identifica și de a-l ucide. În termeni de rețea, „port” poate însemna o conexiune fizică în care introduceți un cablu cu o mufă la capăt, cum ar fi un cablu de rețea CAT5 sau 6, sau poate însemna un port software.
Un port software este partea finală a unei conexiuni la rețea. Adresa IP a unui dispozitiv identifică computerul sau alt dispozitiv de rețea. Aplicațiile din interiorul computerului folosesc diferite porturi. Acestea oferă un alt nivel de granularitate. Traficul de rețea a ajuns la computerul corect folosind adresa IP, iar prin utilizarea adresei de port poate fi livrat la aplicația corectă.
Este ca și poșta care sosește la un hotel, apoi este sortată și livrată în camerele corespunzătoare. Adresa IP este ca adresa străzii a hotelului, iar numerele camerelor sunt ca numerele portului.
Dacă vedeți activitate de rețea pe un port și nu recunoașteți procesul care îl generează sau comportamentul acestuia este problematic sau suspect, este posibil să doriți să opriți procesul. Chiar dacă tot ceea ce știți este numărul portului, puteți urmări procesul și îl omorâți.
Crearea de conexiuni cu socat
Pentru a avea câteva conexiuni de eliminat, vom folosi socat
pentru a crea conexiuni de rețea folosind diferite protocoale. Va trebui să instalați socat
. Pentru a-l instala pe Ubuntu, utilizați această comandă:
sudo apt install socat
Pe Fedora folosiți dnf
:
sudo dnf install socat
Pe Manjaro trebuie să tastați:
sudo pacman -S socat
Sintaxa pentru socat
este simplă, dacă este puțin lungă. Trebuie să furnizăm adresele sursă și destinație. Pentru fiecare dintre acestea, trebuie să furnizăm protocolul, adresa IP și numărul portului. Putem înlocui STDIN sau STDOUT ca sursă sau destinație.
Această comandă creează o conexiune între un soclu de ascultare TCP de pe portul 7889, pe adresa IP de buclă inversă a 127.0.0.1 și STDOUT. Ampersand „ &
” rulează comanda în fundal, astfel încât să păstrăm accesul la linia de comandă.
socat tcp-listen:7889,bind=127.0.0.1 stdout &
Vom crea încă două conexiuni, astfel încât să avem o selecție mică de prize folosind protocoale diferite. Vom crea o conexiune UDP și o conexiune SCTP. Singura parte a comenzii care se schimbă este protocolul.
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &
RELATE: Care este diferența dintre TCP și UDP?
Folosind Kill
Desigur, putem folosi kill
pentru a încheia procesul, atâta timp cât știm care este ID-ul procesului. Pentru a găsi PID-ul, putem folosi comanda lsof
.
Pentru a enumera detaliile procesului de pe portul 7889 care utilizează protocolul TCP, folosim opțiunea -i
(adresă de internet), astfel.
lsof -i tcp:7889
PID-ul acestui proces este 3141 și îl putem folosi cu kill
:
sudo kill 3141
Ne putem economisi ceva efort dacă folosim țevi. Dacă trimitem ieșirea lui lsof
în awk
și îi spunem lui awk
să caute linii care conțin portul de care ne interesează — 7889 — și imprimăm al doilea câmp din acea linie, vom izola PID-ul.
lsof -i tcp:7889 | awk '/7889/{printează $2}'
Putem apoi trimite ieșirea de la awk
în comanda kill
folosind xargs
. Comanda xargs
preia intrarea sa pipetă și o transmite unei alte comenzi ca parametri de linie de comandă. Vom folosi xargs
cu comanda kill
.
lsof -i tcp:7889 | awk '/7889/{printează $2}' | xargs ucide
Nu primim niciun feedback vizual. În mod tipic Linux, nicio veste nu este o veste bună. Dacă doriți să verificați dacă procesul a fost încheiat, puteți utiliza lsof
încă o dată.
lsof -i tcp:7889
Pentru că lsof
nu raportează nimic, știm că nu există o astfel de conexiune.
Putem elimina un proces folosind protocolul UDP pur și simplu înlocuind „tcp” cu „udp” în comanda noastră anterioară.
lsof -i udp:7889 | awk '/7889/{printează $2}' | xargs ucide
Cu toate acestea, lsof
nu recunoaște protocolul SCTP.
lsof -i sctp:7889
Putem folosi comanda ss
pentru a face asta. Folosim opțiunea -S
(SCTP) pentru a căuta socluri SCTP, opțiunea -a
(toate) pentru a căuta toate tipurile de prize (ascultare, acceptare, conectată etc.) și opțiunea -p
(procese) pentru a enumera detaliile procesului folosind socket-ul.
ss -Sap
Putem analiza acea ieșire folosind grep
și awk
. De asemenea, l-am putea analiza folosind grep
și unele regexe PERL, dar acest mod este mult mai ușor de înțeles. Dacă ați folosi acest lucru de mai multe ori sau de două ori, probabil că ați face o funcție de alias sau shell din ea.
Vom canaliza ieșirea de la ss
în grep
și vom căuta numărul nostru de port, 7889. Vom trimite ieșirea de la grep
în awk
. În awk
, folosim opțiunea -F
(șir de separare) pentru a seta o virgulă „ ,
” ca delimitator de câmp. Căutăm un șir care conține „pid=” și imprimăm al doilea câmp delimitat prin virgulă din acel șir.
ss -Sap | grep "7889" | awk -F',' '/pid=/{printează $2}'
Asta ne-a dat șirul „pid=2859”.
Putem introduce din nou asta în awk
, setăm delimitatorul câmpului la semnul egal „ =
” și tipărim al doilea câmp din acel șir, care va fi textul din spatele semnului egal.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{printează $2}'
Acum am izolat ID-ul procesului. Putem folosi xargs
pentru a transmite PID-ul pentru a kill
ca parametru de linie de comandă.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{printează $2}' | xargs ucide
Asta oprește procesul care folosea soclul protocolului SCTP pe portul 7889.
Comanda cuptorului
Comanda fuser
simplifică foarte mult lucrurile. Dezavantajul este că funcționează doar cu socket-uri TCP și UDP. În plus, acestea sunt cele mai comune două tipuri de prize cu care va trebui să vă ocupați. Comanda fuser
a fost deja instalată pe computerele Ubuntu, Fedora și Manjaro pe care le-am verificat.
Tot ce trebuie să faceți este să utilizați opțiunea -k
(kill) și să furnizați portul și protocolul. Puteți fie să utilizați opțiunea -n
(spațiu de nume) și să furnizați protocolul și portul, fie să utilizați „formatul de comandă rapidă bară oblică” și să puneți numărul portului pe primul loc.
fuzor -n tcp 7889
cuptor 7889/udp
Numărul portului, protocolul și PID-ul procesului încheiat sunt tipărite în fereastra terminalului.
Încercați mai întâi cuptorul
Probabil că va fi instalat pe computerul la care lucrați, iar protocolul este probabil TCP sau UDP, așa că există șanse mari ca cea mai simplă modalitate să funcționeze pentru dvs.