Script que llama a ssh; Quiero crear un registro en la máquina local.

Script que llama a ssh; Quiero crear un registro en la máquina local.

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.txty 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 >> filenameen la máquina remota.

¿Cómo puedo hacer que mi script, que se utiliza sshpara 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 sshvarias veces (esto aumentará la sshsobrecarga, pero puede mitigar la mayor parte usándolo ControlPersisten el ssharchivo 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 somethingtexto estándar, puede utilizar pgrepy pkill. Son estándar coreutils, por lo que, a menos que utilices sistemas realmente antiguos, deberían estar disponibles en ellos.

información relacionada