Python中如何通过SSH登录并获取服务器Banner信息

Python中如何通过SSH登录并获取服务器Banner信息

11 回复

帖子回复:

paramiko 库就行,直接连SSH,抓Banner信息。下面给个完整例子:

import paramiko
import socket

def get_ssh_banner(hostname, port=22, timeout=5):
    """
    获取SSH服务器的Banner信息
    
    Args:
        hostname: 服务器地址
        port: SSH端口,默认22
        timeout: 连接超时时间,默认5秒
    """
    try:
        # 创建socket连接
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(timeout)
        sock.connect((hostname, port))
        
        # 创建SSH客户端
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        
        # 获取Banner信息
        transport = paramiko.Transport(sock)
        transport.start_client()
        banner = transport.get_remote_server_key().get_name()
        
        print(f"服务器: {hostname}:{port}")
        print(f"Banner信息: {banner}")
        print(f"完整响应: {transport.remote_version}")
        
        # 清理连接
        transport.close()
        sock.close()
        
        return {
            'host': hostname,
            'port': port,
            'banner': banner,
            'full_version': transport.remote_version
        }
        
    except socket.timeout:
        print(f"连接超时: {hostname}:{port}")
    except ConnectionRefusedError:
        print(f"连接被拒绝: {hostname}:{port}")
    except Exception as e:
        print(f"错误: {str(e)}")
    return None

# 使用示例
if __name__ == "__main__":
    # 测试连接
    result = get_ssh_banner("example.com", 22)
    
    # 如果需要认证登录后再获取信息
    def ssh_login_and_get_info(hostname, username, password, port=22):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        
        try:
            ssh.connect(hostname, port, username, password, timeout=5)
            print("登录成功")
            
            # 执行命令获取系统信息
            stdin, stdout, stderr = ssh.exec_command("uname -a")
            system_info = stdout.read().decode().strip()
            print(f"系统信息: {system_info}")
            
            ssh.close()
            return system_info
        except paramiko.AuthenticationException:
            print("认证失败")
        except Exception as e:
            print(f"连接错误: {str(e)}")
    
    # 登录示例(需要有效凭证)
    # ssh_login_and_get_info("example.com", "username", "password")

代码说明:

  1. 先用socket建立TCP连接,这样能控制超时
  2. 通过paramiko.Transport获取SSH协议层面的Banner
  3. get_remote_server_key()拿到服务器密钥信息
  4. remote_version属性包含完整的SSH版本字符串

安装依赖:

pip install paramiko

要点:

  • 这个方法不依赖认证,直接获取SSH服务信息
  • 如果服务器改了默认端口,记得改port参数
  • 超时设置避免长时间等待

一句话建议: 用paramiko的Transport直接拿Banner最可靠。

大佬 我看过了 没看懂 你能给个例子吗

你也太懒了

老铁,扎心了,自己好好看看吧。。。。学习一下。。

我主要是看不懂英文 要用翻译软件一点点弄

程序员看不懂英文也太说不过去了。

带上你的 Chrome+Google Tranlate 插件,一次把整个网页译了不就得了

from paramiko import SSHClient
client = SSHClient()
client.load_system_host_keys()
client.connect(‘192.168.2.225’,22,‘user’,‘passwd’)
stdin, stdout, stderr = client.exec_command(‘ls -l’)
for line in stdout:
print(’… ’ + line.strip(’\n’))

回到顶部