今天需要做一個定時任務腳本將最新的數據包文件傳到遠程的服務器上,雖然有密鑰但也是要求輸入密碼的那種,所以只能另想辦法實現讓腳本自動輸入密碼了。
從網上查到使用expect可以,簡單研究了一下,效果不錯。
系統:CentOS 6.3
因為我的操作系統沒有安裝expect,所以直接"yum -y install expect",你可以根據你的操作系統安裝expect,或者源碼編譯。
安裝好之後就可以使用了,這裡有幾種方法:
一、單獨寫一個腳本
如 auto_scp.sh:
#!/usr/bin/expect
#使用第一個參數
set server_ip [lindex $argv 0]
#後面的也可以用參數[lindex $argv n]
set server_port 22
set server_dir /home/test
set server_user test
set server_pswd test
set scp_file auto_scp.sh
# 設置超時時間
set timeout 60
spawn scp -P $server_port $scp_file $server_user@$server_ip:$server_dir
expect {
"passphrase"
{
send "$server_pswd\n";
}
"password"
{
send "$server_pswd\n";
}
"yes/no"
{
send "yes\n";
exp_continue;
}
}
expect eof
我這裡的變量都是隨意設置的,你可以根據你的情況進行選擇,保存退出之後,對該文件加上可執行權限,運行
"./auto_scp.sh 2.2.2.2"就可以了,"2.2.2.2"就是傳入的第一參數。
"passphrase"和"password"等就是要監測的輸入提示的一部分,send "$server_pswd\n"就是要執行的命令。
二、在腳本中使用----我比較喜歡這個
我這裡使用的是Here document方法。
......
......
expect <<!!
set timeout 60
spawn scp -P $server_port $scp_file $server_user@$server_ip:$server_dir
expect {
"passphrase"
{
send "$server_pswd\n";
}
"password"
{
send "$server_pswd\n";
}
"yes/no"
{
send "yes\n";
exp_continue;
}
}
expect eof
!!
......
變量都是我從配置文件中獲取的,這裡不再贅述了。
三、在腳本中使用
也是在腳本使用,但是不是用的Here document方法,而是使用expect -c 參數書,"-c"選項後面的字符串填充的就是命令。但是要注意本身字符串的轉義符。
更多使用方法,請參看"man手冊"。
更多CentOS相關信息見CentOS 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=14