我正在python
中创建一个webshell,实际上,用户将通过Web服务器使用他最喜欢的shell。我的想法是创建一个subprocess.Popen
bash -i
并在webapp中创建两个函数read
和write
,分别读取stdout
或写入stdin
的{{1}}。
我用:
启动shellsubprocess
写作没问题,但是当我读取标准输出时,我没有读到用户输入:
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)
参数中的一个选项,强制它将输入添加到输出中吗?
PS:如果你想知道为什么我使用bash
来运行script
是因为单独运行bash
会导致bash
自行停止
python
尽管我还没弄清楚为什么会发生这种情况,我已经找到了如何防止它出现这个问题:Main Python Process is stopped using subprocess calls in SocketServer
答案 0 :(得分:0)
那么,有一种方法,比如
bash
参数中的一个选项,强制它将输入添加到输出中吗?
是:您可以使用-v
命令行选项(“在读取时打印shell输入行。”)。