5

問題文

パスワード(スクリプトに記載されています)を聞かずにサーバーにアクセスし、そのサーバーでコマンドを実行したいと思います。

私のコード

#!/usr/bin/expect
spawn sudo su - <server_name>
expect "[sudo] password for chronicles:"
set Password "xxxxxxx"
send "$Password\r"
#set timeout 300
send "whoami\r"
send "ls -ltr\r"
expect eof

出力

invalid command name "sudo"
    while executing

制限

  • 環境変数を変更したり、.bash_profile/.bashrcを変更したりするためのアクセス権がありません。
  • suserver_nameコマンドは許可されていません
4

3 に答える 3

8

デビッドは、一般的にこれは悪い考えだというのは正しいです。それを行う、または同様のことを行う(たとえば、消灯管理のためにシリアルコンソールに自動的にログインする)理由は時々ありますが、この方法で行うことが理にかなっている理由については何も示されていません。

警告はさておき、はラインからではなく、ラインinvalid command nameから来ています。Expectは、に基づいています。これは、角括弧をコマンド置換を示す特殊文字として扱います。さらに、渡される値は固定文字列ではなくグロブパターンであり、角括弧もグロブの特殊文字です。したがって、あなたが探している答えは、それらの文字を2回引用することです。spawn[sudo]expecttcl[]expect[]

    expect "\\\[sudo\\\] password for chronicles:"

expectまた、パスワードを送信した後、ルートシェルプロンプトを待つために別の行を含める必要があることにも注意してください。

于 2012-08-20T09:57:26.947 に答える
2

パスワードの入力を求めずにサーバーにアクセスする安全な方法は、SSHを介したキー付きログインを使用することです。パスワードをプレーンテキストで指定しないでください。

あなたが単にグーグルであるならば、あなたはこれをする方法を説明する多くの記事を見つけるでしょう。パスワードなしのSSHログインは完全に良い説明です。

于 2012-08-20T09:15:13.370 に答える
1

[]では、「コマンド引用符」(「ツールコマンド言語」のように「コマンド」、Tcl略して)として解釈されTclます。

{}はで最も強力な引用Tclです。これを使用して、解釈を防ぐことができます。

expect {[sudo] password for chronicles:}

もちろん、省略してもかまいません[sudo]

expect "password for chronicles:"
于 2012-08-21T05:49:38.430 に答える