Tengo un problema al agregar una clave ssh a una máquina virtual Vagrant. Básicamente, la configuración que tengo aquí funciona bien. Una vez que se crean las máquinas virtuales, puedo acceder a ellas a través de vagrant ssh
, el usuario "vagabundo" existe y hay una clave ssh para este usuario en el authorized_keys
archivo.
Lo que me gustaría hacer ahora es: poder conectarme a esas VM mediante ssh
o usar scp
. Por lo tanto, solo necesitaría agregar mi clave pública desde id_rsa.pub
al authorized_keys
, tal como lo haría con ssh-copy-id
.
¿Hay alguna forma de decirle a Vagrant durante la configuración que debe incluirse mi clave pública? Si no es así (lo cual es probable, según mis resultados de Google), ¿hay alguna manera de agregar fácilmente mi clave pública durante la configuración de vagabundo?
fuente
virtualhost.vm.provision "shell", inline: "cat ~vagrant/.ssh/me.pub >> ~vagrant/.ssh/authorized_keys"
i
s) que pueden arruinar su tarde; aquí hay una copia fija / versión para pastavirtualhost.vm.provision "shell", inline: "cat ~vagrant/.ssh/me.pub >> ~vagrant/.ssh/authorized_keys"
~/.ssh/id_rsa.pub
. Obtenga las llaves de en sussh-add -L
lugar.Puede usar el módulo de archivo central de Ruby, así:
config.vm.provision "shell" do |s| ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip s.inline = <<-SHELL echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys echo #{ssh_pub_key} >> /root/.ssh/authorized_keys SHELL end
Este ejemplo de trabajo se agrega
~/.ssh/id_rsa.pub
al del~/.ssh/authorized_keys
usuario vagabundo y root, lo que le permitirá usar su clave SSH existente.fuente
Hay una forma más "elegante" de lograr lo que quieres hacer. Puede encontrar la clave privada existente y usarla en lugar de pasar por la molestia de agregar su clave pública.
Proceda así para ver la ruta a la clave privada existente (busque a continuación IdentityFile ):
correr
resultado:
Luego puede usar la clave privada de esta manera, tenga en cuenta también el interruptor para desactivar la autenticación de contraseña
fuente
Esta excelente respuesta fue agregada por user76329 en una edición sugerida rechazada
Ampliando el ejemplo de Meow , podemos copiar las claves ssh públicas / privadas locales, establecer permisos y hacer que el script en línea sea idempotente (se ejecuta una vez y solo se repetirá si la condición de prueba falla, por lo que necesita aprovisionamiento):
config.vm.provision "shell" do |s| ssh_prv_key = "" ssh_pub_key = "" if File.file?("#{Dir.home}/.ssh/id_rsa") ssh_prv_key = File.read("#{Dir.home}/.ssh/id_rsa") ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip else puts "No SSH key found. You will need to remedy this before pushing to the repository." end s.inline = <<-SHELL if grep -sq "#{ssh_pub_key}" /home/vagrant/.ssh/authorized_keys; then echo "SSH keys already provisioned." exit 0; fi echo "SSH key provisioning." mkdir -p /home/vagrant/.ssh/ touch /home/vagrant/.ssh/authorized_keys echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys echo #{ssh_pub_key} > /home/vagrant/.ssh/id_rsa.pub chmod 644 /home/vagrant/.ssh/id_rsa.pub echo "#{ssh_prv_key}" > /home/vagrant/.ssh/id_rsa chmod 600 /home/vagrant/.ssh/id_rsa chown -R vagrant:vagrant /home/vagrant exit 0 SHELL end
fuente
Un código más corto y correcto debería ser:
ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip config.vm.provision 'shell', inline: 'mkdir -p /root/.ssh' config.vm.provision 'shell', inline: "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys" config.vm.provision 'shell', inline: "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys", privileged: false
De lo contrario, el usuario
.ssh/authorized_keys
pertenecerá al usuario root.Aún así, agregará una línea en cada ejecución de provisión, pero Vagrant se usa para pruebas y una VM generalmente tiene una vida corta, por lo que no es un gran problema.
fuente
config.vm.provision 'shell', inline: "mkdir -p /root/.ssh"
después de la primera línea ya que la carpeta no existíassh-copy-id
, por lo que siempre se crea para mí pero es más correcto crearlo para otros. Editaré, gracias.Termino usando código como:
config.ssh.forward_agent = true config.ssh.insert_key = false config.ssh.private_key_path = ["~/.vagrant.d/insecure_private_key","~/.ssh/id_rsa"] config.vm.provision :shell, privileged: false do |s| ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip s.inline = <<-SHELL echo #{ssh_pub_key} >> /home/$USER/.ssh/authorized_keys sudo bash -c "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys" SHELL end
Tenga en cuenta que no debemos codificar la ruta de acceso,
/home/vagrant/.ssh/authorized_keys
ya que algunas cajas vagabundas no usan elvagrant
nombre de usuario.fuente
vagrant.d
se almacena el directorio, así que ajusté su configuración para manejar casos como ese. Detalles aquí .Ninguna de las publicaciones más antiguas me funcionó, aunque algunas estuvieron cerca. Tuve que hacer claves rsa con keygen en la terminal e ir con claves personalizadas. En otras palabras, derrotado por usar las llaves de Vagrant.
Estoy en Mac OS Mojave a la fecha de esta publicación. He configurado dos cajas Vagrant en un Vagrantfile. Estoy mostrando todo el primer cuadro para que los novatos puedan ver el contexto. Puse la carpeta .ssh en la misma carpeta que el archivo Vagrant; de lo contrario, use la configuración user9091383.
El crédito por esta solución es para este codificador.
fuente
Este es un hilo excelente que me ayudó a resolver una situación similar a la que describe el póster original.
Si bien finalmente usé la configuración / lógica presentada en la respuesta de smartwjw , encontré un problema ya que uso la
VAGRANT_HOME
variable de entorno para guardar lasvagrant.d
cosas del directorio central en un disco duro externo en uno de mis sistemas de desarrollo.Así que aquí está el código ajustado que estoy usando en mi Vagrantfile para adaptarse a una
VAGRANT_HOME
variable de entorno que se está configurando; la "magia" ocurre en esta líneavagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d"
:config.ssh.insert_key = false config.ssh.forward_agent = true vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d" config.ssh.private_key_path = ["#{vagrant_home_path}/insecure_private_key", "~/.ssh/id_rsa"] config.vm.provision :shell, privileged: false do |shell_action| ssh_public_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip shell_action.inline = <<-SHELL echo #{ssh_public_key} >> /home/$USER/.ssh/authorized_keys SHELL end
fuente
Para los aprovisionadores de shell en línea, es común que una clave pública contenga espacios, comentarios, etc. Así que asegúrese de poner comillas (de escape) alrededor de la var que se expande a la clave pública:
fuente
Un ejemplo bastante completo, espero que esto ayude a alguien que visite a continuación. Se movieron todos los valores concretos a archivos de configuración externos. La asignación de IP es solo para probar.
fuente
La respuesta de Madis Maenni es la más cercana a la mejor solución:
solo haz:
entonces puede ssh a través del nombre de host.
Para obtener la lista de nombres de host configurados en ~ / .ssh / config
Mi ejemplo:
fuente
Genere un par de claves rsa para la autenticación de vagabundos
ssh-keygen -f ~/.ssh/vagrant
Es posible que también desee agregar los archivos de identidad vagabundos a su
~/.ssh/config
Por alguna razón, no podemos simplemente especificar la clave que queremos insertar, por lo que tomamos algunos pasos adicionales para generar una clave nosotros mismos. De esta manera obtenemos seguridad y conocimiento de exactamente qué clave necesitamos (+ todas las cajas de vagabundos obtendrán la misma clave)
No se puede enviar SSH a VM vagrant usando la clave privada insegura (vagrant 1.7.2) ¿Cómo agrego mi propia clave pública a Vagrant VM?
CÁSCARA
fuente