私はボットを送るすべてのメッセージがシェルコマンド[1]として解釈されるように、私のラズベリーパイを制御するテレグラムボットのプログラムを書こうとしています。 [2]。対話シェルを使ってラズベリーパイを制御する電報ボット
ラズベリーパイはバージョン2のモデルBで、Arch Linux ARMを実行します。このプログラムはPython 3.6.0でモジュールTelepotで書かれ、Piから実行されます。
これまでのところ、私はこのように、コマンドを実行するために、モジュールにサブプロセスを使用している:
# Execute a shell command (assuming that the message received is «text»)
P = subprocess.Popen(text, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
# Store the output and the error
(output, error) = P.communicate()
# Send a message with the output
if str(output) != "b''":
bot.sendMessage(my_id, output)
# And another message with the error
if str(error) != "b''":
bot.sendMessage(my_id, error)
ボットはうまく動作しますが、問題は私のようなすべてのコマンドを実行できないということです私は本当の殻になります。私はSTDOUTをバイパスし、その出力を直接tty(ssh
、ftp
など)に送るインタラクティブなコマンドについて話しています。通常はパスワードを要求し、ユーザーが入力するまで待機します。 サブプロセスは、ttyの読み書きを許可していません。事実、私のbotにコマンドtty
を送ると、それはnot a tty
と返答します。
さらに、いくつかのシェルコマンドはdinamicallyその出力を更新したり、いくつかのイベントが(たとえばping 8.8.8.8
、またはgrep pattern
のために)起こるまで実行し続ける、と私はCtrl+C
かCtrl+D
送信することはできませんので、それらを再現していないどちらに成功しませんでした。 pingの出力をファイルにリダイレクトすることは可能です([sudo] Password for user:
をリダイレクトすることはできません)ので、この2番目の方法は別の問題です。この場合、シェルに入力を送ることができません。
また、オプションとして、ボットがパイプ、リダイレクト、グロブを理解できると楽しいでしょう。
これらの問題に対応するものは、はシェルでと対話できないということです。私はそれらのすべてに対する解決策は単なるものだと信じています。
私はそれを使って対話型シェルコマンドを実行できるようなボットプログラムを広く実装することができますか?
私が達成したい最終的な結果は、(私とボット間の会話の形で)での例:
ミー:PWD
ボット:/ホーム/ユーザー/ some /ディレクトリ
Me:sudo chmod 777ファイル。TXT
ボット:[sudoの]ユーザのパスワード:
ミー:QWERTY
ミー:SSHユーザー@ホスト
ボット:ユーザー@ host'sパスワード:
Me:qwerty2
ボット:ホストへようこそ...
または
私:猫
私:こんにちは
ボット:こんにちは
ミー:試験
ボット:試験
ミー:Ctrlキー+ D
P.S.
私はpexpectモジュールをPython用に試しましたが、特定の出力が期待できないので、それほど良くないと思います。私はシェルが私に与えるものを手に入れたい。 (おそらく、わたしが知らないものをする方法があるでしょうか?)
fifoファイルを使ってみましたが、ttyではなくSTDINとSTDOUTに接続されているので動作しません。
[1]例:私はメッセージpwd
を送り、ボットは/working/directory
と答えます。
[2]実際には、sshなどを使用できます。しかし、私が興味をそそられているのは、追加のソフトウェアをインストールすることなく、Linux、Windows、Androidなどのリクエストを実行するマシンのオペレーティングシステムとは独立して動作するということです(Telegramをインストールしなくても、 。
[3]問題は、スクリプトを使用してttyに直接接続するにはどうすればよいのでしょうか?スクリプトは、bashや他の言語で書くこともできます(もっと簡単な場合)。しかし、私はあなたに偏ってほしくない、私はあらゆる解決策に開放されている。変数に入力/出力を入れたら、メッセージを送信することは問題ではありません。
明らかにttyを作成する必要があります。 'python subprocess tty'を検索すると、[this one](https://gist.github.com/thomasballinger/7979808)など、考えられるアイディアが得られます。 – larsks
@larsksありがとうございます。私はそのスクリプトを実行しようとしましたが、それは私のためには機能しません。私がCtrl + Cを押すまで、無期限に入力のためにハングアップします。私を許してください、しかし私はかなりの騒ぎです。単にttyを作成するにはどうすればいいですか?私は多くの質問を読んだが、どれも役に立たなかった。 –