1

.eshリモート ホストにスクリプトを送信する単純な BASH スクリプトを使用しています。たとえば、ホストのユーザー名とパスワードがわかっているので、スクリプトは次のことを行います。

expect login:
send root\n
expect Password:
send abc123\n
expect "# "

rootしたがって、これにより、パスワードを使用してユーザーとしてリモートホストに自動的にログインしますabc123

現在、BASH スタイルの 1 行の for ループを送信して、ホスト上のいくつかのログ ファイルからいくつかのメトリックを取得しようとしています。

send 'for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done \n'

ただし、これは次の場合に失敗します。

# can't read "i": no such variable
    while executing
send 'for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done \n'

同様の投稿をいくつか読みましたが、これに似たケースは見つかりませんでした。これを実装する方法を理解したら、ログ ファイルの出力を改善するためのコマンド ライン コマンドを追加する予定です (つまり、bash の一時変数を追加する、出力を にパイプするawkなど)。

誰でもこの問題を解決できますか?

ありがとうございました。


編集:提供された回答に従って、スクリプトを次のように変更しましたが、魅力的に機能しました:

expect login:
send root\n
expect Password:
send abc123\n
expect "# "
send { for i in /var/log/example/*.txt; do echo $i; cat $i | grep error ; done }
send "\n"
send exit

これにより、リモート ホストにログインし、いくつかの重要なメトリックがコンソールに出力され、telnet が終了します。ローカル ホストで bash スクリプトを使用して、ホスト名/IP のリストを含むテキスト ファイルを介して複数のリモート ホストをループできるようになりました。

ありがとう!

4

1 に答える 1

2

シングル クォートはTclでの引用には使用されません。通常の文字です。バックスラッシュ、コマンドと変数の展開が必要な場合は二重引用符を使用し、必要ない場合は中括弧を使用します。

'最初を{に、最後を に置き換え}ます。

于 2013-01-19T19:46:11.847 に答える