我看到這個職位上計算器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()