Comment ssh vagabonder sans réellement lancer «vagrant ssh»?

149

Je voudrais reproduire la façon dont Vagrant se connecte à ma VM dans un script shell à l'aide de la sshcommande, donc je crée un alias pour mon instance Vagrant.

Quelle est la syntaxe de commande pour utiliser la sshcommande normale pour y accéder?

Kevin Burke
la source
Qu'est-ce que vous demandez réellement, je vois trois choses différentes qui sont posées, peut-être pourriez-vous développer la question puis marquer pour migrer. Merci.
Kev
3
Par défaut, le port ssh de la VM qui est -22 sera transféré à 2222 sur la machine hôte. J'ai masticé sur 127.0.0.1 et le port 2222 avec SSH et cela a fonctionné!
Vishal Biyani le
8
Si vous exécutez plusieurs boîtiers, ce numéro de port changera automatiquement. Vous pouvez obtenir le bon en courant vagrant ssh-config.
Stefano Palazzo

Réponses:

108

J'ai dû réimplémenter "vagrant ssh" parce que son -coption ne transmettait pas correctement les arguments. C'est essentiellement ce qu'il fait (il y en a peut-être plus, mais cela fonctionne bien de cette façon)

#!/bin/sh
PORT=$(vagrant ssh-config | grep Port | grep -o '[0-9]\+')
ssh -q \
    -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no \
    -i ~/.vagrant.d/insecure_private_key \
    vagrant@localhost \
    -p $PORT \
    "$@"

En one-liner (avec merci à kgadek):

ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost

Pour tenir compte du fait que vous avez plus d'un hôte vagabond, cela sélectionnera l'hôte souhaité, ainsi que les lignes vides de la configuration (en utilisant sed):

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost
Stefano Palazzo
la source
3
Cette réponse ne vous permet pas d'accéder sshà votre Vagrant depuis l'extérieur du Vagrantfilerépertoire ("en utilisant la sshcommande régulière "), c'est ainsi que j'ai interprété la question.
sjy
Vous pouvez définir le port vous-même. Ainsi, le script sera exécutable à partir de n'importe quel répertoire.
Yser
Alors, qu'est-ce qui fait de ce port un moyen d'entrer dans la machine? Où est la configuration de quel port il s'agit?
nroose
1
Vagrant en choisit un inutilisé avec le auto_correct: trueparamètre. Voici plus d'informations sur la façon de le changer manuellement
Stefano Palazzo
1
J'ai dû sauter la première ligne, c'est à dire. l' Hostentrée. La commande modifiée est:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek
148

Il y a déjà beaucoup de réponses, mais elles semblent toutes trop compliquées ou résolvent des problèmes que le demandeur n'avait pas.

simplement:

# save the config to a file
vagrant ssh-config > vagrant-ssh

# run ssh with the file.
ssh -F vagrant-ssh default
Steven Soroka
la source
2
C'est étonnant. N'oubliez pas d'ajouter un vagrant-sshfichier .gitignore.
sashaegorov
5
Avec quelques coquilles (par exemple zsh), le one-liner suivant fonctionne:ssh -F =(vagrant ssh-config) default
liori
4
Vous voudrez peut-être faire écho à ce résultat dans votre sshfichier de configuration:, vagrant ssh-config >> ~/.ssh/configdonc vous exécutez simplement ssh defaultde n'importe où dans votre système, où defaultest le nom de la VM que vous pouvez spécifier comme ici
adamczi
Merci @adamczi, c'est la méthode simplifiée qui fonctionne également pour les solutions automatisées où l'ajout de paramètres ssh supplémentaires -Fn'est pas simple
laimison
3
En ajoutant une entrée à la ~/.ssh/configmanière suggérée par @adamczi, vous pouvez ensuite utiliser l'extension Visual Studio Code Remote - SSH pour ssh dans la machine virtuelle Vagrant, modifier les fichiers et effectuer le développement à distance. Simplement CMD-SHIFT-P puis "Remote-SSH: Connect to Host ..." et l'entrée ssh .config que vous venez d'ajouter est automatiquement répertoriée - il vous suffit de la sélectionner et voilà, vscode se connecte à votre vm vagrant distant! Sans l'approche d'entrée de configuration, je ne sais pas comment je l'aurais fait autrement avec vscode.
abulka
52

