169

我想重现 Vagrant 在 shell 脚本中使用ssh命令登录到我的虚拟机的方式,所以我为我的 Vagrant 实例创建了一个别名。

ssh使用常规命令访问它的命令语法是什么?

4

16 回答 16

183

已经有很多答案,但它们似乎都过于复杂或解决了提问者没有的问题。

简单地:

# save the config to a file
vagrant ssh-config > vagrant-ssh

# run ssh with the file.
ssh -F vagrant-ssh default
于 2014-05-15T17:58:37.417 回答
114

我不得不重新实现“vagrant ssh”,因为它的-c选项没有正确传递参数。这基本上就是它的作用(可能还有更多,但这样可以正常工作)

#!/bin/sh
PORT=$(vagrant ssh-config | grep Port | grep -o '[0-9]\+')
ssh -q \
    -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no \
    -i ~/.vagrant.d/insecure_private_key \
    vagrant@localhost \
    -p $PORT \
    "$@"

作为一个单行者(感谢kgadek):

ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost

考虑到当你有多个流浪主机时,这将选择所需的主机,并从配置中剔除空白行(使用 sed):

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost
于 2012-10-17T16:04:39.413 回答
61

在终端运行

vagrant ssh

在另一个终端窗口/选项卡中运行

ps aux | grep ssh

在那里,您将看到 Vagrant 执行的实际命令,如下所示:

ssh vagrant@127.0.0.1 -p 2222 -o Compression=yes -o DSAAuthentication=yes -o LogLevel=FATAL -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -i ~/.vagrant.d/less_insecure_private_key -o ForwardAgent=yes
于 2014-09-14T09:42:10.663 回答
20

只需将整个vagrant ssh-config作为配置文件传递ssh-F configfile参数即可。vagrant ssh-config要连接的主机别名在;的第一行中定义。Host default表示您可以与ssh default.

我看不到从标准输入读取配置文件的选项,所以选择了临时文件路径。这是一个单线,之后也清理临时$TMPDIR.vagrant-ssh-config文件。Vagrantfile假设您的 vagrant box 已启动并正在运行,它需要在与您的相同目录中执行。

vagrant ssh-config > $TMPDIR.vagrant-ssh-config && ssh default -F $TMPDIR.vagrant-ssh-config ; rm $TMPDIR.vagrant-ssh-config

注意:在我的 Mac OSX 系统上,$TMPDIR扩展为/var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(现在)。如果您的系统上未设置,请使用另一个 变量或另一个文件夹。

于 2013-01-03T16:26:22.777 回答
16

我以一种非常简单的方式解决了这个问题:当你启动 vagrant box 时,它会像这样显示 ssh 地址

SSH address: 127.0.0.1:2222

然后您可以使用 vagrant 用户、主机和您获得的端口连接到盒子

ssh vagrant@127.0.0.1 -p 2222
于 2017-08-04T18:00:55.883 回答
7

如果您不需要使用标准输入ssh例如,您只想执行一个命令并注销),您可以使用:

vagrant ssh-config --host default | ssh -F /dev/stdin default

建议使用此方法以响应google groups上的类似问题。

不幸的是, bash 进程替换也不起作用(有关更多详细信息,请参阅unix.stackexchange上的这个问题)。

如果您想要一个交互式外壳,您拥有的最佳选择是创建一个临时文件并将其与其他答案的建议一起使用ssh -F或使用。awk

于 2013-12-20T11:50:45.197 回答
7

您可以将 vagrant 主机配置添加到本地 ssh 配置中。

  1. vagrant ssh-config >> ~/.ssh/config

  2. ssh vagrant@{主机}

前任。猫 ~/.ssh/config

Host kmaster
  HostName 127.0.0.1
  User vagrant
  Port 2222..
  ....
  • ssh vagrant@kmaster
于 2019-08-24T07:19:58.763 回答
5

如果您只想设置它以便可以使用普通的 ssh 命令行以及 scp 等,您可以运行vagrant ssh-config并将输出附加到您的默认 ssh 配置。如果您将“主机默认值”行替换为更具描述性的主机名,那么您应该很高兴。

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
于 2014-07-17T21:58:45.447 回答
5

