Respostas:
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 corrente PATH
(com o env
comando) e / ou o resto do ambiente (com a -E
opção) apenas invocando-a corretamente :
sudo -E env "PATH=$PATH" <command> [arguments]
De fato, pode-se criar um pseudônimo:
alias mysudo='sudo -E env "PATH=$PATH"'
(Também é possível nomear o próprio alias sudo
, substituindo o original sudo
.)
command not found
problema enfrentado na distribuição do Ubuntu. Obrigado cara.
./bashrc
para salvá-lo entre as sessões
Verificar se há secure_path no sudo
[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Se $PATH
estiver sendo substituído, use visudo
e edite/etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
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.
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
Dê uma olhada nesta resposta para ter uma idéia de qual diretório colocar o link virtual.
Parece que o linux dirá "comando não encontrado", mesmo que você forneça explicitamente o caminho para o arquivo.
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0
É 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.
Ok, esta é a minha solução: em ~ / .bash_aliases basta adicionar o seguinte:
# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
export PATH=$PATH:/home/your_user/bin
fi
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
Tente em chmod u+x foo.sh
vez de chmod +x foo.sh
se tiver problemas com os guias acima. Isso funcionou para mim quando as outras soluções não.