[ssh] Vagrant VM에 내 공개 키를 어떻게 추가합니까?

Vagrant VM에 ssh 키를 추가하는 데 문제가 있습니다. 기본적으로 여기에있는 설정이 잘 작동합니다. VM이 생성되면을 통해 액세스 할 수 있습니다 vagrant ssh. 사용자 “vagrant”가 존재하며 authorized_keys파일 에이 사용자에 대한 ssh 키가 있습니다.

지금하고 싶은 것은 .NET을 통해 해당 VM에 연결 ssh하거나 사용할 수 있도록하는 것 scp입니다. 따라서에서 id_rsa.pub하는 authorized_keys것처럼 공개 키만 추가 하면됩니다 ssh-copy-id.

설정 중에 내 공개 키를 포함해야한다고 Vagrant에게 알리는 방법이 있습니까? 그렇지 않은 경우 (Google 결과에 따르면 가능성이 있음) 방랑 설정 중에 공개 키를 쉽게 추가하는 방법이 있습니까?



답변

원하는 공개 키를 복사하면 바로 프로비저닝 단계 로 넘어갑니다 . 정확한 대답은 사용하려는 프로비저닝 (shell, Chef, Puppet 등)에 따라 다릅니다. 가장 사소한 것은 file다음과 같은 키를 제공 하는 것입니다 .

config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub"

글쎄, 실제로 당신은 authorized_keys에 추가해야합니다. 다음과 같이 셸 프로비저닝 도구를 사용합니다.

config.vm.provision "shell", inline: <<-SHELL
  cat /home/vagrant/.ssh/me.pub >> /home/vagrant/.ssh/authorized_keys
SHELL
end

Puppet 과 같은 진정한 프로비저닝 도구를 사용할 수도 있습니다 . 예를 들어 Puppet을 사용하여 SSH 인증 키 관리 를 참조하십시오 .


답변

Ruby의 핵심 파일 모듈을 다음과 같이 사용할 수 있습니다.

  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

이 작업 예제는 방랑자 및 루트 사용자 모두에 추가 ~/.ssh/id_rsa.pub되어 ~/.ssh/authorized_keys기존 SSH 키를 사용할 수 있습니다.


답변

당신이하고 싶은 것을 성취하는 더 “우아한”방법이 있습니다. 공개 키를 추가하는 번거 로움을 겪지 않고 기존 개인 키를 찾아서 사용할 수 있습니다.

다음과 같이 진행하여 기존 개인 키의 경로를 확인합니다 ( IdentityFile 은 아래 참조 ).

운영

 방랑 ssh 구성 

결과:

$ vagrant ssh-config
호스트 magento2.vagrant150
  호스트 이름 127.0.0.1
  사용자 방랑자
  포트 3150
  UserKnownHostsFile / dev / null
  StrictHostKeyChecking 아니요
  비밀번호 인증 번호
  IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key"
  IdentitiesOnly 예
  LogLevel 치명적

그런 다음 이와 같은 개인 키를 사용할 수 있습니다. 암호 인증을 끄는 스위치도 참고하십시오.

ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key -o PasswordAuthentication = no vagrant@127.0.0.1 -p 3150


답변

이 훌륭한 답변은 거부 된 제안 편집user76329 에 의해 추가되었습니다.

Meow의 예제를 확장 하면 로컬 pub / private ssh 키를 복사하고, 권한을 설정하고, 인라인 스크립트를 멱등으로 만들 수 있습니다 (한 번 실행되고 테스트 조건이 실패 할 경우에만 반복되므로 프로비저닝이 필요함).

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


답변

더 짧고 정확한 코드는 다음과 같아야합니다.

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

그렇지 않으면 사용자 .ssh/authorized_keys는 루트 사용자에게 속합니다.

그래도 모든 프로비저닝 실행마다 라인이 추가되지만 Vagrant는 테스트에 사용되며 VM은 일반적으로 수명이 짧으므로 큰 문제는 아닙니다.


답변

다음과 같은 코드를 사용하게됩니다.

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

/home/vagrant/.ssh/authorized_keys일부 방랑자 상자는 vagrant사용자 이름을 사용하지 않으므로 경로를 하드 코드해서는 안됩니다 .


답변

일부는 가까이 왔지만 이전 게시물 중 어느 것도 나를 위해 일하지 않았습니다. 터미널에서 keygen으로 rsa 키를 만들고 사용자 지정 키로 이동해야했습니다. 즉, Vagrant의 키를 사용하여 패배했습니다.

이 게시물의 날짜를 기준으로 Mac OS Mojave를 사용하고 있습니다. 하나의 Vagrantfile에 두 개의 Vagrant 상자를 설치했습니다. 초보자가 컨텍스트를 볼 수 있도록 첫 번째 상자를 모두 표시하고 있습니다. Vagrant 파일과 같은 폴더에 .ssh 폴더를 넣습니다. 그렇지 않으면 user9091383 설정을 사용합니다.

이 솔루션에 대한 크레딧은이 코더에게 있습니다.

Vagrant.configure("2") do |config|
  config.vm.define "pfbox", primary: true do |pfbox|
        pfbox.vm.box = "ubuntu/xenial64"
        pfbox.vm.network "forwarded_port", host: 8084, guest: 80
        pfbox.vm.network "forwarded_port", host: 8080, guest: 8080
        pfbox.vm.network "forwarded_port", host: 8079, guest: 8079
        pfbox.vm.network "forwarded_port", host: 3000, guest: 3000
        pfbox.vm.provision :shell, path: ".provision/bootstrap.sh"
        pfbox.vm.synced_folder "ubuntu", "/home/vagrant"
        pfbox.vm.provision "file", source: "~/.gitconfig", destination: "~/.gitconfig"
        pfbox.vm.network "private_network", type: "dhcp"
        pfbox.vm.network "public_network"
        pfbox.ssh.insert_key = false
        ssh_key_path = ".ssh/"  # This may not be necessary.  I may remove.
        pfbox.vm.provision "shell", inline: "mkdir -p /home/vagrant/.ssh"
        pfbox.ssh.private_key_path = ["~/.vagrant.d/insecure_private_key", ".ssh/id_rsa"]
        pfbox.vm.provision "file", source: ".ssh/id_rsa.pub", destination: ".ssh/authorized_keys"
        pfbox.vm.box_check_update = "true"
        pfbox.vm.hostname = "pfbox"
        # VirtualBox
          config.vm.provider "virtualbox" do |vb|
            # vb.gui = true
            vb.name = "pfbox" # friendly name for Oracle VM VirtualBox Manager
            vb.memory = 2048 # memory in megabytes 2.0 GB
            vb.cpus = 1 # cpu cores, can't be more than the host actually has.
          end
  end
  config.vm.define "dbbox" do |dbbox|
        ...