Existe-t-il un moyen de SSH / SCP vers un autre server en tant qu'user différent, via un script?

J'ai besoin d'automatiser un moyen de dissortingbuer des files sur plusieurs servers. Le problème, bien sûr, je dois utiliser un protocole sécurisé (SSH ou SCP) et le nom d'user / mot de passe sur chaque server est différent.

Le scénario est que nous avons un server maître a, avec l'user a_prod et nous devons envoyer des scripts / configurations mis à jour, etc. aux servers b, c, d, … et sur ces servers, les noms d'user sont dits b_dev, c_test, d_prod avec chacun ayant des passwords uniques.

Les noms d'user doivent être uniques dans tous les environnements pour quelques raisons, traitant de DB2 et de la security de l'entreprise.

Les keys partagées ne fonctionneront pas dans ce scénario, donc j'ai besoin de passer les noms d'user et les passwords via un script. C'est un environnement AIX, et je n'ai pas la possibilité de m'attendre.

Des idées?

Les keys partagées sont mentionnées dans plusieurs réponses ci-dessous: J'ai essayé quelques façons de le faire, je pense que le problème principal est que l'ID user distant n'existe sur aucun autre hôte, donc je ne peux pas faire un ssh-keygen pour eux sur le hôte, je souhaite que ssh effectue une implémentation de key partagée avec l'user principal (a_prod) ayant plusieurs identités en fonction de l'hôte cible (b_dev, c_test_d_prod). La key privée pour ces users doit être générée sur l'hôte a pour les users distants, puis leurs keys publiques doivent être copiées sur les hôtes cibles.

"Corporate S (tupidité)" 🙂

SSH / SCP vit généralement avec le domaine de la philosophie UNIX, je pense. Il est très rare que les concepteurs des applications Unix le fassent intentionnellement afin que l'administrateur ne puisse pas facilement faire quelque chose de stupide. Il y aura généralement un avertissement comme: "Vous ne voulez probablement pas le faire parce que … mais, si vous voulez vraiment, bien!".

Dans le cas de passer un mot de passe à ssh dans un script, ils intentionnellement rendent cela difficile, car c'est une mauvaise idée .

À ce stade, je ne dérangei même pas SSH. Vous avez vraiment besoin de parler avec les personnes de security d'entreprise et de proposer une solution réelle pour le scénario. S'ils ne veulent pas utiliser les keys, requestz-leur ce que vous devez faire. Si cela ne fonctionne pas, dites à vos gestionnaires ce qu'ils veulent que cela ne soit pas possible en raison des ressortingctions de security de l'entreprise. Si les gestionnaires insistent pour que vous fassiez cela, obtenez-le par écrit, ou c'est votre cul en ligne

Insérez la clause de non-responsabilité standard sur la politique d'entreprise et pourquoi il est mauvais de mettre des scripts user / passer ici.

Mais nous travaillons tous dans le monde réel où parfois cela n'a pas de sens. Soo .. Il existe de nombreux outils qui vous permettront de faire cela. Shell n'a pas de manière embeddede de fonctionner. Mon arme de choix pour des scripts très rapides et sales de cette nature est Expect. Il est incroyablement facile de fonctionner.

 #!/usr/bin/expect set nodename "hostname" set username "user" set password "pass" set prompt "your prompt on the remote system" eval spawn ssh -x $user@$nodeaddy set timeout 15 expect "password:" { send "$password\r" } expect "$prompt" { send "script\r" } exit 0 

Évidemment, cela peut ou non fonctionner pour vous, mais vous pouvez voir à partir de la syntaxe, à quel point il est simple de fonctionner.

D'abord un avertissement: faites attention de ne pas créer un problème de security au nom de l'opportunité. Kevin et Kyle apportent de bons points. Le stockage de nombreuses combinaisons de nom d'user / mot de passe dans un file (même une database cryptée) est probablement une très mauvaise idée et peut être contraire à la politique de l'entreprise.

La solution à votre problème peut être un certificate côté client. Consultez les articles ci-dessous pour plus d'informations:

  • Configuration des keys SSH pour l'access sans mot de passe
  • Exécutez des commands à distance avec SSH

