2013-01-07 154 views
0

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

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

问题是,脚本A永远不会被调用,并且cron永远不会被设置。脚本B是一个Expect脚本和这里的代码,

spawn rsync -avz -e ssh $localDir/autodir [email protected]$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但没有成功。即使经过大量搜索,我也找不到合适的解决方案。这里需要帮助!

+0

您是否尝试将可执行文件的完整路径?例如:使用/ usr/bin/rsync而不是rsync –

+1

rsync部分可以忽略,因为它只是将脚本A上传到远程服务器。它没有问题。它的实际部分*调用*失败的脚本A.这部分:发送“./setCron.sh”。这是我的脚本“A”,需要通过上面的脚本执行。 –

回答

0

刚刚在修补时发现了解决方案。这里的代码,

spawn rsync -avz -e ssh $localDir/autodir [email protected]$ipaddress:$remoteDir 
sleep 10 

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

spawn ssh [email protected]$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。

相关问题