Mam problem z dodaniem klucza ssh do maszyny wirtualnej Vagrant. Zasadniczo konfiguracja, którą tutaj mam, działa dobrze. Po utworzeniu maszyn wirtualnych mogę uzyskać do nich dostęp za pośrednictwem vagrant ssh
, użytkownik „vagrant” istnieje iw pliku znajduje się klucz ssh dla tego użytkownika authorized_keys
.
Chciałbym teraz: móc łączyć się z tymi maszynami wirtualnymi za pośrednictwem ssh
lub z nich korzystać scp
. Musiałbym więc tylko dodać mój klucz publiczny od id_rsa.pub
do authorized_keys
- tak jak bym to zrobił ssh-copy-id
.
Czy istnieje sposób, aby podczas konfiguracji powiedzieć Vagrantowi, że powinien zostać uwzględniony mój klucz publiczny? Jeśli nie (co jest prawdopodobne, według moich wyników Google), czy istnieje sposób na łatwe dodanie mojego klucza publicznego podczas konfiguracji włóczęgi?
źródło
virtualhost.vm.provision "shell", inline: "cat ~vagrant/.ssh/me.pub >> ~vagrant/.ssh/authorized_keys"
i
s) ukryte są znaki Unicode, które mogą zrujnować twoje popołudnie - oto poprawiona kopia / wersja do wklejaniavirtualhost.vm.provision "shell", inline: "cat ~vagrant/.ssh/me.pub >> ~vagrant/.ssh/authorized_keys"
~/.ssh/id_rsa.pub
.ssh-add -L
Zamiast tego weź klucze .Możesz użyć podstawowego modułu File w Ruby, na przykład:
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
Ten działający przykład dołącza
~/.ssh/id_rsa.pub
się~/.ssh/authorized_keys
zarówno do użytkownika włóczącego się, jak i użytkownika root, co pozwoli ci użyć istniejącego klucza SSH.źródło
Jest bardziej „elegancki” sposób na osiągnięcie tego, co chcesz. Możesz znaleźć istniejący klucz prywatny i użyć go, zamiast męczyć się z dodaniem klucza publicznego.
Postępuj w ten sposób, aby zobaczyć ścieżkę do istniejącego klucza prywatnego (spójrz poniżej na IdentityFile ):
biegać
wynik:
Następnie możesz użyć takiego klucza prywatnego, zwróć także uwagę na przełącznik do wyłączania uwierzytelniania hasłem
źródło
Ta doskonała odpowiedź została dodana przez użytkownika76329 w odrzuconej sugerowanej edycji
Rozwijając przykład Meow , możemy skopiować lokalne klucze pub / private ssh, ustawić uprawnienia i sprawić, by skrypt wbudowany był idempotentny (uruchamia się raz i powtórzy się tylko wtedy, gdy warunek testu nie powiedzie się, a zatem wymaga aprowizacji):
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
źródło
Krótszy i bardziej poprawny kod powinien wyglądać następująco:
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
W przeciwnym razie użytkownik
.ssh/authorized_keys
będzie należał do użytkownika root.Mimo to doda linię przy każdym uruchomieniu, ale Vagrant jest używany do testowania, a maszyna wirtualna ma zwykle krótką żywotność, więc nie jest to duży problem.
źródło
config.vm.provision 'shell', inline: "mkdir -p /root/.ssh"
po pierwszej linii, ponieważ folder nie istniałssh-copy-id
, więc jest zawsze tworzony dla mnie, ale bardziej poprawne jest tworzenie go dla innych. Będę edytować, dzięki.W końcu używam kodu takiego jak:
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
Zauważ, że nie powinniśmy twardej ścieżki do kodu,
/home/vagrant/.ssh/authorized_keys
ponieważ niektóre błędne pola nie używająvagrant
nazwy użytkownika.źródło
vagrant.d
przechowywania katalogu, więc dostosowałem konfigurację do obsługi takich przypadków. Szczegóły tutaj .Żaden ze starszych postów nie działał dla mnie, chociaż niektóre były bliskie. Musiałem zrobić klucze rsa z keygenem w terminalu i korzystać z niestandardowych kluczy. Innymi słowy, pokonany przez użycie kluczy Vagranta.
Korzystam z Mac OS Mojave od daty tego postu. Ustawiłem dwie skrzynki Vagrant w jednym pliku Vagrantfile. Pokazuję całe pierwsze pudełko, aby nowicjusze mogli zobaczyć kontekst. Umieściłem folder .ssh w tym samym folderze co plik Vagrant, w przeciwnym razie użyj konfiguracji user9091383.
Kredyt za to rozwiązanie przypada temu koderowi.
źródło
To doskonały wątek, który pomógł mi rozwiązać podobną sytuację, jaką opisuje oryginalny plakat.
Chociaż ostatecznie użyłem ustawień / logiki przedstawionych w odpowiedzi smartwjw, napotkałem problem , ponieważ używam
VAGRANT_HOME
zmiennej środowiskowej do zapisywania podstawowych danychvagrant.d
katalogu na zewnętrznym dysku twardym w jednym z moich systemów programistycznych.Oto dostosowany kod, którego używam w moim pliku Vagrantfile, aby dostosować się do
VAGRANT_HOME
ustawianej zmiennej środowiskowej; „magia” dzieje się w tej liniivagrant_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
źródło
Dla dostawców powłoki wbudowanej - często klucz publiczny zawiera spacje, komentarze itp. Dlatego upewnij się, że wokół zmiennej rozwijanej do klucza publicznego umieszczasz cudzysłowy (ze znakami ucieczki):
źródło
Całkiem kompletny przykład, mam nadzieję, że pomoże to komuś, kto odwiedza następny. Przeniesiono wszystkie konkretne wartości do zewnętrznych plików konfiguracyjnych. Przypisanie adresu IP służy tylko do wypróbowania.
źródło
Odpowiedź Madis Maenni jest najbliższa najlepszemu rozwiązaniu:
po prostu zrób:
możesz po prostu ssh przez nazwę hosta.
Aby uzyskać listę nazw hostów skonfigurowanych w ~ / .ssh / config
Mój przykład:
źródło
Wygeneruj parę kluczy rsa do uwierzytelniania włóczęgów
ssh-keygen -f ~/.ssh/vagrant
Możesz również dodać pliki tożsamości włóczęgów do swojego
~/.ssh/config
Z jakiegoś powodu nie możemy po prostu określić klucza, który chcemy wstawić, więc wykonujemy kilka dodatkowych kroków, aby samodzielnie wygenerować klucz. W ten sposób uzyskujemy bezpieczeństwo i wiedzę o tym, jakiego dokładnie klucza potrzebujemy (+ wszystkie pudełka włóczęgów otrzymają ten sam klucz)
Nie można ssh do vagrant VM przy użyciu niezabezpieczonego klucza prywatnego (vagrant 1.7.2) Jak dodać własny klucz publiczny do Vagrant VM?
MUSZLA
źródło