¿Cómo hacer ssh para vagabundo sin ejecutar realmente "ssh vagabundo"?

149

Me gustaría reproducir la forma en que Vagrant se registra en mi VM dentro de un script de shell utilizando el sshcomando, por lo que creo un alias para mi instancia de Vagrant.

¿Cuál es la sintaxis del comando para usar el sshcomando regular para acceder?

Kevin Burke
fuente
¿Qué es lo que realmente está preguntando? Veo tres preguntas diferentes, tal vez podría ampliar la pregunta y luego marcar para migrar. Gracias.
Kev
3
Por defecto, el puerto ssh de VM que es -22 se reenviará a 2222 en la máquina host. ¡Puse masilla en 127.0.0.1 y el puerto 2222 con SSH y funcionó!
Vishal Biyani
8
Si está ejecutando más de una casilla, ese número de puerto cambiará automáticamente. Puede obtener el correcto ejecutando vagrant ssh-config.
Stefano Palazzo

Respuestas:

108

He tenido que volver a implementar "ssh vagabundo" porque su -copción no pasó los argumentos correctamente. Esto es básicamente lo que hace (puede haber más, pero funciona bien de esta manera)

#!/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 \
    "$@"

Como una frase (con agradecimiento a kgadek):

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

Para tener en cuenta cuando tiene más de un host vagabundo, esto seleccionará el host deseado, así como también eliminará las líneas en blanco de la configuración (usando sed):

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost
Stefano Palazzo
fuente
3
Esta respuesta no te permite acceder ssha tu Vagrant desde fuera del Vagrantfiledirectorio ("usando el sshcomando regular "), que es cómo interpreté la pregunta.
sjy
Puede configurar el puerto por su cuenta. Por lo tanto, el script será ejecutable desde cualquier directorio.
Yser
Entonces, ¿qué está haciendo que ese puerto sea una forma de ingresar a la máquina? ¿Dónde está la configuración de qué puerto es?
nroose
1
Vagabundo elige uno no utilizado con la auto_correct: trueconfiguración. Aquí hay más información sobre cómo cambiarlo manualmente
Stefano Palazzo
1
Tuve que saltar la primera línea, es decir. La Hostentrada. El comando modificado es:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek
148

Ya hay muchas respuestas, pero todas parecen demasiado complicadas o resuelven problemas que el autor de la pregunta no tenía.

simplemente:

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

# run ssh with the file.
ssh -F vagrant-ssh default
Steven Soroka
fuente
2
Esto es increíble. Mente agregar vagrant-ssharchivo .gitignore.
sashaegorov
55
Con algunas conchas (por ejemplo zsh), las siguientes obras de una sola línea:ssh -F =(vagrant ssh-config) default
Liori
44
Es posible que desee eco de este resultado en el sshfichero de configuración: vagrant ssh-config >> ~/.ssh/config, por lo que acaba de ejecutar ssh defaultdesde cualquier lugar en el sistema, donde defaultes el nombre de la máquina virtual que se puede especificar como aquí
adamczi
Gracias @adamczi, esta es la forma simplificada que también funciona para soluciones automatizadas en las que agregar parámetros ssh adicionales -Fno es sencillo
laimison
3
Al agregar una entrada ~/.ssh/configen la forma en que @adamczi sugiere, puede usar la extensión SSH de Visual Studio Code Remote para ssh en Vagrant VM y editar archivos y hacer desarrollo remoto. Simplemente CMD-SHIFT-P, luego "Remote-SSH: Connect to Host ..." y la entrada ssh .config que acaba de agregar aparece automáticamente en la lista: simplemente selecciónela y listo, vscode se conecta a su vm remoto vagabundo. Sin el enfoque de entrada de configuración, no estoy seguro de qué otra forma lo habría hecho con vscode.
abulka
52

En ejecución de terminal

vagrant ssh

En otra ventana de terminal / pestaña ejecutar

ps aux | grep ssh

Allí verá el comando real ejecutado por Vagrant, algo como esto:

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
fuente
Gran truco si necesita el host de su vagabundo para ssh por otras razones, como una conexión GUI de SQL, como Sequel Pro. Este me salvó!
Atomox
19

