2017-04-20 61 views
-2

我看到這個職位上計算器sftp server implementaion with Python需要得到運行

我試圖建立https://pypi.python.org/pypi/sftpserver蟒蛇SFTP服務器,但我似乎無法得到它的正常工作。

像上面的stackoverflow帖子,我想開發一種方法來連接ssh到交換機,我能夠使用paramiko,但是然後我需要能夠將文件/配置從交換機複製回窗口主機在哪裏我正在運行我的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 LISTENING 7012

代碼我目前使用我從以下考慮: https://gist.github.com/Girgitt/2df036f9e26dba1baaddf4c5845a20a2 所以簡而言之,我需要一個在python腳本的窗口上運行的運行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() 

回答

0

我想通了。我的密鑰文件

----- BEGIN PRIVATE KEY ----- MIEdksjdlfaj; slkdfj ......... ..... ----- END PRIVATE KEY ----- 就在裏面。

我不得不既改變

----- BEGIN RSA私鑰----- MIEdksjdlfaj; slkdfj ......... ..... - --- END RSA PRIVATE KEY -----

然後winscp提示它正常