私の目標は Linuxは
- を自動化することであるが相互に作用使用した後にbashスクリプトに制御を戻すない期待します私はrootアクセスが必要なので、私はログインを期待して使用しています。つまり"su"を送信し、 "Password:"を期待して、 "を送ってください。
- 次に、expectスクリプトを呼び出したbashスクリプトに制御権を戻し、rootとしてログインしたさまざまなSSHコマンドを実行したいと思います。
これは可能ですか、それともすべてを期待通りに行う必要がありますか?
私の目標は Linuxは
これは可能ですか、それともすべてを期待通りに行う必要がありますか?
問題は、さまざまなコミュニケーション層が残っていなければならないということです。あなたが気づいている以上に多くのことが起こっています。
あなたのモデルがこれです:
+------+ expect +-----+ su +----------------+
| bash | ---------> | ssh | -----> | remote-context |
+------+ +-----+ +----------------+
だが、実際に起こっているのはこれです:
+----------------+ +----------------------+ +----------------------------+
| local terminal | | expect | | remote terminal |
| | | +------------------+ | | +------------------------+ |
| +------+ | | | virtual terminal | | | | bash | |
| | bash | -----> | | | | | | +--------------------+ | |
| +------+ | | | +-----+ | | | | | su | | |
| | | | | ssh | ---------> | | | +----------------+ | | |
+----------------+ | | +-----+ | | | | | | remote context | | | |
| +------------------+ | | | | +----------------+ | | |
+----------------------+ | | +--------------------+ | |
| +------------------------+ |
+----------------------------+
またはそのような何か(私はネットワークで何ビットのほとんどを省略しましたが、例えば)。 のレイヤリングが行われていますが、そのほとんどはあなたが気付いていません。しかし、ssh
はexpect
の中で実行されているため(自動化機能を利用するために)、がexpect
で制御されているローカル仮想端末で実行されていることを意味します。 bash
は制御を直接取ることができません。は仮想端末のマスター側の方法を知らないので、とsshd
はとなります。
代わりに、コードの残りの部分を直接期待して書くか、引数として実行するコードを提供する必要があります(ある意味では、おそらくファイルから引っ張られます)。 send
。
は、その発信者からのテキストの行を読み取るためにgets stdin
を使用することができ、argv
変数から引数を取得する期待、そしてopen
/read
/close
は、ファイルの内容にプルします。
あなたはsu
の代替としてsudo
を知っていますか?これは、特定の要求元ユーザーに対して完全にパスワードなしの操作を許可するように構成することができます。これは、あまりにも大きなセキュリティホールを露出させることなく、システムの操作を可能にするのに役立ちます。それが動作たら何
ありがとうございました。私が直面している問題の大きな要約です。それらの提案のいくつかを行ってもらえますか? – mgibson
...予想外の方法で間違って行くことができ、より少ない部分を持って、この種のもの
:あなたはまたのような、自動化のためのより良い作品
ssh
の形式に切り替えを検討してください働いていない?私たちが見ることができるいくつかの証拠を示してください。デバッグが有効になっている状態でexpectを実行すると便利です( 'expect -d script.exp') –