具有执行权限和......参数的符号链接?

具有执行权限和......参数的符号链接?

我使用的是 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 网络。但输出证明ping4ping6在我的系统中是两个不同的东西。但它们实际上是什么?它们都位于/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

事实证明不,不可能创建一个影响执行命令行参数的符号链接。但是它如何与pingthen 一起工作呢?显然,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$

这里我们显然使用的是相同的可执行文件(没有链接或类似的东西),唯一的区别是它的名称。

相关内容