Utiliser la valeur d'une variable comme mot de passe pour scp, ssh, etc. au lieu d'inviter l'utilisateur à entrer à chaque fois
Autant que je sache, les commandes ssh
ou scp
n'avez pas/prendre un paramètre de mot de passe. Sinon, je pouvais garder le mot de passe dans une variable du shell et probablement se débarrasser de l'entrée de mot de passe. Si j'écris une commande scp dans mon script shell, il invite l'utilisateur à entrer le mot de passe. J'ai plusieurs ssh et scp commandes dans mon script et je ne veux pas l'utilisateur à entrer le mot de passe à chaque fois. Je préfère enregistrer le mot de passe dans une variable du shell dans le début (en demandant le mot de passe une fois), puis de l'utiliser pour toutes ssh ou scp.
J'ai lu sur "identification" dans cette question. Est-ce lié à la solution, je suis à la recherche d'?
Mise à jour
J'ai lu dans Comment utiliser la commande ssh en script shell? pourquoi il est dangereux de le spécifier des mots de passe sur la ligne de commande. N'utilisant expect
également stocker le mot de passe et est visible (à l'aide de ps aux
)? C'est que le problème de sécurité avec l'aide de expect
?
De Plus Amples Explications
Pour de plus amples que ce soit clair, je suis en train d'écrire ce script shell pour automatiser le code et la base de données de sauvegarde, n'code de téléchargement, exécutez nécessaire requêtes de base de données, faire toutes les choses qui sont nécessaires pour une nouvelle version d'une LAMPE projet à partir d'un développeur de système à distance à un serveur live. Mon script shell sera là à l'intérieur de la principale base de code du projet dans chaque développeur instance.
Exigence
- Je veux que tous les développeurs (tous peuvent travailler à partir de différents systèmes à distance) en sachant que le SSH/FTP mot de passe pour pouvoir utiliser l'invite de commande en entrant le ssh/ftp mot de passe uniquement au moment de l'exécuter une fois. Je préfère le mot de passe pour être le ssh/ftp mot de passe
Note - je ne veux pas que d'autres développeurs qui ne connaissent pas le mot de passe SSH pour être en mesure de l'utiliser (Donc je suppose que l'authentification par clé publique ne fonctionnera pas car il stocke les mots de passe dans les systèmes).
- Je ne veux pas de ligne de commande solution qui stocke le mot de passe dans un log dans le système et peut être du monde visible à l'aide de ps aux ou quelque chose.
Ouverture Bounty
À partir de toutes les réponses jusqu'à présent et mon analyse de ces solutions, elle ressemble aux autres que l'authentification par clé publique, tous les autres sont en insécurité. Je ne suis pas encore sûr si vous utilisez expect
est précaire. Je pense que c'est sinon la bonne solution pour moi. Dans ce cas, je suis de commande introuvable erreurs en essayant de faire que, comme déjà commenté sur l'une des réponses.
De http://www.debianadmin.com/sshpass-non-interactive-ssh-password-authentication.html -
D'abord et avant tout, les utilisateurs de sshpass
devrait se rendre compte que le ssh de l'insistance
sur seulement obtenir le mot de passe
de manière interactive n'est pas sans raison.
Il est proche d'être impossible
stocker en toute sécurité le mot de passe et les utilisateurs
de sshpass devrait examiner si les
de ssh authentification par clé publique
offre la même expérience de l'utilisateur final,
tout en impliquant moins de tracas et d'être
plus sécurisé.
Donc, il n'est pas possible d'exécuter en toute sécurité plusieurs ssh, scp commandes en entrant le ssh/ftp mot de passe (si une seule fois au moment de l'exécution? Veuillez lire mon Exigence de l'article de nouveau.
Aussi, quelqu'un peut-il expliquer ce -
En particulier, des gens qui écrivent des programmes
qui satisfait sont destinés à
communiquer les points ci-dessus)mot de passe
par programme sont encouragés à utiliser
un canal anonyme et passe le tuyau de
la lecture de la fin de sshpass à l'aide de l'option-d
option.
Est-ce à dire que tout est possible?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
En effet, vous aurez certainement envie d'envisager la possibilité de créer des clés ssh, au cours de l'enregistrement d'un mot de passe dans un script bash. Si la clé est sans mot de passe, puis aucune intervention de l'utilisateur sera tenu de ssh/scp. Vous venez de le configurer pour utiliser la clé sur les deux extrémités et le tour est joué, la communication sécurisée.
Cependant, je vais obtenir downvoted en enfer si je ne dis pas cela. Beaucoup considèrent ssh sans mot de passe touches d'être une Mauvaise Idée(TM). Si quelqu'un reçoit ses mains sur les touches, le plein accès. Cela signifie que vous êtes en s'appuyant sur d'autres mesures de sécurité telles que les autorisations de fichier pour garder votre mot de passe sûr.
Aussi, regardez dans ssh-agent. Il vous permet de le configurer de sorte que vous avez un mot de passe protégé ssh-clé, mais vous avez seulement besoin de le saisir à la fois et il va gérer le mot de passe de la clé pour vous et l'utiliser quand nécessaire. Sur mon linux à la maison, j'ai ssh-agent configuré pour s'exécuter dans mon .xinitrc fichier de sorte qu'il me pousse une fois et puis commence à X. YMMV.
Mise à JOUR:
En ce qui concerne vos exigences, protégé par mot de passe authentification par clé publique + ssh-agent semble toujours s'adapter. Seuls les développeurs sont au courant de la SSH/FTP mot de passe pourrait commencer à ssh-agent, tapez le mot de passe et ssh-agent de gérer les mots de passe pour les clés publiques pour le reste de la session, jamais exigeant une interaction de nouveau.
Bien sûr, comment il stocke c'est une tout autre affaire. IANASE, mais pour plus d'informations sur les problèmes de sécurité à l'aide de ssh-agent, j'ai trouvé de symantec article pour être assez instructif: http://www.symantec.com/connect/articles/ssh-and-ssh-agent
J'espère que vous n'êtes pas dans une situation où vous essayez d'utiliser un non approuvés
root
'système.La bonne façon de le faire est comme suit:
S'assurer que tous vos utilisateurs à l'aide de ssh-agent (aujourd'hui, c'est la valeur par défaut pour la plupart des systèmes Linux). Vous pouvez le vérifier en exécutant la commande suivante:
echo $SSH_AUTH_SOCK
Si cette variable n'est pas vide, cela signifie que l'utilisateur est à l'aide de ssh-agent.
Créer une paire de clés d'authentification pour chaque utilisateur de s'assurer qu'ils sont protégés par un non vide mot de passe.
Installer la partie publique des clés d'authentification sur l'ordinateur distant, de sorte que les utilisateurs peuvent se connecter.
Vous êtes fait!
Maintenant, la première fois qu'un utilisateur veut se connecter à la machine distante de quelques session, il faudra entrer le mot de passe pour la clé privée.
Plus tard, les connexions à partir de la même session ssh-agent fournira le déverrouillage de la clé pour l'authentification dans le nom de l'utilisateur qui ne sera pas nécessaire d'introduire la phrase de passe de nouveau.
Vous pouvez L'aide s'attendre à passer un mot de passe ssh faire ceci ou comme l'a dit déjà utiliser l'authentification par clé publique au lieu, si c'est une option viable.
Ugh. J'ai frappé les pages de manuel pour cela. Voici ce que j'ai:
Utiliser ce code au début du script en mode silencieux obtenir le mot de passe ssh:
Et ensuite utiliser sshpass pour ssh comme suit:
Espère que ça aide.
Attendre à l'insécurité
Il anime une session interactive. Si vous deviez passer un mot de passe via attendre, il ne serait pas différent de vous taper un mot de passe sur la ligne de commande sauf le script expect aurait récupérer le mot de passe quelque part. Il est en général d'insécurité parce que les gens vont mettre le mot de passe dans le script, ou dans un fichier de config.
C'est aussi notoirement fragile parce qu'il attend notamment la sortie comme l'événement mécanisme pour l'entrée.
ssh-agent
ssh-agent est une belle solution si c'est le script qui va toujours être actionnée manuellement. Si il y a quelqu'un qui va être connecté pour conduire l'exécution du script qu'un agent est une bonne façon d'aller. Ce n'est pas une bonne solution pour l'automatisation parce qu'un agent implique une session. Vous n'avez généralement pas à ouvrir une session automatiquement coup de pied à un script (c'est à dire. cron).
ssh touches de commande
Commande Ssh keys est votre meilleur pari pour une solution automatisée. Il ne nécessite pas une session, et de la touche de commande restreint ce qui s'exécute sur le serveur uniquement pour la commande spécifiée dans la authorized_keys. Ils sont aussi généralement le programme d'installation sans mots de passe. Cela peut être une solution complexe à gérer si vous avez des milliers de serveurs. Si vous avez seulement un peu alors c'est assez facile à configurer et à gérer.
service ssh comptes
J'ai aussi vu des configurations par mot de passe de moins en moins les comptes de service. Au lieu de la commande d'entrée dans tehh fichier authorized_keys, et de l'autre mécanisme est utilisé pour restreindre l'accès/commandes. Ces solutions sont souvent utiliser sudo ou restreint coquilles. Cependant, je pense qu'ils sont plus compliqués à gérer correctement, et ont donc tendance à être plus anxieux.
hôte à l'authentification automatique
Vous pouvez également configurer l'hôte 2 hôte authentification automatique, mais il y a beaucoup de choses à écrire pour le faire correctement. À partir de la configuration de votre réseau correctement, à l'aide d'un bastion de l'hôte pour la clé d'hôte de la diffusion, de la bonne ssh configuration du serveur, etc. En conséquence, ce n'est pas une solution a recommander sauf si vous savez ce que vous faites et ont la capacité et l'aptitude à mettre tout en place correctement et de le maintenir comme tel.
Oui, vous voulez pubkey d'authentification.
Pour l'authentification par mot de passe, comme vous l'avez mentionné dans vous de description, vous pouvez utiliser le bouton "sshpass". Sur Ubuntu, vous pouvez installer autant de "sudo apt-get install sshpass".
Public/privé à la paire de clés de la base de l'authentification,
Une fois copiée, les connexions suivantes ne devraient pas demander de mot de passe.
Pour ceux pour qui la configuration d'une paire de clés n'est pas une option et ont absolument besoin pour effectuer l'authentification par mot de passe, utilisez
$SSH_ASKPASS
:E. g.:
Voir aussi Dire SSH pour utiliser un graphique de l'invite de mot de passe.
Aujourd'hui, la seule façon que j'ai été capable de le faire dans un script bash via
crontab
était comme ça:C'est avec l'agent ssh déjà en cours d'exécution et, pour y parvenir, il était nécessaire le mot de passe.
ssh
ssh-keygen
ssh-agent
ssh-add
et une configuration correcte dans/etc/ssh_config
sur les systèmes distants sont des ingrédients nécessaires à la sécurisation de l'accès à des systèmes distants.Premier, privé/public paire de clés doit être généré avec
ssh-keygen
. Le résultat de l'keygen sont deux fichiers: le clé publique et la clé privée.Le fichier de clé publique, généralement stockés dans
~/.ssh/id_dsa.pub
(ou~/.ssh/id_rsa.pub
pour le cryptage RSA) doit être copié dans chaque système distant qui sera l'octroi de l'accès à distance à l'utilisateur.Le fichier de clé privée doit rester sur le système d'origine, ou sur un disque USB ("pouce") lecteur référencée dans le système d'approvisionnement.
Lors de la génération de la paire de clés, un passphrase est utilisé pour se protéger contre l'utilisation par les utilisateurs non authentifiés. Lors de l'établissement d'une session ssh pour la première fois, la clé privée ne peut être déverrouillé avec le mot de passe. Une fois débloqué, il est possible que le système d'origine pour rappeler le déverrouillage de la clé privée avec
ssh-agent
. Certains systèmes (par exemple, Mac OS X) démarrera automatiquementssh-agent
dans le cadre du processus d'ouverture de session, et ensuite faire un automatiquessh-add -k
qui déverrouille votre privé clés ssh en utilisant un mot de passe précédemment stockées dans le trousseau de fichier.Connexions à des systèmes distants peut être directe, ou mandatées par le biais de ssh passerelles. Dans le premier cas, le système distant seulement besoin de connaître la clé publique correspondant à la disposition déverrouillé clés privées. Dans le cas de l'utilisation d'une passerelle, le système intermédiaire doit avoir la clé publique ainsi que les éventuelles système cible. En outre, l'original de la commande ssh doit permettre de l'agent de transfertsoit par configuration dans
~/.ssh/config
ou par option de commande-A
.Par exemple, de se connecter au système à distance "app1" à travers une passerelle ssh à un système appelé "gw", le suivant peut être fait:
ou à la suite de strophes placé dans le
~/.ssh/config
fichier:qui s'exécute "net chat" (aka
nc
) sur la passerelle ssh comme un réseau de tuyaux.La configuration ci-dessus permettra très simple ssh commandes, même à travers ssh passerelles:
Parfois, même plus important que les sessions de terminal sont
scp
etrsync
commandes pour déplacer des fichiers de manière sécurisée. Par exemple, j'utilise quelque chose comme cela pour synchroniser mon environnement personnel à un système distant:Sans le fichier de config et nc proxy commande, le rsync serait un peu plus compliqué:
Rien de tout cela fonctionne correctement, à moins que la distance des systèmes de
/etc/ssh_config
est configuré correctement. Une telle configuration est de retirer la "racine" de l'accès via ssh), d'améliorer le suivi et la reddition de comptes lorsque plusieurs membres du personnel peut effectuer les fonctions du système racinaire.Sans surveillance dans des scripts batch, un ssh à la paire de clés doit être généré pour l'utilisateur non-root nom d'utilisateur sous lequel les scripts sont exécutés. Tout comme avec ssh, gestion de session, le lot de l'utilisateur ssh à la paire de clés doit être déployé de la même façon, avec la clé publique copié sur les systèmes distants, et la clé privée, résidant sur le système source.
La clé privée peut être verrouillé avec un mot de passe ou déverrouillé, comme souhaité par les gestionnaires du système et/ou les développeurs. La façon d'utiliser le lot de clés ssh, même dans un script qui s'exécute en tant que root, est d'utiliser le "
ssh -i ~/.ssh/id_dsa
" options de la commande avec tous les accès à distance des commandes. Par exemple, pour copier un fichier à l'intérieur d'un script à l'aide de la "fournée" d'accès d'utilisateur:Cela provoque
rsync
à l'aide d'unssh
de commande à distance de l'accès shell. Le cas spécialssh
commande utilise le "lot" de l'utilisateur de la clé DSA privée comme son identité. Lersync
de commande du système distant cible sera accessible à l'aide de la "fournée" de l'utilisateur.