Comment SSH en une seule ligne

26

Comment puis-je me connecter à un autre ordinateur via SSH sur une seule ligne? Si je devais le faire ssh host@IP, il me faudrait saisir le mot de passe sur la deuxième ligne. Je pensais que je pouvais faire quelque chose comme ça:, ssh host@IP | echo passwordmais cela met le mot de passe avant de demander le mot de passe.

Ben A.
la source
3
Ce genre de pensée vient de l'époque de Telnet et attend, à l'époque où Internet était un endroit plus sûr. La réponse d'Allen est correcte, la réponse de Jakuje est techniquement vraie mais n'est pas l'outil pour le travail dans la plupart des endroits.
Criggie
3
C'est une bonne question pour configurer une connexion sans mot de passe. Je vous demanderais de revoir votre réponse acceptée. Quelle réponse de Jakuje est correcte et fonctionnera, la bonne façon de le faire est avec les clés SSH, décrites dans la réponse d'Allan.
Scot
Si sshlirait le mot de passe depuis stdin, echo password | ssh host@IPcela fonctionnerait, mais généralement SSH essaie de lire directement depuis le terminal.
Paŭlo Ebermann

Réponses:

82

Vous devez utiliser des clés SSH pour vous authentifier plutôt que de mettre votre mot de passe sur la ligne de commande car il est extrêmement peu sûr.

La façon dont cela fonctionne est une fois que vous avez configuré vos clés SSH, tout ce que vous avez à faire est d'émettre la commande:

ssh user@host

et sans taper autre chose, vous serez automatiquement connecté.


Copier la clé publique SSH sur Mac / FreeBSD / Linux à partir de macOS

Cela suppose que vous avez accès au serveur distant via une authentification par mot de passe (en tapant un mot de passe) et que vous avez déjà généré votre paire de clés privée / publique (sinon, voir ci-dessous). Dans l'exemple suivant, nous utilisons RSA. Pour commencer, copions la clé (sachez que le répertoire "home" diffère entre macOS, Linux, BSD, etc.):

Utilisation de SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

Ou simplement attraper le fichier authorized_keys(je préfère cette méthode):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(Votre nom de clé peut différer) Si le répertoire .ssh n'existe pas sur le serveur distant, vous devrez vous connecter et le créer.

Maintenant, la clé a été copiée du mac vers le serveur distant . Définissez les autorisations correctes pour la clé publique SSH sur le serveur distant:

chmod 600  ~/.ssh/id_rsa.pub

Ajoutez ensuite la clé au fichier SSH authorized_keys, si le fichier n'existe pas, créez-le.

Si le fichier authorized_keysexiste déjà dans ~/.sshla, utilisez la commande suivante:

cat id_rsa.pub >> authorized_keys

Si le fichier n'existe pas, entrez les commandes suivantes:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Générer une clé publique / privée SSH sur macOS

Ouvrez le terminal en allant dans Applications -> Utilitaires -> Terminal

Dans le terminal, utilisez la commande suivante pour démarrer la génération de clés

ssh-keygen -t rsa

Ensuite, vous serez invité à fournir l'emplacement où vous souhaitez créer le fichier de clé privée:

Entrez le fichier dans lequel enregistrer la clé ( /Users/username/.ssh/id_rsa):

Laissez ce champ vide pour créer la clé à l'emplacement par défaut, qui est /Users/username/.ssh/id_rsa. Le fichier de clé publique sera créé au même emplacement et avec le même nom, mais avec l'extension .PUB.

Après, vous serez invité à choisir une phrase secrète. Il s'agit du mot de passe facultatif pour utiliser la clé privée.

Enter passphrase (empty for no passphrase):

Votre clé SSH est générée.

Maintenant, gardez à l'esprit que si vous entrez une phrase secrète, vous devrez la saisir à chaque connexion. L'utilitaire ssh-agentgardera la phrase secrète en mémoire, ce qui vous évitera de la saisir manuellement à chaque fois que vous vous connectez pendant que vous êtes dans la même session. Pour plus de détails, voirman ssh-agent

Allan
la source
6
Absolument - les clés peuvent et doivent remplacer complètement les mots de passe pour tout accès ssh sur Internet. Je vous suggère de développer le besoin de sécurité de la clé privée, que ce n'est pas quelque chose à avoir sur tous vos ordinateurs.
Criggie
+1 C'est une très bonne réponse, non seulement à cause de ce qu'elle dit, mais aussi à cause de la façon dont vous l'avez expliqué. Tout ce qui est plus facile à suivre pour les utilisateurs et les aide à être plus en sécurité est un plus dans mes livres!
Monomeeth
7
Très bonne réponse. Je voulais juste ajouter que ssh-copy-idc'est un bel outil pour automatiser certains des éléments ci-dessus.
Scot
Une mention de ssh-agent pourrait également aider. La plupart (toutes?) Des versions d'OS X / macOS sont livrées avec, et il permet une connexion sans mot de passe même lorsque la clé est protégée par mot de passe.
Qsigma
1
@Scot - il ne fait pas partie de macOS par défaut et doit être installé via Homebrew ou MacPorts . Je ne suis pas un fan de l'installation de logiciels car les choses peuvent être accomplies en 1 ligne ou un court script auto-écrit et pour ces raisons, je pensais que cela sortait du cadre de la réponse. Cependant, c'est un bon petit utilitaire et mérite d'être mentionné.
Allan
13

