【问题标题】:Efficient way of finding remote host's operating system using Python使用 Python 查找远程主机操作系统的有效方法
【发布时间】:2017-10-10 14:36:17
【问题描述】:

如何使用 python 识别远程主机操作系统(Unix/Windows)?我发现的一种解决方案是检查端口 22 是否打开,但后来知道某些 Windows 主机也打开了端口 22,但连接被拒绝。请让我知道做同样事情的有效方法。提前致谢。

【问题讨论】:

  • 作为一般答案,您不能。我能想到的唯一方法是识别用 Python 编写的服务(服务器为 Django 网站提供服务,或托管用 Python 编写的应用程序)。但是,这很有效,因为您知道这样的应用程序使用 Python。它可能只是用另一种语言编码的相同,你无法区分。这是内部实现细节。
  • 您是否有权访问这些远程服务器,或者您是否尝试通过 SSH 等广告服务确定操作系统?
  • 一个常用的工具是Nmap。我想作为一种解决方法,您可以在其上编写一个 Python 包装器,或者查看[Python]: python-nmap
  • 我认为这是一个公平的问题,但我怀疑是否有一个令人满意的答案。如果您可以实际访问主机上运行的某些服务,那么也许您有机会。但是,如果您必须仅从打开哪些 IP 端口来解决问题,我认为您不走运。无论如何,许多系统将其端口隐藏在软件防火墙后面。您将不得不尝试从操作系统对 ICMP“ping”的响应方式中找出操作系统,这几乎是不可能的。
  • 这个问题太宽泛了,而且不是 Python 特有的。您可以尝试根据 TCP/IP 堆栈实现的细节(默认窗口大小、默认标志和极端情况下的响应等)来猜测远程操作系统。有一些工具可以尝试为您做到这一点(就像提到的nmap,见 -O option),但是关于如何做的一般性讨论远远超出了本网站的范围。

标签: python linux windows remote-access remote-server


【解决方案1】:

出于安全原因,大多数操作系统不会通过网络发布信息。虽然诸如 nmap 之类的工具可以通过扫描网络上的端口来推断远程系统上运行的操作系统,但可靠地了解操作系统的唯一方法是登录到系统。在许多情况下,操作系统将作为登录过程的一部分报告,因此通过网络建立连接就足以确定操作系统。在远程系统上运行“uname -a”也将检索 linux 系统上的操作系统类型。

这将从 HOST 中检索欢迎字符串,该字符串通常包括操作系统类型。用有效的用户名代替 UNAME,用主机名代替 HOST。

#!/usr/bin/env python3 导入系统 导入子流程 CMD="uname -a" conn = subprocess.Popen(["ssh", "UNAME@HOST", CMD], 壳=假, 标准输出=子进程.PIPE, 标准错误=子进程.PIPE) res = conn.stdout.readlines() 打印(分辨率)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2019-04-23
    • 2015-01-25
    • 2014-04-01
    • 2019-10-05
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多