Get the IP addresses of local Docker containers
We have Docker running with containers that are connected to their own private network. To efficiently manage and monitor these containers, it’s often useful to retrieve their private IP addresses.
With the following command, you can easily obtain the private IP addresses of all running Docker containers:
sudo docker inspect $(docker ps -q) --format='{{ printf "%-50s" .Name}} {{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' | sort -t. -k2,2n -k3,3n -k4,4n
Output example:
$ sudo docker inspect $(docker ps -q ) --format='{{ printf "%-50s" .Name}} {{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' | sort -t. -k2,2n -k3,3n -k4,4n /rproxy 10.3.10.2 /n8n 10.3.10.4 /semaphore 10.3.10.6 /code 10.3.10.7 /ssh 10.3.10.9 /nodered 10.3.10.11 /pihole_opendns 10.3.10.23 /pihole_googledns 10.3.10.24
OpenSSH public key fingerprint
Quick and easy, how to get the fingerprint of your SSH RSA key.
# syntax: openssl pkey -in PATH/PRIVATE_RSA_KEY -pubout -outform DER | openssl md5 -c # example: $ openssl pkey -in ~/.ssh/id_rsa -pubout -outform DER | openssl md5 -c MD5(stdin)= a6:26:23:d9:c1:d3:d5:e5:c0:38:ab:3c:c1:6a:3f:ea
Mikrotik passwordless SSH with public key
Following the instructions described in the official documentation:
https://wiki.mikrotik.com/wiki/Use_SSH_to_execute_commands_(public/private_key_login)
The process is as always as easy as:
# upload the id_rsa.pub file # then import the public key file for the user used for connecting via SSH user ssh-keys import public-key-file=id_rsa.pub user=admin-ssh # and it's done.
Everything was OK with my WSL Ubuntu 20.04. (I added WSL at the beginning of the versions because it runs in Windows Subsystem Linux).
But, with the newest WSL Ubuntu 22.04 I was unsuccessful.
Being precise, the SSH versions are:
# WSL Ubuntu 20.04 $ ssh -V OpenSSH_8.2p1 Ubuntu-4ubuntu0.5, OpenSSL 1.1.1f 31 Mar 2020 # WSL Ubuntu 22.04 $ ssh -V OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022
After connecting with verbose details, I found this message, that was the key for solving the problem:
debug1: Offering public key: /home/my_user/.ssh/id_rsa RSA SHA256:2******************************Y agent debug1: send_pubkey_test: no mutual signature algorithm
Then, I discovered that newest SSH versions aren’t compatible with Mikrotik SSH version. It seems that version isn’t enough newest and are incompatible with how public keys are negotiated at the beginning of the connection.
Finally, the solution was to use an extra parameter for establishing the connection:
ssh -o 'PubkeyAcceptedAlgorithms +ssh-rsa' THE_USER@THE_HOST
Of course, an alternative is using ~/.ssh/config file or the system file: /etc/ssh/ssh_config and add this parameter for everything, or specific hosts. For instance, like this:
Host JUST_A_NAME_OF_THE_CONNECTION Hostname THE_IP_ADDRESS_OR_HOSTNAME_OF_THE_TARGET_HOST user THE_USER PubkeyAcceptedAlgorithms +ssh-rsa
Get the IP address of the WSL2 in Windows 10
Nothing else than what the title says. Simple PowerShell script for dumping the IP address:
wsl -- ip -o -4 -json addr list eth0 ` | ConvertFrom-Json ` | %{ $_.addr_info.local } ` | ?{ $_ }
socat: publish a port only available in localhost
Assume that we have a service only available in localhost (127.0.0.1/8) and we want to expose this port temporarily. Of course, you can use iptables for redirecting the port. But take care, this is not a simple DNAT because packets will not be evaluated by PREROUTING (-t nat) rules.
Another option is using an old-powerful Swiss knife tool: socat (github) (my fork).
# binds public port to any local interface socat TCP-LISTEN:<public_port>,fork TCP:127.0.0.1:<internal_port> # binds only to an IP address SOCAT_SOCKADDR=<interface_IP> socat TCP-LISTEN:<public_port>,fork TCP:127.0.0.1:<internal_port> # examples: # binds to all interfaces: socat TCP-LISTEN:1880,fork TCP:127.0.0.1:1880 # just for an IP address of one interface: SOCAT_SOCKADDR=10.2.0.110 socat TCP-LISTEN:1880,fork TCP:127.0.0.1:1880
WSL2: upgrade from Ubuntu 18.04 to 20.04
I was afraid for missing my files, configurations and much other staff that I had in Linux filesystem of WSL2 (Windows 10). But I had to upgrade because of compatibility with an application that I need. So, finally, I decided to upgrade the Ubuntu 18.04 that I installed in WSL2 to a newer version 20.04. Yes, I know that there is 22.04 available nowadays, but I wasn’t comfortable jumping to many versions.
I followed simple steps that I found at:
How To Upgrade Existing WSL/WSL2 Ubuntu 18.04 to 20.04
The steps in a nutshell were:
sudo apt update sudo apt upgrade -y sudo apt --purge autoremove sudo apt install update-manager-core sudo do-release-upgrade
When I answered all the questions and after stopping the WSL2 VM with:
# command that I ran from 'cmd.exe' (Windows console) wsl --shutdown
I had and issue rebooting, WSL2 didn’t boot and it gave this message:
wsl/usr/sbin/enter-systemd-namespace: line 10: /usr/sbin/daemonize: No such file or directory
I resolved the problem, shutting down the WSL and running the command:
wsl -u root -e bash --noprofile --norc
It gave me a root console where I could modify the file:
/usr/sbin/enter-systemd-namespace
specifically, in line 10, I changed:
/usr/sbin/daemonize
to
/usr/bin/daemonize
And when I accessed to WSL2 everything worked perfectly. I used to access WSL2 from Windows Terminal which uses the command:
C:\WINDOWS\system32\wsl.exe -d Ubuntu-18.04
But it has small issues with bybou, finally I changed this command to:
C:\WINDOWS\system32\bash.exe ~ -login
I love to use a console with byobu enabled when access the shell, but with my former command, the command ‘byobu-enable’ was ignored. I didn’t find why, in the end the solution was to change the command that I use for accessing Linux console (WSL2).
Likewise, I hope these notes can help someone.