为什么 vagrant provisioner 不修改 ~/.bashrc?
why doesn't vagrant provisioner modify ~/.bashrc?
如何让 Vagrantfile 将文件的内容附加到 ~/.bashrc 文件?
在我的 Vagrantfile 中,我试图将文件 /vagrant/dev_env_config 的内容附加到 ~/.bashrc 文件。
当我 运行 vagrant up
它输出 echo 语句并输出 ~/.bashrc 文件的预期内容....所以我知道它正在读取文件 dev_env_config 并且似乎要附加它。
但是,当我然后 运行 vagrant ssh
然后 cat ~/.bashrc
~/.bashrc 文件未修改时,它是默认的 ~/.bashrc 文件
换句话说,~/.bashrc 文件的模组在 vagrant provison 运行s 和我 运行 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
我认为发生的事情是供应脚本 运行 作为 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
。作为规则,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
命令(在 sudo cat ...
中)。可能您不需要它,但这取决于哪个用户习惯于 运行 供应脚本。我猜也是 vagrant
.
因此,如果它真的是 vagrant
,您可以不修改 .bashrc
的路径 (~/.bashrc
),但必须删除 sudo cat ...
命令并使用简单的 cat ...
代替。在我看来,这是一个更干净的解决方案。因为实际上我们不应该在不需要的情况下使用 sudo
(root
) 权限。
如何让 Vagrantfile 将文件的内容附加到 ~/.bashrc 文件?
在我的 Vagrantfile 中,我试图将文件 /vagrant/dev_env_config 的内容附加到 ~/.bashrc 文件。
当我 运行 vagrant up
它输出 echo 语句并输出 ~/.bashrc 文件的预期内容....所以我知道它正在读取文件 dev_env_config 并且似乎要附加它。
但是,当我然后 运行 vagrant ssh
然后 cat ~/.bashrc
~/.bashrc 文件未修改时,它是默认的 ~/.bashrc 文件
换句话说,~/.bashrc 文件的模组在 vagrant provison 运行s 和我 运行 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
我认为发生的事情是供应脚本 运行 作为 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
。作为规则,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
命令(在 sudo cat ...
中)。可能您不需要它,但这取决于哪个用户习惯于 运行 供应脚本。我猜也是 vagrant
.
因此,如果它真的是 vagrant
,您可以不修改 .bashrc
的路径 (~/.bashrc
),但必须删除 sudo cat ...
命令并使用简单的 cat ...
代替。在我看来,这是一个更干净的解决方案。因为实际上我们不应该在不需要的情况下使用 sudo
(root
) 权限。