跳转到主要内容

模拟SSH服务器

项目描述

模拟SSH服务器

你...

  • 有一个测试需要SSH连接到服务器,但不想为测试设置一个服务器吗?

  • 认为monkeypatching听起来并不像听起来那么好吗?

  • 想要开发一个应用程序并需要一个返回预定义结果的模拟服务器?

这个包是为你准备的!

安装

pip install fake-ssh

使用

阻塞服务器

阻塞服务器通常用于开发目的。

只需编写自己的server.py文件

from typing import Optional
from fake_ssh import Server


def handler(command: str) -> Optional[str]:
    if command.startswith("ls"):
        return "file1\nfile2\n"
    elif command.startswith("echo"):
        return command[4:].strip() + "\n"

if __name__ == "__main__":
    Server(command_handler=handler, port=5050).run_blocking()

然后运行它

$ python3 server.py

在另一个终端中运行

$ ssh root@127.0.0.1 -p 5050 echo 42
42
                                                                         
$ ssh root@127.0.0.1 -p 5050 ls
file1
file2

(如果您被提示输入密码,可以留空)

注意您需要指定一个非标准端口(5050)。使用标准端口(22)需要root权限,可能不安全。

非阻塞服务器

非阻塞服务器通常用于测试。

此服务器在线程中运行,允许您并行运行一些测试。

import paramiko
import pytest

from fake_ssh import Server


def handler(command):
    if command == "ls":
        return "file1\nfile2\n"


@pytest.fixture
def server():
    with Server(command_handler=handler) as server:
        yield server


def my_ls(host, port):
    c = paramiko.SSHClient()
    c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    c.connect(hostname=host,
              port=port,
              username="root",
              password="",
              allow_agent=False,
              look_for_keys=False)
    return c.exec_command("ls")[1].read().decode().splitlines()


def test_ls(server):
    assert my_ls(server.host, server.port) == ["file1", "file2"]

由...