Lah*_*rah 2 python linux ssh system
所以我在写命令行实用程序,却遇到了一个我很好奇的问题。
该实用程序可以使用文件参数调用,也可以从中读取sys.stdin。本来我是sys.stdin.isatty()想弄清楚是否正在传输数据,但是,我发现,即使没有实际数据传输,如果我通过远程调用该实用程序ssh server utility,sys.stdin.isatty()也会返回false。
作为一种解决方法,我将其-用作文件参数以强制从stdin中进行读取(例如:)echo "data_here" | utility -f -,但我很好奇是否有可靠的方法来区分从进程获取数据的管道与仅从管道获取数据的管道之间的区别打开,因为调用是通过ssh进行的。
系统编程不是我的专长,因此,我感谢你们能提供的任何帮助。
您可以通过检查环境来判断是否正在通过SSH进行调用。如果通过SSH连接调用您SSH_CONNECTION,SSH_CLIENT则会设置环境变量和。您可以测试是否设置了它们,例如:
if "SSH_CONNECTION" in os.environ:
# do something
Run Code Online (Sandbox Code Playgroud)
如果您只想使用的原始方法,则另一个选择sys.stdin.isatty()是为SSH连接分配一个伪tty。通常,如果您仅通过SSH进行交互式会话,则SSH默认情况下会执行此操作,但如果您提供命令,则不会。但是,在传递命令时,可以通过传递-t标志来强制它这样做:
ssh -t server utility
Run Code Online (Sandbox Code Playgroud)
但是,我会警告您不要执行任何一种操作。如您所见,尝试根据是否为TTY来检测是否应接受来自stdin的输入,这可能会导致某些令人惊讶的行为。如果用户想要一种在调试某些东西时交互式地向程序提供输入的方法,也可能使用户感到沮丧。
添加显式-参数的方法使它变得更显式,也就不足为奇了。一些实用程序还只是使用缺少任何文件参数来表示要从stdin读取数据,因此这也不是什么令人惊讶的选择。