
Problema:
Executando um script conforme o sudo retorna
sudo: mount-remove-hiberfile: command not found
Informações:
Pasta de scripts: '/scripts' (todos os meus scripts personalizados são mantidos aqui)
Meu usuário: 'cybex'
cybex@cybex-W55xEU:~$ echo $PATH //e 'sudo echo $PATH' retornam o mesmo caminho
/home/cybex/.rbenv/plugins/ruby-build/bin:/home/cybex/.rbenv/shims:/home/cybex/.rbenv/bin:/home/cybex/.rbenv/plugins/ruby-build/bin:/home/cybex/.rbenv/shims:/home/cybex/.rbenv/bin:/home/cybex/bin:/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/scripts:/snap/bin
root@cybex-W55xEU:/home/cybex# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/scripts
O script 'mount-remove-hiberfile' não pode ser executado como um usuário normal, portanto eu precisaria executar o sudo mount-remove-hiberfile
.
Por que o sudo não detecta esse script?
nota: encontrei algumas perguntas sobre isso, mas nenhuma que respondeu à minha pergunta
ATUALIZAR
ls -l /scripts/
total 20
-rwxr-xr-x 1 root root 95 Apr 26 22:45 apt-manage
-rwxr-xr-x 1 root root 40 Apr 26 22:45 apt-update
-rwxr-xr-x 1 root root 769 Apr 28 20:47 create-desktop-file
-rwxr-xr-x 1 root root 370 May 16 22:45 extractgst.sh
-rwxr-xr-x 1 root root 1085 May 16 21:25 mount-remove-hiberfile
UPDATE (inclui uma pasta que inclui o comando, o erro e o diretório)
cybex@cybex-W55xEU:~$ pwd
/home/cybex
cybex@cybex-W55xEU:~$ ls -l /scripts/
total 52
-rwxr-xr-x 1 root root 95 Apr 26 22:45 apt-manage
-rwxr-xr-x 1 root root 2283 May 21 16:59 backup
-rwxr-xr-x 1 root root 109 May 21 16:59 check-port
-rwxr-xr-x 1 root root 2185 May 21 16:59 connected
-rwxr-xr-x 1 root root 769 Apr 28 20:47 create-desktop-file
-rwxr-xr-x 1 root root 164 May 21 16:59 download
-rwxr-xr-x 1 root root 370 May 16 22:45 extractgst.sh
-rwxr-xr-x 1 root root 5142 May 21 16:59 firewall
-rwxr-xr-x 1 root root 3881 May 21 16:59 firewall.save
-rwxr-xr-x 1 root root 1085 May 16 21:25 mount-remove-hiberfile
-rwxr-xr-x 1 root root 80 May 21 16:59 portquiz
-rwxr-xr-x 1 root root 84 May 21 16:59 space-used
drwxr-xr-x 1 root root 0 May 21 17:00 tmp
cybex@cybex-W55xEU:~$ sudo mount-remove-hiberfile
sudo: mount-remove-hiberfile: command not found
Responder1
A configuração do sudo por padrão redefinirá o caminho, independentemente de como o sudo é chamado. Aqui estão duas maneiras comuns de contornar isso: a primeira é a mudança permanente, a segunda é um argumento de linha de comando para o sudo (que você pode adicionar como um alias).
mudança permanente e global
Você /etc/sudoers
precisa modificar duas configurações:
sudo visudo
No arquivo sudoers, por padrão, há uma configuração chamada Default env_reset
que limpa as configurações ambientais do shell dos chamadores do sudo, mesmo que o sudo seja chamado com -E (manter ambiente).
No arquivo procure uma configuração chamada env_keep
. Isso determina quais variáveis ambientais podem ser passadas para o ambiente raiz criado com sudo. Normalmente há uma série de instruções env_keep="xxx" e env_keep+="xxx" no arquivo sudoers padrão. Por padrão, PATH não é um dos env vars com permissão de passagem.
Adicione PATH a uma dessas entradas ou comente a linha env_reset. Se você não tiver entradas env_keep, procure Defaults env_reset
e adicione uma nova env_keep = "PATH"
entrada depois dela.
Em segundo lugar, mesmo se você permitir que a variável PATH passe para o ambiente sudo, o caminho é limitado em sudoers pela configuração. Defaults secure_path='...'
Você pode comentar esta configuração ou adicionar o caminho em que seu script está à entrada.
Depois disso, sudo manterá a variável PATH e executará seu script.
solução alternativa de linha de comando
Para evitar a modificação do arquivo sudoers, você pode chamar sudo com esta sintaxe:
sudo env "PATH=$PATH" <script name>
Responder2
sudo não usa, por padrão, seu caminho e não executa o bashrc do root ou equivalente. Verhttps://askubuntu.com/q/128413para obter uma descrição completa.