2010-05-25 55 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

相关问题