
Necesito crear un script que inicie sesión en todos los servidores enumerados en servers.txt
. Quiero usar contraseña, no sin contraseña. Después de iniciar sesión, necesito configurar una variable y realizar un if
- then
- else
. Una vez completado el trabajo, debería crear un archivo en la máquina local, no en la remota. El archivo (local) contendrá los nombres de host de las máquinas donde no se estaba ejecutando cierto proceso.
La idea general es:
#!/bin/bash
while read line
do
sshpass -p ******** ssh "mydomain1\admin1"@$line bash -s << EOF
pwd=*********
var=$"(ps -ef | grep http | grep -v grep | wc -l)"
if (( var > 0 ))
then
echo "$pwd" | sudo -S ps -ef | grep patrol | grep -v grep | awk '{print $2}' | xargs kill
echo "$pwd" | sudo -S rm -rf /data/abc /etc/efg
#need to create the log on local machine, not on remote machine
hostname >> /find.txt
else
#need to create the log on local machine, not on the remote machine
hostname >> /agentnotthere.txt
fi
EOF
#servers.txt contains server names
done < servers.txt
Obviamente, las líneas 5 a 16 de lo anterior forman un documento que contiene comandos para ejecutar en el host remoto. En ese documento aquí, tengo comandos hostname >> /find.txt
y hostname >> /agentnotthere.txt
. Como se indicó en mi párrafo introductorio, y nuevamente en los comentarios del código, quiero que el nombre de host (remoto) se escriba en un archivo local, no en un archivo en la máquina remota. Obviamente, un comando en la máquina remota escribirá en un archivocommand >> filename
en la máquina remota.
¿Cómo puedo hacer que mi script, que se utiliza ssh
para ejecutar algunos comandos en máquinas remotas, escriba la salida en un archivo local en función de los resultados de las pruebas realizadas en la máquina remota?
Respuesta1
No creo que haya una manera fácil de hacer lo que quería, es decir, escribir en archivos separados en su host local de un script que se ejecuta en una máquina remota.
Sin embargo, puedes canalizar fácilmente la salida del script a un archivo local:
ssh host << EOF > output_file
some commands
to be executed
EOF
Con eso, puede reestructurar el script para que se ejecute ssh
varias veces (esto aumentará la ssh
sobrecarga, pero puede mitigar la mayor parte usándolo ControlPersist
en el ssh
archivo de configuración).
Entonces, en lugar de eso, terminarás con algo como esto (pseudo-bash):
echo "get the output of var script" | ssh host > var_value
if var read from the file is more than zero; then
echo "the thing you want" | ssh host >> /find.txt
else
echo "the other thing you want" | ssh host >> /agentnotthere.txt
fi
Esto debería adaptarse perfectamente a su caso de uso :)
Mi granito de arena sobre el guión en sí:
- Ansible o alguna de las otras herramientas de gestión de configuración probablemente sea más adecuada para esta tarea en lugar de escribir scripts bash.
- Usar contraseñas SSH en lugar de autenticación de clave es malo desde el punto de vista de la seguridad. Pero he estado en situaciones en las que es imposible implementarlo debido a la política de la empresa o a cosas antiguas integradas que no lo admiten, etc.
- En lugar de utilizar el antiguo
ps aux | grep -v grep | grep something
texto estándar, puede utilizarpgrep
ypkill
. Son estándarcoreutils
, por lo que, a menos que utilices sistemas realmente antiguos, deberían estar disponibles en ellos.