如何向流浪者 ssh 而不实际运行“流浪者 ssh”?

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

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

89639 次浏览

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

只需将整个 vagrant ssh-config作为配置文件传递给带有 -F configfile参数的 ssh。要连接到的主机别名在 vagrant ssh-config的第一行定义; Host default意味着可以连接到 ssh default

我看不到从标准输入读取配置文件的选项,所以使用临时文件路由。下面是一行程序,它还会在之后清理临时 $TMPDIR.vagrant-ssh-config文件。它需要在与您的 Vagrantfile相同的目录中执行,假设您的流浪箱已经启动并运行。

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/(现在)。如果系统上没有设置,请使用 另一个变量或其他文件夹。

您可以获取任何 ssh-config参数,并将它们作为 -o Key=value在命令行上传递给 ssh。因此,对于一个简单的单主机流浪设置(对于多主机设置,您可能需要对 grepperl做一些更多的工作) ,您可以执行以下操作(或者如果您愿意,将 perl替换为 sed) :

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

如果您不需要在 ssh中使用 stdin (例如,您只想执行一个命令并注销) ,您可以使用:

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

该方法是针对 谷歌群组上的一个类似问题而提出的。

不幸的是,Bash 进程替换也不起作用(更多细节请参见 Unix.stackexchange上的这个问题)。

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

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

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

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

虽然如果你的目标是有一个 多机器环境多机器环境你可以这样做使用 config.vm.define

下面的例子说明了一个有两台机器的环境,一台称为 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 ssh webvagrant provision databases

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

简单地说:

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


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

如果您只是想设置它,以便能够使用普通的 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

在终点线上

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

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

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

有用。

也许 Xshell 是候选人。

很多答案都假设你安装了流浪汉。

我在 Windows10上安装了 Vagrant,但是我不能使用 vagrant ssh,因为我正在使用 PuTTy 作为我的 SSH 客户端,而这个 Vagrant 是不会接受的。

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

然而,在 Windows10中,我们也在 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/开头。我想您可以写出文件,然后修改它,如果这对您更有效的话。

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

  1. 编辑实例添加的 Vagrantfile

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

这将为主机添加一个私有 IP (使其在192.168范围内如您所愿,只要它还没有被使用

  1. 通过从命令行重新加载流浪者来重新启动实例
  2. 将流浪的 private _ key 文件复制到你应该在你的机器上运行的 Linux 等价文件(例如 Cygwin if on windows,我使用 windows 10)到你的 Cygwin 主目录,并将它重命名为某个描述密钥要用于的主机的东西,例如。

your_virtual_host_name.pem

  1. 您可以在. vasrant machine default Virtual box private _ key 下找到这个密钥

  2. 进入您的主目录并执行您通常使用的 Unix ssh,因此

ssh -i your_virtual_hostname.pem username@192.168.33.10

其中,如果您有一个标准框,那么用户名很可能是流浪的,请查看流浪 ssh-config 的输出,以获得该框的 ssh 标准详细信息。

就是这样

我用一种非常简单的方法解决了这个问题: 当您启动流浪者框时,它显示 ssh 地址如下所示

SSH address: 127.0.0.1:2222

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

ssh vagrant@127.0.0.1 -p 2222

密码: vagrant

例子:

  • ssh vagrant@vagrant.local

  • 或在检查 IP (从内部,使用 vagrant ssh) ssh vagrant@172.28.128.3

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

  1. 获取流浪机的 ssh 配置文件夹: vagrant ssh-config

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

  3. Ssh 到流浪者: ssh vagrant。最后一个名字是前一步的别名。

您可以向本地 ssh 配置添加流浪主机配置。

  1. 流浪 ssh-config > > ~/. ssh/config

  2. Ssh 漂泊者@{ host }

Ex. cat ~/. ssh/config

Host kmaster
HostName 127.0.0.1
User vagrant
Port 2222..
....
  • 流浪汉@kmaster