8

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

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

提示赞赏。:)

4

5 回答 5

8

根据您担心它被欺骗的程度,一个简单的检查将是 SSH_CLIENT 和 SSH_CONNECTION 环境变量的存在/不存在,在这种情况下,您需要该getenv功能。

于 2010-05-25T20:00:28.137 回答
6

根据您的标准输入检查 ttyname(3) 的返回值应该会给您提供进程输入的终端的名称。

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

于 2010-05-25T20:06:20.040 回答
5

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

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

除此之外,您可以检查各种环境变量(SSH_CONNECTION, SSH_CLIENT, REMOTEHOST, DISPLAY, SESSIONNAME)。 Wireshark有逻辑来检测它是否正在远程运行,这样它就不会捕获它产生的网络流量;您可能对其get_conn_cfilter函数用于实现此功能的逻辑感兴趣。

于 2010-05-25T20:10:59.090 回答
3

我会将环境变量视为正在发生的事情的合理迹象。我不确定你想要什么 C API,但我确定存在一个。

例如,无论使用什么 SSH 客户端,我的机器上都设置了SSH_CLIENT或环境变量。SSH_CONNECTION

根据机器上运行的 SSH 服务器,检查它们的通用性可能是值得的。

于 2010-05-25T20:02:28.040 回答
0

丑陋,但有效:

// don't force scripts to pause!
if (_isatty(_fileno(stdout)))
{
    _tprintf(_T("\nPress enter to continue..."));
    _gettc(stdin);
}
于 2019-01-30T15:57:24.497 回答