En course terminale

vagrant ssh

Dans une autre fenêtre / onglet de terminal

ps aux | grep ssh

Là, vous verrez la commande réelle exécutée par Vagrant, quelque chose comme ceci:

ssh vagrant@127.0.0.1 -p 2222 -o Compression=yes -o DSAAuthentication=yes -o LogLevel=FATAL -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -i ~/.vagrant.d/less_insecure_private_key -o ForwardAgent=yes
Leksat
la source
Excellente astuce si vous avez besoin de l'hôte de votre vagrant pour ssh pour d'autres raisons, comme une connexion SQL GUI, telle que Sequel Pro. Celui-ci me sauve!
Atomox
19

Passez simplement le tout vagrant ssh-configen fichier de configuration sshavec le -F configfileparamètre. L'alias d'hôte auquel se connecter est défini sur la première ligne de vagrant ssh-config; Host defaultsignifie que vous pouvez vous connecter avec ssh default.

Je ne pouvais pas voir une option pour lire le fichier de configuration à partir de l'entrée standard, alors je suis allé avec la route du fichier temporaire. Voici une ligne unique qui nettoie également le $TMPDIR.vagrant-ssh-configfichier temporaire par la suite. Il doit être exécuté dans le même répertoire que le vôtre Vagrantfile, en supposant que votre boîte vagabonde soit opérationnelle.

vagrant ssh-config > $TMPDIR.vagrant-ssh-config && ssh default -F $TMPDIR.vagrant-ssh-config ; rm $TMPDIR.vagrant-ssh-config

Remarque: sur mon système Mac OSX, se $TMPDIRdéveloppe en /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(maintenant). Utilisez une autre variable , ou un autre dossier, s'il n'est pas défini sur votre système.

Joël Purra
la source
3
Si vous utilisez bash ou zsh, la substitution de processus est un moyen plus simple de passer la sortie d'une commande à une autre. bash: ssh -F <(vagrant ssh-config) zsh: zsh process substitution ssh -F =(vagrant ssh-config)
myeeshen
@myshen: selon la réponse de @tyrion , la substitution de processus ne fonctionne pas pour ssh -Fbash - la façon dont vous mentionnez devrait cependant fonctionner dans zsh.
Joel Purra
Dang, j'ai vraiment besoin d'apprendre à utiliser réellement vagrant, sans parler de bash.
Spencer Williams
14

J'ai résolu cela d'une manière très simple: lorsque vous démarrez la boîte vagrant, elle affiche l'adresse ssh comme celle-ci

SSH address: 127.0.0.1:2222

alors vous pouvez vous connecter à la boîte en utilisant l'utilisateur vagrant, l'hôte et le port que vous obtenez

ssh vagrant@127.0.0.1 -p 2222
Samer Abu Gahgah
la source
1
agréable! et notez que généralement, le mot de passe de l'utilisateur vagabond estvagrant
Brad Parks
7

Si vous n'avez pas besoin d'utiliser stdin avec ssh(par exemple, vous voulez exécuter juste une commande et vous déconnecter), vous pouvez utiliser:

vagrant ssh-config --host default | ssh -F /dev/stdin default

Cette méthode a été suggérée en réponse à une question similaire sur les groupes Google .

Malheureusement , la substitution de processus bash ne fonctionne pas non plus (voir cette question sur unix.stackexchange pour plus de détails).

Les meilleures options que vous avez, si vous voulez un shell interactif, sont de créer un fichier temporaire et de l'utiliser avec ssh -Fou de l'utiliser awkcomme suggéré par les autres réponses.

Tyrion
la source
5

