sftp的服务器实现工作得很好,但现在我想使用它从客户端执行额外的命令
该代码与sftp服务器一样工作良好,但我不知道如何扩展它以执行命令
正在使用:设置子系统\u处理程序正在使用sftp,使用命令失败
想法
工作示例:sftp-p3376-i key.fileuser1@localhost
失败的示例:ssh-p3376-i key.fileuser1@localhostls
class StubServer (ServerInterface, ):
def check_auth_publickey(self, username, key):
return paramiko.AUTH_SUCCESSFUL
def check_channel_request(self, kind, chanid):
return OPEN_SUCCEEDED
def get_allowed_auths(self, username):
return "publickey"
def check_channel_exec_request ( self, channel, command ):
print ( f'....> check_channel_exec_request commmand: {command}' )
return True
class ConnHandlerThd(threading.Thread):
def __init__(self, conn, addr, serverkeyfile ):
threading.Thread.__init__(self)
self._conn = conn
self._addr = addr
self._serverkeyfile = serverkeyfile
def run(self):
server_key = paramiko.RSAKey.from_private_key_file(self._serverkeyfile)
name = server_key.get_name()
transport = paramiko.Transport(self._conn)
transport.add_server_key(server_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, serverkeyfile, logfile=logfile, level=level, backlog=backlog ):
paramiko_level = getattr(paramiko.common, level)
paramiko.common.logging.basicConfig(level=paramiko_level)
paramiko.util.log_to_file ( logfile, level = 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, addr, serverkeyfile )
srv_thd.setDaemon(True)
srv_thd.start()
start_server(host=host, port=port, serverkeyfile=keyfile, level=level, logfile=logfile, backlog=backlog)
ssh ... command
使用exec
SSH通道,而不是sftp
因此,您也需要处理
exec
通道相关问题 更多 >
编程相关推荐