scp免密批量獲取文件

前言: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

image-20201028160144771

若沒有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

image-20201028152638685

在遠程主機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

image-20201028154156820

運行scp_file_dir.sh,免密獲取相關文件和目錄,下載至本地/tmp/files目錄。

測試符合預期。

 

 

本文全部腳本和配置文件已上傳github:scp-to-get-files-in-batch-without-secret

相關文章
相關標籤/搜索