Czy chmod 000 / dev / stdin na zawsze wyłączy terminal?

12

Pracuję nad pytaniami z podręcznika Unix The Textbook (rozdział 8, # 16, strona 207) :

Daj chmodlinii poleceń, które wykonują te same zadania, że mesg ni mesg ypolecenia zrobienia. (Wskazówka: każde urządzenie sprzętowe, w tym terminal, ma powiązany katalog w /devkatalogu).

Uważam, że odpowiedź brzmi:

mesg n = chmod 770 /dev/stdout

mesg y = chmod 777 /dev/stdout

Ale zastanawiałem się, co się stanie, jeśli użyjesz chmod 000 /dev/stdin?

Czy nie możesz wprowadzać poleceń w terminalu?

Philip Kirkbride
źródło
2
Ważne jest, aby zrozumieć, że uprawnienia są sprawdzane tylko po otwarciu pliku. Dlatego bez względu na standardowe wejście powłoki, zmiana jej uprawnień nie blokuje wprowadzania poleceń, ponieważ zarówno powłoka, jak i emulator terminala lub ssh lub cokolwiek już otworzyło kanał komunikacyjny. mesg nmoże używać uprawnień, aby wpływać writetylko na przyszłe, ponieważ write nie ma jeszcze otwartego terminala.
zwolnienie

Odpowiedzi:

20

Nie, /dev/stdini /dev/stdoutsą niewłaściwym urządzeniem. Nie są to urządzenia końcowe, są to aliasy odpowiednio dla standardowego wejścia i wyjścia. Standardowe dane wejściowe i standardowe dane wyjściowe są z definicji deskryptorami plików, które aplikacje oczekują, że będą otwarte i mają konwencjonalne znaczenie (odpowiednio deskryptor pliku 0 i 1, jest też 2, który jest błędem standardowym). Urządzenia takie jak /dev/stdini /dev/stdoutsą przydatne, gdy aplikacja wymaga nazwy pliku, ale użytkownik aplikacji chce, aby uzyskał dostęp do określonego deskryptora pliku, a nie otworzył jakiś plik. W zależności od wariantu uniksowego mogą nawet nie być plikami urządzeń; na przykład w systemie Linux są symbolicznymi linkami do/proc/self/fd/0 i przyjaciele, a te z kolei są „magicznymi” symbolicznymi linkami do dowolnego pliku, który proces już otworzył na tym deskryptorze pliku.

Zmiana uprawnień /dev/stdini /dev/stdoutzmieniłaby tylko to, co dzieje się, gdy te nazwy plików są jawnie używane. Nie wpływa na nic związanego z terminalem i nie wpływa na normalne użycie standardowego wejścia i standardowego wyjścia, ponieważ uprawnienia mają znaczenie tylko podczas otwierania określonej nazwy pliku.

Co mesgrobi to zmienić uprawnienia procesu za kontrolnego terminalu . W przypadku aplikacji działającej w terminalu terminal jest otwarty przy standardowym wejściu, standardowym wyjściu i standardowym błędzie (deskryptory plików 0, 1 i 2). Możesz użyć polecenia, ttyaby zobaczyć, jakie jest urządzenie końcowe. mesg njest równoważne chmod g-w "$(tty)"i mesg yjest równoważne z chmod g+w "$(tty)".

Gilles „SO- przestań być zły”
źródło
2
ttynie zgłasza terminalu sterującego, ale terminal otwiera się na stdin, jeśli taki istnieje. Tak więc w systemie Linux, gdzie / dev / stdin nie jest urządzeniem, ale specjalnym dowiązaniem symbolicznym do pliku otwartego na / dev / stdin, chmot "$(tty)"byłby mniej więcej taki sam chmod /dev/stdin(jeśli stdin jest urządzeniem tty i próbowałby zmienić tryb not a ttyplików w bieżącym katalogu inaczej). Sprawdź /dev/$(ps -o tty= -p "$$")terminal sterujący.
Stéphane Chazelas,