Si vous voulez simplement le configurer pour pouvoir utiliser la ligne de commande ssh normale, ainsi que scp et autres, vous pouvez exécuter vagrant ssh-configet ajouter la sortie à votre configuration ssh par défaut. Si vous remplacez la ligne "Host default" par un nom d'hôte plus descriptif, vous devriez être prêt à partir.

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
Tedward
la source
Exactement ce que le médecin a ordonné ... Thx.
xenoid
4

Si vous voulez simplement que la commande minimale se connecte à votre box, vous devez connaître le port qu'il utilise (imprimé en faisant vagrant up, ou visible en faisant vagrant ssh-config) et où se trouve votre clé SSH privée (également visible en faisant)vagrant ssh-config )

Ensuite, il suffit de fournir la clé et le port:

ssh -p 2222 -i $HOME/vagrantenv/.vagrant/machines/default/virtualbox/private_key [email protected]

Nico Villanueva
la source
4

De nombreuses autres réponses supposent que Vagrant est installé.

J'ai Vagrant installé sur Windows 10, mais je ne peux pas vagrant sshcar j'utilise PuTTy comme client SSH, ce que vagrant n'acceptera pas.

L' sshexécutable trouvé dans le PATH est un client SSH PuTTY Link. Vagrant est uniquement compatible avec les clients OpenSSH SSH.

Cependant, dans Windows 10, nous avons également Bash sur Ubuntu sur Windows. Donc, je l'utilise simplement avec la commande suivante:

ssh vagrant@127.0.0.1 -p2222 -i .vagrant/machines/default/virtualbox/private_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=Fatal

Il est assez facile d'installer Vagrant sur Win10-Ubuntu, mais il souhaite également que vous installiez Virtualbox pour une raison quelconque, ce que je préfère ne pas faire.

NB j'ai essayé avec la ssh default -F vagrant-ssh-configméthode, mais j'obtiens juste

Autorisation refusée (publickey, mot de passe).

Je suppose que c'est parce que le IdentityFilechemin est un chemin Windows, alors que dans Bash, il devrait commencer par /mnt/c/. Je suppose que vous pouvez simplement écrire le fichier et le modifier si cela fonctionne mieux pour vous.

mpen
la source
4

Vous pouvez ajouter une configuration d'hôte vagabond à votre configuration ssh locale.

  1. vagrant ssh-config >> ~ / .ssh / config

  2. ssh vagrant @ {hôte}

ex. cat ~ / .ssh / config

Host kmaster
  HostName 127.0.0.1
  User vagrant
  Port 2222..
  ....
  • ssh vagrant @ kmaster
Vinay Kumar Gupta
la source
3

Il existe un moyen qui reproduit la façon dont un utilisateur distant peut se connecter au système

  1. Modifiez le Vagrantfile pour votre instance en ajoutant

config.vm.network "private_network", ip: "192.168.33.10"

