【问题标题】:How to tell if running in a linux console versus an ssh session?如何判断是在 linux 控制台还是在 ssh 会话中运行?
【发布时间】:2011-02-23 21:10:32
【问题描述】:

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

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

提示赞赏。 :)

【问题讨论】:

  • 除了通过 SSH 连接之外,还有其他方法可以获得非 tty shell 会话。例如,现在在我的桌面上,我在 KDE 中使用 Konsole……我实际上在计算机上,但是当我运行 who 时它显示为 pty。出于您的目的,这是否算作控制台或“ssh”会话?也许您应该编辑您的问题以使其更清楚。
  • 我认为你在问两个不同的事情......实际的问题似乎是如何判断你是在本地 X 终端还是通过 ssh 会话运行。 “Linux 控制台”通常是指使用 [Ctrl+]Alt+F2 等访问的硬件控制台。如果 $TERM == "linux",则可以检测到后者。

标签: linux console tty


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不是 /dev/console,而是 /dev/tty[0-9],而 ssh 和 gnome-terminal 会话的名称类似于 /dev/pts/[0-9 ]+。结合 isatty(),您使用 ttyname() 的提示非常适合我需要做的事情。
    【解决方案3】:

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

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

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

    【讨论】:

    • wireshark 资源中的好消息!
    【解决方案4】:

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

    例如,SSH_CLIENTSSH_CONNECTION 环境变量都在我的机器上设置,而不管使用的是 SSH 客户端。

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

    【讨论】:

    • 该死的,发育性的疯狂打败了我;)不应该花这么长时间写...
    【解决方案5】:

    丑陋,但有效:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-14
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2015-03-28
      • 2023-03-07
      • 2021-10-15
      相关资源
      最近更新 更多