1. 程式人生 > >expect spawn scp * shell路徑名展開

expect spawn scp * shell路徑名展開

一直通過 scp 同步多臺伺服器上配置檔案,雖然已經寫了 shell 指令碼,但是密碼還需要手動輸入,終於忍不了啦,經查可以使用 expect 改變這種現狀(當然不只這一種解決方案)

#!/usr/bin/expect
#filename scp.exp
spawn scp -r files/* [email protected]:/home/panshiqu
expect "password:"
send "123456\n"
expect eof
panshiqudeiMac:exp panshiqu$ ./scp.exp 
spawn scp -r files/* [email protected]
:/home/panshiqu [email protected]'s password: files/*: No such file or directory

這個錯誤困擾我很長時間,根本原因是 路徑名展開 是 shell 的特性,expect 沒有

雖然網上有提供 一次僅拷貝一個檔案 的替代方案

#!/usr/bin/expect
#filename scp2.exp
spawn scp -r [lindex $argv 0] [email protected]:/home/panshiqu
expect "password:"
send "123456\n"
expect eof
#!/bin/bash
#filename scp.sh
for f in `echo files/*`
do
    ./scp2.exp $f
done

即便這只是一個輔助工具,而且我也不關心效率,但我也不想如此,一個檔案一次呼叫,建立連線等等,會慢的

反覆嘗試,終不得解,最後靈機一動,分享給大家

#!/bin/bash
#filename scp2.sh
scp -r $1 $2
#!/usr/bin/expect
#filename scp3.exp
spawn ./scp2.sh files/* [email protected]:/home/panshiqu
expect "password:"
send "123456\n"
expect eof