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é:
- Někde je vytvořena „uvězněná“ verze kořenového adresáře systému, například /home/jail
- Domovské adresáře uvězněných uživatelů se přesouvají do této složky jako /home/jail/home/testuser
- Relevantní konfigurační soubory se zkopírují do /home/jail/etc/ – včetně omezeného /etc/passwd
- Programy, kterým chcete povolit přístup, se zkopírují do odpovídajících adresářů, například
/bin/bash - 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.