Zapoznaj się z / etc / inittab
On 12 lutego, 2021 by admin Używam następującego pliku /etc/inittab
(systemv):
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin S0:12345:respawn:/sbin/getty -L 115200 ttyS0
Aby zrozumieć, jak to naprawdę działa, docenię, jeśli odpowiesz na pytania 1-3, rozróżnisz dwie sytuacje:
- Jestem podłączony do systemu przez port szeregowy.
- Mam „zwykły” komputer stacjonarny.
Pytania:
-
Jeśli dodam kolejną linię getty, po uruchomieniu Linuksa zobaczę dwa oddzielne terminale?
-
Jeśli otworzę kilka linii getty, w jaki sposób przypisałem które getty uruchomi moje polecenie
si::sysinit:/etc/init.d/rcS
i które getty uruchomi polecenia innych skryptów? (te, które uruchamiają skrypty zgodnie z poziomem uruchamiania systemu)w innymi słowy: w pliku
/etc/inittab
– czy mogę przypisać różne polecenia do różnych gettys? (mam na myśli terminale, które będą otwierane przez te gettys) -
ostatni skrypt w folderze /etc/init.d/rc5 uruchomiony następujące polecenie:
su nobody -c /bin/sh
, a wynik to:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Więc zweryfikowałem że jestem nikim, ale dlaczego pisze pierwsze dwie linijki? także dlaczego zachęta to sh-4.3 $ a nie nobody @ …
-
Używam połączenia szeregowego. Czy mogę zmienić plik / etc / inittab i ostatni skrypt który będzie uruchamiany przez init w celu:
- uruchomienia programu przed zalogowaniem się jako użytkownik o niskich uprawnieniach (proces init będzie czekał na zakończenie)
- po zakończeniu programu otrzyma zwykłe monit o zalogowanie się do mojego systemu
- jaki jest najlepszy sposób na stworzenie niskiego uprzywilejowanego użytkownika i umożliwienie mu uruchomienia tego programu podczas procesu inicjalizacji (jeśli nie chcę używać nikogo użytkownika)
Odpowiedź
Pytanie 1:
Tak, dodając więcej getty
można uzyskać więcej terminali równolegle. Tylko jedno getty
może być skojarzone z jednym urządzeniem końcowym naraz, więc możliwe jest tylko jedno getty
na port szeregowy. Na zwykłym komputerze stacjonarnym jądro Linuksa definiuje kilka konsol wirtualnych, dostępnych za pomocą kombinacji klawiszy Control + Alt + FX i odpowiadających /dev/ttyX
urządzeń (X = liczba). Dokładna konfiguracja może się różnić w zależności od dystrybucji, ale zwykle w głównych dystrybucjach pierwszych 6 lub więcej /dev/ttyX
urządzeń ma getty
skonfigurowanych pod kątem system działa normalnie. Możesz użyć poleceń openvt
i deallocvt
, aby dodać lub usunąć konsole wirtualne i uruchomić procesy (mogą to być dowolne procesy, niekoniecznie getty
s) na nich.
/dev/tty0
jest wyjątkowy: odnosi się do dowolnej konsoli wirtualnej, która jest aktualnie wybrana. /dev/console
to podobne urządzenie specjalne, wskazujące na dowolne urządzenie TTY zdefiniowane jako podstawowa konsola systemowa na poziomie jądra. Na komputerach stacjonarnych jest to w rzeczywistości alias do /dev/tty0
domyślnie, ale używając opcji rozruchu console=
, można przełączyć go na port szeregowy Port. Np. w niektórych architekturach wbudowanych może to być domyślnie port szeregowy. Narzędzia takie jak xconsole
mogą również pełnić rolę dodatkowego wyjścia dla /dev/console
.
W czasach, gdy komputery były dużymi urządzeniami z wieloma szafkami w wydzielonych pomieszczeniach komputerowych, wysłanie wiadomości do /dev/console
byłoby sposobem na skontaktowanie się z operatorem systemu na służbie fizycznie w pobliżu komputera, co mogło być przydatne w przypadku zapytań np zmień taśmy lub pakiety dysków. W nowoczesnych systemach wiadomości wysyłane specjalnie do /dev/console
są zwykle wiadomościami o uruchomieniu / zamknięciu lub być może kanałem ostatniej szansy dla pilnych alarmów o warunkach awarii, które mogą mieć wpływ na dostęp do sieci lub pamięci masowej, a nawet wiąże się z awarią jądra: „osoba odpowiedzialna za fizyczny sprzęt musi to zobaczyć, a zwykłe pliki dziennika są z jakiegoś powodu bezużyteczne”.
Pytanie 2:
Obawiam się, że masz tu błędne przekonanie. Linia sysinit
i inne /etc/inittab
linie nie są powiązane z getty
w ogóle. Każde polecenie wykonane z inittab
, o ile nie określono inaczej, ma swoje standardowe strumienie wejścia, wyjścia i błędów powiązane z /dev/console
.
Wiersze getty
w rzeczywistości określają urządzenie TTY, którego będą używać, oraz proces getty
ma wbudowany kod, który przypisze to urządzenie TTY dla siebie i wszystkie ich procesy potomne, chyba że użytkownik uruchomi powłokę i zdecyduje się przekierować te strumienie w inny sposób.To i inicjalizacja ustawień urządzenia TTY to największa część celu getty
„: wyświetlenie /etc/issue
i zachęty do logowania, zaakceptowanie nazwa użytkownika, ustawienie zmiennej środowiskowej TERM i rozpoczęcie następnego kroku procesu logowania TTY (zwykle /bin/login
, ale konfigurowalne) to właściwie tylko drobne części.
Zauważ, że to konwencja, zgodnie z którą w przypadku urządzeń TTY dwuznakowe pole identyfikatora w pierwszej kolumnie wiersza inittab
powinno odpowiadać nazwie danego urządzenia TTY po , więc /dev/ttyS0
otrzyma identyfikator wiersza inittab S0
i tak dalej. W przypadku rzeczy, które niekoniecznie jest powiązany z jakimkolwiek TTY (lub po prostu wyprowadza dane awaryjne do / dev / console, jeśli to konieczne), ID może być wszystkim, co nie koliduje z identyfikatorami linii urządzenia TTY.
dzień, w którym terminale szeregowe były nr rm, pobranie ustawień urządzenia TTY bezpośrednio dla terminala na drugim końcu linii i zresetowanie tego terminala do znanego stanu logowania były nietrywialnymi zadaniami, ponieważ istniało wiele konkurencyjnych standardów typu terminala.)
Jeśli skonfigurujesz linię inittab
do uruchamiania skryptu, możesz na przykład sprawdzić, czy dana /dev/ttyX
konsola wirtualna urządzenie istnieje. Jeśli tak się nie stanie, możesz użyć openvt -c X <command>
, aby utworzyć konsolę wirtualną i uruchomić na niej polecenie; jeśli urządzenie wirtualnej konsoli już istnieje, możesz po prostu uruchomić dowolne polecenie ze standardowym wejściem, wyjściem i przekierowaniem do niego błędu. Na przykład możesz określić wiersz inittab w następujący sposób:
6:345:respawn:/usr/local/sbin/myscript
, a następnie /usr/local/sbin/myscript
za pomocą czegoś takiego ( zastrzeżenie: nie testowane, nie mam w tej chwili systemu z SysVinit, możesz go edytować, jeśli możesz to poprawić):
#!/bin/sh if [ -c /dev/tty6 ]; then exec <some command> </dev/tty6 >/dev/tty6 2>&1 else exec openvt -c 6 -w <some command> fi
respawn
w wierszu inittab
zapewnia automatyczne ponowne uruchomienie procesu, jeśli z jakiegoś powodu umrze. 345
to lista poziomów działania SysVinit, na których powinien działać ten proces. Jeśli chcesz, aby działał na wszystkich zwykłych poziomach działania, wpisz 12345
.
Uwaga, to działa zgodnie z przeznaczeniem tylko wtedy, gdy wiersz inittab jest umieszczony po linii sysinit
, więc można założyć, że inicjalizacja udev
została zakończona. Jeśli jeśli chcesz to zrobić na wczesnym etapie procesu inicjalizacji, być może będziesz musiał zadbać o utworzenie rzeczywistych węzłów urządzeń dla urządzeń, które mają już załadowane sterowniki; po uruchomieniu udev
powinno automatycznie tworzyć węzły urządzeń podczas inicjowania sterowników urządzeń.
W przypadku korzystania z portu szeregowego openvt
polecenie nie będzie miało zastosowania.
Więc tak, zdecydowanie możesz dołączyć różne polecenia do różnych urządzeń TTY. Pomocne jest, jeśli polecenia mają do tego wbudowane funkcje, takie jak getty
, ale możesz to również zrobić za pomocą skryptów.
(Jeśli skonfigurujesz coś bardziej skomplikowanego niż zwykła tail -f
, aby na stałe wyświetlić niektóre logi z nieużywanej w inny sposób konsoli wirtualnej, przeczytaj man setsid
i sprawdź, czy ma to zastosowanie do tego, co „planujesz”.
Pytanie 3:
Inicjalizacja sesji TTY to nie wszystko dla konkretnego użytkownika innego niż root, niż tylko uruchomienie powłoki za pomocą su
.
Komunikaty o błędach
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
są prawdopodobnie spowodowane tym, że powłoka jest powiązana przez urządzenie /dev/console
, a nie przez określone urządzenie TTY. Ponieważ /dev/console
jest po prostu alias do jakiejkolwiek bieżącej konsoli systemowej, nie będzie miał dostępnego pełnego zestawu funkcji ioctl sterujących TTY.
Jeśli nie ma skryptu logowania do przypisania bardziej użytecznej wartości zmiennej środowiskowej PS1
, domyślny monit o /bin/sh
może być po prostu sh-<version>$
.
Pytanie 4:
Tak, możesz. Należy określić „ostatni skrypt” jako linię wait
-type w inittab
i umieścić go przed wiersz getty
odpowiadający twojej linii szeregowej.
Bez znajomości dużo więcej szczegółów na temat twojego środowiska, będzie bardzo trudno powiedzieć, który byłby najlepszy sposób na stworzenie użytkownika o niskich uprawnieniach do takich celów.
Komentarze
Odpowiedź
-
Tak, zakładając wiersz otrzyma unikalny identyfikator i skonfigurowana linia terminala jest dostępna:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
otworzy terminal na porcie szeregowym dołączonym do
ttyS1
. -
Linie w
inittab
nie są sekwencyjne ani związane z loginem. Każda linia opisuje akcję, która ma zostać wykonana w danym zestawie poziomów działania. W związku z tymsi::sysinit:/etc/init.d/rcS
określa, żeinit
powinno działać/etc/init.d/rcS
, gdy obsługuje inicjalizację systemu; dzieje się to zanim możliwe będzie logowanie. (Zobaczinittab(5)
stronę podręcznika , aby uzyskać szczegółowe informacje).Aby przypisać różne polecenia do różnych
getty
s na określonych terminalach, należy skonfigurować samo wywołaniegetty
, na przykład zmieniająclogin
program, który uruchamia (opcja-l
w większości implementacjigetty
):S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
-
/etc/init.d/rc 5
działa przed zalogowaniem, a programy, które uruchamia, nie są podłączone do terminala („prawidłowo”, co jest tym, co robigetty
– otwiera terminal dla Ciebie i łączy z nim uruchamiane programy), więc gdy wywoływany jestsu nobody -c /bin/sh
, powłoka nie znajduje oczekiwanej konfiguracji terminala i w rezultacie wyłącza kontrolę zadań. Znak zachętysh-4.3$
jest domyślnym monitem Bash 4.3 po uruchomieniu jako/bin/sh
. -
Jeśli Twój program ma działać tylko wtedy, gdy użytkownik zacznie się logować, możesz podłączyć go do sekwencji logowania używanej przez
getty
; ale taki program działałby jako root. W zależności od tego, czego dokładnie szukasz, prawdopodobnie lepiej byłoby użyć skryptu inicjującego zamiast/etc/inittab
dostosowywania lubsudo
i skryptów startowych powłoki.
Komentarze
- dziękujemy za powtórkę. Czy mogę poprosić smail o wyjaśnienie dotyczące ust. 2? jak mogę edytować polecenie logowania dla każdego innego getty?
- Gotowe, zobacz aktualizację.
- dziękuję! tylko po to, aby sprawdzić, czy dobrze zrozumiałem: domyślnie proces getty uruchomi polecenie / bin / login, które wykonuje proces odpowiedzialny za logowanie do systemu. Teraz getty uruchomi inne polecenie, każde polecenie, które ' wybiorę i nie będzie wywoływać procesu logowania do systemu, jak poprzednio … mam rację?
- Tak, zgadza się. Kluczem jest uzyskanie
getty
, aby otworzyć TTY; jego normalnym zachowaniem jest oczekiwanie na nazwę logowania, a następnie uruchomienielogin
, połączonego z terminalem TTY;login
czeka na hasło, sprawdza je i uruchamia powłokę, również połączoną z TTY. W przypadku wymiany częścilogin
należy upewnić się, że program zastępujący zachowuje się jaklogin
. - Na przykład, jeśli chcę pominąć fazę logowania – aby móc otworzyć swój system z użytkownikiem root bez wprowadzania nazwy użytkownika ani hasła. Mogę użyć: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 lub użyć: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 i inside skrypt i ' czy uruchomimy polecenie – / bin / sh i inne?
Odpowiedź
Chwileczkę (długo!) odpowiedź została opublikowana. Muszę powiedzieć, że pierwszy wyjaśnia całkiem dobrze. W tej chwili chcę skomentować punkt trzeci: jest to mniej kwestia synchronizacji, ale procesów kontrolujących „prawdziwy wirtualny” terminal, a nie tylko „atrapę konsoli”.
Zanim będziesz mógł uruchomić powłokę „z kontrolą zadań”, musisz ustawić np. otworzyć ttyN. Polecenie „ogólne” to getty
. Z tego tty-czegoś, co otrzymasz, możesz uruchomić powłokę, a nie tylko po .
To tak, jakbyś próbował najpierw uruchomić menedżera okien, a potem xorg, zamiast „uruchamiać” je razem z xinit. Myślę. „lider sesji”.
Z powodu
xx:12:...:program
i przeciwnie:
aa:1:...:pr_1 bb:1:...:pr_2
… otrzymujesz relację N: M (jeśli nadużyjesz, także będziesz miał bałagan – wiele RL-ów, każdy z wieloma różnymi progami). Możesz zajść z tym daleko, ale od tamtej pory różne rodzaje „standardów” RC przejęły władzę. „Runcoms”. Dzięki nim inittab wygląda na prosty, ale cała złożoność jest w tych skryptach.
Ale twój inittab wygląda prosto i poprawnie – tylko ostatni komentarz i wpis „z6” …
Może twój „su nobody” potrzebuje tylko „getty … ttyN” przed / w pobliżu. su
zamiast login
i bez odrodzenia. Powinien przynajmniej podać inny komunikat o błędzie niż „nieodpowiednie”.
Wniosek (po przeczytaniu drugiej odpowiedzi): Nie potrzebujesz skomplikowanego systemu init.d
, surowy inittab jest wystarczająco elastyczny. koncepcja i szczegóły są prawidłowe.
Możesz ustawić trzy poziomy pracy: jeden z ttyNs, jeden z ttySN i jeden RL, który uruchamia oba. Jest to parametr rozruchowy, który można dodać za pomocą programu ładującego. W twoim przypadku „5” jest tylko domyślną wartością. Wybierasz jądro, root = i poziom działania, do którego chcesz zainicjować.
Akcja „respawn” jest tym, do czego sysvinit był / jest faktycznie potrzebny . Znacznie więcej tego nie robi, a mniej byłoby możliwe do zaimplementowania w skrypcie. Ale jeśli opuścisz (lub wyłączysz) „ostatni” poziom powłoki, potrzebujesz sieci bezpieczeństwa.
sysvinit może nawet wykryć błędną konfigurację, wyświetlając błąd „pojawianie się zbyt szybko – ignorowanie przez 5 minut …”.
getty
to proces; mówisz o urządzeniu TTY . Jądro otworzyło pierwszy dla Ciebie i dla skryptów inicjalizacyjnych;/dev/console
to alias ” pierwszego urządzenia TTY, które zostało otwarte i używane przez jądro „. Jeśli Twoje konto użytkownika ma uprawnienia do odczytu i zapisu na urządzeniu TTY, możesz po prostu zacząć z niego korzystać (getty
nie jest potrzebne), ale dobrym pomysłem może być ustawienie Zmienna TERM poprawnie:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
lubTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
uruchomi polecenietop
na 8. konsoli wirtualnej lub drugiego portu szeregowego.getty
, zrobi bałagan wejście & wyjście, ponieważ dwa procesy będą walczyć o dane wejściowe, a ich wyjścia zostaną pomieszane. Procesygetty
są uruchamiane dopiero po wykonaniu/etc/init.d/rc 5
i zakończeniu wszystkich uruchomionych przez nie skryptów.