需要让python sftp服务器运行

时间:2017-04-20 01:14:39

标签: 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主机的连接,我能够telnet到端口22罚款所以我知道python的sftp服务器正在运行,当我从其他窗口主机运行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上监听,telnet到它可以在另一台主机上运行。

活动连接

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

我目前正在使用的代码,我从以下代码中获取: https://gist.github.com/Girgitt/2df036f9e26dba1baaddf4c5845a20a2 所以简而言之我需要一个在python脚本中运行在Windows上运行的sftp服务器,然后使用任何非python组件(如winscp或switch)连接到在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()

1 个答案:

答案 0 :(得分:0)

我明白了。我的密钥文件

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

我必须将两者都改为

-----开始RSA私钥----- MIEdksjdlfaj; slkdfj ......... ..... ----- END RSA私钥-----

然后winscp提示它没问题