Controlla secure_path su sudo
[[email protected] ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Se $PATH
è stato sovrascritto usa visudo
e modifica /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Autorizzazione negata
Per eseguire uno script, il file deve avere un bit di autorizzazione eseguibile impostato .
Per comprendere appieno i permessi dei file di Linux puoi studiare la documentazione per chmod
comando. chmod, un'abbreviazione di change mode , è il comando utilizzato per modificare le impostazioni di autorizzazione di un file.
Per leggere la documentazione di chmod per il tuo sistema locale, esegui man chmod
o info chmod
dalla riga di comando. Una volta letto e compreso, dovresti essere in grado di comprendere l'output di running ...
ls -l foo.sh
... che elencherà i permessi READ, WRITE ed EXECUTE per il proprietario del file, il proprietario del gruppo e tutti gli altri che non sono il proprietario del file o un membro del gruppo a cui appartiene il file (a volte si fa riferimento a quest'ultimo gruppo di permessi come "mondo" o "altro")
Ecco un riepilogo di come risolvere l'errore Autorizzazione negata nel tuo 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
Il proprietario ha accesso in lettura e scrittura rw ma - indica che manca il permesso di esecuzione
Il chmod
comando lo risolve. (Gruppo e altro hanno solo i permessi di lettura impostati sul file, non possono scriverci o eseguirlo)
$ 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
^ ^ ^
foo.sh è ora eseguibile per quanto riguarda Linux.
L'utilizzo di sudo restituisce Comando non trovato
Quando esegui un comando utilizzando sudo lo stai effettivamente eseguendo come superutente o root.
Il motivo per cui l'utente root non trova il tuo comando è probabile che il file PATH
variabile di ambiente per root non include la directory in cui foo.sh
si trova . Quindi il comando non è stato trovato.
La variabile d'ambiente PATH contiene un elenco di directory in cui vengono cercati i comandi. Ogni utente imposta la propria variabile PATH in base alle proprie esigenze. Per vedere cosa è impostato per eseguire
env | grep ^PATH
Ecco alcuni esempi di output dell'esecuzione del precedente env
comando prima come utente ordinario e poi come utente root utilizzando sudo
[email protected]:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[email protected]:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Si noti che, sebbene simili, in questo caso le directory contenute nel PATH l'utente non privilegiato (rkielty) e il super utente non sono la stessa cosa .
La directory in cui foo.sh
resides non è presente nella variabile PATH dell'utente root, da cui il comando non trovato errore.
Le altre soluzioni che ho visto finora si basano su alcune definizioni di sistema, ma in realtà è possibile avere sudo
usa l'attuale PATH
(con il env
comando) e/o il resto dell'ambiente (con il comando -E
option) semplicemente invocandolo correttamente:
sudo -E env "PATH=$PATH" <command> [arguments]
Infatti, se ne può ricavare un alias:
alias mysudo='sudo -E env "PATH=$PATH"'
(È anche possibile denominare l'alias stesso sudo
, sostituendo l'originale sudo
.)