Enlace simbólico con permiso de ejecución y... ¿argumentos?

Enlace simbólico con permiso de ejecución y... ¿argumentos?

Estoy usando Linux Mint 20.1, que está basado en Ubuntu 20.04. Mi núcleo es 5.4.0-60-generic. Todos los comandos siguientes se ejecutan enGNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

He visto el mismo comportamiento con algunos otros comandos, pero lo usaré pingaquí como ejemplo. Veamos qué sucede si ejecuto los siguientes comandos:

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

El resultado es razonable. El error, obviamente, ocurre en la segunda ejecución, porque no tengo una red IPv6 configurada en mi computadora portátil. Pero el resultado lo demuestra ping4y ping6son dos cosas diferentes en mi sistema. ¿Pero qué son en realidad? Ambos están ubicados en /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:~$

¿Y qué son realmente estos archivos?

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

¡Guau! ¡Ambos son enlaces simbólicos al mismo ejecutable /usr/bin/ping! ¿Pero cómo es eso posible? ¿Existe alguna forma mágica de hacer que un enlace simbólico agregue argumentos de ejecución?

Respuesta1

Resulta queNo, no es posiblepara crear un enlace simbólico que afecta los argumentos de la línea de comando de ejecución. ¿Pero cómo funciona pingentonces? Aparentemente, pingse utiliza argv[0]para averiguar qué archivo estamos usando para ejecutar la utilidad. Sólo le preocupa el nombre del archivo. Así es como puedes comprobarlo fácilmente:

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$

Aquí obviamente estamos usando el mismo ejecutable (sin enlace o algo así), y la única diferencia es su nombre.

información relacionada