Wie führe ich Befehle im Batch-Modus über ssh aus?

9

Wie kann ich Befehle im Batch-Modus über ssh ausführen? Das heißt, was entspricht dem sshBefehl sftp -b <filename> <hostname>?

Ich habe eine Reihe von Befehlen, die ich über eine Reihe von Hosts ausführen möchte, über die eine Verbindung hergestellt wird ssh. Über sftp, ich speichere die Befehle in einer Datei filenameund verbinde mich mit dem Host und führe die Befehle mit dem zuvor erwähnten Befehl aus.

Ist so etwas möglich vorbei ssh?

Srikanth
quelle
Ich habe diese Frage durchgearbeitet. Aber ich konnte immer noch nicht herausfinden, wie die Befehle im Batch-Modus ausgeführt werden sollen.
Srikanth
Und kann jemand bitte ein Tag #batchmode erstellen und diese Frage damit markieren?
Srikanth

Antworten:

9

Korrigieren Sie mich, wenn ich falsch liege, aber Sie möchten anscheinend reguläre Shell-Befehle auf dem Remote-Server ausführen, auf dem das Skript lokal ist.

#!/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

Ich mache dies mit einigen 'Remote Execution'-Apps in meiner Testumgebung, die Python anstelle der Shell verwenden : ssh $userhost python < $pythonscriptfilename.

Arcege
quelle
Danke für die Antwort. Das sieht so aus. Ich optimiere es ein bisschen und probiere es jetzt aus.
Srikanth
7

Das SSH-Äquivalent von sftp -b <filename> <hostname>wäre:

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

MattBianco
quelle
3

Wie wäre es, es einfach zu halten und die "Batch" -Datei auf dem anderen Computer auszuführen?

  1. scp Batch-Datei user @ pc
  2. ssh user @ pc Batch-Datei
  3. ssh user @ pc rm Batch-Datei

Und die Batch-Datei wäre ein normales Shell-Skript, daher ist die Syntax bekannt.

Johan
quelle
0

man expect? : \

aber es ist nicht der perfekte Weg.

LanceBaynes
quelle
Hallo johnny8888, ich bin auf einem Solaris-Server und es ist kein manueller Eintrag zu erwarten. Können Sie bitte Ihre Antwort ausarbeiten?
Srikanth
@Srikanth linux.die.net/man/1/expect
Michael Mrozek
@Srikanth: wurde expectentwickelt, um mit Programmen zu interagieren, die voraussichtlich auf einem Terminal ausgeführt werden. Dies hat nichts mit dem Problem zu tun, Befehle über ssh auszuführen.
Gilles 'SO - hör auf böse zu sein'
0

vielleicht

ssh user@host sh -c "$(<filename)"
Glenn Jackman
quelle
0

Sie können erzwungene ssh-Befehle verwenden.

Diese sind einem bestimmten Schlüssel zugeordnet. Wenn eine Authentifizierung mit diesem Schlüssel durchgeführt wird, wird dieser Befehl ausgeführt und die Verbindung wird beendet. Ein Vorteil dieses Ansatzes ist die erhöhte Sicherheit, da in diesem Fall der Schlüssel nicht zum Aufrufen einer Anmeldeshell verwendet werden kann.

Faheem Mitha
quelle
0

Eine weitere Option für ein Skript von Arcege wäre eine Bash-Funktion:

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
}

Ich verwende die -TOption von ssh nicht , da sie nicht in allen Fällen funktioniert.

Dieses Skript verwendet die Parametererweiterung für das Positionsparameter-Array $@:

  • "${@:(-1)}" wird bis zum letzten Parameter erweitert (buchstäblich erst ab dem Ende)
  • "${#@}" erweitert sich auf die Anzahl der Positionsparameter
  • "${@:1:${#@}-1}" Erweitert sich zu einer Liste aller Parameter vom ersten bis zum vorletzten (buchstäblich Anzahl der Parameter abzüglich eines).
Gadamiak
quelle
Ich bin nicht so gut in solchen variablen Erweiterungen. Könnten Sie ein wenig hinzufügen, was los ist? Prost.
Guy
@ Guy, hier sind Sie - ich habe den Code kommentiert und einige Erklärungen zur Parametererweiterung hinzugefügt
Gadamiak