Я пытаюсь запустить доверенные исполняемые файлы через скрипт.
Я скопировал двоичный исполняемый файл /bin/ip
в каталог с именем Tools
.
Я переименовал двоичный файл в eip
.
Я перешел к инструментам каталога и попытался запустить исполняемый файл eip
.
# ./eip addr list
Выдает ошибку: object "ip" is unknown , try "ip help."
Как с этим бороться?
Если Вы сохраняете свое локальное ip
исполняемый файл называют ip
, и не что-то дольше, можно избежать этой конкретной проблемы. При переименовании его некоторому другому, которого один или два символа долго называют, который будет также хорошо работать - проблема только происходит, если ее имя является тремя или больше символами в длине. Это может казаться странным... так продолжает читать для деталей...
Когда я выполняю копию /bin/ip
названный eip
, Я получаю сообщение об ошибке с p
(а не ip
) как неизвестный объект:
Object "p" is unknown, try "ip help".
Я задаюсь вопросом, происходит ли то же с Вами? (Могла там быть опечатка в Вашем вопросе?), Даже если не, я сильно подозреваю, поведение на Вашей машине связано с тем, что я вижу.
Я нашел это, когда я переименовал ip
к чему-либо дольше, чем два символа это дало мне ошибку "неизвестного объекта" об остальной части символов:
ek@Io:~$ cp /bin/ip abc
ek@Io:~$ ./abc
Object "c" is unknown, try "ip help".
ek@Io:~$ mv abc foobar
ek@Io:~$ ./foobar
Object "obar" is unknown, try "ip help".
ek@Io:~$ mv foobar 12345
ek@Io:~$ ./12345
Object "345" is unknown, try "ip help".
man ip
казалось, не объяснил это нечетное поведение, но я действительно замечал что первый аргумент неопции ip
технически назван объектом:
SYNOPSIS
ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |
netns | l2tp | tcp_metrics }
....
Таким образом, я пытался изменить символы, после первых двух, к этим именам объектов:
ek@Io:~$ mv 12345 12addr
ek@Io:~$ ./12addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
....
ek@Io:~$ mv 12addr XXrule
ek@Io:~$ ./XXrule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
ek@Io:~$ mv XXrule ipl2tp
ek@Io:~$ ./ipl2tp
Usage: ip l2tp add tunnel
remote ADDR local ADDR
....
Таким образом, это появляется ip
разработан для проверки имени, с которым это было вызвано, и если это содержит больше чем два символа, для интерпретации оставшихся символов как названия объекта, на который можно воздействовать. Вероятно, это то, так, чтобы копии и символьные ссылки ip
с именами как iplink
, ipaddr
, ipaddrlabel
, и т.д, может действовать как будто ip link
, ip addr
, ip addrlabel
, и так далее соответственно были выполнены.
Для проверения этого дважды я взял во взгляде на исходный код. iproute2
пакет обеспечивает /bin/ip
, таким образом, я искал это и нашел, что это было обеспечено исходным пакетом того же имени. (Это часто, но не всегда случай.) На вкладке кода, я выбрал ответвление и просмотрел код, войдя ip
каталог и исследование ip.c
.
Я заглянул main
функция, так как это - то, где большинство программ C начинает работать. Это - функция, которая начинается:
int main(int argc, char **argv)
{
Как много программ main
функции, это состоит в основном из обработки для параметров командной строки. Но ниже этого, существует код для обработки различных путей ip
может быть выполнен, и один из них для того, когда его имя является больше чем двумя символами долго:
if (strlen(basename) > 2)
return do_cmd(basename+2, argc, argv);
Круто! (Своего рода странное - но прохладный.)
Простое и лучшее решение состоит в том, чтобы, вероятно, только сохранить Вашу копию ip
названный ip
, или некоторый другой один - или два имени персонажа. Предоставление его то же имя как копия ip
в /bin
(и указал /sbin/ip
символьная ссылка), не должна быть проблема - Ваш сценарий уже обеспечивает путь к определенному исполняемому файлу, который Вы хотите выполнить.
Однако Вы могли бы хотеть, чтобы это было возможно для пользователей вызвать Вашу копию ip
с командой как eip
- например, таким образом, у них может быть отдельная команда, чтобы вставить каталоги в их PATH
. Это обычно достигается с символьной ссылкой, но это перестанет работать здесь по той же причине, называя копию eip
отказавший во-первых:
ek@Io:~$ ln -s /bin/ip eip
ek@Io:~$ ./eip
Object "p" is unknown, try "ip help".
(Я сделал символьную ссылку на свою систему /bin/ip
, но то же происходит когда Вы символьная ссылка на отдельную копию.)
Решение состоит в том, чтобы записать сценарий обертки (названный eip
, или независимо от того, что Вам нравится), который вызывает ip
, проведение его аргументов. Файл сценария может быть похожим на это:
#!/bin/sh
/path/to/your/ip "$@"