如果直接从 linux 控制台运行,我有一个应用程序需要表现不同。因此,如果用户使用 SSH 连接来运行 FooBar,或者用户走到控制台并直接登录以运行 FooBar,我希望它做一些不同的事情。
我需要调用什么 C API 来区分这两种情况?我在想我必须查看“tty/pts”信息(例如我在运行“ps axf”时看到的信息),但我不确定这是否是最佳解决方案,也不确定要调用什么 API获取该信息。
提示赞赏。:)
根据您担心它被欺骗的程度,一个简单的检查将是 SSH_CLIENT 和 SSH_CONNECTION 环境变量的存在/不存在,在这种情况下,您需要该getenv
功能。
根据您的标准输入检查 ttyname(3) 的返回值应该会给您提供进程输入的终端的名称。
如果程序正在控制台上运行(并且没有重定向输入),它将是 /dev/console。您还可以检查 stdout 以查看它是否连接到 /dev/console - 看看哪个更适合您的使用场景。
ttyname将告诉您连接到给定文件描述符的终端名称;例如,ttyname(0)
会告诉你标准输入的终端。
如果输入或输出被重定向,这当然会失败。
除此之外,您可以检查各种环境变量(SSH_CONNECTION
, SSH_CLIENT
, REMOTEHOST
, DISPLAY
, SESSIONNAME
)。 Wireshark有逻辑来检测它是否正在远程运行,这样它就不会捕获它产生的网络流量;您可能对其get_conn_cfilter函数用于实现此功能的逻辑感兴趣。
我会将环境变量视为正在发生的事情的合理迹象。我不确定你想要什么 C API,但我确定存在一个。
例如,无论使用什么 SSH 客户端,我的机器上都设置了SSH_CLIENT
或环境变量。SSH_CONNECTION
根据机器上运行的 SSH 服务器,检查它们的通用性可能是值得的。
丑陋,但有效:
// don't force scripts to pause!
if (_isatty(_fileno(stdout)))
{
_tprintf(_T("\nPress enter to continue..."));
_gettc(stdin);
}