it-swarm.com.de

Wenn Sie eine einzelne ausführbare Datei mit Sudo ausführen, werden der Prozessliste zwei Prozesse hinzugefügt

Ich habe ein Programm geschrieben, das die Pakete von der Netzwerkschnittstelle erfasst. Wenn der Netzwerkadapter abgehört wird, muss er mit Sudo ausgeführt werden. Die Frage ist, warum, wenn ich es starte, es der Prozessliste zwei Prozesse hinzufügt?

Hinweis: lwdpi ist mein Programm

Vor der Ausführung:

[email protected]:~/Desktop/lwdpi_cpp$ ps ax | grep lwdpi
 4665 pts/21   S+     0:00 grep --color=auto lwdpi
[email protected]:~/Desktop/lwdpi_cpp$ 

Execution:
[email protected]:~/Desktop/lwdpi_cpp$ Sudo ./lwdpi -i enp5s0
2016:10:26 11:07:29 ::   192.168.1.25   9918  -->     239.1.99.222   9918    UDP
2016:10:26 11:07:29 ::  192.168.1.111   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:30 ::  192.168.1.153   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:30 ::  192.168.1.154   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:30 ::   192.168.1.88   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:30 ::   192.168.1.60   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:37 ::  192.168.1.131  17500  -->  255.255.255.255  17500    UDP
2016:10:26 11:07:37 ::  192.168.1.131  17500  -->    192.168.1.255  17500    UDP
2016:10:26 11:07:37 ::  192.168.1.169   5546  -->     192.168.1.38     53    UDP
2016:10:26 11:07:37 ::  192.168.1.169  30955  -->     192.168.1.38     53    UDP
2016:10:26 11:07:38 ::  192.168.1.110  17500  -->  255.255.255.255  17500    UDP
2016:10:26 11:07:38 ::  192.168.1.110  17500  -->    192.168.1.255  17500    UDP
2016:10:26 11:07:42 ::  192.168.1.169  57189  -->     192.168.1.38     53    UDP
2016:10:26 11:07:42 ::  192.168.1.169  26072  -->     192.168.1.38     53    UDP
2016:10:26 11:07:42 ::  192.168.1.169  41674  -->   199.30.228.113     80    TCP
2016:10:26 11:07:43 ::  192.168.1.169  41676  -->   199.30.228.113     80    TCP
2016:10:26 11:07:43 ::  192.168.1.169   7190  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  30029  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  41678  -->   199.30.228.113     80    TCP
2016:10:26 11:07:43 ::  192.168.1.169  64975  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  12625  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  29973  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  53300  -->     216.58.211.4    443    TCP
2016:10:26 11:07:43 ::  192.168.1.169  41682  -->   199.30.228.113     80    TCP
.
.
.

Prozessliste während der Ausführung:

[email protected]:~/Desktop/lwdpi_cpp$ ps ax | grep lwdpi
 4685 pts/22   S+     0:00 Sudo ./lwdpi -i enp5s0
 4686 pts/22   S+     0:00 ./lwdpi -i enp5s0
 4691 pts/21   S+     0:00 grep --color=auto lwdpi
[email protected]:~/Desktop/lwdpi_cpp$ 

Wie Sie oben sehen, werden nach der Ausführung Prozesse mit PID = 4685 und PID = 4686 zur Prozessliste hinzugefügt. Warum? Ich habe mein Programm darin nicht aufgerufen!

6
Abraham

Wenn Sie das tun:

Sudo ./lwdpi -i enp5s0
  • Sudo ist der übergeordnete Prozess, es fork(2) ist ein untergeordneter Prozess, der dann execve(2) mit ./lwdpi als ausführbarem Namen ausführt

  • lwdpi ist also der untergeordnete Prozess von Sudo

Wie Sie sehen, führt dies zu zwei Prozessen: Der eine ist Sudo und der andere ist lwdpi.

Am besten überprüfen Sie die Details, indem Sie auch die PPID (übergeordnete Prozess-ID) überprüfen:

ps -eo pid,ppid,args | grep '[l]wdpi'

sie werden sehen, dass das übergeordnete Element von lwdpiSudo selbst ist.


Hier ist das Prozessmodell von Sudo aus man Sudo:

Wenn Sudo einen Befehl ausführt, ruft es fork (2) auf, richtet die Ausführungsumgebung wie oben beschrieben ein und ruft den Systemaufruf execve im untergeordneten Prozess auf. Der Haupt-Sudo-Prozess wartet, bis der Befehl abgeschlossen ist, übergibt dann den Beendigungsstatus des Befehls an die Schließfunktion der Sicherheitsrichtlinie und wird beendet.

Wenn ein E/A-Protokollierungs-Plugin konfiguriert ist oder wenn die Sicherheitsrichtlinie dies ausdrücklich anfordert, wird ein neues Pseudoterminal ("pty") erstellt und ein zweiter Sudo-Prozess verwendet, um Auftragskontrollsignale zwischen dem vorhandenen und dem neuen Pty des Benutzers weiterzuleiten pty, in der der Befehl ausgeführt wird. Dieser zusätzliche Prozess ermöglicht es beispielsweise, den Befehl anzuhalten und fortzusetzen. Ohne diesen Befehl würde POSIX eine „verwaiste Prozessgruppe“ darstellen und keine Jobsteuersignale empfangen.

In einem speziellen Fall führt Sudo den Befehl direkt aus, anstatt zuerst fork (2) aufzurufen, wenn das Richtlinien-Plugin keine Close-Funktion definiert und keine Pty erforderlich ist. Das sudoers-Richtlinien-Plugin definiert eine Schließfunktion nur, wenn die E/A-Protokollierung aktiviert ist, eine Pty erforderlich ist oder die Optionen pam_session oder pam_setcred aktiviert sind. Beachten Sie, dass pam_session und pam_setcred auf Systemen, die PAM verwenden, standardmäßig aktiviert sind.

10
heemayl

Dies geschieht, wenn Sie einen Prozess mit Sudo starten. Ein Prozess ist das Programm Sudo und der andere ist das Programm, das mit Sudo gestartet wurde, einem untergeordneten Prozess des ersten. Das Programm Sudo wird nur beendet, wenn der Prozess, für den es ausgeführt wird (sein untergeordnetes Programm), beendet wird. Hier ist ein Auszug aus meinem pstree beim Ausführen von Sudo apt update

    ├─mate-terminal─┬
                    ├─bash───Sudo───apt
               child of bash--^      ^--child of Sudo
6
Zanna