で webshell を作成しているpython
ので、実際には、ユーザーは自分の好きなシェルを web サーバー経由で使用します。私の考えは、subprocess.Popen
withを作成し、 bash -i
2 つの関数をread
作成write
し、webapp でそれぞれ読み取りstdout
または書き込みを行うstdin
ことですsubprocess
。
シェルを次のように開始します。
p = subprocess.Popen(["script","-f","-c","bash -i -l"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
書き込みはOKですが、標準出力を読むと、ユーザーの入力を読みません:
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)
ユーザー入力を出力に追加してエコーを強制することもできますが、ユーザーがエコーを防止するプログラム (パスワード入力など) を使用すると、ユーザー入力が常に Web ページに表示されるため、あまりエレガントではありません。
bash
それで、パラメータのオプションのように、入力を出力に強制的に追加する方法はありますか?
PS: なぜ私がscript
run を使用しているのか疑問に思われる場合は、単独でbash
実行するとで停止するためです。bash
python
[1]+ Stopped python RPCServer.py
なぜそれが起こるのかはわかりませんが、この質問からそれを防ぐ方法を見つけました: Main Python Process is stopped using subprocess calls in SocketServer