如何为Vagrant虚拟机启用密码SSH认证?

22

我想在我的 Vagrant 虚拟机上启用基于密码的 SSH 认证(同时保持基于密钥的认证),应该如何设置?

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "fedora/26-cloud-base"
  config.vm.box_version = "20170705"

  config.ssh.username = 'vagrant'
  config.ssh.password = 'a'
  config.ssh.keys_only = false
end
$ sudo vagrant ssh-config 
Host default
  HostName 192.168.121.166
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/jakub/src/kubernetes-vms/kubernetes/.vagrant/machines/default/libvirt/private_key
  LogLevel FATAL

这个设置不接受密码a

我猜在vagrant ssh-config的输出中可能有 PasswordAuthentication no。如何打开这个选项?

6个回答

16

在CentOS 7上,仅使用以下内容是不够的。我猜这只是使su vagrant通过密码登录。我找不到任何原因说明为什么以下内容在官方网站中不起作用。

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  config.ssh.username = 'vagrant'
  config.ssh.password = 'vagrant'
  config.ssh.insert_key = false
end

您应该手动修改sshd_config文件。

  config.vm.provision "shell", inline: <<-SHELL
     sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config    
     systemctl restart sshd.service
  SHELL

12

对我来说以下操作是有效的。您需要像往常一样ssh到虚拟机,然后编辑/etc/ssh/sshd_config文件。在那里,您需要将PasswordAuthentication设置为yes而不是no。这将允许密码身份验证。


它运行正常!谢谢。 - vidihermes
4
有没有一种适当的方法可以在“Vagrantfile”中编写脚本,而不是手动配置ssh?顺便说一句:更改后还需要重新启动sshd(即systemctl restart sshd)。 - DoNuT
1
我会在你的provision脚本中添加perl -i -pe 'if (/^PasswordAuthentication no$/) { s/no$/yes/; $pwdAuth = 1 ; }; if (/^PasswordAuthentication yes$/) { $pwdAuth = 1 } ; END { if (!$pwdAuth) {print "\n# activate password auth\nPasswordAuthentication yes\n"}}' /etc/ssh/sshd_config和sshd重启命令。 - bernard paulus

6

Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.box = "fedora/26-cloud-base"
  config.vm.box_version = "20170705"

  config.vm.provision 'shell', inline: 'echo "vagrant:a" | chpasswd'
end

Line config.vm.provision 'shell', inline: 'echo "vagrant:a" | chpasswd' 是调用 shell provisioning 来更改用户 vagrant 的密码(前提是 box 中已经预定义了名为 vagrant 的用户)。

然后,可以通过 vagrant ssh 连接,也可以使用其他方式连接。

ssh vagrant@<vm-ip>

4
如果您想要强制虚拟机使用密码验证,您需要从Vagrantfile中设置以下内容。
  config.ssh.username = 'vagrant'
  config.ssh.password = 'vagrant'
  config.ssh.insert_key = false

您需要确保虚拟机中的vagrant用户拥有相应的密码。我不确定您使用的是哪个镜像,所以您需要自行验证。以下镜像已经验证通过:ubuntu/trusty64


1
对我来说没用。vagrant up 命令卡在了提示 vagrant@192.168.121.171's password: 上。我无法提供密码,因为该密码未由盒子作者提供。 - czerny
所以您需要登录一次到虚拟机并设置密码,然后重新打包盒子并使用我发布的配置。 - Frederic Henri
根据https://apple.stackexchange.com/a/61060/252780的说法,看起来一个人不能有不同的帐户和SSH密码。在我的实验中,我无法使用“config.ssh.password”更改帐户密码。因此,我对“config.ssh.password”的目的感到非常困惑。 - czerny
2
你混淆了身份验证和密码设置。你需要在虚拟机中正确设置用户(包括密码),而 config.ssh.password 是为了让 Vagrant 知道需要哪个密码来验证用户身份。它不是用来为用户设置新密码的(你需要先登录到虚拟机才能进行此更改)。 - Frederic Henri

3

以下是启用 Linux VM 密码 SSH 认证的步骤,您还可以设置用户 vagrantroot 的密码(如果需要)。

Vagrant.configure("2") do |config|
  config.vm.box = "debian/bullseye64"
  config.vm.provision "shell", inline: <<-'SHELL'
    sed -i 's/^#* *\(PermitRootLogin\)\(.*\)$/\1 yes/' /etc/ssh/sshd_config
    sed -i 's/^#* *\(PasswordAuthentication\)\(.*\)$/\1 yes/' /etc/ssh/sshd_config
    systemctl restart sshd.service
    echo -e "vagrant\nvagrant" | (passwd vagrant)
    echo -e "root\nroot" | (passwd root)
  SHELL
end

3
使用密码进行ssh登录,这将自动更新debian/stretch64上的sshd配置:
config.vm.provision "shell", inline: <<-SHELL
  sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config    
  service ssh restart
SHELL

尽管更改sshd_config的提示有所帮助,但是当我添加了您在此处提到的配置片段时,它并没有起作用。虚拟机启动后,我登录并手动更改了设置。我不得不使用sudo sed ..... 。我不确定为什么需要sudo,但这就是我让它工作的方式。 - webjockey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接