2010-05-25 53 views
6

我有一個應用程序,如果直接從Linux控制檯運行,需要採取不同的行爲。因此,如果用戶使用SSH連接到運行FooBar,或者用戶走到控制檯並直接登錄來運行FooBar,我希望它做一些不同的事情。如何判斷是否在Linux控制檯中運行而不是在ssh會話中運行?

我需要調用哪些C API來區分這兩種情況?我想我必須看看「tty/pts」信息(比如我運行「ps axf」時看到的信息),但我不確定這是否是最佳解決方案,也不知道要調用哪個API獲取這些信息。

提示讚賞。 :)

+0

還有其他方法可以獲得非tty shell會話,而不是通過SSH進行連接。例如,現在在我的桌面上,我在KDE中使用了Konsole ......我身體上在電腦上,但是當我運行「who」時顯示爲pty。這會算作一個控制檯還是「ssh」會話?也許你應該編輯你的問題更清楚。 – rmeador 2010-05-25 20:12:39

+0

我想你是在問兩個不同的事情......真正的問題似乎是如何判斷你是在本地X終端還是通過ssh會話運行。 「Linux控制檯」通常意味着使用[Ctrl +] Alt + F2等訪問硬件控制檯。如果$ TERM ==「linux」,則可以檢測到後者。 – 2012-10-29 19:20:47

回答

5

根據你的stdin檢查ttyname(3)的返回值應該給你提供你的進程輸入的終端的名字。

如果程序在控制檯上運行(並且沒有輸入重定向),它將成爲/ dev/console。您還可以檢查stdout以查看它是否連接到/ dev/console - 請參閱哪個更適合您的使用場景。

+5

它不是/ dev/console,而是/ dev/tty [0-9],而ssh和gnome-terminal會話顯示名稱如/ dev/pts/[0-9] +。結合isatty(),你使用ttyname()的提示對我需要做的事情非常有用。 – 2010-05-25 21:35:41

6

根據您擔心被欺騙的程度,可以輕鬆檢查是否存在SSH_CLIENT和SSH_CONNECTION環境變量,在這種情況下,您需要getenv函數。

3

我會將環境變量看作是發生了什麼的合理標志。我不確定你想要什麼C API,但我確信存在。

例如,無論使用哪個SSH客戶端,我的機器上都會設置SSH_CLIENTSSH_CONNECTION環境變量。

可能值得檢查這些基於運行在計算機上的SSH服務器的通用性。

+0

該死的,developmentalinsanity打敗了我;)不應該花很長時間寫作...... – Darien 2010-05-25 20:03:14

4

ttyname會告訴你連接到給定文件描述符的終端的名稱;例如,ttyname(0)會告訴你stdin的終端。

如果輸入或輸出被重定向,這當然會失敗。

除非,你可以檢查各種環境變量(SSH_CONNECTIONSSH_CLIENTREMOTEHOSTDISPLAYSESSIONNAME)。 Wireshark具有邏輯來檢測它是否正在遠程運行,以便它不捕獲它生成的網絡流量;你可能會對它的get_conn_cfilter函數用來實現這個邏輯感興趣。

+1

在wireshark來源好抓! – ivans 2010-05-25 20:14:37

相關問題