為什麼“>/dev/console”用於遠端蜂鳴聲(回顯指令)

為什麼“>/dev/console”用於遠端蜂鳴聲(回顯指令)

我了解到這個命令:

echo -e "\a"

在本機系統上觸發蜂鳴聲,而此指令:

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

在遠端系統上觸發蜂鳴聲。

為什麼是這樣?該部分在做什麼>/dev/console

為什麼echo -e "\a"在遠端電腦上執行會在本機而不是遠端觸發蜂鳴聲?

為什麼「echo」-指令不喜歡 sudo ?

有類似OSI層的方案嗎?請向我提供一些外部文件。

我對將 stdout/stderr 重定向到文件只有基本的了解,但問題更可能是指“Gnu/Linux/Kernel”是如何設計的,以便要求重定向到

“ > /dev/console”用於發出遠程蜂鳴聲。

遠端是否echo "Hello World"需要重定向到 /dev/console ?

答案1

echo將其輸出寫入其標準輸出。這是它的檔案描述符 1。

對於echo -e '\a',根據echo實現的不同,將寫入一個 BEL 字元(ASCII 中的 0x7 位元組值),後面是 LF(又稱換行符),或-e \a後面-e 跟著 BEL 和 LF。

要僅編寫 BEL 字符,您寧願編寫printf '\a'.

無論如何,這對這個問題的核心沒有太大影響。printf,就像echo將其必須寫入其標準輸出的內容寫入。

如果您在互動式 shell 的提示字元下輸入該命令而不進行重定向,則 stdout 將從 shell 繼承。如果 shell 是由終端模擬器(如xterm或 )啟動的screen,則檔案描述符 1 將在裝置檔案xterm/dev/pt<something>(請參閱Linux 上的lsof -ad1 -p "$$"或)開啟(由 ) readlink -f /proc/self/fd/1。這將是偽終端對的從屬端。

這裡唯一需要了解的是它是某種溝通管道。有點像管道,只不過它有更多有助於用戶互動的花哨功能。

因此,當printf將 BEL 寫入該裝置檔案時,會發生將其傳輸到另一端的情況。在這種xterm情況下,那就是終端模擬器本身。 BEL 字符是一個控製字符,使終端和終端模擬器以某種方式警告使用者(\a用於警告)。這可以是可聽見的蜂鳴聲、提示音或螢幕的視覺閃爍,或兩者兼而有之。xterm通常會使用XBell()X11 API 調用,或者如果已配置為使用可視鈴聲,則閃爍其視窗。screen它本身會簡單地將 BEL 轉發給主持人它所連接的終端以及該螢幕視窗處於活動狀態或發出終端的位置閃光控制序列或“Wuff,Wuff!!” (原文如此)訊息取決於它的配置方式(請參閱info screen vbell)。

如果您在圖形會話之外登入執行 Linux 的 PC,則 fd 1 將已(由getty)開啟至/dev/tty<1-...>裝置。在這裡,核心實現了終端模擬器並使用監視器進行輸出,使用鍵盤輸入。同樣的原理,當printf在那裡寫入 BEL 時,核心會讓 PC 揚聲器發出蜂鳴聲。

當您在互動式 shell 的提示字元下執行該命令時ssh,fd 1 也將是一個偽終端設備 ( /dev/pt<something>),這次由 ssh 伺服器啟動,該伺服器在遠端系統上啟動遠端使用者的登入 shell。偽終端對的另一端是 ssh 伺服器。當收到該 BEL(或任何其他相關內容)時,ssh 伺服器會透過加密連線將其傳送至 ssh 用戶端,然後 ssh 用戶端將其寫入其標準輸出,最終將其傳送至您所在的終端視窗在。

printf '\a' > /dev/console

shell/dev/console在運作之前開啟檔案描述子 1 (stdout) 上的檔案printf

現在/dev/console,至少在 Linux 上,是用於接收系統訊息的 tty 裝置檔案。/dev/console通常會重定向到另一個 tty 設備。在 PC 上,預設情況下,它/dev/tty0指向當前活動的虛擬終端,但可以在啟動時使用console=/dev/anything核心參數更改它(例如console=/dev/ttyS0使其成為第一個串行設備),甚至可以更改它(對於輸出部分)稍後使用TIOCCONS ioctl()(參見xterm -C)。

無論如何,這將是一個通常連接到機器本身的終端。因此,輸出 BEL 旨在提醒該電腦的管理員,因為它正在使用用於向使用者發送系統訊息的通道。

要向所有登入的用戶寫入訊息,您還可以使用該wall應用程序,或write僅向一個用戶(一台終端設備)使用該應用程序,前提是這些用戶尚未停用這些通知(帶有mesg n

相關內容