it-swarm.dev

sudo: source: command not found

Aktualizoval jsem část výchozího profilu pro bash a z tutoriálů jsem viděl, že mohu znovu načíst nový profil s novým nastavením prostředí pomocí:

source /etc/bash.bashrc

Jediná věc je - nové proměnné prostředí byly dostupné pouze mému aktuálnímu uživateli - a byly ignorovány, když jsem použil Sudo. K dispozici byly Sudovi pouze tehdy, když jsem ukončil svou terminálovou relaci a znovu se připojil.

Když se pokusím použít:

Sudo source /etc/bash.bashrc

Dostal jsem chybu:

Sudo: source: command not found

Existuje jednoduchý způsob načtení nového nastavení bash profilu pro Sudo, aniž byste museli terminál uzavřít a restartovat?

- Zpočátku jsem používal několik instalačních skriptů, které odkazovaly na proměnné. Zjistil jsem, že zatímco oni mohli přistupovat k proměnným, když jsem volal skripty přímo (ačkoli, to by způsobilo pozdější problém s vytvářením adresářů, protože jsem potřeboval být root), volání instalačních skriptů pomocí Sudo by ne.

To jsem dokázal testováním pomocí těchto jednoduchých příkazů:

echo $ENV_VARIABLE
Sudo echo $ENV_VARIABLE

První by vynesl hodnotu proměnné, ale druhý nevydal nic.

62
HorusKol

Problém je v tom, že source je bash vestavěný příkaz (ne program - jako ls nebo grep). Myslím, že jedním z přístupů je přihlášení jako root a provedení příkazu source.

Sudo -s
source /etc/bash.bashrc
82

Problém není v tom, že source je vestavěný příkaz Shell. Skutečnost, že to je je to, co vás skutečně hází command not found chyba, ale neznamená to, že by to fungovalo, kdyby to bylo.

Skutečným problémem je to, jak fungují proměnné prostředí. A fungují takto: pokaždé, když je zahájen nový proces, pokud se nic neděje, zdědí prostředí svého rodiče. Z tohoto důvodu by použití subshell (např. Zadáním bash uvnitř bash instance) a prohlížení výstupu env mělo přinést podobné výsledky než jeho nadřazený.

Vzhledem k tomu, jak Sudo funguje (jak je uvedeno v jeho manuálové stránce), se Sudo pokouší odstranit prostředí uživatele a vytvořit "výchozí" prostředí pro nahrazení uživatele tak, aby byl spuštěn příkazový příkaz - jako by uživatel, který jej vyvolal, byl volajícím uživatelem (což je očekávané chování), a tak spustil nautilus jako Sudo nautilus by měl otevřít složku na /root složka a ne /home/yourusername.

Tak:

Dělat něco jako Sudo source script.sh a pak Sudo command, i kdyby to fungovalo, nebylo by úspěšné nastavit žádnou proměnnou na pozdější Sudo command.

Chcete-li předat proměnné prostředí, můžete buď říct Sudovi, aby zachoval prostředí (prostřednictvím -E přepínač; a máte příslušná oprávnění v souboru sudoers) nebo jej nastavíte pro příkaz jako Sudo VAR1=VALUE1 VAR2=VALUE2 command.

15
ssice

Jak říká Marcos , vaším hlavním problémem je, že source je zabudovaný příkaz Shell, který ovlivňuje pouze proces Shell, ve kterém je spuštěn.

Snadným řešením je začít nový Shell jako root a bash automaticky přečte /etc/bash.bashrc když to začíná. To je tak jednoduché, jak říkám

Sudo bash
4
poolie

Pomocí bash substituce proces můžete:

source <(Sudo cat /etc/bash.bashrc)
4
TomDotTom

Uzavření a opětovné otevření terminálu by nemělo nic měnit. Ve výchozím nastavení Sudo prostředí. Chcete-li to zakázat, přidejte do Sudo -E.

2
psusi

K chybě dochází, protože binární kód, který se pokoušíte volat z příkazového řádku, je pouze součástí proměnné PATH aktuálního uživatele, ale není součástí PATH kořenového uživatele.

Tuto skutečnost můžete ověřit vyhledáním cesty binárního kódu, ke kterému se pokoušíte získat přístup. V mém případě jsem se snažil říkat „bettercap-ng“. Tak jsem běžel,

$ which bettercap-ng
/home/user/work/bin/bettercap`

Ověřil jsem, zda je toto umístění součástí PATH mého kořenového uživatele.

$ Sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

Takže Sudo nemůže najít binární kód, který se pokouším zavolat z příkazového řádku. Vrací tedy chybový příkaz nebyl nalezen.

Můžete nasměrovat Sudo, aby použil PATH aktuálního uživatele při volání binárního formátu, jako je níže.

Sudo -E env "PATH=$PATH" [command] [arguments]

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

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

Je také možné pojmenovat samotné přezdívku Sudo a nahradit původní Sudo.

2

Některé prostředí UNIX Shell nepodporuje source. místo toho podporují . Tak to zkus

. /etc/bash.bashrc

Doufám, že to funguje

1
Shivam Agrawal