我想在一个 shell 脚本中使用 ssh
命令来复制 Vagrant 登录虚拟机的方式,因此我创建了一个别名到我的 Vagrant 实例。
如何使用普通的 ssh
命令访问它?
我想在一个 shell 脚本中使用 ssh
命令来复制 Vagrant 登录虚拟机的方式,因此我创建了一个别名到我的 Vagrant 实例。
如何使用普通的 ssh
命令访问它?
已经有很多答案了,但它们似乎都过于复杂,或者解决了提问者没有的问题。
简单来说:
# save the config to a file
vagrant ssh-config > vagrant-ssh
# run ssh with the file.
ssh -F vagrant-ssh default
.gitignore
中添加vagrant-ssh
文件? - sashaegorovzsh
),以下的单行命令可以工作:ssh -F =(vagrant ssh-config) default
。 - liorissh
配置文件中:vagrant ssh-config >> ~/.ssh/config
,这样你只需在系统中任何地方运行 ssh default
,其中 default
是你可以像这里所示指定的虚拟机名称。 - adamczi~/.ssh/config
中添加一个条目,您可以使用Visual Studio Code Remote - SSH扩展程序连接到Vagrant VM并进行远程开发。只需按CMD-SHIFT-P,然后选择“Remote-SSH:Connect to Host...”,您刚刚添加的ssh .config条目会自动列出-您只需选择它,就可以将vscode连接到您的远程vagrant vm!如果没有配置条目方法,我不确定如何使用vscode完成此操作。 - abulka因为“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
为了适应有多个vagrant主机的情况,这将选择所需的主机,并从配置中删除空行(使用sed):
HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' | awk 'NR>1 {print " -o "$1"="$2}') localhost
Vagrantfile
目录外部使用普通的ssh
命令连接到你的Vagrant。这也是我对问题的理解。 - sjyauto_correct: true
。这里有更多信息,介绍如何手动更改它。 (http://oddessay.com/development-notes/changing-vagrants-default-ssh-port-to-prevent-collision-when-resuming-a-suspended-instance) - Stefano Palazzossh $(vagrant ssh-config | awk'NR>1 {print" -o"$1"="$2}')localhost
。 - kgadekvagrant ssh
有一个全局锁 - 一次只能运行一个进程。ssh
本身没有这样的锁定,因此使用您的一行代码让我绕过了这个限制。 - henrebotha在终端中运行
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
ssh vagrant@IP -p PORT -i path/to/privatekey
。这甚至比得票最高的答案还要简单。 - Aldianvagrant ssh-config
作为配置文件传递给带有 -F configfile
参数的 ssh
。要连接的主机别名在 vagrant ssh-config
的第一行中定义;Host default
表示您可以使用 ssh default
连接。$TMPDIR.vagrant-ssh-config
文件。假设您的 vagrant box 已经启动并正在运行,需要在与您的 Vagrantfile
相同的目录中执行该命令。vagrant ssh-config > $TMPDIR.vagrant-ssh-config && ssh default -F $TMPDIR.vagrant-ssh-config ; rm $TMPDIR.vagrant-ssh-config
$TMPDIR
会扩展为/var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/
(当前)。如果你的系统没有设置,请使用another variable或其他文件夹。我以非常简单的方式解决了这个问题: 当你启动vagrant box时,它会显示ssh地址,就像这样
SSH address: 127.0.0.1:2222
然后您可以使用vagrant用户、主机和端口连接到该框
ssh vagrant@127.0.0.1 -p 2222
vagrant
。 - Brad Parksssh vagrant@IP -p PORT -i /home/USER/WORKING_REP/.vagrant/machines/default/libvirt/private_key
的东西。 - Aldian您可以将vagrant主机配置添加到本地ssh配置中。
vagrant ssh-config >> ~/.ssh/config
ssh vagrant@{host}
例如:cat ~/.ssh/config
Host kmaster
HostName 127.0.0.1
User vagrant
Port 2222..
....
如果你不需要使用stdin与ssh
(例如,你只想执行一个命令并退出),那么你可以使用:
vagrant ssh-config --host default | ssh -F /dev/stdin default
这个方法是在谷歌论坛上对一个类似问题提出的建议。
不幸的是,bash进程替换也不起作用(有关详细信息,请参见unix.stackexchange上的此问题)。
如果您想要一个交互式shell,则最好的选择是创建一个临时文件并将其与ssh -F
一起使用,或者像其他答案所建议的那样使用awk
。
ssh vagrant@127.0.0.1 -p2222 -i .vagrant/machines/default/virtualbox/private_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=Fatal
如果你只想设置使得你能使用普通的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-config
命令来获取正确的端口号。 - Stefano Palazzo