it-swarm.dev

Jak zadat adresář příkazem 'cd', pokud má oprávnění 700 a není mi vlastněna?

Snažil jsem se použít Sudo cd name_of_dir ale zobrazuje se chybová zpráva:

Sudo: cd: command not found

Existuje nějaký jiný způsob, jak zadat adresář vlastněný jiným uživatelem, který má oprávnění 700?

91
Bakhtiyor

Sudo cd nebude fungovat, protože příkaz cd je zabudován do shellu. Takže říkáte, že se stanete rootem a potom spustíte tento příkaz. Stanete se rootem a příkaz se vyhledá po vyhledání Sudo, ale není k dispozici žádný příkaz cd.

Metoda, kterou použijete, je přepnutí na uživatele, který vlastní adresář. Povolení 700 je míněno jako „vlastník umí číst, psát a vykonávat“.

Pokud tedy root vlastní adresář Sudo -i, heslo a poté cd {dir} je jediná správná metoda. Pokud adresář vlastní někdo jiný, můžete použít první metodu, ale můžete ji také změnit pomocí su {username} a poté jako uživatel použijte cd.

117
Rinzwind

Sudo -i

otevřete „kořenovou konzoli“ a poté

cd /path/to/directory

(cd je vestavěný příkaz Shell, takže to nemůže být cíl Sudo)

46
Vojtech Trefny

K otevření kořenového adresáře můžeme spustit kořenový Shell, např .:

Sudo su
# cd /root
19
Takkat

Jak zdůraznili ostatní - je to zabudováno Shell:

~ % which cd
cd: Shell built-in command

Tak proč ty sám Sudo Shell?

~ % Sudo $Shell -c "cd name_of_dir"
11
Daniel Bauke

Můžete se také povýšit na uživatele root:

Sudo -s

Pak můžete zkopírovat do libovolného adresáře, který neumožňuje běžnému uživateli, jako je:

cd /root

Nebo

cd /var/lib/

Poté, co tam skončíte, napište:

exit

Odhlášení uživatelských oprávnění uživatele root.

Chcete-li se povýšit jako root, můžete také oba příkazy kombinovat pomocí && Operátor, jak je uvedeno níže, si tento operátor také zachová svoji prováděcí posloupnost, pokud se aktuální příkaz provede úspěšně a teprve potom je možné provést následující příkaz:

Sudo -s && cd /var/lib

Nebo

Sudo -s && cd /root
4
Vicky Dev

Pokud opravdu chcete udělat Sudo cd directory work, můžete definovat funkci bash Shell nazvanou Sudo, která při spuštění tímto způsobem spustí nový root Shell, a jinak spustí běžný příkaz Sudo.