Cela ajoute une adresse IP privée pour l'hôte (faites-en ce que vous souhaitez dans la plage 192.168 tant qu'il n'est pas déjà utilisé

  1. Redémarrez l'instance avec vagrant reload à partir de la ligne de commande
  2. Copiez le fichier vagrant private_key dans un équivalent Linux que vous devriez avoir exécuté sur votre boîte (par exemple Cygwin si sous Windows, j'utilise Windows 10) dans votre répertoire de base cygwin, en le renommant en cours de route en quelque chose décrivant l'hôte que la clé doit être utilisée pour, par exemple

your_virtual_host_name.pem

  1. Vous trouverez la clé sous .vagrant \ machines \ default \ virtualbox \ private_key

  2. Allez dans votre répertoire personnel et faites votre ssh Unix habituel, alors

ssh -i your_virtual_hostname.pem [email protected]

où le nom d'utilisateur, peut bien être vagabond si vous avez une boîte standard, regardez la sortie de vagrant ssh-config pour les détails standard ssh pour la boîte.

C'est tout

Jimbo
la source
Merci, grâce à votre idée de copier le fichier clé de vagrant ailleurs, j'ai réalisé quel problème j'avais - j'ai utilisé le fournisseur libvirt sous Linux. Ceci est important car avec le fournisseur libvirt, vous devez initialiser vagrant avec sudo et tous les fichiers du .vagrantdossier appartiennent donc à root. Et les permissions sur le fichier étaient rw ------- donc seul root avait les permissions pour lire le fichier clé. Cela pourrait peut-être être utile à n'importe qui.
TomasH
2

Vagrant stocke la clé privée ~/.vagrant.d/insecure_private_keyet l'utilise pour se connecter à chaque machine via ssh, étant donné qu'elle est configurée pour se connecter sur le port 2200 (par défaut), ce serait quelque chose comme:

ssh vagrant@localhost -p 2200 -i ~/.vagrant.d/insecure_private_key

Remarque: assurez-vous que la clé privée appartient à l'utilisateur exécutant Vagrant .

Cependant, si votre objectif est d'avoir un environnement multi-machines, vous pouvez le faire en utilisantconfig.vm.define .

Voici un exemple illustrant un environnement avec 2 machines, l'une appelée webet l'autre databases:

config.vm.define 'web', primary: true do |web|
        web.vm.box = 'CentOS64'
        web.vm.hostname = 'vic-develop'
        web.vm.network 'private_network', ip: '192.168.50.10', virtualbox__intnet: true
        web.vm.synced_folder '../code', '/var/www/project', :mount_options => ["dmode=777,fmode=777"]

        web.vm.provision 'ansible' do |ansible|
            ansible.playbook = 'development-web.yml'
            ansible.sudo = true
        end
end

config.vm.define 'databases' do |db|
    db.vm.box = 'CentOS64'

    db.vm.network 'private_network', ip: '192.168.50.20', virtualbox__intnet: true
    db.vm.network :forwarded_port, guest: 3306, host: 8206

    db.vm.provision 'ansible' do |ansible|
        ansible.playbook = 'development-db.yml'
        ansible.sudo = true
    end
end

Ensuite, vous aurez toutes les commandes Vagrant disponibles par machine, c'est vagrant ssh web-à- dire et vagrant provision databases.

Mulkave
la source
Puis-je changer une configuration à une machine en une configuration à 2 machines, si je rends l'ancienne machine "principale"?
nroose
2

Vous pouvez ajouter la configuration ssh pour votre hôte vagabond à la configuration ssh.

  1. Obtenez la configuration ssh pour vagrant machine dans le dossier vagrant: vagrant ssh-config

  2. Ouvrez {UserDir}/.ssh/configet ajoutez le résultat de la commande précédente. Remarque : la première ligne Host defaultsignifie l'alias que vous utiliserez plus tard pour la sshcommande. Nommez-le comme votre machine ou dir. Si vous n'avez qu'un seul répertoire vagrant - vous pouvez le nommerHost vagrant

  3. Chut à Vagrant: ssh vagrant. Le nom de famille est l'alias de l'étape précédente.

FreeLightman
la source
1

Vous pouvez prendre n'importe lequel des ssh-configarguments et les transmettre à ssh sur la ligne de commande en tant que -o Key=value. Ainsi, pour une configuration vagabonde simple à un hôte (vous devrez peut-être faire un peu plus de travail avec grepou perlpour une configuration multi -hôte ), vous pouvez faire quelque chose comme ce qui suit (ou remplacer perlpar sedsi vous le souhaitez):

ssh `vagrant ssh-config | tail -8 | perl -pe 's/^\s+/-o@/; s/\s/\=/;s/@/ /;s/\n/ /'` vagrant@localhost
Darin Londres
la source
0

Mon Env. est Win7 + Centos. La réponse avec la plupart d'accord ne fonctionne pas pour moi. Après avoir échoué après avoir essayé ssh -p [port] [usrname]@127.0.01, j'utilise juste XShell pour ajouter une nouvelle session avec le port vagrant et le nom d'utilisateur.

Ça marche.

Peut-être que Xshell est un candinate.

onebraveman
la source