如何在没有实际运行“stream浪ssh”的情况下sshstream浪?
我想重现Vagrant如何使用ssh
命令在shell脚本内logging我的虚拟机,所以我为我的Vagrant实例创build一个别名。
什么是使用普通的ssh
命令来访问它的命令语法?
我不得不重新实施“stream浪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
为了说明当你有多个stream浪主机时,这将select所需的主机,以及从configuration(使用sed)剔除空行:
HOST=name-of-my-host ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' | awk 'NR>1 {print " -o "$1"="$2}') localhost
已经有很多答案了,但是它们都显得过于复杂,或者解决了提问者没有的问题。
只是:
# save the config to a file vagrant ssh-config > vagrant-ssh # run ssh with the file. ssh -F vagrant-ssh default
在terminal运行
vagrant ssh
在另一个terminal窗口/标签运行
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 ssh-config
作为configuration文件传递给ssh
并使用-F configfile
参数。 要连接的主机别名在vagrant ssh-config
的第一行定义; Host default
意味着您可以使用ssh default
连接。
我看不到从标准input读取configuration文件的选项,所以使用临时文件path。 这里是一个简单的$TMPDIR.vagrant-ssh-config
还会清理临时的$TMPDIR.vagrant-ssh-config
文件。 它需要在你的Vagrantfile
文件所在的目录下执行,假设你的stream浪盒正在运行。
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/
(现在)。 如果未在系统上设置,请使用其他 variables或其他文件夹。
如果你不需要使用stdin和ssh
(例如你只想执行一个命令并注销),你可以使用:
vagrant ssh-config --host default | ssh -F /dev/stdin default
这个方法是针对谷歌类似的问题而提出的。
不幸的是, bash过程replace也不起作用(有关更多详细信息,请参阅unix.stackexchange上的此问题)。
如果你想要一个交互式shell,最好的select是创build一个临时文件,并用ssh -F
或者像其他答案所build议的那样使用awk
。
如果你只是想设置它,所以你可以使用普通的ssh命令行,以及scp等,你可以运行vagrant ssh-config
并将输出附加到默认的sshconfiguration。 如果你用一个更具描述性的主机名replace“主机默认”这一行,你应该很好。
vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config ssh my_cool_dev_box
Vagrant将私钥存储在~/.vagrant.d/insecure_private_key
并使用它通过ssh
连接到每台机器,考虑到它被configuration为在端口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
那么你将有每台机器可用的所有stream浪汉命令,即vagrant ssh web
和vagrant provision databases
。
其他很多答案都假设你已经安装了Vagrant。
我在Windows 10上安装了Vagrant,但是我不能使用vagrant ssh
因为我使用PuTTy作为我的SSH客户端,无法接受。
在PATH中find的
ssh
可执行文件是一个PuTTY链接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,我宁愿不这样做。
NB我已经尝试过使用ssh default -F vagrant-ssh-config
方法,但是我只是得到了
权限被拒绝(公钥,密码)。
我猜这是因为IdentityFile
path是一个Windowspath,而在Bash中,它应该以/mnt/c/
开头。 我想你可以写出文件,然后修改它,如果这对你更好。
您可以使用任何ssh-config
参数,并将其作为-o Key=value
在命令行中传递给ssh。 所以,对于一个简单的单主机stream浪者设置(你可能需要做一个多主机设置的grep
或perl
多一点的工作),你可以做下面的事情(或者用sed
replaceperl
,如果你愿意的话):
ssh `vagrant ssh-config | tail -8 | perl -pe 's/^\s+/-o@/; s/\s/\=/;s/@/ /;s/\n/ /'` vagrant@localhost
如果你只是想要最低限度的命令连接到你的盒子,你需要知道它使用的端口(在vagrant up
打印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
我的环境 是Win7 + Centos。 大多数协议的答案不适用于我。 在尝试ssh -p [port] [usrname]@127.0.01
之后失败之后,我只是使用XShell添加一个新的会话,包含vagrant端口和用户名。
有用。
也许Xshell是一个候选人。
有一种方法可以复制远程用户如何login系统
- 编辑join的实例的Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
这为主机添加了一个私有IP(只要它没有被使用,就可以在192.168范围内使其成为你所希望的)
- 使用vagrant重新加载从命令行重新启动实例
- 将vagrant private_key文件拷贝到你的cygwin home目录下的一些Linux应用程序(例如Cygwin,如果在windows上,我使用的是Windows 10),重命名它以描述主机将被使用的东西因为,例如
your_virtual_host_name.pem
-
您可以在.vagrant \ machines \ default \ virtualbox \ private_key下find密钥
-
去你的家目录,做你的平常Unix的SSH,所以
ssh -i your_virtual_hostname.pem username@192.168.33.10
在那里用户名,如果你有一个标准的盒子可能是stream浪的,看看vagrant ssh-config的输出,以获得盒子的ssh标准详细信息。
而已
我用一个非常简单的方法解决了这个问题:当你启动stream浪箱时,它会显示这样的ssh地址
SSH address: 127.0.0.1:2222
那么你可以通过使用stream浪的用户,主机和端口,你可以连接到框
ssh vagrant@127.0.0.1 -p 2222
ssh vagrant@<host>
密码: vagrant
例子:
-
ssh vagrant@vagrant.local
-
或者在检查IP后(从内部使用
vagrant ssh
)ssh vagrant@172.28.128.3