1. Antecedentes temáticos
Recientemente, utilicé una plataforma de automatización (consulte Prueba de Spug de la plataforma de mantenimiento y operación automatizada para obtener más detalles ) para realizar cambios semanales. El efecto es muy bueno. La plataforma ha estandarizado y automatizado una gran cantidad de operaciones repetitivas y tediosas mediante la distribución de scripts. El núcleo de la plataforma se distribuye a cada servidor Script de shell, siento que es necesario hacer un resumen del script de shell, así que tengo la idea de escribir este tema. Este tema presentará los diversos usos de los scripts de shell en combinación con la operación y el mantenimiento. Se estima que alrededor de 10 artículos incluirán inspección del sistema, monitoreo, carga y descarga de ftp, consulta de base de datos, limpieza de registros, sincronización de reloj, tareas de temporización, etc. , lo que implicará gramática, notas, depuración, etc.
2. Prefacio
Este artículo es el segundo del tema.
El artículo presenta principalmente algunas declaraciones de shell utilizadas recientemente en la operación y el mantenimiento de la producción diaria, que incluyen principalmente reemplazo, eliminación, búsqueda de líneas y caracteres especificados, transferencia de archivos, intercambio de columnas y columnas, etc.
Tres casos de uso de shell
1. Prohibir el inicio de sesión de root directamente
Requisitos: para garantizar la seguridad, el inicio de sesión directo con una cuenta de root está prohibido en producción
antes de arreglar:
[root@ansible /etc/ssh]# ll|grep sshd_config
-rw-------. 1 root root 3907 4月 11 2018 sshd_config
[root@ansible /etc/ssh]# more /etc/ssh/sshd_config|grep PermitRootLogin
#PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
Antes de la modificación, solo hay un archivo sshd_config en el directorio / etc / ssh y PermitRootLogin está configurado como un estado de comentario
Después de la modificación:
[root@ansible /etc/ssh]# sed -i.bak 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
[root@ansible /etc/ssh]# more /etc/ssh/sshd_config|grep PermitRootLogin
PermitRootLogin no
# the setting of "PermitRootLogin without-password".
[root@ansible /etc/ssh]# ll|grep sshd_config
-rw------- 1 root root 3905 1月 22 15:26 sshd_config
-rw-------. 1 root root 3907 4月 11 2018 sshd_config.bak
Después de la modificación, el directorio / etc / ssh tiene más archivos de respaldo y el parámetro PermitRootLogin está comentado y no está en estado
2. Actualiza la lista de sudoer
Requisitos: algunas cuentas requieren privilegios de root
antes de arreglar:
[root@ansible /etc]# cd
[root@ansible ~]# cd /etc
[root@ansible /etc]# ll|grep sudoers
-r--r-----. 1 root root 4328 10月 30 2018 sudoers
drwxr-x---. 2 root root 6 10月 31 2018 sudoers.d
[root@ansible /etc]# more sudoers|grep 'ALL=(ALL)'
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
# %wheel ALL=(ALL) NOPASSWD: ALL
Antes de la modificación, solo hay un archivo sudoers en / etc y ninguna otra cuenta, excepto root, tiene privilegios de root
Después de la modificación:
[root@ansible /etc]# sed -i.bak "/root.*ALL=(ALL).*ALL/a\app ALL=(ALL) ALL" /etc/sudoers
[root@ansible /etc]# ll|grep sudoers
-r--r----- 1 root root 4355 1月 22 16:05 sudoers
-r--r----- 1 root root 4328 1月 22 15:53 sudoers.bak
drwxr-x---. 2 root root 6 10月 31 2018 sudoers.d
[root@ansible /etc]# more sudoers|grep 'ALL=(ALL)'
root ALL=(ALL) ALL
app ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
# %wheel ALL=(ALL) NOPASSWD: ALL
Después de la modificación, hay un archivo de respaldo adicional sudoers.bak en / etc y la línea debajo de la raíz tiene más información sobre la cuenta de la aplicación, por lo que la aplicación tiene privilegios de root.
3.scp copia varios directorios o archivos
Requisitos: copie varios archivos locales al control remoto o copie varios archivos del control remoto al local
Copie localmente al directorio remoto:
[root@ansible ~]# touch a.txt b.txt c.txt
[root@ansible ~]# mkdir d
[root@ansible ~]# scp -v -r a.txt b.txt c.txt d [email protected]:/tmp
Cree un nuevo archivo a.txt b.txt c.txt y el directorio d localmente y cópielos en el directorio / tmp del host remoto
Copie el directorio remoto al local:
[root@157 ~]# touch 01.sh 02.sh 03.sh
[root@157 ~]# mkdir 04
[root@ansible ~]# scp -v -r [email protected]:/root/\{01.sh,02.sh,03.sh,04\} /tmp
Cree un nuevo archivo 01.sh 02.sh 03.sh y el directorio 04 en 157 y cópielos en el directorio local / tmp
4. Eliminar tareas programadas existentes
Requisito: eliminar la tarea cronometrada especificada
[root@ansible /var/spool/cron]# crontab -l
0 0 * * * /usr/sbin/ntpdate -u ntpserver >> /tmp/ntp.log
[root@ansible /var/spool/cron]# sed -i.bak '/\/usr\/sbin\/ntpdate/d' /var/spool/cron/root
Tenga en cuenta que "/" debe escaparse al coincidir con / usr / sbin / ntpdate
5. Cambiar entre columnas y columnas
Requisito: intercambie la ip y el nombre de host en el archivo / etc / hosts, el formato de la lista de hosts en ansible es hostname + ip
antes de arreglar:
[root@ansible ~]# cd /etc
[root@ansible /etc]# cp hosts hosts-ansible.txt
[root@ansible /etc]# more hosts-ansible.txt
10.17.6.137 loong576-file01
10.17.6.129 loong576-kxxl01
10.17.6.130 loong576-kxxl02
10.17.6.131 loong576-capp01
10.17.6.132 loong576-capp02
10.17.6.128 loong576-pbgw01
10.17.6.127 loong576-pbgw02
10.17.6.134 loong576-xucs01
10.17.6.133 loong576-xucs02
10.17.6.136 loong576-webc01
10.17.6.135 loong576-webc02
10.17.6.14 loong576-gwxx-1
10.17.6.15 loong576-gwxx-2
10.17.6.18 loong576-mysql1
10.17.6.17 loong576-mysql2
Después de la modificación:
[root@ansible /etc]# awk '{print $2,$1 > "hosts-ansible.txt"}' hosts-ansible.txt
[root@ansible /etc]# more hosts-ansible.txt
loong576-file01 10.17.6.137
loong576-kxxl01 10.17.6.129
loong576-kxxl02 10.17.6.130
loong576-capp01 10.17.6.131
loong576-capp02 10.17.6.132
loong576-pbgw01 10.17.6.128
loong576-pbgw02 10.17.6.127
loong576-xucs01 10.17.6.134
loong576-xucs02 10.17.6.133
loong576-webc01 10.17.6.136
loong576-webc02 10.17.6.135
loong576-gwxx-1 10.17.6.14
loong576-gwxx-2 10.17.6.15
loong576-mysql1 10.17.6.18
loong576-mysql2 10.17.6.17
Este script puede realizar fácilmente el intercambio de posición de ip y nombre de host
6. Agregue la línea especificada
Requisitos: agregue el parámetro'ansible_ssh_host = 'al mismo tiempo antes de la dirección IP 10.17.6
[root@ansible /etc]# sed -i 's/10.17.6/ansible_ssh_host=&/' hosts-ansible.txt
A través de 5 y 6, el formato de ip + nombre de host de / etc / hosts se puede convertir fácilmente al formato de nombre de host + ansible_ssh_host = + ip para cumplir con los requisitos de formato de ansible para nombre de host
A través de 5 y 6, el formato de ip + nombre de host de / etc / hosts se puede convertir fácilmente al formato de nombre de host + ansible_ssh_host = + ip para cumplir con los requisitos de formato de ansible para nombre de host
7.find, xargs, rm eliminar archivos encontrados
Requisitos: use buscar para buscar archivos que cumplan las condiciones y eliminarlos
[root@ansible /]# find ./ -name *[0-9]\*.bak
./home/a001.bak
./opt/04.txt.bak
./opt/03.bak
./tmp/09.bak
./tmp/10.txt.bak
./usr/05.bak
./usr/06.txt.bak
./var/07.bak
./var/08.txt.bak
./root/02.txt.bak
./root/01.bak
[root@ansible /]# find ./ -name *[0-9]\*.bak|xargs rm -rf
[root@ansible /]# find ./ -name *[0-9]\*.bak
Busque todos los archivos que comiencen con un número y terminen con .bak, luego elimínelos
8.sed, find, grep eliminar / reemplazar caracteres especificados en archivos
Requisitos: busque la cadena que contiene 'loong576' en todos los archivos y reemplácela o elimínela
antes de arreglar:
[root@ansible-awx os-check]# find .|xargs grep -rl 'loong576'
./defaults/main.yaml
./files/check_linux.sh
./tasks/main.yaml
./defaults/main.yaml
./defaults/main.yaml
./files/check_linux.sh
./files/check_linux.sh
./tasks/main.yaml
./tasks/main.yaml
[root@ansible-awx os-check]# find .|xargs grep -ri 'loong576'
./defaults/main.yaml:# Created by loong576 2020.05
./files/check_linux.sh:# Created by loong576 2020.05
./tasks/main.yaml:# Created by loong576 2020.05
./defaults/main.yaml:# Created by loong576 2020.05
./defaults/main.yaml:# Created by loong576 2020.05
./files/check_linux.sh:# Created by loong576 2020.05
./files/check_linux.sh:# Created by loong576 2020.05
./tasks/main.yaml:# Created by loong576 2020.05
./tasks/main.yaml:# Created by loong576 2020.05
Busque la lista de archivos que contienen la palabra loong576 y señale los caracteres específicos contenidos en el archivo
Después de la modificación: cambie el comentario de 'Creado por loong576 2020.05' a 'Creado por loong576 2021.01'
[root@ansible-awx os-check]# sed -i "s/2020.05/2021.01/g" `find .|xargs grep -rl 'loong576'`
[root@ansible-awx os-check]# find .|xargs grep -ri 'loong576'
./defaults/main.yaml:# Created by loong576 2021.01
./files/check_linux.sh:# Created by loong576 2021.01
./tasks/main.yaml:# Created by loong576 2021.01
./defaults/main.yaml:# Created by loong576 2021.01
./defaults/main.yaml:# Created by loong576 2021.01
./files/check_linux.sh:# Created by loong576 2021.01
./files/check_linux.sh:# Created by loong576 2021.01
./tasks/main.yaml:# Created by loong576 2021.01
./tasks/main.yaml:# Created by loong576 2021.01
Eliminar hora:
[root@ansible-awx os-check]# sed -i "s/2021.01//g" `find .|xargs grep -rl 'loong576'`
[root@ansible-awx os-check]# find .|xargs grep -ri 'loong576'
./defaults/main.yaml:# Created by loong576
./files/check_linux.sh:# Created by loong576
./tasks/main.yaml:# Created by loong576
./defaults/main.yaml:# Created by loong576
./defaults/main.yaml:# Created by loong576
./files/check_linux.sh:# Created by loong576
./files/check_linux.sh:# Created by loong576
./tasks/main.yaml:# Created by loong576
./tasks/main.yaml:# Created by loong576
9. Especifique el carácter para agregar caracteres al frente y la línea anterior, y agregue una línea a la última línea
Requisito: al configurar el servidor ntp, debe agregar una nueva línea en el carácter especificado en el archivo de configuración /etc/ntp.conf, comentar algunas configuraciones predeterminadas (agregar # antes del carácter especificado) y agregar una nueva línea al final del archivo de configuración / etc / hosts
Agregue una nueva línea en el carácter especificado:
[root@ansible ~]# sed -i '/driftfile/i server ntpserver iburst' /etc/ntp.conf
Agregue 'server ntpserver iburst' a la línea especificada de driftfile
Tenga en cuenta algunas configuraciones predeterminadas (agregue # antes de los caracteres especificados):
[root@ansible ~]# sed -i '/centos.pool.ntp.org/s/^/#/' /etc/ntp.conf
Servidor de comentarios [0..3] .centos.pool.ntp.org iburst '
Antes del cambio:
Después del cambio:
Agregue en la última línea:
[root@ansible ~]# sed -i '$a 172.16.7.157 ntpserver' /etc/hosts
4. Resumen de este artículo
Este artículo presenta principalmente algunos casos de uso de shell de uso común, que implican búsqueda diaria, reemplazo, transferencia de archivos, etc. Los comandos utilizados principalmente incluyen find, sed, xargs, scp, etc. El script de shell es combinar lógicamente los diversos comandos de acuerdo con el propósito inutilizable, y dominar estos comandos tendrá un efecto multiplicador en el siguiente script.
Para más, preste atención: tema de shell