【发布时间】:2017-12-03 14:46:42
【问题描述】:
我正在尝试使用paramiko 实现一个(本地伪造)服务器,它响应自定义命令,就像用于测试目的的原始命令一样。主要从提供的demo server复制,我设法想出了这个自定义方法来处理通过paramiko.ServerInterface实现的服务器的exec_requests:
def check_channel_exec_request(self,channel,command):
print("User wants to execute '%s'" %(command))
comm_main, comm_add = command.decode().split(sep=" ",maxsplit=1)
if comm_main in self.allowed_commands:
chout = channel.makefile("w")
subprocess.Popen(command,stdout=chout)
return True
else:
return False
服务器运行后通过:
PORT = 50007 # The same port as used by the server
HOST = 'localhost'
host_key = paramiko.RSAKey(filename = <FILEPATH>)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((HOST,PORT))
sock.listen(1)
conn, addr = sock.accept() # Connected!
with conn:
trans = paramiko.Transport(conn)
trans.add_server_key(host_key)
trans.set_subsystem_handler("job",JobHandler)
server = FakeCluster() # Custom class sublassing paramiko.ServerInterface
trans.start_server(server=server)
chan = trans.accept() # Accept authentication from client
while trans.is_active(): # Do not close until inactive
time.sleep(1)
chan.close()
客户端会尝试以下列方式执行echo 123:
PORT = 50007 # The same port as used by the server
HOST = 'localhost'
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.bind((HOST,PORT))
ssh = paramiko.client.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(HOST, PORT,username=<USERNAME>,password=<PASSWORD>)
ssh.exec_command("echo 123")
现在,我在尝试执行 subprocess 和 'ChannelFile' has no attribute 'fileno' 时遇到 错误。此外,我想知道以后如何将 python 脚本作为exec_command 调用的自定义命令执行。 (也许通过调用调用 python 脚本的批处理文件?)
【问题讨论】:
-
找到
fileno错误here的解决方案/解释
标签: python python-3.x subprocess paramiko