GNU/Linux >> Znalost Linux >  >> Linux

Jak Bash ví, jak je vyvoláván?

Nainstaloval jsem jailkit na Ubuntu 12.04 a nastavil jsem uživatelský shell na /bin/bash – ale když je vyvolán, spustí /etc/bash.bashrc místo /etc/profile

Pokud jste nepoužili jailkit předtím, než je to podstatné:

  1. Někde je vytvořena „uvězněná“ verze kořenového adresáře systému, například /home/jail
  2. Domovské adresáře uvězněných uživatelů se přesouvají do této složky jako /home/jail/home/testuser
  3. Relevantní konfigurační soubory se zkopírují do /home/jail/etc/ – včetně omezeného /etc/passwd
  4. Programy, kterým chcete povolit přístup, se zkopírují do odpovídajících adresářů, například
    /bin/bash
  5. Když se uvězněný uživatel přihlásí, je chrootován do /etc/jail/ a nad tím nevidí žádné soubory

Takže mám testuser kdo má záznam v /etc/passwd takhle:

testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh

V souboru /home/jail/etc/passwd je tam záznam jako:

testuser:1001:1003::/home/testuser:/bin/bash

Přečetl jsem si bash(1) a tak si myslím, že problém je v tom, že bash si myslí, že není vyvolán jako přihlašovací shell:

Když je bash vyvolán jako interaktivní přihlašovací shell nebo jako neinteraktivní shell s volbou –login, nejprve načte a provede příkazy ze souboru
/etc/profile, pokud takový soubor existuje.

Dostávám ten bash je ve skutečnosti vyvolán /usr/sbin/jk_chrootsh ale nechápu, jak bash určuje, o jaký typ shellu se jedná a jakou sadu spouštěcích souborů by měl spustit.

Chtěl bych zjistit, jestli to dokážu vyřešit – ale nerozumím tomu:

Jak bash ví, jak je vyvolán?

ps:Také jsem se podíval do login(1) bez velkého štěstí.

Přijatá odpověď:

Normálně bash ví, že je to přihlašovací shell, protože když jej přihlašovací program vyvolá, řekne bash, že jeho jméno je -bash . Toto jméno je v argv[0] , nultý argument příkazového řádku, což je konvenčně způsob, jakým uživatel program vyvolal. Počáteční pomlčka je konvence, která říká shellu, že se jedná o přihlašovací shell. Bash se také chová jako přihlašovací shell, pokud mu předáte volbu --login nebo -l . Viz Rozdíl mezi přihlašovacím prostředím a nepřihlašovacím prostředím? pro více podrobností.

Od Jailkit 2.16, jk_chrootsh přečte absolutní cestu k shellu, aby ji vyvolal z různých zdrojů, a předá tuto cestu jako argv[0] a předá své vlastní argumenty příkazového řádku tomuto shellu. V běžném případě použití, kde jk_chrootsh se sám používá v /etc/passwd , neexistuje způsob, jak předat argument jako -l . Protože absolutní cesta nezačíná - , neexistuje způsob, jak vytvořit jk_chrootsh vyvolejte přihlašovací shell, bez použití malého přechodného programu.

#include <unistd.h>
int main () {
    execl("/bin/bash", "-bash", NULL);
    return 127;
}

Očekával bych jk_chrootsh mít snadný způsob, jak vyvolat přihlašovací shell. Navrhuji vytvořit žádost o funkci.

Související:Co dělá „exec {fd}/watchdog“ v Bash?
Linux
  1. Účel .bashrc a jak to funguje?

  2. Jak Gcc ví, kde je Boost nainstalován?

  3. Jak změnit Cron Shell (sh to Bash)?

  1. Jak zopakovat nový řádek ve skriptech Bash Shell

  2. Jak funguje cat << EOF v bash?

  3. Jak zjistit dostupnost GUI v Bash/Shell?

  1. Jak programovat s Bash:Syntaxe a nástroje

  2. Jak zkontrolovat podřetězec v Shell Script Bash?

  3. Jak bash testuje „nepravdu“?