Use SSH to execute commands (public/private key login): Difference between revisions

From MikroTik Wiki
Jump to navigation Jump to search
No edit summary
Line 1: Line 1:
The following example uses DSA key pair, this will allow you to run scripts and login from a remote machine against RouterOS using Public/Private key authentication.
The following example uses RSA key pair, this will allow you to run scripts and login from a remote machine against RouterOS using Public/Private key authentication.

===Host to RouterOS===
===Host to RouterOS===
Line 79: Line 79:

=Escaping shell special characters=
=Escaping shell special characters=

Revision as of 04:40, 27 May 2020


The following example uses RSA key pair, this will allow you to run scripts and login from a remote machine against RouterOS using Public/Private key authentication.

Host to RouterOS

Note: commands are run using FreeBSD - should be similar on other platforms.

1) Create a key using ssh-keygen

%ssh-keygen -t rsa

This creates an RSA key pair that is compatible with Mikrotik.

Generating public/private RSA key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/
The key fingerprint is:

Note: Make sure to leave the passphrase blank if you are going to be using this key in automated scripts. You do not want to be prompted for a password. Just make sure you keep your private key private (enough said?)!

2) Upload the generated key (public) to the target device:

Example: Upload key via FTP

Connected to
220 mikrotik FTP server (MikroTik 2.9.16) ready
Name ( admin
331 Password required for admin

ftp> put
226 ASCII transfer complete

ftp> exit

3) Now from either Winbox or terminal mode you need to import the key. An example using terminal mode is given.

[admin@mikrotik]> user ssh-keys import 
user: admin-ssh

The user field above determines which user account will be logged in when you pass the key. For security reasons you should never use the 'admin' account (you knew that right?). Create a separate user account.

Now that you've created a key pair and imported the public key into RouterOS you can start running commands from your remote machine.


Note: If you wish to be able to run ssh / ssh-exec commands from one RouterOS device to another, follow the additional steps below

RouterOS to RouterOS

4) Create a new group with policies:

/user group add name=remote policy=ssh,read,write

5) Create a new user and assign the previously created group:

 /user add name=remote group=remote password=Sup3rStr0ngPassw0rd

6) Upload private and public keys on the device, from which you wish to use ssh commands with RSA authentication

7) Import both keys for the user:

/user ssh-keys private import user=remote private-key-file=mykey passphrase=""

Now you should be able to authenticate from this device to any other device which has a user with the imported public key


Note: You can disable password login for users with SSH-KEY imported using "/ip ssh set always-allow-password-login=no"

Save a Host key

Since v6.45.1(stable) RouterOS allows user to save a ssh host key after devices reset. Use the following configuration line

/system reset-configuration keep-users=yes

Escaping shell special characters

For executing a simple command with ssh you have to enclose command with quotes to tell shell which characters belong to single shell command parameter. If you use double quotes then you have to escape all inside double quotes with backslash \.

%ssh -l admin-ssh -i /home/user/.ssh/id_rsa ":put \"hello\""

Another special character which need escaping is single dollar sign $ because it's used for variable handling by shell like bash or sh.

%ssh -l admin-ssh -i /home/user/.ssh/id_rsa ":for i from=1 to=10 do={:put \$i}"

All other special characters evaluated by shell have to be escaped.


%ssh -l admin-ssh -i /home/user/.ssh/id_rsa "/system gps monitor"
  date-and-time: mar/18/2006 08:30:39
      longitude: "W 117 00' 00''"
       latitude: "N 33 0' 00''"
       altitude: "200.199997m"
          speed: "0.185200 km/h"
          valid: yes
%ssh -l admin-ssh -i /home/user/.ssh/id_rsa "/routing bgp peer print status"
Flags: X - disabled
 0 remote-as=65333 multihop=yes
     in-filter=cymru-in out-filter=cymru-out route-reflect=no hold-time=3m
     ttl=60 tcp-md5-key="" remote-hold-time=3h
     used-hold-time=3m used-keepalive-time=1m state=established
     uptime=1w1d10h54m55s prefix-count=68 refresh-capability=yes
%ssh -l admin-ssh -i /home/user/.ssh/id_rsa "/ip firewall connection print count-only"

DSA deprecated

Since OpenSSH 7.0 version DSA public key algorithm is considered weak and is deprecated. To be able to use DSA it needs to be enabled explicitly. Put PubkeyAcceptedKeyTypes +ssh-dss to ~/.ssh/config file.

Also to be able to connect to older versions of RouterOS you may need to use additional ssh parameters -o KexAlgorithms=diffie-hellman-group14-sha1 -o HostKeyAlgorithms=+ssh-dss

Otherwise, use RSA.

See also