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 执行命令。