Simplemente pase todo vagrant ssh-configcomo un archivo de configuración sshcon el -F configfileparámetro. El alias de host para conectarse se define en la primera línea vagrant ssh-config; Host defaultsignifica que te puedes conectar ssh default.

No pude ver una opción para leer el archivo de configuración desde la entrada estándar, así que elegí la ruta del archivo temporal. Aquí hay una línea que también limpia el $TMPDIR.vagrant-ssh-configarchivo temporal después. Debe ejecutarse en el mismo directorio que el suyo Vagrantfile, suponiendo que su casilla vagabunda esté en funcionamiento.

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

Nota: en mi sistema Mac OSX, se $TMPDIRexpande a /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(en este momento). Use otra variable , u otra carpeta, si no está configurada en su sistema.

Joel Purra
fuente
3
Si está utilizando bash o zsh, la sustitución de procesos es una forma más sencilla de pasar la salida de un comando a otro. bash: ssh -F <(vagrant ssh-config) zsh: sustitución del proceso zsh ssh -F =(vagrant ssh-config)
myeeshen
@myshen: según la respuesta de @tyrion , la sustitución del proceso no funciona ssh -Fen bash, aunque la forma en que mencionas debería funcionar en zsh.
Joel Purra
Dang, realmente necesito aprender a usar vagabundo, sin mencionar bash.
Spencer Williams
14

Resolví esto de una manera muy simple: cuando inicias el cuadro vagabundo, muestra la dirección ssh como esta

SSH address: 127.0.0.1:2222

entonces puede conectarse a la caja utilizando el usuario vagabundo, el host y el puerto que obtiene

ssh vagrant@127.0.0.1 -p 2222
Samer Abu Gahgah
fuente
1
¡bonito! y tenga en cuenta que, por lo general, la contraseña para el usuario vagabundo esvagrant
Brad Parks
7

Si no necesita usar stdin con ssh(por ejemplo, desea ejecutar solo un comando y cerrar sesión), puede usar:

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

Este método fue sugerido en respuesta a una pregunta similar en grupos de google .

Lamentablemente , la sustitución del proceso bash tampoco funciona (consulte esta pregunta en unix.stackexchange para obtener más detalles).

Las mejores opciones que tiene, si desea un shell interactivo, son crear un archivo temporal y usarlo con ssh -Fo usar awkcomo lo sugieren las otras respuestas.

tyrion
fuente
5

Si solo desea configurarlo para que pueda usar la línea de comando ssh normal, así como scp y demás, puede ejecutar vagrant ssh-configy agregar la salida a su configuración ssh predeterminada. Si reemplaza la línea "Host default" con un nombre de host más descriptivo, debería estar listo.

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
Tedward
fuente
Exactamente lo que ordenó el médico ... Gracias.
xenoid
4

Si solo desea que el comando mínimo se conecte a su caja, debe conocer el puerto que está usando (impreso cuando lo hace vagrant upo visible vagrant ssh-config) y dónde está su clave SSH privada (también visible cuando lo hace vagrant ssh-config)

Entonces es solo cuestión de proporcionar la clave y el puerto:

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

Nico Villanueva
fuente
4

Muchas de las otras respuestas suponen que tienes instalado Vagrant.

Tengo Vagrant instalado en Windows 10, pero no puedo vagrant sshporque estoy usando PuTTy como mi cliente SSH, que vagabundo no aceptará.

El sshejecutable que se encuentra en PATH es un cliente PuTTY Link SSH. Vagrant solo es compatible con clientes OpenSSH SSH.

Sin embargo, en Windows 10 también tenemos Bash en Ubuntu en Windows. Entonces, solo lo uso con el siguiente comando:

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

Es bastante fácil instalar Vagrant en Win10-Ubuntu, pero también quiere que instales Virtualbox por alguna razón, lo que prefiero no hacer.

Nota: he intentado con el ssh default -F vagrant-ssh-configmétodo, pero acabo de obtener

Permiso denegado (clave pública, contraseña).

Supongo que esto se debe a que la IdentityFileruta es una ruta de Windows, mientras que en Bash, debería comenzar con /mnt/c/. Supongo que podría escribir el archivo y luego modificarlo si eso funciona mejor para usted.