如果您只希望以最低限度的命令连接到您的机器,您需要知道它正在使用的端口(在执行时打印vagrant up或可见执行vagrant ssh-config)以及您的私有 SSH 密钥在哪里(执行时也可见vagrant ssh-config

然后只需提供密钥和端口即可:

ssh -p 2222 -i $HOME/vagrantenv/.vagrant/machines/default/virtualbox/private_key vagrant@127.0.0.1

于 2016-06-25T23:45:04.203 回答
4

许多其他答案假设您安装了 Vagrant。

我在 Windows 10 上安装了 Vagrant,但我不能,vagrant ssh因为我使用 PuTTy 作为我的 SSH 客户端,vagrant 不会接受。

在 PATH 中找到的ssh可执行文件是 PuTTY Link SSH 客户端。Vagrant 仅与 OpenSSH SSH 客户端兼容。

但是,在 Windows 10 中,我们在 Windows 上的 Ubuntu 上也有 Bash。所以,我只是将它与以下命令一起使用:

ssh vagrant@127.0.0.1 -p2222 -i .vagrant/machines/default/virtualbox/private_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=Fatal

在 Win10-Ubuntu 上安装 Vagrant 很容易,但出于某种原因它也希望你安装 Virtualbox,我不想这样做。

注意我已经尝试过这种ssh default -F vagrant-ssh-config方法,但我只是得到

权限被拒绝(公钥、密码)。

我猜这是因为IdentityFile路径是 Windows 路径,而在 Bash 中,它应该以/mnt/c/. 我想你可以写出文件然后修改它,如果它更适合你。

于 2017-02-24T04:19:27.663 回答
3

有一种方法可以复制远程用户登录系统的方式

  1. 编辑您的实例的 Vagrantfile 添加

config.vm.network "private_network", ip: "192.168.33.10"

这会为主机添加一个私有 IP(只要它尚未使用,就让它在 192.168 范围内成为您希望的样子)

  1. 从命令行使用 vagrant reload 重新启动实例
  2. 将 vagrant private_key 文件复制到您应该在您的机器上运行的某个 Linux 等效文件(例如,如果在 Windows 上,我使用 Windows 10 的 Cygwin)到您的 cygwin 主目录,并将其重命名为描述要使用密钥的主机的内容例如

your_virtual_host_name.pem

  1. 您将在 .vagrant\machines\default\virtualbox\private_key 下找到密钥

  2. 转到您的主目录并执行通常的 Unix ssh,所以

ssh -i your_virtual_hostname.pem username@192.168.33.10

如果您有一个标准框,则用户名可能是 vagrant,请查看 vagrant ssh-config 的输出以获取该框的 ssh 标准详细信息。

就是这样

于 2017-06-09T14:01:52.500 回答
2

Vagrant将私钥存储在其中~/.vagrant.d/insecure_private_key并使用它通过 连接到每台机器ssh,考虑到它被配置为连接到端口 2200(默认),它类似于:

ssh vagrant@localhost -p 2200 -i ~/.vagrant.d/insecure_private_key

注意:确保私钥归运行Vagrant.

尽管如果您的目标是拥有一个多机环境,您可以使用config.vm.define.

这是一个示例,说明具有 2 台机器的环境,一台被调用web,另一台是databases

config.vm.define 'web', primary: true do |web|
        web.vm.box = 'CentOS64'
        web.vm.hostname = 'vic-develop'
        web.vm.network 'private_network', ip: '192.168.50.10', virtualbox__intnet: true
        web.vm.synced_folder '../code', '/var/www/project', :mount_options => ["dmode=777,fmode=777"]

        web.vm.provision 'ansible' do |ansible|
            ansible.playbook = 'development-web.yml'
            ansible.sudo = true
        end
end

config.vm.define 'databases' do |db|
    db.vm.box = 'CentOS64'

    db.vm.network 'private_network', ip: '192.168.50.20', virtualbox__intnet: true
    db.vm.network :forwarded_port, guest: 3306, host: 8206

    db.vm.provision 'ansible' do |ansible|
        ansible.playbook = 'development-db.yml'
        ansible.sudo = true
    end
end

然后,您将拥有每台机器可用的所有 Vagrant 命令,即vagrant ssh webvagrant provision databases.

于 2014-03-30T18:57:43.147 回答
2

ssh vagrant@<host>密码:vagrant

例子:

  • ssh vagrant@vagrant.local

  • 或在检查 IP 之后(从内部,使用vagrant sshssh vagrant@172.28.128.3

于 2017-11-10T11:22:40.527 回答
2

您可以将 vagrant 主机的 ssh 配置添加到 ssh 配置。

  1. 在 vagrant 文件夹中获取 vagrant 机器的 ssh 配置:vagrant ssh-config

  2. 打开{UserDir}/.ssh/config并附加上一个命令的结果。注意:第一行Host default表示您稍后将用于ssh命令的别名。将其命名为您的流浪机器或目录。如果你只有一个 vagrant dir - 你可以命名它Host vagrant

  3. SSH到流浪者:ssh vagrant。姓氏是上一步的别名。

于 2018-03-23T18:05:14.750 回答
1

您可以采用任何ssh-config参数,并将它们作为-o Key=value. 因此,对于简单的单主机 vagrant 设置(对于多主机设置,您可能需要做更多的工作),您可以执行以下操作(或grep根据需要替换):perlperlsed

ssh `vagrant ssh-config | tail -8 | perl -pe 's/^\s+/-o@/; s/\s/\=/;s/@/ /;s/\n/ /'` vagrant@localhost
于 2013-09-09T02:07:14.073 回答
0

我的环境 是Win7 + Centos。大多数同意的答案对我不起作用。在尝试失败后ssh -p [port] [usrname]@127.0.01,我只是使用 XShell 添加一个带有 vagrant 端口和用户名的新会话。

有用。

也许 Xshell 是一个候选人。

于 2016-11-12T07:38:14.273 回答