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

Sté*_*ane 8 linux console tty

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

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

提示赞赏.:)

dev*_*ity 7

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


iva*_*ans 5

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

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

  • 它不是/ dev/console,而是/ dev/tty [0-9],而ssh和gnome-terminal会话显示的名称如/ dev/pts/[0-9] +.结合isatty(),您使用ttyname()的提示非常适合我需要做的事情. (5认同)

Jos*_*ley 5

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

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

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