mpen
fuente
4

Puede agregar una configuración de host vagabundo a su configuración ssh local.

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

  2. ssh vagabundo @ {host}

ex. cat ~ / .ssh / config

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

Hay una manera que replica cómo un usuario remoto puede iniciar sesión en el sistema

  1. Edite el Vagrantfile para su instancia agregando

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

Esto agrega una IP privada para el host (haga que sea lo que desea en el rango 192.168 siempre y cuando no esté ya en uso

  1. Reinicie la instancia con recarga vagabunda desde la línea de comando
  2. Copie el archivo vagabundo private_key a algún equivalente de Linux que debería tener ejecutándose en su caja (por ejemplo, Cygwin si estoy en Windows, yo uso Windows 10) a su directorio de inicio de cygwin, renombrándolo en el camino a algo que describa el host que se usará la clave para, por ejemplo

your_virtual_host_name.pem

  1. Encontrará la clave en .vagrant \ machines \ default \ virtualbox \ private_key

  2. Vaya a su directorio de inicio y haga su ssh Unix habitual, así que

ssh -i your_virtual_hostname.pem [email protected]

donde nombre de usuario, puede ser vagabundo si tiene un cuadro estándar, mire la salida de ssh-config vagabundo para obtener detalles estándar de ssh para el cuadro.

Eso es

Jimbo
fuente
Gracias, gracias a su idea de copiar el archivo de clave de vagabundo en otro lugar, me di cuenta del problema que tenía: utilicé el proveedor libvirt en Linux. Esto es importante porque con el proveedor de libvirt necesita inicializar vagabundo con sudo y, por lo tanto, todos los archivos dentro de la .vagrantcarpeta son propiedad de root. Y los permisos en el archivo eran rw ------- por lo que solo root tenía permisos para leer el archivo clave. Quizás esto pueda ser útil para cualquiera.
TomasH
2

Vagrant almacena la clave privada ~/.vagrant.d/insecure_private_keyy la usa para conectarse a cada máquina ssh, considerando que está configurada para conectarse en el puerto 2200 (predeterminado) sería algo así como:

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

Nota: asegúrese de que la clave privada sea propiedad del usuario en ejecuciónVagrant .

Sin embargo, si su objetivo es tener un entorno de máquinas múltiples, puede hacerlo utilizando config.vm.define.

Aquí hay un ejemplo que ilustra un entorno con 2 máquinas, una llamada weby la otra es 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

Entonces tendrá todos los comandos Vagrant disponibles por máquina, es decir, vagrant ssh weby vagrant provision databases.

Mulkave
fuente
¿Puedo cambiar una configuración de una máquina a una configuración de 2 máquinas, si hago que la vieja máquina sea "primaria"?
nroose
2

Puede agregar ssh config para su host vagabundo a ssh config.

  1. Obtenga ssh config para vagrant machine en vagrant folder: vagrant ssh-config

  2. Abra {UserDir}/.ssh/configy agregue el resultado del comando anterior. Nota : la primera línea Host defaultsignifica el alias que usará más adelante para el sshcomando. Nómbrelo como su máquina o directorio vagabundo. Si solo tiene un directorio vagabundo, puede nombrarloHost vagrant

  3. Ssh a vagabundo: ssh vagrant. El apellido es un alias del paso anterior.

FreeLightman
fuente
1

Puede tomar cualquiera de los ssh-configargumentos y pasarlos a ssh en la línea de comandos como -o Key=value. Por lo tanto, para una configuración vagabunda simple de un host (es posible que tenga que trabajar un poco más con grepo perlpara una configuración de host múltiple), puede hacer algo como lo siguiente (o reemplazar perlcon sedsi lo desea):

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

Mi env. es Win7 + Centos. La respuesta con la mayoría de los acuerdos no me funciona. Después de fallar después de intentarlo ssh -p [port] [usrname]@127.0.01, solo uso XShell para agregar una nueva sesión con el puerto vagabundo y el nombre de usuario.

Funciona.

Quizás Xshell es un candidato.

onebraveman
fuente