GNU/Linux >> Znalost Linux >  >> Linux

příkaz nebyl nalezen při použití sudo

Zkontrolujte secure_path na sudo

[[email protected] ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

Pokud $PATH je přepsán pomocí visudo a upravit /etc/sudoers

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

Oprávnění odepřeno

Aby bylo možné spustit skript, musí mít soubor nastavený bit spustitelného oprávnění .

Chcete-li plně porozumět oprávněním souborů Linux, můžete si prostudovat dokumentaci k chmod příkaz. chmod, což je zkratka pro režim změny , je příkaz, který se používá ke změně nastavení oprávnění souboru.

Chcete-li si přečíst dokumentaci chmod pro váš lokální systém, spusťte man chmod nebo info chmod z příkazového řádku. Po přečtení a pochopení byste měli být schopni porozumět výstupu běhu ...

ls -l foo.sh

... který bude obsahovat seznam oprávnění ČÍT, ZAPISOVAT a PROVÁDĚT pro vlastníka souboru, vlastníka skupiny a všechny ostatní, kteří nejsou vlastníkem souboru nebo členem skupiny, do které soubor patří (tato poslední skupina oprávnění je někdy označována jako jako „svět“ nebo „jiný“)

Zde je shrnutí postupu při odstraňování chyby Povolení odepřeno ve vašem případě.

$ 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 

Vlastník má přístup pro čtení a zápis rw, ale znak - znamená, že chybí oprávnění ke spustitelnému souboru

chmod příkaz to řeší. (Skupina a ostatní mají u souboru nastaveno pouze oprávnění ke čtení, nemohou do něj zapisovat ani jej spouštět)

$ 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 je nyní spustitelný, pokud jde o Linux.

Použití sudo vede k příkazu nenalezen

Když spustíte příkaz pomocí sudo efektivně jej spouštíte jako superuživatel nebo root.

Důvod, proč uživatel root nenachází váš příkaz, je pravděpodobně PATH proměnná prostředí pro root nezahrnuje adresář, kde je foo.sh se nachází . Příkaz tedy nebyl nalezen.

Proměnná prostředí PATH obsahuje seznam adresářů, ve kterých se hledají příkazy. Každý uživatel si nastaví svou vlastní proměnnou PATH podle svých potřeb. Chcete-li vidět, co je nastaveno na spuštění

env | grep ^PATH

Zde je ukázkový výstup spuštění výše uvedeného env příkaz nejprve jako běžný uživatel a poté jako uživatel root pomocí 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

Všimněte si, že ačkoli jsou podobné, v tomto případě adresáře obsažené v PATH neprivilegovaného uživatele (rkielty) a superuživatele nejsou stejné .

Adresář, kde je foo.sh resides není přítomen v proměnné PATH uživatele root, proto příkaz nenalezen chyba.


Ostatní řešení, která jsem zde zatím viděl, jsou založena na některých definicích systému, ale ve skutečnosti je možné mít sudo použijte aktuální PATH (s env příkaz) a/nebo zbytek prostředí (s -E možnost) pouze jejím správným vyvoláním:

sudo -E env "PATH=$PATH" <command> [arguments]

Ve skutečnosti z toho lze vytvořit alias:

alias mysudo='sudo -E env "PATH=$PATH"'

(Je také možné pojmenovat samotný alias sudo , nahrazující původní sudo .)


Linux
  1. Sudo:Nocorrect:Příkaz nenalezen?

  2. Alternativní příkaz aktualizace nebyl nalezen?

  3. Sudo:Příkaz nenalezen?

  1. id:příkaz nenalezen

  2. w:příkaz nenalezen

  3. df:příkaz nenalezen

  1. du:příkaz nenalezen

  2. sudo:npm:příkaz nenalezen

  3. linuxový příkaz nalezen, ale nebyl nalezen při použití sudo