通过Expect在远程服务器上执行shell脚本

时间:2013-01-07 09:42:32

标签: cron crontab expect

我需要在多台服务器上设置一个cron作业(所有基于Unix的)。为此,我创建了一个脚本(让它称为脚本“A”),它在执行手动时正确设置了cron作业。此外,我已将此脚本上传到所有目标服务器,目的是通过另一台服务器上的另一个脚本自动调用和执行它。

现在,这个其他服务器包含脚本“B”(如上所述),它记录到所有目标服务器并调用脚本A,以便在所有服务器上自动设置cron。

问题是,从不调用脚本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但没有成功。即使经过大量的翻找,我也找不到合适的解决方案。需要帮助!

1 个答案:

答案 0 :(得分: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。