Jak je uvedeno v jiných odpovědích, většina uživatelů se nebude chtít s tím obtěžovat, ale místo toho chce:

  1. Spustit Sudo -s nebo Sudo -i pokud chcete přihlásit Shell (pamatujte, že jeden efekt Sudo -i znamená začít vás v domovském adresáři root, nebo Sudo bash pokud chcete vynutit bash nebo být schopen předat možnosti Shell.
  2. Spustit cd directory v novém Shell.
  3. Proveďte cokoli (jiné) akce, které je třeba v nové Shell provést jako root.
  4. Po dokončení spusťte exit, abyste opustili nový Shell. Je důležité na to nezapomenout, protože nechcete provádět více akcí jako root, než máte v úmyslu!

Pokud tedy chcete, můžete napsat funkci Shell (nebo skript), která provede první dvě z těchto akcí, když Sudo následuje cd, a pouze spustí Sudo normálně jinak. Nepoužívejte to jako alternativu k učení proč Sudo cd jinak neuspěje, protože pokud nerozumíte tomu, co se děje, budete pravděpodobně velmi zmateni tím, že jste v novém prostředí (a nemusíte rozumět žádným chybovým zprávám, které se vyskytnou).

Zde je jeden způsob, jak napsat takovou funkci Shell, která vám také připomene, že jste v novém Shell a že byste po dokončení měli exit. (Toto připomenutí bude pravděpodobně užitečné pro uživatele jakékoli úrovně dovedností, protože člověk obvykle není zvyklý být v novém prostředí, když se spustí Sudo bez -s, -i nebo jako název argumentu skutečné Shell.)

# Make Sudo treat "Sudo cd [DIRECTORY]" as a special case and start a Shell.
Sudo() {
    if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
        Sudo bash -c '
                if cd -- "$2"; then # When cd fails, its own message is enough.
                    printf "%s: Running %s Shell in %s\n" "$0" "$USER" "$2" >&2
                    printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
                    exec bash # Replace this bash Shell with an interactive one.
                fi
            ' bash _ "$2" # Use $2 as the dir in the intermediate Shell, too.
    else
        command Sudo "[email protected]"
    fi
}

Můžete to vložit do svého ~/.bashrc, i když je to dost divný způsob, jak použít Sudo, že jej budete chtít povolit pouze příležitostně. V takovém případě je lepší vložit jej do vlastního souboru. Pokud vytvoříte soubor s názvem Sudo.bash ve vašem domovském adresáři s tímto obsahem, pak můžete zpřístupnit funkci Sudo - tak, aby se spouštěla ​​namísto běžného příkazu Sudo - spuštěním . ~/Sudo.bash. To se projeví v současné Shell a jejích dětských skořápkách, ale ne v ostatních. Ze stejného důvodu jako soubory jako .bashrc nejsou spustitelné, neoznačujte Sudo.bash spustitelný s chmod. Toto je opravdu knihovna, spíše než samostatný skript Shell. Pokud jste spustili jako skript Shell, definovali by funkci ... ale pouze ve Shell, který skript spustil, ne pro vás jako volající. (Samozřejmě, že můžete napsat skript, který se prostě nestane přístupem, který jsem sem použil.)

Chcete-li zkontrolovat a zjistit, zda Sudo je aktuálně definována jako funkce Shell, a vidět jeho aktuální definici, pokud je jedna, spusťte type Sudo. Chcete-li funkci deaktivovat (tj. Undefinovat), jakmile je definována, spusťte unset -f Sudo. Chcete-li ručně spustit běžný příkaz Sudo přímo, i když je definována funkce Shell, spusťte command Sudo. Všimněte si však, že to nemáte , protože tato funkce Sudo to ve skutečnosti dělá sama, kdykoli je jich více nebo je předáno méně než dva argumenty nebo první argument předaný je nic jiného než cd. To je důvod, proč je stále můžete používat běžnými způsoby, jak lidé používají Sudo.

Všimněte si také, že výše uvedená funkce Shell vám stále umožňuje předávat další argumenty Sudo, , ale to zabrání tomu, aby se speciálními způsoby cd. Běh Sudo -u user cd directory není konkrétně podporován, i když můžete tuto funkci rozšířit o funkci Shell. Ani není Sudo -i cd directory. Skořápka, kterou vytváří, je podobná tomu, co získáte s Sudo -s. Kód se ve skutečnosti nespustí Sudo -s, ale používá Sudo bash, takže -c volba funguje správně. Ve skutečnosti se spustí bash dvakrát, když do něj předáte cd a argument adresáře (a jinak nulakrát). Když spustíte Sudo cd directory, nejprve to rozepne samostatnou bash Shell od té, ve které je spuštěna funkce Sudo, a změní adresář. Pokud to uspěje, nahradí bash Shell novým interaktivním, který můžete použít.

Zde je příklad, jak tato funkce Shell automaticky „dělá správnou věc“. Všimněte si, že Sudo ls -A /root se chová normálně. Teprve tehdy, když se pokusím cd do adresáře s Sudo, je vytvořen nový Shell a mám výslovně připomenout, co se děje.

[email protected]:~$ Sudo ls -A /root
[Sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
[email protected]:~$ Sudo -k  # invalidates my current timestamp... like I left for a while
[email protected]:~$ Sudo cd /root/.local
[Sudo] password for ek:
bash: Running root Shell in /root/.local
bash: Type "exit" once you are done!
[email protected]:/root/.local#
[email protected]:/root/.local#
[email protected]:/root/.local# exit
exit
[email protected]:~$

Pokud se pokusíte Sudo cd do adresáře, do kterého nemůžete změnit ani kořenový adresář, dostanete pouze chybovou zprávu:

[email protected]:~$ Sudo cd /nonexistent
[Sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
[email protected]:~$ Sudo -k
[email protected]:~$ Sudo cd /etc/crontab
[Sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
[email protected]:~$

Použil jsem Sudo -k mezi vyvoláními ve výše uvedených příkladech, abychom ukázali, že vás před pokusem o změnu adresáře autentizuje jako root před . Ale ve skutečnosti nemusíte běžet Sudo -k vy sám. Protože funkce Shell je jen tenký obal pro skutečný příkaz Sudo, ukládání do mezipaměti vašich pověření a dalších běžných chování Sudo stále funguje normálně.

I když to funguje dobře a je to trochu úhledné, připouštím, že stínování skutečného příkazu Sudo s funkcí stejného jména je super podivné. Většina uživatelů bude pravděpodobně chtít provést kroky Sudo -s, cd directory oni sami. Ale v případě, že to někdo chce - a také musí prokázat, že je to možné - existuje.

2
Eliah Kagan

Řešení @ Danielielka Bauke funguje, když to, co se pokoušíte Sudo, je složený příkaz, například cd /some/path && ./executableScript.sh což může být to, co potřebujete, pokud executableScript.sh musí být provedeno z jeho adresáře a vyžaduje, aby Sudo jak vstoupil do adresáře, tak aby spustil skript (a chcete to provést neinteraktivní/relací způsobem).

Zopakuji, řešení Daniel Bauke je:

Sudo $Shell -c "cd /some/path && ./executableScript.sh"
0
flying_thorn

Pokud jde o debatu o su nebo ne su, myslím, že je to hloupé. su je proti náboženství Ubuntu a není to nic nedbalého. Je úžasné, co může rm -rf * Udělat, pokud jste root. Ale pokud jste spokojeni s rozhraním příkazového řádku (CLI) a máte úkoly na systémové úrovni, není důvod nepoužívat su. Použil jsem několik distribucí, kde se nikdo nezmínil pomocí Sudo. Je to jen otázka toho, jakou práci děláte a jakou metodu jste nejpohodlnější. Používám oba.

0
Joe