2011-02-02 12 views
2

シェルスクリプトを初めて作成しています。私は愚かな/繰り返しの質問を避けるためにできる限り多くの研究をしようとしました。その繰り返し/間違った質問があれば申し訳ありません。シェルスクリプトを使用してリモートコンピュータ上でスクリプトを実行した後に接続を終了する際の問題

私は、リモートのLinuxマシンに接続してスクリプトを実行するシェルスクリプトを持っています。私はssh接続を起動し、ジョブを起動するコマンドを発行するために 'expect'を使用しています。しかし、私は仕事を完了した後に接続を閉じる間に問題が発生しています。

これは私のスクリプトです:

set prompt "(%|#|\\$|%\]) $" 


    expect -c 'spawn ssh [email protected]$STAGE ; 
        expect password ; send "$PASS \n"; 
        expect -regexp "$PROMPT"; send "./settings.$UN.sh > settings_log.txt \n"; 
        interact' 

このスクリプトが正常に($ UNと$ STAGEパラメータがスクリプトに入力され、私は簡単にするためにここにいることを省略。)私のためのスクリプトファイルを実行します。しかし、これは私にオープンな接続を残す。 は私が

expect -c 'spawn ssh [email protected]$STAGE ; 
       expect password ; send "$PASS \n"; 
       expect -regexp "$PROMPT"; send "./settings.$UN.sh > settings_log.txt \n"; 
       expect -regexp "$PROMPT"; send "exit \n"' 

の上、下記の代わりに使用してスクリプトを実行した後、接続を終了しようとしたこれは、接続を閉じませんが、私は私のスクリプトファイルがまったく実行されなかったことに気づきました。また、settings_log.txtはまったく生成されません。

これは、exitコマンドが完了する前にプロセスを中断しているということですか?私は退室する前に「睡眠」を使ってみましたが、助けにはなりませんでした。期待通りの接続を終了するには、より良い方法がありますか? 何か助けていただければ幸いです。

+0

、あなたはあなたの送信が\rない\nでコマンドを終了し、ない期待しますか?私は* expect *に慣れていません。 – user359996

+0

これは初めてのことです。 expect -regexp "$ PROMPT"は、シェルが作業を完了するのを待って、ユーザー入力を返します。たとえば、 を使用してssh接続を開始します。 expect -c 'spawn ssh $ UN @ $ STAGE; sshがパスワードを尋ねることを知っています。私はこれを知っていますので、準備が整ったことをスクリプトに伝え、これが発生するとパスワードを送信することができます。 パスワードを期待してください。 "$ PASS \ n"を送ってください また、私は何をしようとしています。私は変数($ PROMPT)を一番上に定義し、次の文でそれを使用しました。 – PraveenGorthy

答えて

2

とは*あなたが*「$プロンプト」-regexp期待するものを私に説明できそう

expect -c 'spawn ssh [email protected]$STAGE 
      expect password 
      send "$PASS\r" 
      expect -regexp "$PROMPT" 
      send "./settings.$UN.sh > settings_log.txt\r" 
      expect -regexp "$PROMPT" 
      send "exit\r" 
      expect eof' 
+0

素晴らしいです。これは機能します。助けてくれてありがとう。 – PraveenGorthy

1

は、リモートシェルコマンドを実行し、を期待を使用せずに、直接、SSHSCPを使用してファイルをコピーすることができます。

例えば、

scp ./settings.$UN.sh [email protected]$STAGE:settings_log.txt 
ssh [email protected]$STAGE whatever-you-need-to-execute 

接続はすぐどんな-あなた-必要ツー実行完了するとすぐに終了します。

+0

私はこれをやってみました。しかしssh $ UN @ $ STAGEは私にパスワードを要求します。ユーザーの介入なしにこのスクリプトが必要です。もし、私が彼の国連と障害者に入るHTMLフォームを作成できれば、私のシステムはこのスクリプトを起動します。私はそれをすることはできませんsshはPWDのために私を促します。だから、私は例外を使用しています。 – PraveenGorthy

+0

自分自身を証明書で識別したり、* expect *を使って* ssh *にパスワードを提供したり、* sshpass *を使ってあなたのために行うことができます。最初のオプションははるかに安全であり、* scp *(2番目と同じですが安全性が低い)にも対応しています。 – user359996

+0

よかったです。それはそれを行うより良い方法のように聞こえる。助けてくれてありがとう – PraveenGorthy

0

外側のスクリプトはcshで書かれているようですが、 "prompt"という名前の変数を設定していますが、expectスクリプトでは "PROMPT"という変数が使用されています。 2つの変数名を大文字とするようにしてください。

+0

ケースの不一致は私のタイプミスです。私の実際のスクリプトではどちらも同じ場合 – PraveenGorthy

関連する問題