为什么Vagrant provisioner不修改~/.bashrc?

3
如何让Vagrantfile将文件内容附加到~/.bashrc文件中?
在我的Vagrantfile中,我试图将文件/vagrant/dev_env_config的内容附加到~/.bashrc文件中。
当我运行vagrant up时,它会输出echo语句,并输出预期的~/.bashrc文件内容....所以我知道它正在读取文件dev_env_config并似乎正在附加它。
然而,当我运行vagrant ssh,然后cat ~/.bashrc时,~/.bashrc文件未被修改,它是默认的~/.bashrc文件
换句话说,对~/.bashrc文件的修改在vagrant provison运行和我运行vagrant ssh之间丢失了。
# Vagrantfile

Vagrant.configure("2") do |config|
  ... various cmds to set box and network...
  $install_user_vars = <<SCRIPT
      sudo cat /vagrant/dev_env_config  >> ~/.bashrc
      echo "*** here is the .bashrc file:"
      cat ~/.bashrc
SCRIPT
  config.vm.provision "shell", inline: $install_user_vars
end
2个回答

6

我认为正在发生的情况是,配置脚本以root(或sudo)身份运行,因此“~”主目录位置实际上是/root,而不是默认用户主目录位置/home/vagrant。

我可以想到一些解决方法:

第一种(也可能是最简单的方法)是明确指定.bashrc路径,例如:

# Vagrantfile

Vagrant.configure("2") do |config|
  ... various cmds to set box and network...
  $install_user_vars = <<SCRIPT
      sudo cat /vagrant/dev_env_config  >> /home/vagrant/.bashrc
      echo "*** here is the .bashrc file:"
      cat /home/vagrant/.bashrc
SCRIPT
  config.vm.provision "shell", inline: $install_user_vars
end

第二个选项是将此部分配置脚本作为非特权用户运行。请参阅Shell Scripts文档页面上的“privileged”选项。

好的,明确指定路径可以完美地解决问题,谢谢!在这种情况下,将所有的~/.bashrc实例替换为/home/vagrant/.bashrc。 - jpw

2

一种最基本的解决方案是显式设置路径到.bashrc。通常,SSH用户的默认用户名(用于执行vagrant ssh操作)是vagrant,因此:

$install_user_vars = <<SCRIPT
      sudo cat /vagrant/dev_env_config  >> /home/vagrant/.bashrc
      echo "*** here is the .bashrc file:"
      cat /home/vagrant/.bashrc
SCRIPT

我不确定在sudo cat...中使用sudo命令是否必要。也许您不需要它,但这取决于哪个用户用于运行提供脚本。我猜想它也是vagrant

因此,如果确实是vagrant,则可以保留.bashrc路径不变(~/.bashrc),但必须删除sudo cat ...命令,改用简单的cat...。在我看来,这是一种更加干净的解决方案。因为实际上我们不应该没有必要地使用sudoroot)权限。

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