Easy ssh into libvirt VMs and LXD containers September 20, 2017
Posted by jdstrand in canonical, ubuntu, ubuntu-server.trackback
Finding your VMs and containers via DNS resolution so you can ssh into them can be tricky. I was talking with Stéphane Graber today about this and he reminded me of his excellent article: Easily ssh to your containers and VMs on Ubuntu 12.04.
These days, libvirt has the `virsh dominfo` command and LXD has a slightly different way of finding the IP address.
Here is an updated `~/.ssh/config` that I’m now using (thank you Stéphane for the update for LXD. Note, the original post had an extra ‘%h’ for lxd which is corrected as of 2020/06/23):
Host *.lxd
#User ubuntu
#StrictHostKeyChecking no
#UserKnownHostsFile /dev/null
ProxyCommand nc $(lxc list -c s4 $(echo %h | sed "s/\.lxd//g") | grep RUNNING | cut -d' ' -f4) %p
Host *.vm
#StrictHostKeyChecking no
#UserKnownHostsFile /dev/null
ProxyCommand nc $(virsh domifaddr $(echo %h | sed "s/\.vm//g") | awk -F'[ /]+' '{if (NR>2 && $5) print $5}') %p
You may want to uncomment `StrictHostKeyChecking` and `UserKnownHostsFile` depending on your environment (see `man ssh_config`) for details.
With the above, I can ssh in with:
$ ssh foo.vm uptime
16:37:26 up 50 min, 0 users, load average: 0.00, 0.00, 0.00
$ ssh bar.lxd uptime
21:37:35 up 12:39, 2 users, load average: 0.55, 0.73, 0.66
Enjoy!
Nice time saver, thanks for sharing the snippets!
Note: You miss the uptime command in your ssh bar.lxd example.
Fixed, thanks!
In
lxc list -c s4 $(echo %h | sed “s/\.lxd//g”) %h
you’re running lxc list with both hostname and hostname.lxd on the command line; lxc list thinks those are separate filters and combines them with AND, and as a result fails to find the container.
I removed the second %h and the command works for me now.
Yes, there was a typo. Thanks! (I’ll adjust it in the post)