前言:git
在生產運維變動時,有時須要經過免密方式下載遠程主機的文件或目錄,這時能夠使用expect和內部命令 spawn實現該需求。本文模擬經過scp免密獲取遠程主機指定路徑下相關文件和目錄至本地服務器。github
環境說明:bash
主機名 | 操做系統版本 | ip | expect version | 備註 |
---|---|---|---|---|
ansible-awx | Centos 7.6.1810 | 172.27.34.51 | 5.45 | 本地服務器,獲取文件至本地 |
client | Centos 7.6.1810 | 172.27.34.85 | / | 遠程主機 |
1、expect安裝
[root@ansible-awx ~]# which expect /usr/bin/which: no expect in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) [root@ansible-awx ~]# yum -y install expect
若沒有expect命令,則需安裝服務器
2、構造測試文件和目錄
[root@client product]# pwd /root/product [root@client product]# ll 總用量 4 -rwxr--r-- 1 root root 218 10月 28 14:23 file.sh [root@client product]# more file.sh #!/bin/bash #by loong576 #批量生成測試文件 for num in {1..5} do dd if=/dev/zero of=myfile_$num.txt bs=1M count=10 done #生成目錄dir並將前3個文件移到該目錄 mkdir dir mv myfile_{1..3}.txt dir [root@client product]# ./file.sh 記錄了10+0 的讀入 記錄了10+0 的寫出 10485760字節(10 MB)已複製,0.0125638 秒,835 MB/秒 記錄了10+0 的讀入 記錄了10+0 的寫出 10485760字節(10 MB)已複製,0.0149011 秒,704 MB/秒 記錄了10+0 的讀入 記錄了10+0 的寫出 10485760字節(10 MB)已複製,0.0159792 秒,656 MB/秒 記錄了10+0 的讀入 記錄了10+0 的寫出 10485760字節(10 MB)已複製,0.0190673 秒,550 MB/秒 記錄了10+0 的讀入 記錄了10+0 的寫出 10485760字節(10 MB)已複製,0.0260948 秒,402 MB/秒 [root@client product]# ll 總用量 20484 drwxr-xr-x 2 root root 66 10月 28 15:25 dir -rwxr--r-- 1 root root 218 10月 28 14:23 file.sh -rw-r--r-- 1 root root 10485760 10月 28 15:25 myfile_4.txt -rw-r--r-- 1 root root 10485760 10月 28 15:25 myfile_5.txt [root@client product]# tree . ├── dir │ ├── myfile_1.txt │ ├── myfile_2.txt │ └── myfile_3.txt ├── file.sh ├── myfile_4.txt └── myfile_5.txt 1 directory, 6 files
在遠程主機client的/root/product路徑下,使用dd命令構造測試文件myfile_{1..5}.txt和目錄dir,每一個文件10M,其中一、二、3號文件在dir目錄中。運維
3、免密腳本
1.scp.sh
[root@ansible-awx files]# cd [root@ansible-awx ~]# cd scp [root@ansible-awx scp]# ll 總用量 8 -rwxr--r-- 1 root root 236 10月 28 15:21 scp_file_dir.sh -rwxr--r-- 1 root root 501 10月 28 15:18 scp.sh [root@ansible-awx scp]# more scp.sh #!/usr/bin/expect set timeout 10 set host [lindex $argv 0] set username [lindex $argv 1] set password [lindex $argv 2] set file1 [lindex $argv 3] set file2 [lindex $argv 4] set dir [lindex $argv 5] set local_path [lindex $argv 6] set dest_path [lindex $argv 7] spawn scp -r $username@$host:$dest_path/\{$file1,$file2,$dir\} $local_path expect { "(yes/no)?" { send "yes\n" expect "*assword:" { send "$password\n"} } "*assword:" { send "$password\n" } } expect "100%" expect eof
一共8個參數ide
$argv 0:遠程主機ip測試
$argv 1:鏈接遠程主機的用戶spa
$argv 2:鏈接遠程主機的密碼操作系統
$argv 3:要獲取的文件名1code
$argv 4:要獲取的文件名2
$argv 5:要獲取的目錄名
$argv 6:獲取文件保存的本地路徑
$argv 7:遠程主機文件所在路徑
scp.sh爲基礎腳本,供後面的scp_file_dir.sh調用
2.scp_file_dir.sh
[root@ansible-awx scp]# more scp_file_dir.sh #!/bin/bash IP=172.27.34.85 USER=root PASSWD=monitor123! DEST1=myfile_4.txt DEST2=myfile_5.txt DEST3=dir LOCAL_PATH=/tmp/files DEST_PATH=/root/product $HOME/scp/scp.sh $IP $USER $PASSWD $DEST1 $DEST2 $DEST3 $LOCAL_PATH $DEST_PATH
根據實際狀況填寫對應的8個參數
4、運行測試
[root@ansible-awx scp]# pwd /root/scp [root@ansible-awx scp]# ll 總用量 8 -rwxr--r-- 1 root root 236 10月 28 15:21 scp_file_dir.sh -rwxr--r-- 1 root root 501 10月 28 15:18 scp.sh [root@ansible-awx scp]# ./scp_file_dir.sh spawn scp -r root@172.27.34.85:/root/product/{myfile_4.txt,myfile_5.txt,dir} /tmp/files root@172.27.34.85's password: myfile_4.txt 100% 10MB 60.2MB/s 00:00 myfile_5.txt 100% 10MB 58.9MB/s 00:00 myfile_1.txt 100% 10MB 67.6MB/s 00:00 myfile_2.txt 100% 10MB 62.8MB/s 00:00 myfile_3.txt 100% 10MB 64.1MB/s 00:00 [root@ansible-awx scp]# cd /tmp [root@ansible-awx tmp]# cd files/ [root@ansible-awx files]# tree . ├── dir │ ├── myfile_1.txt │ ├── myfile_2.txt │ └── myfile_3.txt ├── myfile_4.txt └── myfile_5.txt 1 directory, 5 files [root@ansible-awx files]# du -sm * 30 dir 10 myfile_4.txt 10 myfile_5.txt
運行scp_file_dir.sh,免密獲取相關文件和目錄,下載至本地/tmp/files目錄。
測試符合預期。
本文全部腳本和配置文件已上傳github:scp-to-get-files-in-batch-without-secret