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
.)