"vagrant ssh"命令自动切换到Vagrant目录

51

所以,我有一堆运行某种Linux(CentOS,Ubuntu等)的vagrant虚拟机。我希望能自动确保“vagrant ssh”也会“cd /vagrant”,这样每次登录时就不必记得执行该命令了。

我已经想出来了(傻瓜式!),使用echo "\n\ncd /vagrant" >> /home/vagrant/.bashrc可以解决问题。但我不知道如何确保只有在cd命令不存在时才会发生。我不是shell专家,所以完全被弄糊涂了。 :)

9个回答

36

您可以通过在Vagrantfile中使用config.ssh.extra_args设置来实现此操作:

  config.ssh.extra_args = ["-t", "cd /vagrant; bash --login"]

那么,每次运行vagrant ssh时,您将进入/vagrant目录。


4
这是比尝试解析/配置“.bashrc”文件更好的解决方案。 - Leith
4
这应该是正确的答案。它对环境中的其他进程干扰最少,并专门处理vagrant ssh命令。 - openCivilisation
2
2020年最佳答案(可能在2013年问题被接受时还不存在)。 - Scott Prive
2
我的首选答案,但请注意一个缺点(截至2.2.14):vagrant ssh -c <cmd>vagrant ssh -- <cmd>附加到这些配置的参数而不是替换它们。因此,在没有此配置的主机上,vagrant ssh -c pwd可以正常工作,但使用此配置会出现错误:“/bin/bash:无法执行二进制文件”。 - Hampton Smith

29

我在我的provision.sh文件中加入了以下代码:

echo "cd /vagrant_projects/my-project" >> /home/vagrant/.bashrc

它可以很好地工作。


1
确实,如果有人知道一个一行代码的方法,只有在文件中不存在它时才会追加它,那就更好了。 - httpete
如果您将其添加到配置文件中,请将其添加到仅运行一次的部分。如果您的虚拟机已经设置好(并且未添加),请从命令行运行它。如果您不确定是否已添加,请在文本编辑器中打开文件并检查最后一行。 - Matts
这个答案仍然是正确的,但是现在已经是2020年了,我建议看一下Vagrant-Ansible provisioner,因为它提供了一种相对平台无关的配置技术。(但是像往常一样,如果某些东西没有出现问题,就不要去修复它) - Scott Prive

27

cd是Bash shell内置命令,只要安装了shell,它就应该存在。

还要注意,~/.bash_profile是交互式登录Shell用的,如果在~vagrant/.bashrc中添加cd /vagrant,可能会无法正常工作。

这是因为像Ubuntu这样的发行版默认情况下没有此文件 -> ~/.bash_profile,而是使用~/.bashrc~/.profile

如果有人为Ubuntu上的vagrant用户创建了~/.bash_profile,将不会读取~vagrant/.bashrc


你在vagrant配置文件中的哪里进行配置?我猜不是在虚拟机内部创建。 - David Yell
2
这个答案很有帮助,但我发现对于Ubuntu虚拟机的措辞有些模糊。以下是我的解决方案:
  1. $ vagrant ssh
  2. 在ssh之后所在的目录中,使用$ vi .bash_profile打开文件 - 如果不确定,请先使用$ cd ~回到主目录。
  3. 将“cd /vagrant”添加到文件中并保存。
- mardlin
@q0rban 给出了正确的答案:它使用了 Vagrant 的一个特性,而不是自己编写的解决方法。但是,顺便说一下,如果您想要在字符串“不存在”的情况下添加文件结尾,答案将是:grep foo ~/.bash_profile || echo "foo" > ~/.bash_profile,其中 || 表示或,因此仅当第一部分失败时才执行第二部分。 - Scott Prive
1
为了更加明确.profile.bashrc.bash_profile的区别,请参考:https://serverfault.com/q/261802/536173 - stackprotector

8
你需要在虚拟机的.bashrc文件中添加cd /vagrant。最好的方法是在配置脚本中完成此操作。
如果你没有配置脚本,请在Vagrantfile中加入以下代码,放在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 

这将在 .bashrc 中添加 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

5
您也可以这样做:
``` vagrant ssh -c "cd /vagrant && bash" ```
您可以将其包含在一个脚本中以启动它(如 `./vagrant-ssh`)。

正是我正在寻找的。 - Garrett Kadillak

5

您可以将cd /vagrant添加到您的.bashrc中,当您ssh时它会运行该命令。您想要的/bashrc/home/vagrant中(当您使用vagrant ssh登录时,您使用的用户是vagrant)。您只需将新行放在文件底部即可。


3
理想情况下,我们只想改变vagrant ssh的行为。
在我的情况下,我希望有一种方式来不影响环境中的任何其他进程,因此我们可以在vagrant文件中执行以下操作-
    VAGRANT_COMMAND = ARGV[0]
    if VAGRANT_COMMAND == "ssh"
        config.ssh.extra_args = ["-t", "cd /vagrant; bash --login"]
    end

2
也许这可以帮到您。编辑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
` 

0

你可以使用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

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