使用不同的用户名SSH登录Vagrant Box

53

我希望使用kevin/kevin而不是"vagrant"用户名和密码登录我的Vagrant虚拟机。

我修改了Vagrantfile,添加了:

config.ssh.username = "kevin"

然后我运行了 vagrant reload

出现了以下输出:

[default] Waiting for machine to boot. This may take a few minutes...
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period. This can
mean a number of things.

然而,我仍然可以使用 vagrant/vagrant 登录到我的 Vagrant Box,但是我无法使用用户名和密码为 kevin/kevin 或 kevin/vagrant 登录到该 Box。

请注意,我还尝试了这个答案(https://dev59.com/p2kw5IYBdhLWcg3wdKMv#9924122),但我只能使用用户名 vagrant 登录到该 Box,而不能使用 kevin(即使在 Vagrantfile 中已经指定了)。

如何配置我的 Vagrantfile,以便我可以使用用户名 kevin 进行 SSH 登录?


1
如果您可以使用“vagrant”登录自己的ssh,但无法使用Kevin登录,则似乎需要在客户机映像中设置“kevin”用户。 “Vagrantfile”配置仅建立要使用的用户,而不会在客户机上设置用户。 - zanerock
5个回答

70
您可以使用vagrant,但是不能使用kevin进行ssh连接,这是预期的。
大多数Vagrant基础镜像只有两个具有SSH访问权限的用户:rootvagrant。他们都使用vagrant作为密码,并且vagrant配置为使用Vagrant项目GitHub上提供的不安全(为什么?见Vagrant insecure by default?)密钥对进行公钥身份验证。
要能够以kevin的身份登录,您必须ssh进入框并先创建用户(useradd -m -s /bin/bash -U kevin),配置公钥身份验证(多种方法,例如ssh-copy-id,我会留给您。)
如果您在Vagrantfile中正确设置了config.ssh.username,则应该能够使用vagrant ssh登录到框中创建的用户。
当然,您也可以手动ssh到框中(假设使用NAT):

ssh -p 2222 kevin@localhost

或者(在Linux上):

ssh -p 2222 -i /opt/vagrant/embedded/gems/gems/vagrant-1.5.1/keys/vagrant.pub vagrant@localhost


1
请注意,我能够简单地创建一个用户(useradd ...),销毁并启动我的虚拟机,然后成功使用kevin/kevin登录在putty中进行SSH。但是,我有点困惑,因为正如您在“Vagrant insecure by default?”中提到的那样,vagrantroot只能在没有明确配置密钥的情况下进行SSH吗? - Kevin Meredith
2
您可以使用用户vagrant通过ssh进入该框,变成root用户,然后将文件/home/vagrant/.ssh/authorized_keys复制到/home/kevin/.ssh/authorized_keys中。请确保/home/kevin/.ssh/authorized_keys的所有权和权限正确(600,所有者为kevin:kevin组)。 - Saule
@Saule的评论是最佳答案。虽然这个帖子有点老,但是在这个主题上的搜索引导我来到了这里。 - rickb
我也认为这是一篇不错的文章:http://ermaker.github.io/blog/2015/11/18/change-insecure-key-to-my-own-key-on-vagrant.html - Rob Carpenter
Rob 给的那个链接已经失效了,所以请使用这个链接,由互联网档案馆提供。 - 0xC0000022L
谢谢您提供的信息。我一直在寻找一个有效的用户登录。 - Oualid

29

在您的配置脚本中将用户添加到Vagrant后,另一种解决方案是:

## add kevin
useradd -m -s /bin/bash -U kevin -u 666 --groups wheel
cp -pr /home/vagrant/.ssh /home/kevin/
chown -R kevin:kevin /home/kevin
echo "%kevin ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/kevin

将此添加到您的 Vagrant 文件中:

VAGRANT_COMMAND = ARGV[0]
if VAGRANT_COMMAND == "ssh"
  config.ssh.username = 'kevin'
end

现在Vagrant将使用默认的vagrant用户来为您的虚拟机提供配置,一旦它启动,您可以使用简单的vagrant ssh通过默认的Vagrant ssh密钥作为kevin登录。

这样您就可以发送所需的Vagrantfile,用户只需输入vagrant upkevin就会自动准备好使用。


2
你知道怎么样才能存储密码吗?使用config.ssh.password似乎行不通。谢谢! - jpruiz114

10
创建一个类似下面的vagrant文件。请注意,我们正在引导vagrant用户立即切换到我们创建的“kevin”用户。
bootstrap = <<SCRIPT
  useradd -m kevin --groups sudo
  su -c "printf 'cd /home/kevin\nsudo su kevin' >> .bash_profile" -s /bin/sh vagrant
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-16.04"
  config.vm.host_name = "kevin"
  config.vm.provision "shell", inline: "#{bootstrap}", privileged: true
end

现在通过ssh登录到虚拟机:

$ vagrant ssh
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-83-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.


To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

kevin@kevin:/home/vagrant$

很好,我喜欢它的自给自足特性。 - 0xC0000022L

2

这有点像“hack”的方式,但你可以将sudo su - kevin这一行添加到你的.bash_profile文件中,并在sudoers文件中添加kevin用户且不需要密码。

这样做会在以vagrant用户登录命令行时将当前用户更改为kevin。

这种方法的好处是无需启用NAT。


这真是个巧妙的解决方法!虽然很简单,但我喜欢它。 - aidanmelen

1

我发现一个简单的方法是通过将 .ssh 复制到用户中,例如您的用户名是 alice

sudo su -
cp -r /home/vagrant/.ssh/ /home/alice/
chown -R alice:alice  /home/alice/.ssh

然后在Vagrantfile中添加配置:

# ...
config.ssh.username = 'alice'
# ...

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