Pracuję nad pytaniami z podręcznika Unix The Textbook (rozdział 8, # 16, strona 207) :
Daj
chmod
linii poleceń, które wykonują te same zadania, żemesg n
imesg y
polecenia zrobienia. (Wskazówka: każde urządzenie sprzętowe, w tym terminal, ma powiązany katalog w/dev
katalogu).
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?
mesg n
może używać uprawnień, aby wpływaćwrite
tylko na przyszłe, ponieważwrite
nie ma jeszcze otwartego terminala.Odpowiedzi:
Nie,
/dev/stdin
i/dev/stdout
są 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/stdin
i/dev/stdout
są 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/stdin
i/dev/stdout
zmienił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
mesg
robi 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,tty
aby zobaczyć, jakie jest urządzenie końcowe.mesg n
jest równoważnechmod g-w "$(tty)"
imesg y
jest równoważne zchmod g+w "$(tty)"
.źródło
tty
nie 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 samchmod /dev/stdin
(jeśli stdin jest urządzeniem tty i próbowałby zmienić trybnot a tty
plików w bieżącym katalogu inaczej). Sprawdź/dev/$(ps -o tty= -p "$$")
terminal sterujący.