当前位置:   article > 正文

python 探测远端服务器操作系统是否是 linux 并获取其系统版本和系统架构 不使用 lsb_release_python 远程查询操作系统状态

python 远程查询操作系统状态

如果远程服务器未安装lsb-release包,导致无法使用lsb_release -ds命令获取系统发行版及版本信息,您可以采用以下替代方法来获取这些信息:

  1. 读取 /etc/os-release 文件:大多数现代Linux发行版会在/etc/os-release文件中存储系统发行版和版本信息。您可以通过SSH连接到远程服务器并读取该文件的内容。

以下是修改后的Python脚本,不再使用lsb_release命令,而是直接读取/etc/os-release文件:

 

python

  1. import nmap
  2. import paramiko
  3. def detect_remote_os(ip_address):
  4. nm = nmap.PortScanner()
  5. nm.scan(ip_address, arguments='-O')
  6. try:
  7. os_details = nm[ip_address]['osmatch'][0]
  8. os_name = os_details['name']
  9. os_accuracy = os_details['accuracy']
  10. return os_name, os_accuracy
  11. except KeyError:
  12. return None, None
  13. def is_linux_os(os_name):
  14. return 'linux' in os_name.lower()
  15. def get_remote_system_info(ip_address, username, password):
  16. ssh = paramiko.SSHClient()
  17. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  18. ssh.connect(ip_address, username=username, password=password)
  19. try:
  20. # 获取系统发行版及版本信息
  21. stdin, stdout, stderr = ssh.exec_command('cat /etc/os-release')
  22. os_release_content = stdout.read().decode()
  23. # 解析 /etc/os-release 文件内容
  24. distro_info = {}
  25. for line in os_release_content.split('\n'):
  26. if '=' in line:
  27. key, value = line.strip().split('=', 1)
  28. distro_info[key] = value.strip('"').strip("'")
  29. distro_name = distro_info.get('NAME', '')
  30. distro_version = distro_info.get('VERSION', '')
  31. # 获取系统架构信息
  32. stdin, stdout, stderr = ssh.exec_command('uname -m')
  33. arch = stdout.read().decode().strip()
  34. return f"{distro_name} {distro_version}", arch
  35. finally:
  36. ssh.close()
  37. if __name__ == '__main__':
  38. target_ip = input("Enter the IP address of the remote server: ")
  39. username = input("Enter the SSH username for the remote server: ")
  40. password = input("Enter the SSH password for the remote server: ")
  41. os_name, os_accuracy = detect_remote_os(target_ip)
  42. if os_name is not None:
  43. is_linux = is_linux_os(os_name)
  44. if is_linux:
  45. print(f"The remote server is running Linux (Accuracy: {os_accuracy}%)")
  46. distro_version, arch = get_remote_system_info(target_ip, username, password)
  47. print(f"Remote system distribution and version: {distro_version}")
  48. print(f"Remote system architecture: {arch}")
  49. else:
  50. print(f"The remote server is NOT running Linux. Detected Operating System: {os_name} (Accuracy: {os_accuracy}%)")
  51. else:
  52. print("Failed to detect the operating system of the remote server.")

注意事项

  1. 远程命令执行:确保您有足够的权限在远程服务器上执行cat /etc/os-releaseuname -m命令。如果远程服务器设置了严格的权限控制,可能需要使用具有相应权限的用户账户进行连接。

  2. 错误处理:虽然/etc/os-release文件在大多数现代Linux发行版中是标准的,但仍有少数发行版可能使用不同的文件格式或位置存储系统信息。在实际使用中,您可能需要添加更完善的错误捕获和处理机制,以应对文件不存在、无法读取或其他异常情况。

实现效果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/914053
推荐阅读
相关标签
  

闽ICP备14008679号