之前用腳本scp文件時,都是以.ssh打通爲基礎的。sql
可是在腳本中使用scp在機器之間拷貝文件,輸入密碼成爲問題。ssh
第一種方法,用到了expect。spa
腳本以下:ip
#! /usr/bin/expect -f it
spawn scp 1 koven@192.168.0.2: 自動化
expect "*password:" test
send "your password\r"基礎
expect eof 循環
固然不僅是scp,其它命令也能夠用expect自動化 rsa
循環處理:
spawn scp 1 koven@192.168.0.2:
for { set i 1 } {$i<500} {incr i} {
expect {"*password:" {send "koven\r"}
"*(yes/no)*" {send "yes\r"}
}
}
注意大括號之間有空格 。
第二種方法,使用密鑰文件。
這裏假設主機A(192.168.100.3)用來獲到主機B(192.168.100.4)的文件。
在主機A上執行以下命令來生成配對密鑰:
ssh-keygen -t rsa
遇到提示回車默認便可,公鑰被存到用戶目錄下.ssh目錄,好比root存放在:
/root/.ssh/id_rsa.pub
將 .ssh 目錄中的 id_rsa.pub 文件複製到 主機B 的 ~/.ssh/ 目錄中,並更名爲 authorized_keys,
到主機A中執行命令和主機B創建信任,例(假設主機B的IP爲:192.168.100.4):
scp ~/.ssh/id_rsa.pub 192.168.100.4:/root/.ssh/authorized_keys
下面就能夠用scp、ssh命令不須要密碼來獲取主機B的文件了
ssh 192.168.100.4 回車就不須要密碼了。
注:其實id_rsa.pub內容添加到對方機器的authorized_keys中就好了。
-----------------------------------------------------------------------------------------------------
#!/usr/bin/expect -f
set password 密碼
spawn scp 用戶名@目標機器ip:拷貝文件的路徑 存放本地文件的路徑
set timeout 300
expect "用戶名@目標機器ip's password:" #注意:這裏的「用戶名@目標機器ip」 跟上面的一致
set timeout 300
send "$password\r"
set timeout 300
send "exit\r"
expect eof
附:scp參數
-r:拷貝目錄
-c:容許壓縮
一個完整的例子
#!/usr/bin/expect -f
set password 123456
#download
spawn scp root@192.168.1.218:/root/a.wmv /home/yangyz/
set timeout 300
expect "root@192.168.1.218's password:"
set timeout 300
send "$password\r"
set timeout 300
send "exit\r"
expect eof
#upload
spawn scp /home/yangyz/abc.sql root@192.168.1.218:/root/test.sql
set timeout 300
expect "root@192.168.1.218's password:"
set timeout 300
send "$password\r"
set timeout 300
send "exit\r"
expect eof
########
PS:須要先安裝expect