2017-02-17 14 views
1

私はボットを送るすべてのメッセージがシェルコマンド[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(sshftpなど)に送るインタラクティブなコマンドについて話しています。通常はパスワードを要求し、ユーザーが入力するまで待機します。 サブプロセスは、ttyの読み書きを許可していません。事実、私のbotにコマンドttyを送ると、それはnot a ttyと返答します。
さらに、いくつかのシェルコマンドはdinamicallyその出力を更新したり、いくつかのイベントが(たとえばping 8.8.8.8、またはgrep patternのために)起こるまで実行し続ける、と私はCtrl+CCtrl+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や他の言語で書くこともできます(もっと簡単な場合)。しかし、私はあなたに偏ってほしくない、私はあらゆる解決策に開放されている。変数に入力/出力を入れたら、メッセージを送信することは問題ではありません。

+0

明らかにttyを作成する必要があります。 'python subprocess tty'を検索すると、[this one](https://gist.github.com/thomasballinger/7979808)など、考えられるアイディアが得られます。 – larsks

+0

@larsksありがとうございます。私はそのスクリプトを実行しようとしましたが、それは私のためには機能しません。私がCtrl + Cを押すまで、無期限に入力のためにハングアップします。私を許してください、しかし私はかなりの騒ぎです。単にttyを作成するにはどうすればいいですか?私は多くの質問を読んだが、どれも役に立たなかった。 –

答えて

0

私は自分の質問に答えると私を許しますが、私が探していたものを正確に見つけました。私はそれをあなたと共有したいと思います。あなたが「シェルボット」をインストールして使用するための指示を見つけることができます上記のリンクで

https://jmendeth.com/blog/telegram-shell-bot/

。そこからgithubのソースコードにアクセスすることもできます。

Pythonではなくnode.jsで書かれていますが、それは私には完璧と思われます。それはオンザフライでメッセージを更新し、グラフィカルコマンドを実行することもできます。

P.S.あなたはボットを介してvimを実行することもできます!

関連する問題