Prefacio:
Durante la operación de producción y los cambios de mantenimiento, a veces es necesario descargar archivos o directorios de hosts remotos de manera libre de secretos. En este momento, se pueden usar los comandos internos y de espera para lograr este requisito. Este artículo simula la obtención de los archivos y directorios relevantes en la ruta especificada del host remoto al servidor local a través de scp sin secreto.
Descripción ambiental:
Nombre de la CPU | Versión del sistema operativo | ip | esperar versión | Observaciones |
---|---|---|---|---|
ansible-awx | Centos 7.6.1810 | 172.27.34.51 | 5.45 | Servidor local, obtener archivos a local |
cliente | Centos 7.6.1810 | 172.27.34.85 | / | Servidor remoto |
Uno, espera la instalación
[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
Si no hay un comando de espera, debe instalar
En segundo lugar, construya archivos y directorios de prueba
[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
En la ruta / root / product del cliente de host remoto, use el comando dd para construir el archivo de prueba myfile_ {1..5} .txt y el directorio dir, cada archivo es 10M, de los cuales los archivos 1, 2 y 3 están en el directorio dir.
3. Script sin secretos
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
Un total de 8 parámetros
$ argv 0: IP de host remoto
$ argv 1: el usuario que se conecta al host remoto
$ argv 2: la contraseña para conectarse al host remoto
$ argv 3: Nombre de archivo que se obtendrá 1
$ argv 4: El nombre del archivo que se obtendrá 2
$ argv 5: El nombre del directorio que se obtendrá
$ argv 6: Obtiene la ruta local donde se guarda el archivo
$ argv 7: la ruta del archivo de host remoto
scp.sh es el script básico para el siguiente scp_file_dir.sh para llamar
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
Complete los 8 parámetros correspondientes de acuerdo con la situación real
Cuarto, ejecuta la prueba
[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 [email protected]:/root/product/{myfile_4.txt,myfile_5.txt,dir} /tmp/files
[email protected]'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
Ejecute scp_file_dir.sh para obtener archivos y directorios relevantes sin secreto, y descárguelos al directorio local / tmp / files.
La prueba cumple con las expectativas.
Todos los scripts y archivos de configuración de este artículo se han subido a github: scp-to-get-files-in-batch-without-secret