Symlink mit Ausführungsberechtigung und ... Argumenten?

Symlink mit Ausführungsberechtigung und ... Argumenten?

Ich verwende Linux Mint 20.1, das auf Ubuntu 20.04 basiert. Mein Kernel ist 5.4.0-60-generic. Alle folgenden Befehle werden ausgeführt inGNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

Ich habe dasselbe Verhalten bei einigen anderen Befehlen gesehen, aber ich werde es pinghier als Beispiel verwenden. Mal sehen, was passiert, wenn ich die folgenden Befehle ausführe:

nikolay@KoLin:~$ ping4 -c1 google.com
PING google.com (108.177.14.139) 56(84) bytes of data.
64 bytes from lt-in-f139.1e100.net (108.177.14.139): icmp_seq=1 ttl=107 time=41.3 ms

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 41.301/41.301/41.301/0.000 ms
nikolay@KoLin:~$ ping6 -c1 google.com
ping6: connect: Network is unreachable
nikolay@KoLin:~$

Die Ausgabe ist verständlich. Der Fehler tritt offensichtlich beim zweiten Durchlauf auf, da ich auf meinem Laptop kein IPv6-Netzwerk konfiguriert habe. Aber die Ausgabe beweist das ping4und ping6es handelt sich um zwei verschiedene Dinge in meinem System. Aber was sind sie eigentlich? Sie befinden sich beide in /usr/bin:

nikolay@KoLin:~$ whereis ping{4,6}
ping4: /usr/bin/ping4 /usr/share/man/man8/ping4.8.gz
ping6: /usr/bin/ping6 /usr/share/man/man8/ping6.8.gz
nikolay@KoLin:~$

Und was sind diese Dateien eigentlich?

nikolay@KoLin:~$ ls -l /usr/bin/ping*
-rwxr-xr-x 1 root root 72776 Jan 31  2020 /usr/bin/ping
lrwxrwxrwx 1 root root     4 Jan 11 21:00 /usr/bin/ping4 -> ping
lrwxrwxrwx 1 root root     4 Jan 11 21:00 /usr/bin/ping6 -> ping
nikolay@KoLin:~$

Wow! Sie sind beide symbolische Links zur gleichen ausführbaren Datei /usr/bin/ping! Aber wie ist das möglich? Gibt es eine magische Möglichkeit, symbolischen Links Ausführungsargumente hinzuzufügen?

Antwort1

Es stellt sich heraus, dassnein, das ist nicht möglichum einen symbolischen Link zu erstellen, der die Ausführungsbefehlszeilenargumente beeinflusst. Aber wie funktioniert das pingdann? Anscheinend pingwird es verwendet argv[0], um herauszufinden, welche Datei wir zum Ausführen des Dienstprogramms verwenden. Es geht nur um den Dateinamen. So können Sie das ganz einfach überprüfen:

nikolay@KoLin:~/Desktop$ cp /usr/bin/ping ./ping4
nikolay@KoLin:~/Desktop$ ./ping4 -c1 google.com
PING google.com (64.233.164.113) 56(84) bytes of data.
64 bytes from lf-in-f113.1e100.net (64.233.164.113): icmp_seq=1 ttl=107 time=19.2 ms

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 19.152/19.152/19.152/0.000 ms
nikolay@KoLin:~/Desktop$ mv ping4 ping6
nikolay@KoLin:~/Desktop$ ./ping6 -c1 google.com
./ping6: connect: Network is unreachable
nikolay@KoLin:~/Desktop$

Hier verwenden wir offensichtlich dieselbe ausführbare Datei (ohne Link oder ähnliches), der einzige Unterschied ist der Name.

verwandte Informationen