Comando non trovato quando si utilizza sudo


146

Ho uno script chiamato foo.shnella mia cartella home.

Quando accedo a questa cartella e accedo ./foo.sh, ottengo

-bash: ./foo.sh: Permission denied.

Quando uso sudo ./foo.sh, ottengo

sudo: foo.sh: command not found.

Perché succede e come posso ripararlo?

Risposte:


151

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 chmodcomando. 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 chmodo info chmoddalla 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 chmodcomando 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 PATHvariabile di ambiente per root non includa la directory in cui foo.shsi 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 envcomando 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.shrisiede non è presente nella variabile PATH dell'utente root, quindi il comando non ha trovato errore.


1
@Nakilon se lo metti in una domanda con tutti i dettagli, dovrei essere in grado di risolverlo ulteriormente per te. Il problema è probabilmente quale shell (la tua prima shell dei comandi o la shell lanciata da sudo) ha valutato $ PWD
Rob Kielty,

6
@ Rob: così come si fa a fare sudo'il PATHlo stesso come l'utente di?
Tom

1
@Rob: nel frattempo ho trovato un modo (vedi la mia risposta di seguito).
Tom

1
Mi piace il modo in cui hai spiegato! Grazie :)
Kasparov92,

1
@Tom puoi cambiare il percorso sicuro in / etc / sudoers
DennisLi

98

Le altre soluzioni che ho visto qui finora si basano su alcune definizioni di sistema, ma in effetti è possibile sudoutilizzare l'attuale PATH(con il envcomando) e / o il resto dell'ambiente (con l' -Eopzione) 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.)


3
Mi piace questa soluzione, Tom, perché stai lavorando consapevolmente con una diversa chiamata sudo. È importante essere consapevoli di quale variabile PATH è in uso in qualsiasi momento in qualsiasi modo (e ce ne sono molti) è impostata.
Rob Kielty,

4
Credo che questa sia la soluzione corretta e più standardizzata per il command not foundproblema affrontato nella distribuzione Ubuntu. Grazie uomo.
Omar Tariq,

puoi aggiungere l'alias al tuo ./bashrcper salvarlo tra le sessioni
George

19

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 $PATHviene sovrascritto, utilizzare visudoe modificare/etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

Grazie! Ciò ha aiutato a risolvere un mistero di sudo che non era in grado di eseguire comandi.
Evgeny Goldin,

7
  1. Verifica di disporre dell'autorizzazione di esecuzione per lo script. vale a direchmod +x foo.sh
  2. Verifica che la prima riga di quello script sia #!/bin/sho in parte.
  3. Per sudo sei nella directory sbagliata. controllare consudo pwd

5

Puoi anche creare un collegamento soft al tuo script in una delle directory ( /usr/local/binad 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.


2

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.


1

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



1

Ci sono risposte eccellenti sopra. Se, dopo averli provati, si continua a command not foundriprovare con l'intero percorso del file:

sudo /home/user/path/to/foo.sh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.