Proč nefunguje 'sudo cd / var / named'? [duplikát]

149

Chcicd do/var/named, ale dává mi chybu s odmítnutím svolení a když chci použítsudo, tak to nemám povoleno. Jaký je technický důvod pro to, a je možné to udělat jinak?

    
dané Hojat Taheri 06.05.2013 21:02

5 odpovědí

208

Důvod, proč to nemůžete udělat, je jednoduchý a dvakrát

1

cd není program, ale vestavěný příkaz asudo se vztahuje pouze na programy.

sudo foo znamená spustit program foo jako root

sudo cd /path vrací

sudo: cd: command not found

protožecd není programem.

2

Pokud by bylo možné použít sudo nacd do chráněného adresáře a poté spustit příkazsudo cd /var/named, byl byste v tomto adresáři jako běžný uživatel, být v tomto adresáři.

To není možné.

Řešení:

Můžete použítsudo -i, abyste se povýšili na super uživatele. Například:

sudo -i
cd /var/named 

Nyní jste přihlášeni jako root a můžete použít libovolné příkazy, které chcete. Po dokončení zadáte typexit a vrátíte se k přihlášení jako běžný uživatel.

    
odpověděl Warren Hill 06.05.2013 21:30
25

Protožecd není spustitelný soubor, je to shell funkce pro změnu adresáře.

Pokud spustíte:

type cd

Vaše heslo dostane:

  

cd je funkce shellu

Můžete použítsudo -s k otevření interaktivního shellu a pakcd do požadovaného adresáře:

sudo -s
cd /var/named

Chcete-li se vrátit zpět do normálního prostředí, stiskněte Ctrl + D .

    
odpověděl Basharat Sialvi 06.05.2013 21:29
16

Je také třeba pamatovat na to, že stavcd jako vestavěný shell nebo externí binární, funguje tak, že vytvoří nový proces pro spuštění zadaného příkazu .

Proč je to důležité? Protože se základní tok sudo stává něco podobného:

  1. Skořápka spouští podproces pro spuštění sudo s danými parametry
  2. sudo autentizuje uživatele a potvrzuje jejich právo spouštět zadaný příkaz
  3. sudo spouští podproces pro spuštění zadaného příkazu
  4. sudo čeká na spuštění podprocesu v kroku 3 pro ukončení
  5. ukončí sudo a vrátí se do shellu
  6. V kroku 1 ukončí spuštěný podproces a vrátí uživatele do příkazu shell

( může být technicky mírně nesprávné, existuje systémové volání, které skutečně nahrazuje běžící proces s novým C knihovnaexecve()). Pro účely tohoto vysvětlení jsou však tyto dva rovnocenné.)

Toto je důležité, když se domníváte, že aktuální pracovní adresář je vlastností každého procesu a je zděděn, ale není podporován . Takže pokud proces A vyvolá nový proces B, proces B začíná stejným pracovním adresářem, ve kterém byl proces A. (Proto je něco tak běžné jakols ./, co očekáváte.) Ale pokud se změní proces B jeho pracovní adresář, pak pokud proces A nevyjde z jeho cesty, hledá to, že A tuto změnu zcela neví. (Toto je naopak důvod, proč pokud spustíte něco jakofind / a přerušíte to v polovině cesty, neskončíte v nějakém zdánlivě náhodném místě v systému souborů, protože právě teď se tam náhodou díváte bylo přerušeno.)

Takže i kdyžsudo cd /somewhere udělal přesně to, co říká na plechovce, v době, kdysudo vystoupí, vrátíte se zpátky, kde jste začali. Z tohoto důvodu se z hlediska uživatele skutečně stává nikoliv. Skutečnost, žecd, zatímco byl spuštěn, nazvaný funkce systémové knihovnychdir() pro nastavení nového pracovního adresáře, nepomůže uživateli.

Jak uvedl Warren Hill , správné řešení (vlastně bych nevolal to je řešení) je použítsudo -i, který vás propadne do kořenového shellu, kde můžete volně pohybovat kolem souborového systému a provádět příkazy, které máte pocit. Všimněte si však, že když opustíte tento shell, jste stále uvedena zpět, kde jste začali v hierarchii adresářů, a to právě z důvodu, který jsem popsal výše.

    
odpověděl Michael Kjörling 07.05.2013 09:27
12

Všechny výše uvedené odpovědi jsou správné. zde je řešení

sudo sh -c "cd restricted-dir; some_command"
    
odpověděl Tagar 07.11.2015 07:00
3

Můžete také změnit oprávnění dočasně, pokud jste uživatelem sudo.

cesta sudo chmod 0775

nebo

sudo chmod + r cesta ke složce

Ujistěte se, že jste je v případě potřeby vrátili zpět.

    
odpověděl Andres Abello 07.11.2016 18:14