web-dev-qa-db-fra.com

Script shell vers SSH dans un autre serveur et y exécuter un script

J'ai 6 serveurs dans mon environnement de test. Je veux écrire un script pour arrêter le serveur Tomcat dans toutes les boîtes en se connectant à une boîte au lieu de se connecter à chaque boîte.

S'il vous plaît, aidez-moi avec les scripts Shell, SSH et l'exécution d'un script dans toutes les autres cases. J'utilise SSH avec un mot de passe et un numéro de port personnalisé.

3
nithi

Vous devez combiner deux réponses Ask Ubuntu liées, une pour vous connecter à SSH via un port spécifique et une pour exécuter des commandes sur le serveur distant , en un seul script. Bien sûr, vous auriez besoin d'une forme de structure de données pour conserver la correspondance serveur + port. Cela peut être soit bash tableaux associatifs soit avec le script POSIX Shell - une déclaration de cas. En supposant que votre nom d'utilisateur sur tous les hôtes est le même, nous pourrions proposer quelque chose comme ceci:

#!/bin/sh
# bar Host has ssh server on port 22, while baz - on port 2222
Host_port(){
    case "$1" in
        "bar") echo 22 ;;
        "baz") echo 2222 ;;
    esac
} 

# set positional parameters of script to hosts and iterate over them
set -- bar baz
for Host ; do
    # command substitution will call function, 
    # function's return value will be the port number
    ssh ssh://username@"$Host":"$(Host_port "$Host")" -t "systemctl stop Tomcat"
done

Maintenant, un avertissement géant : Ce n'est qu'un exemple. Je n'ai pas 6 serveurs pour tester le script, alors adaptez-le à vos besoins si besoin. Si vous avez des noms d'utilisateur différents sur chaque hôte, utilisez une autre instruction case


Note complémentaire sur la connexion: si vous avez une clé privée, qui est acceptée par les 6 serveurs, il sera facile de se connecter simplement en ajoutant -i ~/.ssh/id_rsa. Une alternative à cela serait de créer un ~/.ssh/config fichier contenant les informations de clé/mot de passe pour chaque hôte. Ceci est décrit dans réponse de Lekensteyn . Si vous n'êtes pas familier avec les clés SSH (et je comprends que c'est un sujet un peu déroutant), vous voudrez peut-être lire article ssh.com sur le sujet .

5
Sergiy Kolodyazhnyy

Vous pouvez utiliser sshpass:

Sudo apt install sshpass -y 

alors vous pouvez exécuter la commande sur le serveur distant, par exemple

    #!/bin/bash
    # login info
    Host='192.168.0.1'
    USER='user'
    PORT='2222'
    PASSWORD='password'
    # command
    sshpass -p $PASSWORD ssh -p $PORT $USER@$Host touch 1.txt 
0
Yaroslav Urshulyak