如何在不实际运行“vagrant ssh”的情况下 ssh 到 vagrant?

Posted

技术标签:

【中文标题】如何在不实际运行“vagrant ssh”的情况下 ssh 到 vagrant?【英文标题】:How to ssh to vagrant without actually running "vagrant ssh"? 【发布时间】:2012-06-07 12:38:25 【问题描述】:

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

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

【问题讨论】:

您实际上在问什么,我看到三个不同的问题被问到,也许您可​​以扩展问题然后标记迁移。谢谢。 默认情况下,VM的ssh端口-22将被转发到主机上的2222。我使用 SSH 在 127.0.0.1 和端口 2222 上进行了 putty-ed,并且成功了! 如果您运行多个机器,该端口号将自动更改。您可以通过运行vagrant ssh-config 获得正确的。 【参考方案1】:

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

简单地说:

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

# run ssh with the file.
ssh -F vagrant-ssh default

【讨论】:

这太棒了。请注意在.gitignore 中添加vagrant-ssh 文件。 使用一些shell(例如zsh),以下单行代码可以工作:ssh -F =(vagrant ssh-config) default 您可能希望将此结果回显到您的ssh 配置文件中:vagrant ssh-config >> ~/.ssh/config,因此您只需从系统中的任何位置运行ssh default,其中default 是VM 的名称你可以指定像here 感谢@adamczi,这是一种简化的方法,也适用于添加额外 ssh 参数 -F 并不简单的自动化解决方案 通过以@adamczi 建议的方式向~/.ssh/config 添加一个条目,然后您可以使用Visual Studio Code Remote - SSH 扩展通过ssh 进入Vagrant VM 并编辑文件并进行远程开发。只需 CMD-SHIFT-P 然后 "Remote-SSH: Connect to Host..." 并且您刚刚添加的 ssh .config 条目会自动列出 - 您只需选择它并瞧,vscode 会连接到您的远程 vagrant vm!如果没有配置输入方法,我不确定我会如何使用 vscode 完成它。【参考方案2】:

我不得不重新实现“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

【讨论】:

这个答案不允许你从Vagrantfile 目录之外ssh 到你的流浪者(“使用常规的ssh 命令”),这就是我解释这个问题的方式。跨度> 您可以自行设置端口。因此脚本可以从任何目录执行。 那么,是什么让该端口成为进入机器的途径?什么端口的配置在哪里? Vagrant 使用auto_correct: true 设置选择一个未使用的。这是more info on how to change it manually 我不得不跳过第一行,即。 Host 条目。修改后的命令为:ssh $(vagrant ssh-config | awk 'NR>1 print " -o "$1"="$2') localhost【参考方案3】:

在终端运行

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

【讨论】:

如果您出于其他原因(例如 SQL GUI 连接,例如 Sequel Pro)需要 vagrant 的主机来进行 ssh ,这是一个绝妙的技巧。这个救我!【参考方案4】:

只需使用-F configfile 参数将整个vagrant ssh-config 作为配置文件传递给ssh。要连接的主机别名在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/(现在)。使用 another variable 或其他文件夹(如果您的系统上未设置)。

【讨论】:

如果您使用的是 bash 或 zsh,process substitution 是将一个命令的输出传递给另一个命令的一种更简单的方法。 bash:ssh -F <(vagrant ssh-config) zsh:zsh process substitutionssh -F =(vagrant ssh-config) @myshen: 根据the answer by @tyrion 进程替换不适用于 bash 中的ssh -F - 你提到的方式应该在 zsh 中工作。【参考方案5】:

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

SSH address: 127.0.0.1:2222

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

ssh vagrant@127.0.0.1 -p 2222

【讨论】:

不错!请注意,通常情况下,vagrant 用户的密码是 vagrant【参考方案6】:

如果您不需要将 stdinssh 一起使用(例如,您只想执行一个命令并注销),您可以使用:

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

在回复google groups 上的类似问题时建议使用此方法。

很遗憾,bash process substitution 也不起作用(有关详细信息,请参阅unix.stackexchange 上的这个问题)。

如果您想要一个交互式 shell,最好的选择是创建一个临时文件并将其与 ssh -F 一起使用,或者按照其他答案的建议使用 awk

【讨论】:

【参考方案7】:

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

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

    ssh vagrant@host

例如。猫 ~/.ssh/config

Host kmaster
  HostName 127.0.0.1
  User vagrant
  Port 2222..
  ....
ssh vagrant@kmaster

【讨论】:

【参考方案8】:

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

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box

【讨论】:

【参考方案9】:

如果您只希望以最低限度的命令连接到您的机器,您需要知道它正在使用的端口(在执行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

【讨论】:

【参考方案10】:

许多其他答案都假设您安装了 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/ 开头。我想你可以写出文件然后修改它,如果这对你更好。

【讨论】:

【参考方案11】:

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

    为添加的实例编辑 Vagrantfile

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

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

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

your_virtual_host_name.pem

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

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

ssh -i your_virtual_hostname.pem username@192.168.33.10

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

就是这样

【讨论】:

谢谢,感谢您从其他地方的 vagrant 复制密钥文件的想法,我意识到我遇到了什么问题 - 我在 Linux 上使用了 libvirt 提供程序。这很重要,因为对于 libvirt 提供程序,您需要使用 sudo 初始化 vagrant,因此 .vagrant 文件夹中的所有文件都归 root 所有。并且文件的权限是 rw-------- 所以只有 root 有权读取密钥文件。也许这对任何人都有帮助。【参考方案12】:

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

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

注意:确保私钥归运行Vagrant的用户所有。

如果您的目标是拥有multi-machine environment,您可以使用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

【讨论】:

如果我将旧机器设为“主要”,我可以将一台机器配置更改为两台机器配置吗?【参考方案13】:

ssh vagrant@<host> 密码:vagrant

例子:

ssh vagrant@vagrant.local

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

【讨论】:

【参考方案14】:

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

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

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

    SSH 到 vagrant:ssh vagrant。姓氏是上一步的别名。

【讨论】:

【参考方案15】:

您可以采用任何ssh-config 参数,并将它们作为-o Key=value 在命令行上传递给ssh。因此,对于简单的单主机 vagrant 设置(对于多主机设置,您可能需要使用 grepperl 做更多的工作),您可以执行以下操作(或将 perl 替换为 @987654326 @如果你愿意):

ssh `vagrant ssh-config | tail -8 | perl -pe 's/^\s+/-o@/; s/\s/\=/;s/@/ /;s/\n/ /'` vagrant@localhost

【讨论】:

【参考方案16】:

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

有效。

也许 Xshell 是一个候选者。

【讨论】:

以上是关于如何在不实际运行“vagrant ssh”的情况下 ssh 到 vagrant?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 CURL 的情况下运行 HTTP 请求

在 Android 11 上,如何在不实际点击通知的情况下从通知更新启动 Activity

如何在不实际序列化对象的情况下估计 Java 中对象的序列化大小?

如何在不实际缩放的情况下更改视图缩放值?

cppcheck 可以在不实际检查的情况下进行试运行以列出所有文件吗?

如何在不实际滚动的情况下确定滚动方向