SSH

RouterOS 包含内置 SSH 服务器,具有可自定义的设置,例如密码套件配置、密钥类型和转发选项。它支持密码和公钥认证,并提供用于导出/导入主机密钥和重新生成密钥的命令。为用户导入公钥即可启用 PKI 认证。

SSH

SSH 服务器

RouterOS 有内置的 SSH (SSH v2) 服务器,默认启用并在 TCP/22 端口监听传入连接。你可以在 Services 菜单下更改端口并禁用该服务器。

参数说明请参阅 /ip/ssh CLI 参考。

启用 PKI 认证

为用户 admin 导入公钥的示例:

在客户端设备上获取 SSH 密钥对(你连接的来源设备)。把公钥上传到路由器并导入。

有关支持的 SSH 密钥的更多信息,请参阅 User SSH keys 章节。

/user/ssh-keys/import public-key-file=id_rsa.pub user=admin

生成 SSH 密钥对

RouterOS 不支持像 Linux 系统上那样的直接 SSH 密钥生成。

要获得 SSH 密钥对(首次 SSH 连接时会自动生成 SSH 密钥对),必须使用 export-host-key 命令导出设备的 SSH 主机密钥。

SSH 客户端

登录到远程主机

连接到远程主机并发起 SSH 会话。IP 地址同时支持 IPv4 和 IPv6。

/system/ssh 192.168.88.1
/system/ssh 2001:db8:add:1337::beef

在这种情况下,提供给远程主机的用户名就是登录到该路由器的那个用户名。如果需要其他值,请使用 user=<username>。

/system/ssh 192.168.88.1 user=lala
/system/ssh 2001:db8:add:1337::beef user=lala

从路由器的特定 IP 地址登录

出于测试或安全原因,你可能需要使用特定的源地址登录另一台主机。使用 src-address=<ip address> 参数。IP 地址同时支持 IPv4 和 IPv6。

/system/ssh 192.168.88.1 src-address=192.168.89.2
/system/ssh 2001:db8:add:1337::beef src-address=2001:db8:bad:1000::2

在这种情况下,SSH 客户端会绑定到指定地址,然后向远程主机发起 SSH 连接。

使用 SSH 密钥登录

为用户 admin 导入 RSA 私钥的示例。

首先,把 SSH 密钥导出到文件:

/ip/ssh/export-host-key key-file-prefix=admin

会生成两个文件 admin_rsa 和 admin_rsa.pub。pub 文件需要在 SSH 服务器端被信任(如何在 RouterOS 上启用 SSH PKI)。私钥必须添加到特定用户。

/user/ssh-keys/private/import user=admin private-key-file=admin_rsa

危险

只有在路由器上拥有完整权限的用户才能更改 /user/ssh-keys/private 下的 'user' 属性值 在公钥安装并在 SSH 服务器上被信任后,就可以创建 PKI SSH 会话。

/system/ssh 192.168.1.1

观看如何用 RSA 密钥 或 Ed25519 密钥 登录。

执行远程命令

要执行远程命令,请把它放在登录行的末尾:

/system/ssh 192.168.88.1 "/ip/address/print"
/system/ssh 192.168.88.1 command="/ip/address/print"
/system/ssh 2001:db8:add:1337::beef "/ip/address/print"
/system/ssh 2001:db8:add:1337::beef command="/ip/address/print"

危险

如果服务器不支持 pseudo-tty(ssh -T 或 ssh host command),例如 MikroTik SSH 服务器,你就无法通过 SSH 发送多行命令。 例如,向 MikroTik 路由器发送命令 "/ip/address \n add address=1.1.1.1/24" 会失败。

警告

如果你想通过 scripts 或 scheduler 执行远程命令,请使用 ssh-exec 命令。

SSH exec

ssh-exec 命令是一个非交互式 SSH 命令,允许你通过 scripts 和 scheduler 在设备上远程执行命令。参数说明请参阅 ssh-exec CLI 参考。

获取信息

该命令返回两个值:

  • exit-code:如果命令执行成功则返回 0
  • output:返回远程执行的命令的输出

示例: 以下代码从设备 10.10.10.1 获取 ether1 的接口状态,并把结果输出到 "Log"

:local Status ([/system/ssh-exec address=10.10.10.1 user=remote command=":put ([/interface/ethernet/monitor [find where name=ether1] once as-value]->\"status\")" as-value]->"output")
:log info $Status

警告

出于安全原因,你不应在命令行中指定 "password" 参数并使用明文密码。为确保远程命令的安全执行,你应在两端为用户使用 SSH PKI 认证。

执行命令的用户组和脚本策略需要 test 权限。 观看如何通过 SSH 执行命令。