¿Cómo ejecutar comandos en modo por lotes sobre ssh?


9

¿Cómo puedo ejecutar comandos en modo por lotes a través de ssh? Es decir, ¿cuál es el sshequivalente del comando sftp -b <filename> <hostname>?

Tengo un conjunto de comandos que deseo ejecutar en un conjunto de hosts que se conectan ssh. De nuevo sftp, almaceno los comandos en un archivo filenamey me conecto al host y ejecuto los comandos usando el comando mencionado anteriormente.

¿Es posible algo así ssh?


He pasado por esta pregunta. Pero todavía no podía entender cómo ejecutar los comandos en modo por lotes.
Srikanth

¿Y alguien puede crear una etiqueta #batchmode y etiquetar esta pregunta?
Srikanth

Respuestas:


9

Corrígeme si me equivoco, pero parece que quieres ejecutar comandos de shell regulares en el servidor remoto donde el script es local.

#!/bin/sh
trap "rm -f /tmp/sendonssh.$$.*" 0 1 2 3 15
# commands to run on the remote server
cat <<'EOF' >> /tmp/sendonssh.$$.sh
mkdir -p /tmp/foobar.$$
mv $HOME/xyzzy /tmp/foobar.$$
chmod 640 $HOME/xyzzy
EOF
# call for each argument
for userhost in "$@"; do
    errorout=`ssh -aTxo BatchMode=yes $userhost /bin/sh -s < /tmp/sendonssh.$$.sh 2>&1`
    rc=$?
    if [ $rc -ne 0 ]; then
        echo "Error: $userhost: $errorout"
        exit $rc
    fi
done

Lo hago con algunas aplicaciones '' en ejecución remota de mi entorno de prueba usando Python en lugar de la cáscara: ssh $userhost python < $pythonscriptfilename.


gracias por la respuesta. Eso parece. Lo estoy retocando un poco y probándolo ahora.
Srikanth

7

El equivalente de SSH sftp -b <filename> <hostname>sería:

ssh -o BatchMode=yes <hostname> sh -s < "<filename>"


3

¿Qué tal mantenerlo simple y ejecutar el archivo "batch" en la otra computadora?

  1. usuario de archivo por lotes scp @ pc
  2. ssh user @ pc archivo por lotes
  3. ssh user @ pc rm archivo por lotes

Y el archivo por lotes sería un script de shell normal, por lo que la sintaxis es bien conocida.




0

Podrías usar comandos forzados ssh.

Estos están asociados con una clave particular. Cuando se realiza una autenticación con esa clave, se ejecuta ese comando y se cierra la conexión. Una ventaja de este enfoque es una mayor seguridad, ya que en ese caso la clave no se puede usar para acceder a un shell de inicio de sesión.


0

Otra opción para un script de Arcege sería una función Bash:

sshbatch() {
  # Expect at least 2 parameters, if less are provided print help
  if [[ ${#@} -lt 2 ]]; then
    printf 'Usage: sshbatch [user@]host... input_file\n'
  else
    while read -r -u "$fd" host; do
      # Check if the last parameter is a readable file, else print error and exit
      [[ -r ${@:(-1)} ]] || { printf "The file ${@:(-1)} is not readable!\n"; break; }
      # Run remote bash from the file given in the last parameter
      ssh -o BatchMode=yes "$host" bash -s < "${@:(-1)}"
      # Read host list from 1st to next to last parameters
    done {fd}< <(printf '%s\n' "${@:1:${#@}-1}")
  fi
}

No uso la -Topción ssh , ya que no funciona con ella en todos los casos.

Este script utiliza la expansión de parámetros en la matriz de parámetros posicionales $@:

  • "${@:(-1)}" se expande hasta el último parámetro (literalmente primero desde el final hacia adelante)
  • "${#@}" se expande a la cantidad de parámetros posicionales
  • "${@:1:${#@}-1}" se expande a una lista de todos los parámetros desde el primero hasta el último (literalmente, el número de parámetros menos uno).

No soy tan bueno con las expansiones variables como esa, ¿podría agregar un poco sobre lo que está sucediendo? Salud.
Chico

@Guy, aquí estás
Comenté
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.