Linux命令-rlogin(远程登录)
-
- [🔰 简介](#🔰 简介)
- [📖 语法](#📖 语法)
- [⚙️ 选项](#⚙️ 选项)
- [💡 示例](#💡 示例)
-
- [示例 1:基本连接与转义字符](#示例 1:基本连接与转义字符)
- [示例 2:与 SSH 的安全对比](#示例 2:与 SSH 的安全对比)
- [示例 3:抓包验证------rlogin 明文传输的证据](#示例 3:抓包验证——rlogin 明文传输的证据)
- [示例 4:检查系统中残留的 r-services](#示例 4:检查系统中残留的 r-services)
- [示例 5:将旧脚本中的 rlogin 迁移到 SSH](#示例 5:将旧脚本中的 rlogin 迁移到 SSH)
- [⚠️ 注意](#⚠️ 注意)
- [📚 相关命令](#📚 相关命令)
- [📝 总结](#📝 总结)
快速参考 :rlogin 是 UNIX/Linux 系统中最早期的远程登录命令之一,属于 BSD r-commands 工具集(rsh/rlogin/rexec)。它基于 rlogin 协议(TCP 端口 513),在不可信网络中明文传输所有数据(包括密码),存在严重安全风险。现代生产环境必须使用 SSH 替代,本文仅作历史参考和安全教育用途。
核心警告 :rlogin 协议没有加密层,密码和会话内容在网络中以明文形式传播,任何具备抓包能力的中间人都可以窃取。同时其认证依赖
.rhosts文件,极易被 IP 欺骗攻击利用。
🔰 简介
rlogin 诞生于 1980 年代的 BSD Unix,是远程登录的早期解决方案。它在设计之初假设网络是安全的(这在当时的大学/研究机构局域网中基本成立),因此不考虑数据加密。随着互联网的普及,这种假设彻底破产。
在现代 Linux 发行版中,rlogin 命令通常由 rsh-client 或 rsh-redone-client 软件包提供,且默认不安装。如果你在旧系统或某些容器镜像中发现该命令,强烈建议立即卸载。
📖 语法
bash
rlogin [选项] 主机名
远程主机 必须运行 rlogin 守护进程(rlogind,由 rsh-server 提供)并监听 TCP 513 端口。
基本使用方式:
bash
# 以当前本地用户名登录远程主机
rlogin remote-host
# 指定远程用户名
rlogin -l bob remote-host
# 8位传输模式(用于非 ASCII 字符集)
rlogin -8 -l user remote-host
⚙️ 选项
| 选项 | 长格式 | 说明 |
|---|---|---|
-l 用户名 |
--- | 指定远程登录的用户名,若不指定则使用当前本地用户名 |
-8 |
--- | 启用 8 位数据传输模式,支持非 ASCII 字符(如中文、日文) |
-e 字符 |
--- | 设置转义字符,默认为 ~,用于断开连接 |
-E |
--- | 禁用转义字符 |
-d |
--- | 启用调试输出,用于排查连接问题 |
-L |
--- | 允许 rlogin 会话在 litout 模式下运行 |
💡 示例
示例 1:基本连接与转义字符
bash
# 以指定用户登录远程主机
$ rlogin -l alice 192.168.1.100
Password:
Last login: Sat Jun 14 10:30:22 from client-host
[alice@remote-host ~]$ hostname
remote-host
[alice@remote-host ~]$ uptime
10:35:01 up 30 days, 2:15, 3 users, load average: 0.08, 0.12, 0.09
# 按 Enter 然后 ~. 断开连接
[alice@remote-host ~]$ ~.
Connection closed.
# 预期输出:
# 输入 ~.(回车后先按 ~ 再按 .)即可强制断开 rlogin 会话
示例 2:与 SSH 的安全对比
bash
# ========== rlogin(明文、不安全)==========
# 服务端需先安装并启用 rsh-server
$ sudo apt-get install rsh-server # Debian/Ubuntu
$ sudo yum install rsh-server # RHEL/CentOS
$ sudo systemctl start rlogin.socket
# 客户端连接
$ rlogin -l admin 10.0.0.50
Password: [密码在网络中以明文传输!]
# ========== SSH(加密、安全)==========
# SSH 服务默认已安装和启用
$ ssh admin@10.0.0.50
admin@10.0.0.50's password: [通过加密通道传输]
# 使用密钥认证(更安全)
$ ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
$ ssh-copy-id admin@10.0.0.50 # 复制公钥到远程
$ ssh admin@10.0.0.50 # 免密登录
Last login: Sat Jun 14 10:35:01 2026 from 10.0.0.20
示例 3:抓包验证------rlogin 明文传输的证据
bash
# 在中间主机上使用 tcpdump 抓取 rlogin 流量
$ sudo tcpdump -i eth0 -A port 513
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MT (Ethernet), capture size 262144 bytes
10:40:15.123456 IP client.1023 > server.login: Flags [P.], seq 1:15
E..C..@.@..........
mypassword <--- 密码明文可见!
10:40:16.234567 IP server.login > client.1023: Flags [P.], seq 1:30
E..B..@.@..........
Last login: Sat Jun 14
# 会话中的所有命令和输出同样明文可见
# 对比 SSH 流量:全部加密,不可读
$ sudo tcpdump -i eth0 -A port 22
tcpdump: verbose output suppressed
listening on eth0
10:41:01.123456 IP client.1024 > server.ssh: Flags [P.], seq 1:60
E..X..@.@..........
...garbled ciphertext... <--- 完全不可读的密文
示例 4:检查系统中残留的 r-services
bash
#!/bin/bash
# 安全检查脚本:排查系统中是否残留 r-services
echo "=== 检查 r-commands 软件包 ==="
dpkg -l 2>/dev/null | grep -E 'rsh-server|rsh-client|rsh-redone' || \
rpm -qa 2>/dev/null | grep -E 'rsh-server|rsh-client'
echo ""
echo "=== 检查 r-commands 二进制文件 ==="
for cmd in rlogin rsh rexec rcp; do
path=$(which $cmd 2>/dev/null)
if [ -n "$path" ]; then
echo "⚠️ 发现: $path"
else
echo "✅ 未发现: $cmd"
fi
done
echo ""
echo "=== 检查 r-services 是否在监听端口 ==="
sudo netstat -tlnp 2>/dev/null | grep -E ':513|:514|:512' || \
sudo ss -tlnp | grep -E ':513|:514|:512'
echo ""
echo "=== 检查 systemd socket 服务 ==="
for svc in rlogin.socket rsh.socket rexec.socket; do
systemctl is-active $svc 2>/dev/null && echo "⚠️ $svc 正在运行" || echo "✅ $svc 未激活"
done
# 预期输出(安全的系统):
# ✅ 未发现: rlogin
# ✅ 未发现: rsh
# ✅ rlogin.socket 未激活
示例 5:将旧脚本中的 rlogin 迁移到 SSH
bash
#!/bin/bash
# 批量迁移脚本:将 rlogin/rsh/rcp 替换为 SSH 系列命令
BACKUP_DIR="/tmp/migration_backup_$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
find /usr/local/bin /opt/scripts -type f -name "*.sh" | while read script; do
echo "处理: $script"
# 备份原文件
cp "$script" "$BACKUP_DIR/"
# rlogin -l user host → ssh user@host
sed -i 's/rlogin\s\+-l\s\+\([^ ]\+\)\s\+\([^ ]\+\)/ssh \1@\2/g' "$script"
# rsh host cmd → ssh host cmd
sed -i 's/rsh\s\+\([^ ]\+\)\s\+\(.*\)/ssh \1 \2/g' "$script"
# rcp src dst → scp src dst
sed -i 's/\brcp\b/scp/g' "$script"
echo " 已完成迁移"
done
echo "备份存放在: $BACKUP_DIR"
echo "请检查迁移后的脚本,确认无误后删除备份"
⚠️ 注意
安全红线:永远不要在生产环境或任何连接互联网的系统上使用 rlogin!以下几点必须牢记:
-
密码明文传输:rlogin 的所有网络流量(包括密码、键盘输入、屏幕输出)都是明文,任何在同一网络段的攻击者都可以通过 ARP 欺骗 + 抓包工具(如 Wireshark、tcpdump)轻易捕获。
-
.rhosts信任机制 :rlogin 的免密认证依赖~/.rhosts文件,格式为主机名 用户名。攻击者只需伪造 IP 地址即可绕过认证,这在现代网络中是灾难性的。 -
无完整性校验:rlogin 不提供数据完整性保护,中间人可以篡改传输的任意数据而不被检测到。
-
无主机认证:客户端无法验证自己连接的是否是预期的服务器,极易遭受中间人攻击(MITM)。
-
发行版状态 :从 RHEL 7 / Ubuntu 18.04 起,rsh-server 已从默认仓库中移除或标记为废弃。在 Debian 12 / Ubuntu 24.04 中,
rsh-client虽仍存在于仓库,但仅用于兼容性。
bash
# 在 Debian/Ubuntu 中卸载 rsh 相关包
sudo apt-get purge rsh-client rsh-server rsh-redone-client
sudo apt-get autoremove
# 在 RHEL/CentOS/Fedora 中卸载
sudo yum remove rsh rsh-server
sudo dnf remove rsh rsh-server # Fedora 22+
# 禁用并屏蔽 systemd socket
sudo systemctl disable --now rlogin.socket rsh.socket rexec.socket 2>/dev/null
sudo systemctl mask rlogin.socket rsh.socket rexec.socket 2>/dev/null
📚 相关命令
| 命令 | 说明 |
|---|---|
ssh |
安全外壳协议,现代远程登录的标准替代方案 |
scp |
基于 SSH 的安全文件复制,替代 rcp |
sftp |
基于 SSH 的安全 FTP,替代传统 FTP |
telnet |
另一个明文远程登录协议(端口 23),同样已被 SSH 取代 |
rsh |
远程 Shell,与 rlogin 同族的远程命令执行工具 |
mosh |
Mobile Shell,适用于高延迟/不稳定网络的 SSH 替代 |
📝 总结
rlogin 是 UNIX 远程登录历史的见证者,代表着"信任网络"时代的设计哲学。在现代网络环境中,它的每一个设计决策都已成为安全漏洞:
- 无加密 → SSH 提供端到端加密
- 弱认证 → SSH 支持公钥/证书/双因素认证
- 无完整性 → SSH 的 MAC(消息认证码)确保数据不被篡改
- 无主机验证 → SSH 的 known_hosts 机制防止中间人攻击
一句话结论 :永远使用 ssh 替代 rlogin,如果在系统中发现 rlogin 服务,立即禁用并移除相关软件包。 本文仅作为历史技术文档保留,方便读者理解远程登录技术的发展脉络。