Comment exécuter des commandes en mode batch sur ssh?

9

Comment puis-je exécuter des commandes en mode batch sur ssh? Autrement dit, quel est l' sshéquivalent de la commande sftp -b <filename> <hostname>?

J'ai un ensemble de commandes que je souhaite exécuter sur un ensemble d'hôtes se connectant ssh. Plus sftp, je stocke les commandes dans un fichier filenameet me connecte à l'hôte et exécute les commandes à l'aide de la commande mentionnée précédemment.

Est-ce que quelque chose comme ça est possible ssh?

Srikanth
la source
J'ai parcouru cette question. Mais je ne pouvais toujours pas comprendre comment exécuter les commandes en mode batch.
Srikanth
Et quelqu'un peut-il s'il vous plaît créer une balise #batchmode et étiqueter cette question à cela?
Srikanth

Réponses:

9

Corrigez-moi si je me trompe, mais vous semblez vouloir exécuter des commandes shell régulières sur le serveur distant où le script est 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

Je le fais avec des applications d'exécution à distance « » dans mon environnement de test en utilisant Python au lieu de la coquille: ssh $userhost python < $pythonscriptfilename.

Arcege
la source
Merci d'avoir répondu. Ça y ressemble. Je peaufine un peu et j'essaye maintenant.
Srikanth
7

L'équivalent SSH sftp -b <filename> <hostname>serait:

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

MattBianco
la source
3

Que diriez-vous de rester simple et d'exécuter le fichier "batch" sur l'autre ordinateur?

  1. utilisateur de fichier batch scp @ pc
  2. ssh user @ pc batch-file
  3. ssh user @ pc rm batch-file

Et le fichier batch serait un script shell normal donc la syntaxe est bien connue.

Johan
la source
0

man expect? : \

mais ce n'est pas le moyen parfait.

LanceBaynes
la source
Bonjour johnny8888, je suis sur un serveur Solaris et il n'y a aucune entrée manuelle à prévoir. Pouvez-vous développer votre réponse?
Srikanth
@Srikanth linux.die.net/man/1/expect
Michael Mrozek
@Srikanth: expectest conçu pour interagir avec les programmes qui s'attendent à être exécutés sur un terminal. Ceci n'est pas lié au problème de l'exécution de commandes sur ssh.
Gilles 'SO- arrête d'être méchant'
0

peut-être

ssh user@host sh -c "$(<filename)"
glenn jackman
la source
0

Vous pouvez utiliser des commandes forcées ssh.

Ceux-ci sont associés à une clé particulière. Lorsqu'une authentification est effectuée avec cette clé, cette commande est exécutée et la connexion se ferme. Un avantage de cette approche est une sécurité accrue, car dans ce cas, la clé ne peut pas être utilisée pour accéder à un shell de connexion.

Faheem Mitha
la source
0

Une autre option pour un script d'Arcege serait une fonction 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
}

Je n'utilise pas l' -Toption de ssh , car elle ne fonctionne pas dans tous les cas.

Ce script utilise l'expansion des paramètres sur le tableau des paramètres positionnels $@:

  • "${@:(-1)}" se développe jusqu'au dernier paramètre (forme d'abord littéralement la fin)
  • "${#@}" s'étend au nombre de paramètres positionnels
  • "${@:1:${#@}-1}" se développe en une liste de tous les paramètres du premier au dernier avant (littéralement le nombre de paramètres moins un).
gadamiak
la source
Je ne suis pas si bon sur les extensions de variables comme ça, pourriez-vous ajouter un peu sur ce qui se passe? À votre santé.
Guy
@Guy, vous êtes ici - J'ai commenté le code et ajouté quelques explications sur l'expansion des paramètres
gadamiak