Il existe plusieurs possibilités. Votre exemple ne fonctionnera évidemment pas, mais vous pouvez réaliser quelque chose de similaire en utilisant l' sshpassutilitaire:

sshpass -p password ssh host@IP

Notez que cela n'est pas recommandé car passwordil sera visible pour d'autres processus ou dans l'historique du shell.

Une bien meilleure façon de faire de même consiste à configurer l'authentification sans mot de passe à l'aide des clés SSH. En bref:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP
Jakuje
la source
J'ai essayé le sshpasscomme vous l'avez recommandé, mais il a dit que la commande était introuvable.
Ben A.
8
Eh bien ... Vous devrez probablement l'installer. Et non, je ne le recommande pas. Configurez l'authentification sans mot de passe à l'aide des clés ssh.
Jakuje
4
@BenA. configurer l'authentification sans mot de passe en définissant un clavier public / privé et en le configurant sur les deux machines concernées. C'est beaucoup plus facile (et en fait plus sûr) que n'importe quel mot de passe
nohillside
8
Mille fois non. sshpass est un hack sale utilisé pour se connecter à des appareils qui parlent ssh mais ne font pas correctement les touches, et son utilisation principale est les scripts de configuration. Vous n'utiliseriez pas sshpass sur une machine multi-utilisateur ps auxw | grep sshpass qui dira aux autres utilisateurs le mot de passe ssh.
Criggie
1
@Criggie, pas entièrement. Bien que je sois à 100% derrière la solution basée sur les clés, j'ai sshpass sur quelques Raspberry Pis internes (pour les tâches aléatoires et accessibles par des clients aléatoires; passer des clés uniquement pour un usage interne est un problème). L' exécution de votre commande donne la sortie suivante: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh [email protected]. Le zzzzzzzzest littéral; sshpass masque le contenu du mot de passe. Peut-être que les versions précédentes étaient moins sensibles à la confidentialité.
2017 à
3

J'ai aussi passé beaucoup de temps à chercher la réponse à cela. Bien qu'il ne soit pas sûr et que toutes ces personnes vous disent d'utiliser des clés RSA ( ce qui est une idée plus sûre et fiable ), c'est tout à fait possible.

Utilisez un programme appelé expectpour cela. Expect surveillera stdout (et je pense que stderr s'il est configuré correctement) pour vous, en attendant certains messages et en y répondant avec une sortie. S'attendre à lui-même est en fait un langage de script, et quand je faisais la même chose, j'ai eu beaucoup de mal à faire fonctionner correctement mon propre script à cause du timing. Cependant, attendez également inclut un utilitaire pratique appelé autoexpect.

Avec autoexpect, il vous surveillera et générera un script d'attente pour vous. Exécutez simplement autoexpect et la commande souhaitée:

autoexpect ssh host@ip 

et faites ce que vous feriez normalement. Lorsque vous quittez le programme (en tapant exitdans le shell ssh'd), il génère le script. Dans le cas où vous ne voulez pas que tout le script que vous écrivez soit dans un script attendu, vous pouvez modifier le script depuis autoexpect (appelé script.exp) pour quitter avant de taper la exitcommande dans le shell. La ligne que vous souhaitez déplacer pour modifier la fin du script est:

expect eof

ce qui signifie attendre la fin du fichier. J'espère que cela t'aides!

Allan
la source
1
Au cas où personne d'autre ne l'aurait encore dit: Bienvenue chez Ask Different!
Synoli
2

Il expectest tout simplement faux de se connecter à une connexion ssh pour autre chose que dans une suite de tests.

Ce que @ ben-a recherche est déjà implémenté dans ssh. L'astuce consiste à savoir comment l'utiliser. Alors voilà:

  1. Générez une paire de clés publique / privée à l'aide de ssh-keygen. Utilisez ECDSA ou RSA comme -t(ou type) et pour RSA utilisez 2048 ou 4096 comme -b(ou longueur BITS). Cela devrait suffire au moment de la rédaction. Utilisez TOUJOURS un MOT DE PASSE!
  2. Utilisez la ssh-copy-idou la méthodologie mentionnée ci-dessus pour créer sur la machine à laquelle vous vous connectez (aka le serveur) le ~/.ssh/authorized_keysfichier. Il contient une copie de la clé publique que vous venez de générer.
  3. Maintenant, sur la machine que vous utilisez pour vous connecter au «serveur» (ou client), vous ouvrez le fichier ~/.ssh/config. S'il n'existe pas, vous pouvez le créer.
  4. Dans ce fichier, vous ajoutez ce qui suit à vos besoins

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. Vous pouvez maintenant utiliser simplement ssh <name>pour configurer la connexion, mais il aura toujours besoin du mot de passe pour votre clé. Pour résoudre ce problème, utilisez l'agent ssh développé et inclus à cet effet. Pour ajouter votre clé à l'agent, utilisez simplement ssh-add <path to keyfile>. Le mot de passe vous sera demandé et il conservera la clé pour vous en toute sécurité pour cette session. S'il renvoie l'erreur "impossible de trouver l'agent ssh" (ou similaire), cela signifie que l'agent n'a probablement pas été démarré. Vous pouvez le démarrer pour cette session en utilisant ssh-agent bash. Cela lancera un nouveau shell avec l'agent actif dedans.

Lorsque vous utilisez ces étapes, non seulement il est plus difficile pour quelqu'un de vous usurper votre identité en détournant vos informations d'identification, mais vous gardez également la convivialité en ordre (c'est plus facile à utiliser que les mots de passe simples).

LvB
la source