En supposant qu'une paire de keys privées publiques est autorisée par la politique d'entreprise, ce n'est pas si difficile à atteindre. Pour get un nom d'user différent de l'user exécutant ssh (le script), utilisez le username@host . La partie la plus difficile est de faire fonctionner les keys privées appropriées. En supposant que, en raison d'une sorte de faux sentiment de security, chaque hôte doit utiliser une paire de keys différente (sinon c'est plus simple), vous devez créer un file de configuration qui indique au client quelle paire utiliser pour quel hôte (vous pouvez également spécifier le nom d'user dans le file).

Pour openssh, le file ressemblerait

 host a_prod user usera IdentityFile ~/.ssh/keyfora_prod host b_dev user userb IdentityFile ~/.ssh/keyforb_prod 

etc.

N'oubliez pas que cette configuration n'est pas plus sûre. Si quelqu'un peut accéder à cet user sur cet ordinateur, il peut lire toutes les keys privées (qui ne peuvent pas avoir de mot de passe si les choses doivent être sécurisées, ou vous devez pirater avec ssh_agent) ainsi que les passwords codés. Comme il n'y a aucune raison pour que les files de keys privées vivent ailleurs, mais dans le directory ssh de cet user (lorsqu'il est perdu, on peut facilement créer une nouvelle key), quatre files ne sont pas différents d'avoir un dans une perspective de security.

OK – J'ai finalement travaillé comme suit:

  1. Effectuez le ssh-keygen sur tous les servers.
  2. Configurez le file d'autorisation pour chaque user avec sa key publique.
  3. Configurez le file d'identification pour chaque user avec la key privée
  4. Copiez les keys privées pour les servers de destination vers le server sur lequel vous souhaitez ssh en tant que files uniques (b_dev_id_dsa_2048_a, c_test_id_dsa_a, …)
  5. Appelle ssh comme suit sur l'hôte a: ssh -i b_dev_id_dsa_2048_a b_dev@b

et l'alto, il fonctionne finalement.

Merci à vous tous pour l'aide, et enfin NiXar pour le dernier moment de Homer Simpson DUH comme faisant cela est exactement en arrière de ce que vous faites si l'user est le même sur tous les hôtes.

Sans keys privées ou Attendez-vous ou quelque chose comme ça, je ne vois pas comment vous pouvez le faire automatiquement. Quelque chose doit être donné.

Vous avez quelque chose à faire, n'est-ce pas? Je suppose que vous ne possédez pas Perl car vous pourriez utiliser Expect.pm? Python? N'importe quoi? Est-ce que tout simplement vieux ksh moche? Dis nous en plus.

Si vous n'êtes pas autorisé à utiliser un langage de programmation, vous devez entrer le passage à la main. Dans ce cas, vous pouvez utiliser:

 scp myfile b_dev@b_prod:/path/to/dest 

Si les lots sont impliqués, envisagez d'utiliser SFTP à la place. Vous pourriez alors utiliser lftp, et ne pas avoir à taper le mot de passe, ici directement à partir de la page de manuel:

 lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site] 

Mais si vous ne pouvez pas vous attendre, je doute que vous pouvez utiliser lftp. Peut tu?

/ Oh, je déteste la merde exclusive d'Unix

Ce n'est pas une bonne idée, mais si vous avez vraiment besoin de le faire sshpass peut vous aider: http://sourceforge.net/projects/sshpass/

Je devais faire quelque chose de semblable, seulement en arrière. Nous éliminons les files de plusieurs servers, et c'est ainsi que nous l'avons fait.

 awk '{FS="|"; printf("rsync %s:%s %s &\n", $1, $2, $3)}' config | sh 

Créez un file appelé config et mettez les lignes que vous voulez exécuter. (veuillez noter: vous devez insert une ligne vierge pour commencer).

La façon dont il est configuré maintenant, vous mettez username@server.com|(folder on remote server)|(folder on local server) dans config, et il synchronisera les deux. Vous voudrez changer la command rsync dans la command awk pour faire le contraire.

Cela fonctionnerait bien avec l'authentification ssh-key, c'est ce que nous utilisons.

Je suggérerais également de créer des SSH-Keys pour l'authentification et d'utiliser un outil comme unison ou lsyncd (selon vos besoins) pour garder les files en synchronisation.

Si l'authentification basée sur la key n'est pas une option, vous pouvez utiliser "attendre" ( http://linux.die.net/man/1/expect ) pour l'écrire. Attendez-vous aux vérifications d'un programme défini (indiquez la question du mot de passe) et relève d'une string définie (dans cet exemple, le mot de passe).

Mais encore une fois, comme je l'ai suggéré, je préférerais la solution ssh-key.