O arquivo de programa existe em / usr / bin, mas não pode ser usado

15

Claramente, meu arquivo existe em /usr/bin

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

No entanto, quando tento chownreceber um erro

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

Outras tentativas para executá-lo também falham!

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

O que esta acontecendo aqui?

Jorik
fonte
O terceiro ponto também pode acontecer se '/ usr / bin /' não estiver no seu PATH. Você deveria ter testado /usr/bin/ngrokpara ser uma simetria completa do seguinte caso com sudo.
Patrick Mevzek

Respostas:

52

/usr/bin/ngrokserá um link simbólico que não aponta para lugar nenhum (ou melhor, para um arquivo inexistente). Verifique com ls -l.

Sven
fonte
13
O erro "não é possível desreferenciar" é a doação inoperante aqui. Você não "desreferencia" um arquivo normal, você o abre.
Kevin
1
Ou readlink -f /usr/bin/ngrokpara descobrir onde o link deve apontar.
Eric Duminil
ounamei -l /usr/bin/ngrok
hanshenrik 06/02
4

Dado o chownerro, a possibilidade mais provável é que seja um link simbólico, conforme respondido por Sven . No entanto, apenas para referência, caso alguém acabe aqui nos casos em que o arquivo existe e não é um link, mas gera um erro de comando não encontrado / arquivo não encontrado, mais uma possibilidade é que o executável esteja vinculado dinamicamente e por algum motivo, não é possível carregar bibliotecas:

  • biblioteca ausente (execute lddno binário para vê-las)
  • carregador ausente
  • apparmor negando acesso a uma biblioteca ou carregador
  • ...

Além disso, para um script, se o intérprete no shebang não puder ser executado por motivos semelhantes, você receberá o mesmo erro.

muru
fonte
Ainda mais confuso, isso pode realmente resultar em um enigmático "nenhum arquivo ou diretório".
Rackandboneman
0

Você também tem a opção de alterar a propriedade do próprio link simbólico com

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

se você não deseja (ou tem permissão) alterar a propriedade do arquivo de destino.

weasel5i2
fonte
2
Não sei ao certo como isso responde à pergunta - a pergunta é "O que está acontecendo aqui?" e o problema é que o arquivo de destino não existe. Isso não resolve o problema e não responde à pergunta.
Wizzwizz4
1
@ wizzwizz4 Suponho que você também possa interpretar a pergunta como "o arquivo existe (o link simbólico é um arquivo), por que me diz o contrário e por que não posso mudar sua propriedade?" Esta resposta cobre essa interpretação. Sven apenas assume (provavelmente corretamente) que o OP quer trabalhar com o arquivo de destino.
5118 JoL
1
@muru Isso não se aplica a um sistema Linux, que não possui permissões para links simbólicos. Na verdade, o Linux é um dos poucos (é o único?) De sistemas operacionais POSIX-familiares que não têm a capacidade de set symlink dono / grupo. Veja a chown(1)página de manual do Linux . As possíveis razões Linux faz isso são discutidos em unix.stackexchange.com/questions/33180/...
Andrew Henle
2
@AndrewHenle e como isso ajuda? A alteração de proprietário / grupo para um link simbólico não faz diferença aqui, pois as permissões aplicadas durante a execução sempre são do arquivo de destino. Portanto, você pode ter um link pertencente a quem quer que seja, mas alterar a propriedade nesse link não faz absolutamente nenhuma diferença para as permissões consideradas ao executá-lo.
Muni
1
@muru e como isso ajuda? Leia a pergunta que eu já vinculei, uma vez que pergunta especificamente: "No linux, é possível alterar o proprietário ou o proprietário do grupo de um link simbólico (link simbólico). Fiquei me perguntando por que alguém iria querer fazer isso, já que as permissões de um link simbólico não são usado ao acessar um arquivo através dele "
Andrew Henle