Файл программы существует в / usr / bin, но не может быть использован

15

Очевидно, мой файл существует в /usr/bin

$ ls /usr/bin/ngrok
/usr/bin/ngrok

Однако, когда я пытаюсь chownэто сделать, я получаю сообщение об ошибке.

$ sudo chown my_user:users /usr/bin/ngrok
chown: cannot dereference '/usr/bin/ngrok': No such file or directory

Дальнейшие попытки запустить его тоже не удаются!

$ ngrok
bash: ngrok: command not found
$ sudo /usr/bin/ngrok
sudo: /usr/bin/ngrok: command not found

Что здесь происходит?

Jorik
источник
Третий момент может произойти, если '/ usr / bin /' отсутствует в вашем PATH. Вы должны быть протестированы с /usr/bin/ngrokбыть полной симметрией следующего случая с sudo.
Патрик Мевзек

Ответы:

52

/usr/bin/ngrokбудет символическая ссылка, которая нигде не указывает (или, скорее, на несуществующий файл). Проверьте с ls -l.

Свен
источник
13
Ошибка «не может разыменовать» - это мертвая распродажа. Вы не «разыменовываете» нормальный файл, вы открываете его.
Кевин
1
Или readlink -f /usr/bin/ngrokнайти ссылку, на которую должна указывать ссылка.
Эрик Думинил
илиnamei -l /usr/bin/ngrok
hanshenrik
4

Учитывая chownошибку, наиболее вероятно, что это символическая ссылка, как ответил Свен . Однако, просто для справки, в случае, если кто-то окажется здесь для случаев, когда файл существует и не является ссылкой, но выдает ошибку «команда не найдена / файл не найден», еще одна возможность состоит в том, что исполняемый файл динамически связан и по какой-то причине он не может загружать библиотеки:

  • отсутствует библиотека (запустите lddдвоичный файл, чтобы увидеть их)
  • отсутствует загрузчик
  • apparmor отказывает в доступе к библиотеке или загрузчику
  • ...

Кроме того, для сценария, если интерпретатор в shebang не может быть выполнен по аналогичным причинам, вы получите ту же ошибку.

Мур
источник
Еще более запутанно, это действительно может привести к загадочному «нет такого файла или каталога».
rackandboneman
0

У вас также есть возможность изменить владельца самой символической ссылки с помощью

chown -h my_user:users /usr/bin/ngrok

если вы не хотите (или имеете разрешение) сменить владельца целевого файла.

weasel5i2
источник
2
Я не уверен, как это отвечает на вопрос - вопрос «что здесь происходит?» и проблема в том, что целевой файл не существует. Это не решает проблему и не отвечает на вопрос.
wizzwizz4
1
@ wizzwizz4 Я полагаю, вы также можете интерпретировать вопрос как «файл существует (символическая ссылка - это файл), почему он говорит мне об обратном и почему я не могу изменить его владельца?» Этот ответ охватывает эту интерпретацию. Свен просто предполагает (вероятно, правильно), что ОП хочет работать с целевым файлом.
JoL
1
@muru Это не применимо в системе Linux, которая не имеет разрешений для символических ссылок. На самом деле, Linux является одной из немногих (является единственной?) ОС семейства POSIX, которая имеет возможность устанавливать владельца / группу символических ссылок. Смотрите chown(1)страницу руководства Linux . Возможные причины, по которым Linux это делает, обсуждаются по адресу unix.stackexchange.com/questions/33180/…
Эндрю Хенле,
2
@AndrewHenle и как это поможет? Изменение владельца / группы для символической ссылки здесь не имеет значения, так как разрешения, применяемые при выполнении, всегда относятся к целевому файлу. Таким образом, вы можете иметь ссылку, которой владеет кто угодно, но смена владельца этой ссылки не имеет абсолютно никакого значения для разрешений, учитываемых при ее выполнении.
Муру
1
@muru и как это поможет? Прочитайте вопрос, на который я уже ссылался, поскольку он конкретно спрашивает: «В Linux можно изменить владельца или владельца группы символической ссылки (символическая ссылка). Мне было интересно, почему кто-то хотел бы сделать это, так как разрешения символической ссылки не являются используется при доступе к файлу через него "
Эндрю Хенле