如何判断是否在Linux控制台运行与ssh会话?

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

我需要调用哪些C API来区分这两种情况? 我想我必须看看“tty / pts”信息(比如我运行“ps axf”时看到的信息),但我不确定这是否是最好的解决scheme,也不知道要调用哪个API获取这些信息。

暗示赞赏。 🙂

Solutions Collecting From Web of "如何判断是否在Linux控制台运行与ssh会话?"

根据你的stdin检查ttyname(3)的返回值应该给你输入你的进程的终端的名字。

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

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

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

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

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

我会把环境变量看作是发生了什么的合理标志。 我不确定你想要什么C API,但是我确定存在。

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

检查机器上运行的SSH服务器的通用性是值得的。