expect
expect是可以實現服務器之間自動交互的工具
I、 expect安裝
expect工具是否安裝:
在Linux系統命令行執行which expect,若返回/usr/bin/expect表示已經安裝過,反之則沒有安裝。
expect安裝說明:
安裝有RPM包可下載expect的RPM包,依賴tcl包,所以tcl也要一併安裝。
expect安裝步驟:
1、先下載expect,tcl,tcl-devel包。
2、傳到要安裝的系統上(主意包的版本)。
3、可直接執行rpm -ivh package-name(安裝順序tcl、tcl-devel、expect)。
II、expect_scp腳本
[root@ora exp]# cat expect_scp
#!/usr/bin/expect
#
set timeout 3
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $username@$host:$src_file $dest_file
expect "(yes/no)?"{send "yes\n"}
expect "*assword:"{send "$password\n"}
expect "100%"
expect eof
You have new mail in /var/spool/mail/root
[root@ora exp]#
III、測試上面腳本
[root@ora exp]# ls
01scp.py expect_scp mult.sh mult.sh.bak scp01.exp scp.py
[root@ora exp]# ./expect_scp 192.168.168.171 root qw1501as /root/1q ./
spawn scp [email protected]:/root/1q ./
reverse mapping checking getaddrinfo for bogon [192.168.168.171] failed - POSSIBLE BREAK-IN ATTEMPT!
[email protected]'s password:
1q 100% 84 0.1KB/s 00:00
[root@ora exp]#
對II註釋:
set 在此處是定義變量的
set host [lindex $argv 0] //host是變量名,在此處定義的是IP。[]中是給變量傳遞的參數,格式是lindex $argv # 在此處的“#”是數字0表示第一個參數依次往後1第二個。。。
set username [lindex $argv 1] //username 在此處定義用戶名
set password [lindex $argv 2] //password 在此處定義密碼
set src_file [lindex $argv 3] //src_file 在此處定義的是源文件的位置
set dest_file [lindex $argv 4] //dest_file 在此處定義的是目標文件的位置
spawn scp $username@$host:$src_file $dest_file
//這一行引用了scp命令,這個scp命令要在expect環境下執行前面需要加spawn
expect "(yes/no)?" //expect能匹配到sh環境內的字符,支持正則表達式.
send "yes\n" //send能夠把後面的數據傳給sh進程
expect和send結合,較清晰的體現出了自動交互功能,說白了就是expect匹配到出現的字符,到該要手動輸入的字符交給send來完成。
expect "100%" //匹配到 100%
expect eof //結束
對III註釋:
當執行expect腳本時,可以./expect_scp 參數1 參數2 參數3...此處的參數的順序要和expect的腳本中定義的變量的參數的順序一致。
要是批量scp的話需要再寫個shell腳本,在服務器上,執行之後即可批量傳輸了。