使用autoexpect避免sftp輸入密碼

myownstars發表於2011-09-21


先是從資料庫中匯出所需檔案,再將此檔案轉移至一個web server,然後透過此web server用sftp傳輸給第三方的server
所用到的指令碼依次如下
先從資料庫匯出文字,並scp到web server
--為避免輸入密碼時候人機互動,需要將兩個server配置使用者等價
[oracle@justin tools]$ more sftpchenying.sh
source /home/oracle/.bash_profile

date1=`date --date='1 day ago'  +%Y%m%d`

/justin/./sqluldr2_linux64_10204.bin  justin/**** sql=/justin/sftp.sql field=## charset="ZHS16GBK" file=/justin/product"$date1".csv
scp /justin/product"$date1".csv
rm /justin/product"$date1".csv

在中轉server上部署以下指令碼
[deploy@justin ~]$ more sftp.sh
date1=`date --date='1 day ago'  +%Y%m%d`

sftp -oPort=3222 justin@*.*.*.* << END
cd /upload
lcd /home/deploy
mput product$date1.csv
END

rm /home/deploy/product$date1.csv
同樣為了避免sftp輸入密碼的人機互動,使用expect命令
先透過root使用者yum install expect安裝expect,然後輸入autoexpect sftp.sh,此時會產生一個名為script.exp的檔案,每次只需呼叫./script.exp即可自動完成sftp到remote server並上傳檔案的操作
似乎只能透過./script.exp的方式呼叫該檔案,設定crontab時候比較麻煩,可以新建一個檔案
[deploy@justin ~]$ more sftpexec.sh
cd /home/deploy
./script.exp
Crontab設定則如下
[deploy@justin ~]$ crontab -l
0 2 * * * sh /home/deploy/sftpexec.sh > /home/deploy/sftpexec.log 2>&1

而生成的script.exp內容如下
[deploy@justin ~]$ more script.exp
#!/usr/bin/expect -f


set force_conservative 0  ;# set to 1 to force conservative mode even if
                          ;# script. wasn't run conservatively originally
if {$force_conservative} {
        set send_slow {1 .1}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}


set timeout -1
spawn ./sftp.sh
match_max 100000
expect -exact "Connecting to *.*.*.*...\r
password: "
send -- "password\r"
expect eof

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-708026/,如需轉載,請註明出處,否則將追究法律責任。

相關文章