0

監視フラグ付きで autossh を使用しています。autossh は、テスト パケットを送信するたびに標準出力に出力します。

予期した状態で autossh を使用すると、テキスト パケット メッセージが出力されません。それらが送信されているかどうかはわかりませんが、これはssh接続を維持するために重要です。

「期待」がautosshの動作に影響するかどうかわかりますか?autossh が正しく機能するかどうかを確認するにはどうすればよいですか?

期待コード:


#!/usr/bin/expect
set timeout 50
spawn autossh -M 11111 -N -R 4848:localhost:80 user@192.168.1.100
set keepRunning 1
while {$keepRunning} {      
    expect \
    {
        "(yes/no)"    { send "yes\r" }  
        "Password:*"  { send "1234\r" ; set keepRunning 0 }

        "ssh exited prematurely with" { exit 7 }
        "remote port forwarding failed*"  { exit 8 }
    }
}
expect \
{
    "remote port forwarding failed*"  { exit 9 }
    "Password:*"  { exit 5 }
}
wait

予期せずに表示される定期的な出力は次のとおりです。

autossh[2882]: checking for grace period, tries = 0
autossh[2882]: starting ssh (count 1)
autossh[2883]: execing /pfrm2.0/bin/ssh
autossh[2882]: ssh child pid is 2883
autossh[2882]: check on child 2883
autossh[2882]: set alarm for 50 secs
Password: autossh[2882]: connection ok
**autossh[2882]: check on child 2883
autossh[2882]: set alarm for 60 secs
autossh[2882]: connection ok
autossh[2882]: check on child 2883
autossh[2882]: set alarm for 60 secs**

最後の 5 行は、autossh によって送信されたテスト パケットです。その行は、autossh を bash から直接実行した場合にのみ出力されます。「expect」を使用して実行すると、これらの行は出力されず、autossh が送信するかどうかわかりません。

ありがとう。

4

3 に答える 3

2

率直に言って、私は以前に取り組んだことがありませんautossh。ただし、コードに従ってexpect、パスワードを提供してログインするなど、指定されたパターンをチェックします。ある種のエラーメッセージが表示された場合。終了します。

それから最後に。を追加しましwaitた。生成されたプロセス (または名前が付けられていない場合は現在のプロセス) が終了するまで遅延します。それらのプリントが単に端末で印刷されるかどうかはわかりません。その場合、ログイン後、ログイン時expectと同じように待機させることができます。何らかのコマンドを提供した後にそれらの出力が表示される場合は、必ずそれを通過させてsendから待機してください。パターン。

それまでは、パターンを期待するように指示しない限り、expect何かを待つ必要がないため、出力にも表示されません。

于 2014-10-23T14:31:20.713 に答える
0

(これはより詳細な説明と回答です。)

私が欲しかったもの:

  1. autossh、expect、およびラッパー bash スクリプトを使用した ssh トンネル。
  2. bash スクリプトはバックグラウンドで実行する必要があります。
  3. ssh が終了すると、スクリプトは再びトンネルを開始する必要があります。

期待の問題:ssh-tunnelを確立した後、次を使用してみました

  1. 対話 - bash スクリプトがバックグラウンドで実行されている場合、対話がハングするため、autossh を待機していないことを期待し、autossh を監視できませんでした (スリープ ループなし)。
  2. 待機 - 何らかの理由で、autossh 監視メカニズムが適切に機能しませんでした。
  3. -nothing- - 終了するだけで、autossh を監視できませんでした

解決策は、「接続OK」文字列を「期待」してこのループエンドを使用することでした

    set moreThanAutoSshTimeout [expr {$env(AUTOSSH_POLL) + 10}]
    set timeout $moreThanAutoSshTimeout
    set connStatus 1
    while { $connStatus } {
        set connStatus 0
        expect \
        {
            "connection ok"    { set connStatus 1 }
        }
    }
于 2014-11-17T09:46:25.927 に答える