Risposte:
Permesso negato
Per eseguire uno script, il file deve avere un bit di autorizzazione eseguibile impostato .
Per comprendere appieno le autorizzazioni dei file Linux , è possibile studiare la documentazione per il 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 capire l'output della corsa ...
ls -l foo.sh
... che elencherà le autorizzazioni 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 quell'ultimo gruppo di autorizzazioni come "mondo" o "altro")
Ecco un riepilogo di come risolvere l' errore di 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 il simbolo - indica che manca l'autorizzazione eseguibile
Il chmod
comando lo risolve. (Il gruppo e altri hanno solo il permesso di lettura impostato sul file, non possono scriverlo 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'uso dei risultati sudo in Comando non trovato
Quando esegui un comando usando sudo, lo stai effettivamente eseguendo come superutente o root.
Il motivo per cui l'utente root non trova il comando è probabile che la PATH
variabile di ambiente per root non includa la directory in cui foo.sh
si trova . Quindi il comando non è stato trovato.
La variabile di 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 che cosa è impostato per l'esecuzione
env | grep ^PATH
Ecco alcuni esempi di output che eseguono prima il env
comando sopra come utente normale e poi come utente root usando 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
Si noti che, sebbene simili, in questo caso le directory contenute nel PERCORSO non privilegiato (non corretto) e superutente non sono le stesse .
La directory in cui foo.sh
risiede non è presente nella variabile PATH dell'utente root, quindi il comando non ha trovato errore.
sudo
'il PATH
lo stesso come l'utente di?
Le altre soluzioni che ho visto qui finora si basano su alcune definizioni di sistema, ma in effetti è possibile sudo
utilizzare l'attuale PATH
(con il env
comando) e / o il resto dell'ambiente (con l' -E
opzione) semplicemente invocandolo correttamente :
sudo -E env "PATH=$PATH" <command> [arguments]
In effetti, si può ricavarne un alias:
alias mysudo='sudo -E env "PATH=$PATH"'
(È anche possibile nominare lo pseudonimo stesso sudo
, sostituendo l'originale sudo
.)
command not found
problema affrontato nella distribuzione Ubuntu. Grazie uomo.
./bashrc
per salvarlo tra le sessioni
Verifica percorso sicuro su sudo
[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Se $PATH
viene sovrascritto, utilizzare visudo
e modificare/etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Puoi anche creare un collegamento soft al tuo script in una delle directory ( /usr/local/bin
ad esempio) nel PERCORSO superutente. Sarà quindi disponibile per il sudo.
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
Dai un'occhiata a questa risposta per avere un'idea di quale directory inserire soft link.
Sembra che Linux dirà "comando non trovato" anche se dai esplicitamente il percorso al file.
[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
È un errore un po 'fuorviante, tuttavia è probabilmente tecnicamente corretto. Un file non è un comando fino al suo eseguibile e quindi non può essere trovato.
Ok questa è la mia soluzione: in ~ / .bash_aliases basta aggiungere quanto segue:
# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
export PATH=$PATH:/home/your_user/bin
fi
Ecco! Ora puoi eseguire i tuoi script con sudo o impostare come ROOT senza dover esportare ogni volta PATH = $ PATH: / home / tuo_utente / bin.
Nota che devo essere esplicito quando aggiungo il mio PERCORSO poiché HOME per superutente è / root
Prova chmod u+x foo.sh
invece chmod +x foo.sh
se hai problemi con le guide sopra. Questo ha funzionato per me quando le altre soluzioni no.