Ошибка: объект & ldquo; ip & rdquo; неизвестно, попробуйте & ldquo; ip help & rdquo;

Я пытаюсь запустить доверенные исполняемые файлы через скрипт.

Я скопировал двоичный исполняемый файл /bin/ip в каталог с именем Tools.

Я переименовал двоичный файл в eip.

Я перешел к инструментам каталога и попытался запустить исполняемый файл eip.

# ./eip addr list

Выдает ошибку: object "ip" is unknown , try "ip help."

Как с этим бороться?

1
задан 3 April 2015 в 15:20

1 ответ

Если Вы сохраняете свое локальное 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 "$@"
1
ответ дан 3 April 2015 в 15:20

Другие вопросы по тегам:

Похожие вопросы: