不,这不是家庭作业的一部分
我正在开发一个项目,我需要模拟在远程docker容器中执行的shell
命令。我能够获得与容器的连接,该连接是OpenSSL
连接和socket
。
当我执行command="ls"
之类的命令时,我能够用read()
读取输出:
def read(self, socket, n=4096):
"""
Return `n` bytes of data from the Stream, or None at the end of the stream
:param n:
:return:
"""
while True:
try:
if hasattr(socket, 'recv'):
return socket.recv(n)
return os.read(socket.fileno(), n)
except Exception, e:
print e
所以例如:
container = self.client.create_container()
exec_id = self.client.exec_create(container, command, tty=True)
socket = self.client.exec_start(exec_id=exec_id, tty=True, stream=True)
response = self.read(socket)
我可以得到以下输出:
bin openssl
etc share
include
lib
license-eula.txt var
然而,在执行诸如/bin/bash
之类的命令时,事情变得更有趣。因此,在这种情况下,我应该保持与连接的交互,从stdin
获取输入,从套接字写入和读取...我确实有办法调整终端的大小,所以这不是我最关心的问题。我的问题是:如何通过套接字连接模拟终端?我知道dockerpty
,但由于tls
连接(Here's the ticket I created),它无法在我的设置中使用。