0

我正在制作一个 webshel​​l python,所以实际上,用户将通过 web 服务器使用他最喜欢的 shell。我的想法是创建一个subprocess.Popenwith并在 webapp 中创建bash -i 两个函数,分别读取或写入.readwritestdoutstdinsubprocess

我以以下方式启动外壳:

p = subprocess.Popen(["script","-f","-c","bash -i -l"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

写作还可以,但是当我阅读标准输出时,我没有阅读用户键入的内容:

        while select.select([p.stdout],[],[],0)[0]!=[] or select.select([p.stderr],[],[],0)[0]!=[]:
            if(select.select([p.stdout],[],[],0)[0]!=[]): data+=p.stdout.read(1)
            if(select.select([p.stderr],[],[],0)[0]!=[]): data+=p.stderr.read(1)

我可以强制回显将用户输入添加到输出,但这不是很优雅,因为如果用户使用一些阻止回显的程序(如密码输入),用户输入将始终显示在网页中。

那么,有一种方法,比如bash参数中的选项,可以强制将输入添加到输出中?


PS:如果你想知道我为什么用script跑步bash是因为bash单独跑步会导致python自己停止

[1]+  Stopped                 python RPCServer.py

虽然我还没有弄清楚为什么会发生这种情况,但我已经找到了如何防止它出现这个问题:Main Python Process is stop using subprocess calls in SocketServer

4

1 回答 1

0

那么,有一种方法,比如bash参数中的选项,可以强制将输入添加到输出中?

是的:您可以使用-v命令行选项(“在读取 shell 输入行时打印它们。”)。

于 2013-08-11T16:20:28.640 回答