需要运行 python sftp 服务器

joh*_*son 4 python sftp paramiko

我在 stackoverflow sftp server Implementaion with Python上看到了这篇文章

我尝试设置https://pypi.python.org/pypi/sftpserver,但我似乎无法让它正常工作。

就像上面的 stackoverflow 帖子一样,我正在尝试开发一种将 ssh 连接到交换机的方法,我可以使用 paramiko 来做到这一点,但随后我需要能够将文件/配置从交换机复制回我所在的 Windows 主机运行我的 python 脚本。我需要在我的 Windows 主机上运行一个基于 python 的 sftp 服务器,该服务器将接受来自任何 sftp 客户端(如交换机)的连接。所以我目前使用下面的代码在我的 Windows 主机上以 python 运行 sftp 服务器。我测试了来自另一台Windows主机的连接,我能够很好地远程登录到端口22,所以我知道Python的sftp服务器正在运行,当我从另一台Windows主机运行winscp时,它会建立连接,但随后超时。我可以设置一个 ftp python 服务器并使用 ftp 客户端进行连接,所以我知道我没有任何类型的网络问题。

当我在 python 中运行下面的 sftp 服务器时,不确定我做错了什么?我不知道我的密钥是否错误,我按照上面 sftpserver 链接中的步骤操作并运行“openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout /tmp/test_rsa.key”来创建我拥有的 ubuntu 主机的密钥。当我使用 winscp 进行连接时,我没有看到客户端需要任何用户名或密码。这是来自 Windows 的 netstat -aon 输出,因此它正在侦听 22 并从另一台主机远程登录到它。

活跃连接数

原始本地地址外部地址状态 PID TCP 0.0.0.0:22 0.0.0.0:0 监听 7012

我当前使用的代码取自以下内容: https: //gist.github.com/Girgitt/2df036f9e26dba1baaddf4c5845a20a2 所以简而言之,我需要一个在 python 脚本中在 windows 上运行的功能 sftp 服务器,然后使用任何非 python 组件,如 Winscp或者在 python 脚本中连接到在 Windows 上运行的 sftp 服务器的开关?

import time
import socket
import optparse
import sys
import textwrap
import os
import paramiko

from sftpserver.stub_sftp import StubServer, StubSFTPServer

import threading

HOST, PORT = 'localhost', 22
BACKLOG = 10

class ConnHandlerThd(threading.Thread):
    def __init__(self, conn, keyfile):
        threading.Thread.__init__(self)
        self._conn = conn
        self._keyfile = keyfile

    def run(self):
        host_key = paramiko.RSAKey.from_private_key_file(self._keyfile)
        transport = paramiko.Transport(self._conn)
        transport.add_server_key(host_key)
        transport.set_subsystem_handler(
            'sftp', paramiko.SFTPServer, StubSFTPServer)

        server = StubServer()
        transport.start_server(server=server)

        channel = transport.accept()
        while transport.is_active():
            time.sleep(1)


def start_server(host, port, keyfile, level):
    paramiko_level = getattr(paramiko.common, level)
    paramiko.common.logging.basicConfig(level=paramiko_level)

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    server_socket.bind((host, port))
    server_socket.listen(BACKLOG)

    while True:
        conn, addr = server_socket.accept()

        srv_thd = ConnHandlerThd(conn, keyfile)
        srv_thd.setDaemon(True)
        srv_thd.start()


def main():
    usage = """\
    usage: sftpserver [options]
    -k/--keyfile should be specified
    """
    parser = optparse.OptionParser(usage=textwrap.dedent(usage))
    parser.add_option(
        '--host', dest='host', default=HOST,
        help='listen on HOST [default: %default]')
    parser.add_option(
        '-p', '--port', dest='port', type='int', default=PORT,
        help='listen on PORT [default: %default]'
        )
    parser.add_option(
        '-l', '--level', dest='level', default='INFO',
        help='Debug level: WARNING, INFO, DEBUG [default: %default]'
        )
    parser.add_option(
        '-k', '--keyfile', dest='keyfile', metavar='FILE',
        help='Path to private key, for example /tmp/test_rsa.key'
        )

    options, args = parser.parse_args()
    options.keyfile = "C:\\test_rsa.key"

    if options.keyfile is None:
        parser.print_help()
        sys.exit(-1)

    start_server(options.host, options.port, options.keyfile, options.level)

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

joh*_*son 6

我想到了。我的密钥文件

-----开始私钥----- MIEdksjdlfaj;slkdfj......... -----结束私钥-----在其中。

我必须把两者都改为

-----开始 RSA 私钥 ----- MIEdksjdlfaj;slkdfj......... ..... -----结束 RSA 私钥 -----

然后winscp提示没问题