如何检查是否通过ssh远程调用python脚本

如何检查是否通过ssh远程调用python脚本,python,linux,ssh,system,Python,Linux,Ssh,System,所以我正在编写一个命令行实用程序,我遇到了一个我很好奇的问题 该实用程序可以使用文件参数调用,也可以从sys.stdin读取。最初,我使用sys.stdin.isatty()来确定是否正在通过管道导入数据,但是,我发现如果我通过ssh server utility远程调用该实用程序,sys.stdin.isatty()将返回false,尽管没有实际的数据通过管道导入 作为一种解决方法,我使用-作为文件参数来强制读取stdin(例如:echo“data_here”| utility-f-),但我很

所以我正在编写一个命令行实用程序,我遇到了一个我很好奇的问题

该实用程序可以使用文件参数调用,也可以从
sys.stdin
读取。最初,我使用
sys.stdin.isatty()
来确定是否正在通过管道导入数据,但是,我发现如果我通过
ssh server utility
远程调用该实用程序,
sys.stdin.isatty()
将返回false,尽管没有实际的数据通过管道导入

作为一种解决方法,我使用
-
作为文件参数来强制读取stdin(例如:
echo“data_here”| utility-f-
),但我很想知道是否有可靠的方法来区分从进程获取数据的管道和仅因为调用是通过ssh而打开的管道之间的区别

系统编程不是我的专长,所以我非常感谢你们给我的任何帮助。

根据
SSH\u客户端
SSH\u TTY
环境变量应该声明。因此,以下代码应该可以工作:

import os

def running_ssh():
    return 'SSH_CLIENT' in os.environ or 'SSH_TTY' in os.environ

一个更完整的示例将检查父进程,以检查其中是否有
sshd
,这可能需要该模块。

通过检查您的环境,您可以判断是否正在通过SSH调用您。如果通过SSH连接调用您,将设置环境变量
SSH\u connection
SSH\u CLIENT
。您可以测试它们是否设置了,例如:

if "SSH_CONNECTION" in os.environ:
    # do something
另一个选项是,如果您想继续使用原来的
sys.stdin.isatty()
,那么可以为SSH连接分配一个伪tty。通常,默认情况下,如果您只是为交互式会话使用SSH,SSH会执行此操作,但如果您提供命令,则不会执行此操作。但是,在提供命令时,您可以通过传递
-t
标志强制它这样做:

ssh -t server utility
然而,我要提醒你不要做这两件事。正如您所看到的,尝试根据stdin是否为TTY来检测是否应该接受stdin的输入可能会导致一些令人惊讶的行为。如果用户希望在调试程序时以交互方式向您的程序提供输入,那么这也可能会让他们感到沮丧


添加显式
-
参数的方法使您得到的行为更加显式,也不那么令人惊讶。一些实用程序也只是使用缺少任何文件参数来表示从stdin读取,因此这也是一个不太令人惊讶的选择。

所有管道都是相同的,所以不要认为您可以。您可能需要查看进程组和父进程,但这变得非常糟糕。这会引发异常,因为这些变量未设置,不会返回布尔值。感谢您的回复!我确实可以使用
os.environ['SSH\u TTY']
来判断调用是否是远程SSH调用。但是,这无助于区分这两个调用之间的区别:
ssh-server-utility
echo“data”| ssh-server-utility
谢谢@BrianCampbell。我已经更新了示例。在JavaScript领域的时间太多了。谢谢,这就是我想要的。看来我会坚持我的解决办法。