Permissão negada
Para executar um script, o arquivo deve ter um bit de permissão executável definido .
Para entender completamente as permissões de arquivo do Linux, você pode estudar a documentação do chmod
comando. chmod , uma abreviação do modo de mudança , é o comando usado para alterar as configurações de permissão de um arquivo.
Para ler a documentação do chmod para o seu sistema local, execute man chmod
ou info chmod
na linha de comandos. Depois de ler e entender, você deve entender a saída da execução ...
ls -l foo.sh
... que listará as permissões READ, WRITE e EXECUTE para o proprietário do arquivo, o proprietário do grupo e todos os outros que não são o proprietário do arquivo ou um membro do grupo ao qual o arquivo pertence (esse último grupo de permissões às vezes é referido como "mundo" ou "outro")
Aqui está um resumo de como solucionar o erro de permissão negada no seu caso.
$ ls -l foo.sh # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh
^^^
^^^ | ^^^ ^^^^^^^ ^^^^^
| | | | |
Owner| World | |
| | Name of
Group | Group
Name of
Owner
O proprietário possui acesso de leitura e gravação rw, mas o - indica que a permissão do executável está ausente
O chmod
comando corrige isso. (O grupo e outros apenas têm permissão de leitura definida no arquivo, eles não podem gravar ou executá-lo)
$ chmod +x foo.sh # The owner can set the executable permission on foo.sh
$ ls -l foo.sh # Now we see an x after the rw
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
^ ^ ^
O foo.sh agora é executável no que diz respeito ao Linux.
Usando resultados do sudo no comando não encontrado
Quando você executa um comando usando o sudo, está efetivamente executando-o como superusuário ou raiz.
O motivo pelo qual o usuário root não está encontrando seu comando é provável que a PATH
variável de ambiente para root não inclua o diretório em que foo.sh
está localizado . Portanto, o comando não foi encontrado.
A variável de ambiente PATH contém uma lista de diretórios que são procurados por comandos. Cada usuário define sua própria variável PATH de acordo com suas necessidades. Para ver o que está definido para executar
env | grep ^PATH
Aqui está um exemplo de saída da execução do env
comando acima primeiro como um usuário comum e depois como usuário root usando o sudo
rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Observe que, embora semelhantes, neste caso, os diretórios contidos no PATH, o usuário não privilegiado (rkielty) e o superusuário não são os mesmos .
O diretório em que foo.sh
reside não está presente na variável PATH do usuário raiz, portanto, o comando não encontrou erro.
sudo
éPATH
o mesmo que o utilizador?As outras soluções que eu vi aqui até agora são baseadas em algumas definições de sistema, mas é possível
sudo
usar a correntePATH
(com oenv
comando) e / ou o resto do ambiente (com a-E
opção) apenas invocando-a corretamente :De fato, pode-se criar um pseudônimo:
(Também é possível nomear o próprio alias
sudo
, substituindo o originalsudo
.)fonte
command not found
problema enfrentado na distribuição do Ubuntu. Obrigado cara../bashrc
para salvá-lo entre as sessõesVerificar se há secure_path no sudo
Se
$PATH
estiver sendo substituído, usevisudo
e edite/etc/sudoers
fonte
chmod +x foo.sh
#!/bin/sh
ou algo parecido.sudo pwd
fonte
Você também pode criar um link flexível para o seu script em um dos diretórios (
/usr/local/bin
por exemplo) no PATH do superusuário. Ele estará disponível para o sudo.Dê uma olhada nesta resposta para ter uma idéia de qual diretório colocar o link virtual.
fonte
Parece que o linux dirá "comando não encontrado", mesmo que você forneça explicitamente o caminho para o arquivo.
É um erro um tanto enganador, mas provavelmente é tecnicamente correto. Um arquivo não é um comando até seu executável e, portanto, não pode ser encontrado.
fonte
Ok, esta é a minha solução: em ~ / .bash_aliases basta adicionar o seguinte:
Voila! Agora você pode executar seus próprios scripts com sudo ou definir como ROOT sem precisar exportar PATH = $ PATH: / home / your_user / bin toda vez.
Observe que eu preciso ser explícito ao adicionar meu PATH, pois HOME para superusuário é / root
fonte
Tente em
chmod u+x foo.sh
vez dechmod +x foo.sh
se tiver problemas com os guias acima. Isso funcionou para mim quando as outras soluções não.fonte
Existem excelentes respostas acima. Se, depois de experimentá-los, você ainda
command not found
tentar novamente com todo o caminho do arquivo:fonte