- ベストアンサー
シェルスクリプトで困っています 2
度々申し訳ございません。 現在、Linuxマシン1からLinuxマシン2へTelnetでログインし、Linuxマシン2上にあるシェルスクリプト(/bin/sh)を実行し、Linuxマシン2上のプログラムを実行した後、Linuxマシン2からログアウトするシェルスクリプトを作成中です。 その、Linuxマシン2からログアウトする際に、 "exit"を記述しているのですが、その"exit"がTelnetログアウトの意味で実行されず、シェルスクリプトを終了するの意味で実行されていて困っています。 どなたか上手くTelnetからログアウトできるようにシェルスクリプトを組む方法をご存知ではないでしょうか?もし判りましたらご教授下さい。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 expectの質問をしていた方ですね。それなら、expectでSS2の終了を検知して、マシン2に対してexitを送るという手もあるとおもいますが。 #2で書いたのは、SS2を実行するために SS2 と打つ代わりに、exec SS2 と打つということです。 例えば、ログインシェルで sleep 10 と打つと10秒後にログインシェルのプロンプトが出ますが、exec sleep 10 と打つと、10秒後にログアウトします。つまりコマンド実行終了後にログインシェルに戻らないということです。
その他の回答 (2)
- notnot
- ベストアンサー率47% (4899/10355)
exitはそれを実行しているシェルを終了させるだけですから、シェルスクリプトの中からexitでログインシェルを終了させることは出来ません。 案1) exec スクリプトファイル名 とexecコマンドを使い、ログインシェル終了とスクリプト実行を同時に行う 案2) . スクリプトファイル名 (ただしログインシェルが/bin/shの場合のみ) ドットコマンド(ピリオド)を使ってログインシェル内でスクリプトを実行させる 案3) ログインシェルのプロセスIDを調べてそのプロセスをkillコマンドで終了させる 普通は案1でいいと思います。exec実行時点でログインシェルは終了しているので、スクリプト内のexitの実行でtelnetセッションが終了します。
補足
少し質問内容を補足いたします。 PC1(Linux)にシェルスクリプト1(SS1:/usr/bin/expect)があり、PC2(Linux)にシェルスクリプト2(SS2:/bin/sh)が置いてあります。 まず、PC1のSS1を実行します。このスクリプトは、自動的にPC2へTelnetでログインし、PC2内のSS2を実行し、「interact」を実行します。 SS2は、PC2にあるプログラム(P1)を実行します。P1は、実行結果を画面に表示します。次にSS2は、ユーザからの入力を受け付け、ユーザが「OK」と入力すると、次のプログラム(P2)を実行します。 # 「NG」と入力すると、再度P1を実行します。 P2でも同様な処理を行い、全部で3つのプログラムを実行して、SS2を終了します。 ここで問題が起きていて、理想は、SS2が終了して、Telnetからログアウトし、SS1の方に戻って欲しいのですが、それが出来ていません。 # SS1に戻ってこなくても、少なくともTelnetからログアウトしたい そのため、SS2の最後に「exit」と記述しているのですが、それではダメなんですよね。。。 そこで、notnotさんのおっしゃる通り、 exec "スクリプトファイル名"をSS2の最後に記述すればよいのですか?その際、"スクリプトファイル名"はどのファイル名になるのですか? 大変ご迷惑をおかけして申し訳ありませんが、今一度ご教授よろしくお願いいたします。
- xjd
- ベストアンサー率63% (1021/1612)
rshコマンドを利用するのはだめですか? Linuxマシン2にログインせずに、Linuxマシン1から、Linuxマシン2のコマンドを 実行できます。 http://www.nifty.com/webapp/digitalword/word/017/01712.htm
お礼
ありがとうございました! 解決できました! 本当に助かりました。