J'ai deux questions:
- Il existe plusieurs machines Linux distantes, et j'ai besoin d'écrire un script shell qui exécutera le même ensemble de commandes dans chaque machine. (Y compris certaines opérations sudo). Comment cela peut-il être fait à l'aide de scripts shell?
- Lors de la connexion à la machine distante, comment gérer le moment où il demande une authentification d'empreinte digitale RSA.
Les machines distantes sont des machines virtuelles créées à la volée et je n'ai que leurs adresses IP. Donc, je ne peux pas placer un fichier de script au préalable dans ces machines et les exécuter à partir de ma machine.
expect
comme `expect" ? assword: "`Réponses:
Vous pouvez le faire avec ssh, par exemple:
Vous pouvez ajouter l'
StrictHostKeyChecking=no
option à ssh:Cela désactivera la vérification de la clé d'hôte et ajoutera automatiquement la clé d'hôte à la liste des hôtes connus. Si vous ne souhaitez pas que l'hôte soit ajouté au fichier d'hôtes connus, ajoutez l'option
-o UserKnownHostsFile=/dev/null
.Notez que cela désactive certains contrôles de sécurité , par exemple la protection contre les attaques man-in-the-middle. Il ne doit donc pas être appliqué dans un environnement sensible à la sécurité.
la source
ssh
partir de n'importe quel script shellIl existe plusieurs façons de gérer cela.
Ma méthode préférée est d'installer http://pamsshagentauth.sourceforge.net/ sur les systèmes distants ainsi que votre propre clé publique. (Trouvez un moyen de les installer sur la VM, vous avez en quelque sorte un système Unix entier installé, qu'est-ce que quelques fichiers de plus?)
Une fois votre agent ssh transféré, vous pouvez désormais vous connecter à chaque système sans mot de passe.
Et encore mieux, ce module pam s'authentifiera pour sudo avec votre paire de clés ssh afin que vous puissiez exécuter avec les droits root (ou tout autre utilisateur) si nécessaire.
Vous n'avez pas à vous soucier de l'interaction de la clé hôte. Si l'entrée n'est pas un terminal, ssh limitera simplement votre capacité à transférer les agents et à vous authentifier avec des mots de passe.
Vous devriez également regarder dans les paquets comme Capistrano. Regardez certainement autour de ce site; il a une introduction aux scripts à distance.
Les lignes de script individuelles peuvent ressembler à ceci:
la source
Installez sshpass en utilisant,
apt-get install sshpass
puis modifiez le script et mettez les adresses IP, les noms d'utilisateur et le mot de passe de vos machines Linux dans l'ordre respectif. Après cela, exécutez ce script. C'est tout ! Ce script installera VLC dans tous les systèmes.la source
Si vous êtes capable d'écrire du code Perl, vous devriez envisager d'utiliser Net :: OpenSSH :: Parallel .
Vous seriez en mesure de décrire les actions qui doivent être exécutées dans chaque hôte de manière déclarative et le module se chargera de tous les détails effrayants. L'exécution de commandes via
sudo
est également prise en charge.la source
Ce travail pour moi.
Syntaxe: ssh -i pemfile.pem nom_utilisateur @ adresse_ip 'command_1; commande 2; commande 3 '
la source
Pour ce genre de tâches, j'utilise à plusieurs reprises Ansible qui permet de dupliquer de manière cohérente des scripts bash dans plusieurs conteneurs ou VM. Ansible (plus précisément Red Hat ) dispose désormais d'une interface Web supplémentaire AWX qui est l'édition open-source de leur tour commerciale.
Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: produit commercial, vous explorerez probablement d'abord l'AWX open-source gratuit, plutôt que le free-trail de 15 jours de la tour
la source
Il existe plusieurs façons d'exécuter les commandes ou le script sur les multiples machines Linux distantes. Un moyen simple et le plus simple est via pssh (programme parallèle ssh)
pssh : est un programme pour exécuter ssh en parallèle sur un certain nombre d'hôtes. Il fournit des fonctionnalités telles que l'envoi d'entrée à tous les processus, la transmission d'un mot de passe à ssh, l'enregistrement de la sortie dans des fichiers et le délai d'expiration.
Exemple et utilisation:
Connectez - vous à host1 et host2, et imprimez "hello, world" à partir de chacun:
Exécutez des commandes via un script sur plusieurs serveurs:
Utilisation et exécution d'une commande sans vérifier ni enregistrer les clés d'hôte:
Si le fichier hosts.txt a un grand nombre d'entrées, disons 100, l'option de parallélisme peut également être définie sur 100 pour garantir que les commandes sont exécutées simultanément:
Options :
-I: Lire l'entrée et l'envoyer à chaque processus ssh.
-P: Indique à pssh d'afficher la sortie à son arrivée.
-h: lit le fichier de l'hôte.
-H: [utilisateur @] hôte [: port] pour un seul hôte.
-i: affiche la sortie standard et l'erreur standard lorsque chaque hôte termine
-x args: transmet des arguments supplémentaires en ligne de commande SSH
-o option: peut être utilisé pour donner des options au format utilisé dans le fichier de configuration. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p parallélisme: utilise le nombre donné comme nombre maximum de connexions simultanées
-q Mode silencieux: provoque la suppression de la plupart des messages d'avertissement et de diagnostic.
-t: rend les connexions expirées après le nombre de secondes donné. 0 signifie que pssh n'expirera aucune connexion
Désactivez StrictHostKeyChecking pour gérer l'invite d'authentification RSA.
-o StrictHostKeyChecking = non
Source : homme pssh
la source
Cela a fonctionné pour moi. J'ai fait une fonction. Mettez ceci dans votre script shell:
Si vous avez plusieurs machines sur lesquelles vous souhaitez exécuter la même commande, vous répétez cette ligne avec un point-virgule. Par exemple, si vous avez deux machines, vous feriez ceci:
Remplacez USER par l'utilisateur de l'ordinateur. Remplacez HOST par le nom de l'ordinateur. Remplacez COMMAND par la commande que vous souhaitez exécuter sur l'ordinateur.
J'espère que cela t'aides!
la source
Vous pouvez suivre cette approche:
la source