所以,我有一堆运行某种Linux(CentOS,Ubuntu等)的vagrant虚拟机。我希望能自动确保“vagrant ssh”也会“cd /vagrant”,这样每次登录时就不必记得执行该命令了。
我已经想出来了(傻瓜式!),使用echo "\n\ncd /vagrant" >> /home/vagrant/.bashrc
可以解决问题。但我不知道如何确保只有在cd命令不存在时才会发生。我不是shell专家,所以完全被弄糊涂了。 :)
您可以通过在Vagrantfile中使用config.ssh.extra_args
设置来实现此操作:
config.ssh.extra_args = ["-t", "cd /vagrant; bash --login"]
那么,每次运行vagrant ssh
时,您将进入/vagrant
目录。
我在我的provision.sh
文件中加入了以下代码:
echo "cd /vagrant_projects/my-project" >> /home/vagrant/.bashrc
它可以很好地工作。
cd
是Bash shell内置命令,只要安装了shell,它就应该存在。
还要注意,~/.bash_profile
是交互式登录Shell用的,如果在~vagrant/.bashrc
中添加cd /vagrant
,可能会无法正常工作。
这是因为像Ubuntu这样的发行版默认情况下没有此文件 -> ~/.bash_profile
,而是使用~/.bashrc
和~/.profile
如果有人为Ubuntu上的vagrant用户创建了~/.bash_profile
,将不会读取~vagrant/.bashrc
。
grep foo ~/.bash_profile || echo "foo" > ~/.bash_profile
,其中 || 表示或,因此仅当第一部分失败时才执行第二部分。 - Scott Prive.profile
、.bashrc
和.bash_profile
的区别,请参考:https://serverfault.com/q/261802/536173 - stackprotectorcd /vagrant
。最好的方法是在配置脚本中完成此操作。end
之前即可:config.vm.provision "shell", path: "scripts/vagrant/provisioner.sh", privileged: false
路径相对于Vagrantfile所在的项目根目录,并且特权取决于您的项目以及在您的配置脚本中需要特权的其他内容。当必要时,我会明确地使用privileged false和sudo。
在配置脚本中:
if ! grep -q "cd /vagrant" ~/.bashrc ; then
echo "cd /vagrant" >> ~/.bashrc
fi
cd /vagrant
,但仅当其不存在时。如果您需要重新配置,这将防止您的 .bashrc 变得混乱。一些答案提到了与 .bash_profile 的冲突。如果上面的代码不起作用,您可以尝试将相同的行替换为 .bash_profile
或 .profile
。然而,我一直在使用 Ubuntu 客户机的 vagrant。我的基于 Ubuntu 的 Laravel/homestead box 有一个 .bash_profile
和一个 .profile
,但是在不更改或删除其他文件的情况下,在使用 vagrant ssh
时将 cd /vagrant
放在 .bashrc
中确实对我有效。.profile
、.bashrc
和.bash_profile
,请参考https://serverfault.com/q/261802/536173。因此,我建议也使用`.bashrc`。 - stackprotector您可以将cd /vagrant
添加到您的.bashrc
中,当您ssh时它会运行该命令。您想要的/bashrc
在/home/vagrant
中(当您使用vagrant ssh
登录时,您使用的用户是vagrant)。您只需将新行放在文件底部即可。
VAGRANT_COMMAND = ARGV[0]
if VAGRANT_COMMAND == "ssh"
config.ssh.extra_args = ["-t", "cd /vagrant; bash --login"]
end
Vagrantfile
,将您的用户名替换为vagrant
。`
config.vm.provision "shell" do |s|
s.inline = <<-SHELL
# Change directory automatically on ssh login
if ! grep -qF "cd /home/vagrant/ansible" /home/vagrant/.bashrc ;
then echo "cd /home/vagrant/ansible" >> /home/vagrant/.bashrc ; fi
chown vagrant. /home/vagrant/.bashrc
`
你可以使用Ansible来断言你的.bashrc
文件包含cd /vagrant
。
如果你还没有在你的虚拟机上使用Ansible provisioner,那么请将以下行添加到你的Vagrantfile
中:
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "provisioning/playbook.yml"
end
在你的playbook中,添加以下任务/操作:
---
- hosts: all
gather_facts: no
tasks:
- name: chdir to vagrant directory
ansible.builtin.lineinfile:
path: /home/vagrant/.bashrc
line: cd /vagrant
.bashrc
而不是.profile
或.bash_profile
。
vagrant ssh -c <cmd>
或vagrant ssh -- <cmd>
将附加到这些配置的参数而不是替换它们。因此,在没有此配置的主机上,vagrant ssh -c pwd
可以正常工作,但使用此配置会出现错误:“/bin/bash:无法执行二进制文件”。 - Hampton Smith