- - PR -
Perlによるリモート操作について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2002-11-11 15:55
現在シェルスクリプトで
「あらかじめ作成したリストにかかれているホストをシャットダウンする」 というのを作っています。 同じ動作を行うものをPerlで作成したいのですが、system関数を使ってrshを実行すると 後ろの引数を読まずにrloginしてしまい、正しく動作しません。 Perlではrshが使えないのでしょうか。 よろしくお願いします。 | ||||
|
投稿日時: 2002-11-13 14:58
すいません、自己レスです。
いろいろ試してみたところ、rshが使えないのではなく、rshと変数に 関係があるみたいです。 動作としては ・ファイルから読み込み要素をリストに格納する ・リストの要素に対してrshコマンドを実行する というようにしたいのですが・・・。 system関数を使って system "rsh $h(変数) /sbin/shutdown -h now"; とするとrloginしてしまうようです。 これはシェルスクリプトで同じ物を作成したときは正常に動いています。 ちなみに system "rsh hostname /sbin/shutdown -h now"; (*hostnameは実際のホスト名) とするとうまくいきます。 相性の問題なのでしょうか・・・? 何かご存知のことがありましたらよろしくお願いします。 | ||||
|
投稿日時: 2002-11-13 22:41
実行するシェルスクリプトを perl から作って、それを実行すればいいのでは:b
# それ以前に rsh で shutdown できるシステムって…という気はしなくはないですが。 [ メッセージ編集済み 編集者: しょむ 編集日時 2002-11-13 22:43 ] | ||||
|
投稿日時: 2002-11-14 09:31
しょむさんありがとうございます。早速やってみます。
#このシステムを常時使う気はまったくないんですけどね :p #4,5台一気に消せたらいいなーとちょっと思ってみたもので。 | ||||
|
投稿日時: 2002-11-14 10:39
Perlではないのですが、Expectを使われたらいかがですか?
ちょっと癖はありますが、リモートでのコマンド実行にSSHを使うことも出来ますし。 ExpectはTcl/Tkの拡張スクリプトです。 例えば、リモートでコマンドを実行する際に認証(ユーザ名&パスワード)が必要な場合が ありますが、Expectでは「リモートからAAAという文字列が返って来たらBBBという アクションを起こす」という形式でコマンドを記述できます。このAAAの部分は正規表現が 使えますし、とても便利です。 | ||||
|
投稿日時: 2002-11-14 13:23
system 関数は、間にスペースを入れて呼び出すとシェルを起動して引数に与えた文字列を渡します。
ですので、変数にシェルが理解するメタ文字が含まれている場合は、期待とは違う動作をしたりします。 以下のようにしてみては如何でしょうか。 system("rsh", $host, "/sbin/shutdown", "-h", "now"); 外していましたらすみません。 また、おばけさんが指摘されている、Expect は CPAN にモジュールもあります。 | ||||
|
投稿日時: 2002-11-14 13:28
書き忘れましたので補足です。 上記のように渡したい引数を 1 つずつ区切って、複数の引数として system 関数に渡しますと、Perl はシェルを呼び出さずに 1 つ目の引数で指定したプログラムに直接渡します。 これの意味は以下の 2 つを実行して頂けると分かり易いかと思います。 perl -e 'system("/bin/echo hello; /bin/cat foo")' perl -e 'system("/bin/echo", "hello", "; cat foo")' | ||||
|
投稿日時: 2002-11-14 15:57
おばけさん、isamさんありがとうございます。
> おばけさん 早速使ってみます。ありがとうございます。 > isamさん このままでは動かなかったのですが、きちんとエラーが出るようになりました。 後ろの引数を読んでくれるようになったみたいです。 ありがとうございます。 |