Dlaczego przekierowanie „skryptu” do / dev / null / pozwala „ekranowi” działać, gdy jest używany jako inny użytkownik?

37

Zostałem pozwany do użytkownika, aby uruchomił konkretny, długo działający skrypt. Chciałem użyć ekranu, ale dostałem komunikat o błędzie „Nie można otworzyć terminala / dev / pts / 4” - sprawdź. ”

Przeszukałem go i natknąłem się na post na forum, w którym polecono bieganie $ script '/dev/null/'. Zrobiłem to, a potem mogłem przesłać.

Dlaczego to działa? Co robi Su, że ten ekran nie może działać jako su'ed użytkownik? Dlaczego inaczej przekierowanie „skryptu” na / dev / null jest niemożliwe? Czy używa gdzieś skryptu, aby zapisać dziennik jako oryginalny użytkownik?

Ichorus
źródło
2
Cleaner miałby być uruchamiany suz poziomu sesji ekranowej.
justarobert
@ justarobert nie, jeśli chcesz, aby wielu użytkowników mogło połączyć się z tym samym ekranem dla konta z uruchomioną usługą / skryptem wsadowym.
Ashley,

Odpowiedzi:

41

Cóż, technicznie nic tu nie przekierowujesz.

Wywołanie script /dev/nullpowoduje po prostu scriptzapisanie całego pisma maszynowego, w /dev/nullktórym w praktyce oznacza odrzucenie zawartości.

Zobacz man scriptszczegółowe informacje i pakiet util-linux-ng do implementacji ( misc-utils/script.c).

To nie ma screenwłaściwie nic wspólnego . Dlaczego to działa, wywoływanie scriptma efekt uboczny tworzenia dla ciebie pseudo-terminala /dev/pts/X. W ten sposób nie musisz tego robić sam, a ekran nie będzie miał problemów z uprawnieniami - jeśli przechodzisz suod użytkownika A do użytkownika B , bezpośrednio wywołując screenpróbujesz przejąć pseudo-terminal użytkownika A. To się nie powiedzie, chyba że jesteś rootem . Dlatego widzisz komunikat o błędzie.

Karol J. Piczak
źródło
6

Aby dane wyjściowe były wysyłane bezpośrednio do okna terminala, uruchomiony program musi mieć możliwość zapisu na terminalu sterującym. Jeśli używasz xterm lub ssh lub innego połączenia wirtualnego (w przeciwieństwie do rzeczywistego bezpośrednio podłączonego terminala), terminal kontrolny jest pseudo tty (pty).

Twój pty jest skonfigurowany z uprawnieniem do zapisu tylko dla ciebie, gdy się logujesz, w przeciwnym razie inni użytkownicy mogliby pisać na twoim wyświetlaczu (lub czytać). Zatem, gdy su do innego użytkownika (i ten użytkownik nie jest rootem), ten użytkownik nie ma dostępu do bazowego pty.

Jednak bardziej złożone operacje wejścia / wyjścia, takie jak ekran, wymagają bezpośredniego dostępu do pty, aby móc sterować całym ekranem. Wtedy napotykasz problemy z tym, że osoba uruchamiająca polecenie nie ma odpowiedniego dostępu do terminala sterującego.

Przekierowanie skryptu do / dev / null powoduje, że screen nie próbuje pisać do terminala sterującego, więc nie trafia w problem z uprawnieniami.

Phil Hollenback
źródło
2
Więc jak mogę zobaczyć, co pisze ekran, jeśli idzie do / dev / null? Jestem prawie pewien, że źle zrozumiałem i tak naprawdę nie idzie do / dev / null, ale gdzie to idzie?
user63623,
„it”, co oznacza wynik na ekranie, nie przechodzi do /dev/null. Po pierwsze: skrypt zapisuje sesji (zobacz stronę podręcznika) i nie trzeba go w ogóle: tak , że idzie do / dev / null. Ale nie ma to żadnego efektu ubocznego: tworzy pseudo terminal, a teraz go używasz, a screen może pisać do tego anee. Zobacz @ odpowiedź karola-piczaka.
Nanne