2016-03-28 9 views
1

私はscript.Itだけでリモートホストにログインしてexits.Hereはそれだけで取得するコードはとリモートのsshコマンドを実行することができませんでしスクリプト

#!/usr/bin/expect 
set timeout 15 
puts "connecting to the storage\n" 
set user [lindex $argv 0] 
set host [lindex $argv 1] 
set pass "root123" 
spawn ssh "$user\@$host" 
expect { 
"Password: " { 
send "$pass\r" 
sleep 1 
expect { 
"$ " { 
    send "isi quota quotas list|grep ramesh\r" } 
"$ " { 
    send "exit\r" } 

} 
} 
"(yes/no)? " { 
send "yes\r" 
expect { 
"$ " { send "ls\r" } 
"$ " { send "exit\r" } 

"> " {} 
} 
} 
default { 
send_user "login failed\n" 
exit 1 
} 
} 

です期待し使用してリモートホスト上でコマンドを実行することができません期待しますリモートホストに接続して終了します。 [深い@ host1に:〜] $ ./sshexpect USER1 host2の ストレージに

spawn ssh [email protected] 
Password: 
host2$ 
[[email protected]:~]$ 

を結ぶ間違った構文ですか? 私はtclスクリプトの初心者です。

答えて

1

インデントは大いに役立つでしょう:

expect { 
    "Password: " { 
     send "$pass\r" 
      sleep 1 
      expect { 
       "$ " { send "isi quota quotas list|grep ramesh\r" } 
       "$ " { send "exit\r" } 
      } 
    } 
    "(yes/no)? " { 
     send "yes\r" 
      expect { 
       "$ " { send "ls\r" } 
       "$ " { send "exit\r" } 
       "> " {} 
      } 
    } 
    default { 
     send_user "login failed\n" 
      exit 1 
    } 
} 

問題はここにある:

  expect { 
       "$ " { send "isi quota quotas list|grep ramesh\r" } 
       "$ " { send "exit\r" } 
      } 

あなたは二度同じパターンに一致している:私は期待しては、最初のアクションブロックを無視し、ちょうどが疑われます第2のものを使用する。 これですぐに終了します。

これは、あなたが何をしたいです:

expect { 
    "(yes/no)? " { send "yes\r"; exp_continue } 
    "Password: " { send "$pass\r"; exp_continue } 
    timeout  { send_user "login failed\n"; exit 1 } 
    -re {\$ $} 
} 
send "isi quota quotas list|grep ramesh\r" 

expect -re {\$ $} 
send "ls\r" 

expect -re {\$ $} 
send "exit\r" 

expect eof 
+0

私はミスを理解し、私は以下の行が -re {\ $ $} を意味しないものを手に入れるのdidntも、なぜ私たちがする必要がありますかput eof スクリプトの最後に – anudeep

+0

'-re'オプションは、デフォルトのグロブパターンの代わりに正規表現パターンを使用します。私は、プロンプトがドル記号で、行末のスペース*であると指定しています。予想にドル記号とスペース、そして他のテキストが表示される場合、それはプロンプトと一致しません。 'expect eof'は基本的に「生成されたプロセスが閉じられるまで待つ」という意味です。ここで厳密には必要ではありませんが、一般的には良い方法です。 –

+0

私はまだそれを試してみました。それは "ログインに失敗しました"と表示され、終了します。 リモートボックスにログインした後、ブランクになり、「login failed」で終了すると、 – anudeep

関連する問題