2013-01-07 240 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。

相關問題