Символическая ссылка с разрешением на выполнение и... аргументами?

Символическая ссылка с разрешением на выполнение и... аргументами?

Я использую Linux Mint 20.1, который основан на Ubuntu 20.04. Мое ядро 5.4.0-60-generic​​. Все команды ниже выполняются вGNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

Я видел такое же поведение с некоторыми другими командами, но я буду использовать pingв качестве примера здесь. Давайте посмотрим, что произойдет, если я запущу следующие команды:

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:~$

Вывод разумный. Ошибка, очевидно, возникает во втором запуске, потому что на моем ноутбуке не настроена сеть IPv6. Но вывод доказывает это ping4и ping6это две разные вещи в моей системе. Но что это на самом деле? Они оба находятся в /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:~$

А что это за файлы на самом деле?

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:~$

Ого! Они оба являются символическими ссылками на один и тот же исполняемый файл /usr/bin/ping! Но как это возможно? Есть ли какой-то волшебный способ заставить символическую ссылку добавлять аргументы выполнения?

решение1

Оказывается, чтонет, это невозможнодля создания символической ссылки, которая влияет на аргументы командной строки выполнения. Но как это работает pingтогда? Видимо, pingиспользуется argv[0]для выяснения, какой файл мы используем для запуска утилиты. Его интересует только имя файла. Вот как вы можете легко это проверить:

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$

Здесь мы, очевидно, используем один и тот же исполняемый файл (без ссылки или чего-то подобного), и единственное отличие — его имя.

Связанный контент