如何判断在Linux控制台和ssh会话中运行?

时间:2010-05-25 19:55:33

标签: linux console tty

如果直接从linux控制台运行,我有一个需要表现不同的应用程序。因此,如果用户使用SSH连接以运行FooBar,或者用户走到控制台并直接登录以运行FooBar,我希望它能够做一些不同的事情。

我需要调用什么C API来说明这两种情况之间的区别?我在想我必须查看“tty / pts”信息(例如我在运行“ps axf”时看到的信息),但我不确定这是否是最佳解决方案,也不是要调用的API获取这些信息。

提示赞赏。 :)

5 个答案:

答案 0 :(得分:6)

根据您担心被欺骗的程度,可以轻松检查SSH_CLIENT和SSH_CONNECTION环境变量的存在与否,在这种情况下,您需要getenv函数。< / p>

答案 1 :(得分:5)

检查ttyname(3)对stdin的返回值应该为您提供进程输入的终端名称。

如果程序在控制台上运行(并且没有重定向它的输入),它将是/ dev / console。您还可以检查stdout以查看它是否已连接到/ dev / console - 查看哪种更适合您的使用方案。

答案 2 :(得分:4)

ttyname将告诉您连接到给定文件描述符的终端的名称;例如,ttyname(0)会告诉你stdin的终端。

如果输入或输出被重定向,这当然会失败。

除此之外,您可以检查各种环境变量(SSH_CONNECTIONSSH_CLIENTREMOTEHOSTDISPLAYSESSIONNAME)。 Wireshark具有检测它是否正在远程运行的逻辑,以便它不会捕获它生成的网络流量;您可能对其get_conn_cfilter函数用于实现此目的的逻辑感兴趣。

答案 3 :(得分:3)

我将环境变量看作是发生了什么的合理信号。我不确定你想要什么样的C API,但我确信它存在。

例如,无论使用何种SSH客户端,都会在我的计算机上设置SSH_CLIENTSSH_CONNECTION环境变量。

值得检查一下这些是基于机器上运行的SSH服务器的通用性。

答案 4 :(得分:0)

丑陋,但有效:

// don't force scripts to pause!
if (_isatty(_fileno(stdout)))
{
    _tprintf(_T("\nPress enter to continue..."));
    _gettc(stdin);
}