Come eseguire i comandi in modalità batch su ssh?


9

Come posso eseguire comandi in modalità batch su ssh? Cioè, qual è l' sshequivalente del comando sftp -b <filename> <hostname>?

Ho una serie di comandi che desidero eseguire su una serie di host collegati ssh. Oltre sftp, memorizzo i comandi in un file filenamee mi collego all'host ed eseguo i comandi usando il comando precedentemente citato.

È possibile qualcosa del genere ssh?


Ho superato questa domanda. Ma non riuscivo ancora a capire come eseguire i comandi in modalità batch.
Srikanth,

E qualcuno può creare un tag #batchmode e taggare questa domanda a quello?
Srikanth,

Risposte:


9

Correggimi se sbaglio, ma sembra che tu voglia eseguire comandi shell regolari sul server remoto in cui lo script è locale.

#!/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 faccio con alcune applicazioni 'esecuzione remota' nel mio ambiente di test utilizzando Python invece del guscio: ssh $userhost python < $pythonscriptfilename.


Grazie per la risposta. Sembra così. Lo sto modificando un po 'e provandolo ora.
Srikanth,

7

L'equivalente SSH di sftp -b <filename> <hostname>sarebbe:

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


3

Che ne dici di mantenerlo semplice ed eseguire il file "batch" sull'altro computer?

  1. scp file batch utente @ pc
  2. ssh file utente @ pc batch
  3. ssh user @ pc rm batch-file

E il file batch sarebbe un normale script di shell, quindi la sintassi è ben nota.




0

È possibile utilizzare i comandi forzati ssh.

Questi sono associati a una chiave particolare. Quando viene eseguita un'autenticazione con quella chiave, quel comando viene eseguito e la connessione termina. Un vantaggio di questo approccio è una maggiore sicurezza, poiché in tal caso la chiave non può essere utilizzata per accedere a una shell di accesso.


0

Un'altra opzione per uno script di Arcege sarebbe una funzione 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
}

Non uso l' -Topzione di ssh , in quanto non funziona in tutti i casi.

Questo script utilizza l'espansione dei parametri sull'array dei parametri posizionali $@:

  • "${@:(-1)}" si espande fino all'ultimo parametro (letteralmente prima dalla fine in poi)
  • "${#@}" si espande al numero di parametri posizionali
  • "${@:1:${#@}-1}" si espande in un elenco di tutti i parametri dal primo all'ultimo all'ultimo (letteralmente numero di parametri meno uno).

Non sono così bravo nelle espansioni variabili del genere, saresti in grado di aggiungere un po 'a quello che sta succedendo? Saluti.
Guy

@Guy, eccoti qui: ho commentato il codice e aggiunto alcune spiegazioni sull'espansione dei parametri
gadamiak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.