Warum " >/dev/console" für Remote-Piepton (Echo-Befehl)

Warum " >/dev/console" für Remote-Piepton (Echo-Befehl)

Ich habe gelernt, dass dieser Befehl:

echo -e "\a"

löst einen Piepton auf dem lokalen System aus, während dieser Befehl:

echo -e "\a" >/dev/console

löst einen Piepton auf einem Remote-System aus.

Warum ist das so? Was >/dev/consolemacht das Teil?

Warum echo -e "\a"wird der Piepton bei der Ausführung auf einem Remotecomputer lokal und nicht remote ausgelöst?

Warum mag der „Echo“-Befehl sudo nicht?

Gibt es ein OSI-Layer-ähnliches Schema? Bitte stellen Sie mir externe Dokumentation zur Verfügung.

Ich habe nur ein grundlegendes Verständnis davon, wie man stdout/stderr in eine Datei umleitet, nicht viel mehr, aber die Frage bezieht sich eher darauf, wie „Gnu/Linux/Kernel“ gestaltet ist, um eine Umleitung zu erfordern auf

" > /dev/console" für einen Remote-Piepton, um zu funktionieren.

Erfordert ein Remote-Zugriff echo "Hello World"eine Umleitung zu /dev/console?

Antwort1

echoschreibt seine Ausgabe auf seine Standardausgabe. Das ist sein Dateideskriptor 1.

Mit wird echo -e '\a', abhängig von der Implementierung, entweder ein BEL-Zeichen (0x7-Byte-Wert in ASCII) gefolgt von LF (auch als Zeilenumbruch bezeichnet) oder gefolgt von LF oder gefolgt von BEL und LF geschrieben.echo-e \a-e 

Um nur ein BEL-Zeichen zu schreiben, schreiben Sie lieber printf '\a'.

Für den Kern dieser Frage macht das ohnehin keinen großen Unterschied. printf, like echowird auf seine Standardausgabe schreiben, was es schreiben muss.

Wenn Sie diesen Befehl ohne Umleitung in der Eingabeaufforderung einer interaktiven Shell eingeben, wird stdout von der Shell übernommen. Wenn die Shell von einem Terminalemulator wie xtermoder gestartet wurde screen, wurde der Dateideskriptor 1 (von xterm) auf einer /dev/pt<something>Gerätedatei geöffnet (siehe lsof -ad1 -p "$$"oder readlink -f /proc/self/fd/1unter Linux). Dies ist die Slave-Seite des Pseudoterminalpaars.

Das einzig Wichtige, was Sie hier darüber wissen müssen, ist, dass es sich um eine Art Kommunikationskanal handelt. Ein bisschen wie eine Leitung, nur dass sie ein paar zusätzliche Schnickschnack-Funktionen hat, die die Benutzerinteraktion erleichtern.

Wenn also printfdas BEL in diese Gerätedatei geschrieben wird, wird es an etwas am anderen Ende übertragen. In diesem xtermFall ist das der Terminalemulator selbst. Das BEL-Zeichen ist ein Steuerzeichen, das Terminals und Terminalemulatoren veranlasst, den Benutzer auf irgendeine Weise zu warnen ( \asteht für Alarm). Das kann ein hörbarer Piepton, ein Klingeln oder ein visuelles Blinken des Bildschirms oder beides sein. xtermverwendet XBell()dafür normalerweise den X11-API-Aufruf oder blinkt sein Fenster auf, wenn es für die Verwendung einer visuellen Glocke konfiguriert wurde. screenselbst würde das BEL einfach an denGastgeberTerminal(s), an das/die es angeschlossen ist und an dem/denen das Bildschirmfenster aktiv ist, oder geben Sie eine Terminal-BlitzSteuersequenz oder „Wuff, Wuff!!“-Meldung (sic), je nachdem, wie es konfiguriert wurde (siehe info screen vbell).

Wenn Sie sich außerhalb der Grafiksitzung auf einem PC mit Linux anmelden, wird fd 1 (von getty) zu einem /dev/tty<1-...>Gerät geöffnet. Hier implementiert der Kernel einen Terminalemulator und verwendet den Monitor für die Ausgabe und die Tastatur(en) für die Eingabe. Gleiches Prinzip, wenn printfdort BEL geschrieben wird, lässt der Kernel den PC-Lautsprecher piepen.

Wenn Sie diesen Befehl in der Eingabeaufforderung einer interaktiven Shell ausführen ssh, ist fd 1 auch ein Pseudoterminalgerät ( /dev/pt<something>), das diesmal vom SSH-Server gestartet wird, der die Login-Shell des Remote-Benutzers auf dem Remote-System gestartet hat. Am anderen Ende des Pseudoterminalpaars befindet sich der SSH-Server. Wenn der SSH-Server diesen BEL (oder irgendetwas anderes, was wichtig ist) empfängt, sendet er ihn über die verschlüsselte Verbindung an den SSH-Client, und der SSH-Client schreibt ihn in seine Standardausgabe, die ihn schließlich in das Terminalfenster bringt, in dem Sie sitzen.

In

printf '\a' > /dev/console

Die Shell öffnet die /dev/consoleDatei vor der Ausführung im Dateideskriptor 1 (stdout) printf.

Nun /dev/consoleist zumindest unter Linux die TTY-Gerätedatei, die zum Empfangen von Systemmeldungen gedacht ist. /dev/consoleleitet normalerweise auf ein anderes TTY-Gerät um. Auf dem PC ist dies standardmäßig die Datei, /dev/tty0die auf das aktuell aktive virtuelle Terminal verweist, aber das kann beim Booten mit dem console=/dev/anythingKernelparameter geändert werden (um console=/dev/ttyS0es beispielsweise zum ersten seriellen Gerät zu machen) und es kann sogar später (für den Ausgabeteil) mit geändert werden TIOCCONS ioctl()(siehe xterm -C).

In jedem Fall handelt es sich dabei um ein Terminal, das normalerweise an die Maschine selbst angeschlossen ist. Die Ausgabe eines BEL soll den Administrator dieser Maschine darauf aufmerksam machen, dass sie den Kanal verwendet, der zum Senden von Systemnachrichten an den Benutzer verwendet wird.

Um eine Nachricht an alle angemeldeten Benutzer zu schreiben, können Sie die wallAnwendung auch verwenden, oder die writeAnwendung nur an einen Benutzer (ein Endgerät), sofern dieser Benutzer diese Benachrichtigungen nicht deaktiviert hat (mit mesg n).

verwandte Informationen