0

複数のサーバー (すべて Unix ベース) で cron ジョブをセットアップする必要があります。このために、手動で実行したときに cron ジョブを正しく設定するスクリプト (スクリプト "A" と呼びます) を作成しました。また、別のサーバー上の別のスクリプトを介して自動的に呼び出して実行する目的で、このスクリプトをすべてのターゲット サーバーにアップロードしました。

ここで、この別のサーバーには、すべてのターゲット サーバーにログインし、すべてのサーバーで cron を自動的にセットアップするためにスクリプト A を呼び出すスクリプト "B" (上記のとおり) が含まれています。

問題は、スクリプト A が呼び出されず、cron がセットアップされないことです。スクリプト B は Expect スクリプトで、コードは次のとおりです。

spawn rsync -avz -e ssh $localDir/autodir $username@$ipaddress:$remoteDir
sleep 10

expect {
"assword:" {
    send "$pwd\r"
    sleep 5
    exp_continue
}
expect {
    "@" {
        send "cd /home/$username/autodir/config\r"
        sleep 5
        exp_continue

        expect "@"
        send "./setCron.sh" # NEED TO EXECUTE THIS AT REMOTE SERVER
        sleep 5
        exp_continue
    }
}
"yes/no" {
    send "yes\r"
    set timeout -5
    exp_continue
}
-re $prompt {
    send "\r"
}
timeout {
    exit
}
eof {
    exit
}
}

基本的に、いくつかの制限によりこれらの方法の両方を使用できないため、sshまたは公開鍵認証を使用せずにリモートサーバーでスクリプトを呼び出す汎用ソリューションを探しています。したがって、Expect を使用してみましたが、成功しませんでした。いろいろと調べても、適切な解決策を見つけることができませんでした。ここで助けが必要です!

4

1 に答える 1

0

いじくり回すうちに解決策を発見しました。これがコードです。

spawn rsync -avz -e ssh $localDir/autodir $username@$ipaddress:$remoteDir
sleep 10

expect {
"assword:" {
    send "$pwd\r"
    sleep 5
    exp_continue
}
timeout {
    exit
}
}

spawn ssh $username@$ipaddress
sleep 10

expect {
"assword:" {
    send "$pwd\r"
    sleep 5
    send "sh /home/$username/autodir/config/setCron.sh\r"
    sleep 5
    exp_continue
}
timeout {
    exit
}
}

これにより、すべてのサーバーにログインし、ファイル/ディレクトリが同期され、cron ジョブが設定されます。魅力のように機能します。しかし、最終的にはsshを使用する必要がありました。

于 2013-01-08T05:04:22.123 に答える