0

で webshel​​l を作成しているpythonので、実際には、ユーザーは自分の好きなシェルを web サーバー経由で使用します。私の考えは、subprocess.Popenwithを作成し、 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: なぜ私がscriptrun を使用しているのか疑問に思われる場合は、単独でbash実行するとで停止するためです。bashpython

[1]+  Stopped                 python RPCServer.py

なぜそれが起こるのかはわかりませんが、この質問からそれを防ぐ方法を見つけました: Main Python Process is stopped using subprocess calls in SocketServer

4

1 に答える 1

0

bashそれで、パラメータのオプションのように、入力を出力に強制的に追加する方法はありますか?

はい:-vコマンドライン オプションを使用できます (「読み込まれたシェル入力行を出力します。」)。

于 2013-08-11T16:20:28.640 に答える