组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者:杜悦冬(yddu    yddu@platform.com.cn)
译文发布时间:2001-6-18
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须
保留本文档的翻译及版权信息。

Network Working Group                                          B. Kantor
Request for Comments: 1258                      Univ. of Calif San Diego
                                                          September 1991


BSD 的远程登陆
                       (RFC1258——BSD Rlogin)
本备忘录的状态
此文记载了一种现有的协议及其在Internet上一种被广泛使用的实现。本备忘录为
Internet社区提供信息,而非定义Internet标准。本备忘录的发布不受任何限制。
目录
协议描述 1
建立连接 2
从客户到服务器(以及流控) 2
屏幕/窗口大小 2
从服务器到客户 3
关闭连接 3
实现需注意的事项 3
警戒故事 4
安全性考虑 5
作者地址 5

协议描述
Rlogin提供远程回显(remote-echoed)、本地流控(locally flow-controlled)、正确输出清
洗(flow-controlled)的虚终端。它广泛用于Unix主机间,因为它提供了比telnet协议更加
丰富的终端环境语义的传输,而且在许多Unix主机上,通过配置可以让用户不用输入密码
就从被信任的主机上建立连接。

Rlogin需要使用TCP协议,端口号是513。采用8位透明流。

建立连接
建立连接时,客户给服务器发送四个以null结尾的字符串。第一个是空串(就是说它
只有一个为0的字节),后面跟着三个非空串:客户的用户名,服务器的用户名,终端的类
型和速度。更明确的讲:
<null>
        客户端用户名<null>
        服务器端用户名<null>
        终端类型/速度<null>

例如:
        <null>
        bostic<null>
        kbostic<null>
        vt100/9600<null>

服务器端返回一个空字节,表明它接受到了这些字符串,现在已进入了数据传输模式。
窗口大小的协商可以接下来进行(如下)。

从客户到服务器(以及流控)

开始时,客户在cooked模式下工作(与raw模式相对)。此模式下START和STOP(通
常是ASCII码 DC1,DC3)字符被客户端截获,理解为启动和终止远程服务器对本地终端
的输出,而其它字符被按照接收到的原样传输到远端主机(但是下面对本地转意字符的处
理)。

在raw模式下,START和STOP字符不在本地处理,而被像其它字符一样传送到远端
服务器上。于是在raw模式下由服务器来决定START和STOP字符的语义。它们可以用于
流控制或者其它与在客户端上根本不同的意思。

屏幕/窗口大小

在刚刚建立好连接并且完成了用户身份检查后,远端服务器通过给客户端发送一个请求
取得窗口大小的消息(如下描述)来表明自己可以接受改变窗口大小的请求。客户端应该返
回当前窗口大小信息。

如果远端服务器表示它可以接收客户窗口大小改变,客户窗口或者屏幕的尺寸大小,一
个12字节的特殊序列被传送到服务器端,告知当前客户端的尺寸,以防服务器端的用户进
程等待使用这些信息。

窗口大小变化控制序列为12字节长,由一个magic cookie(两个连续的16进制FF),
后面跟着两个小写的ASCII "s",然后是8个字节包含16位的行和列的字符数,X方向的像
素数和Y方向的像素数。所以:
FF FF s s rr cc xp yp

将来也许会用ss之外的其它标志来作为控制信息。但现在还没有定义。

从服务器到客户
从远端服务器的数据以字节流方式传递给客户。一般情况下数据被送到客户端显示,但
也可能在实际显示前处理(例如扩展tab键)。

服务器可以把单字节的控制信息嵌入到数据流中,而TCP "紧急数据" 指针(译者注: 
参见TCP头部格式)指向控制字节。当TCP紧急数据指针被客户端收到后,TCP流中的数
据直到紧急字节的数据被缓存,到控制字节得到处理后再显示。被指向的控制字节被接收然
后按照如下来解释:

02 16进制02的控制字节使客户端丢掉所有缓冲的从服务器端接收到但还没有写道客户端
屏幕的数据。

10 16进制控制字节10命令客户端切换到"raw"模式,这种模式下,START和STOP字符
不再被客户端处理,而被当作普通的数据。

20 16进制控制字节20继续捕获并且在本地处理START和STOP流控制字符。

紧急数据的所有其它值都被忽略。在所有情况下,紧急数据指针所指向的字节都不会被
写道客户端用户的显屏上。

关闭连接

当TCP连接的一方关闭连接,注意到此关闭事件的客户或者服务器进程应当进行有次
序的关闭程序,恢复终端模式,在关闭另外一个方向的连接之前通知用户或者进程。

实现需注意的事项
客户端定义了一个客户转移字符(通常是波浪线“~”)。只有当它是一行开始的第一个
输入字符时会被特殊处理。(一行的开始被定义为客户端用户在下列事件后输入的第一个字
符:新行字符[CR或者LF]、取消行字符、继续一个关起的客户端会话或者初始化完成一个
连接)。

客户端转义字符在被检查完之前不会被传送到服务器端。如果此字符是已定义好的客户
转义字符序列,客户转义字符和之后的字符都不会被传送。否则,客户转义字符和其后的字
符作为普通的用户输入送给服务器。如果客户端转义字符之是点".",或者是客户端定义的文
件结束字符(通常为control-D),连接结束。服务器端一般认为这是断开连接而不是有序的
注销(logout)。

其它字符(客户端定义的,一般是control-Z和control-Y)用来当主机允许时临时挂起
rlogin客户端。一个字符挂起远端输入输出;另外一个挂起远端输入,但是远端输出继续输
出到本地客户端的终端上。

很多客户端实现带有启动选项,可以使客户端不进行正常的输出处理,使客户端接收到
服务器的切换模式通知后仍然保持在"raw"模式下。

警戒故事
rlogin协议(通常实现)允许用户建立一类信任用户和/或主机,他们被允许以自己的
身份登陆而不用输入密码。尽管十分方便,这却表现出一种安全上的薄弱环节,在以前
Internet上的攻击中曾经被利用过。如果有人想利用rlogin的绕过password的功能,意识到
由此可能造成的威胁是很重要的。

绕过被信任主机的密码验证开放了所有这样配置的系统,而只有一个机器会受到威胁。
如果所有系统都使用同一个密码会使坏人在你访问过的所有地方畅通无阻,类似的,在你所
有系统上允许没有密码的登陆会导致坏人在进入了你的任何一个系统后可以在广阔的场地
上恣意。有一种折衷方法让人觉得在方便与安全性之间达到一个平衡:只从一个工作站到你
用的其它系统上允许省去密码,而不上系统间互相省去密码。通过这种方法,你可能把暴露
减少到最小极限了。

被信任主机的说明通常是主机名。通过破坏你公司的域名服务器或者网络本身,可以让
人把一个不信任的注意伪装成被信任的主机。用户对于此类攻击无能为力。幸运的是目前此
类攻击还非常少,它会引起网络中断从而很快被注意到。

当包含被信任登陆的用户列表被不小心变成其它用户可写之后,可能会增加一些靠不住
的东西。
rlogin的安全验证扩展(Kerberos等等)可以大大减少可能造成的损害,同时允许省去
密码输入的方便性。当它们在Internet社区上被广泛配置后,rlogin的危害会减少。

安全性考虑
参见上面的 “警戒故事”

作者地址

  Brian Kantor
   University of California at San Diego
   Network Operations C-024
   La Jolla, CA 92093-0214

   Phone: (619) 534-6865

   EMail: brian@UCSD.EDU

RFC1258——BSD Rlogin                                                 BSD的远程登录
RFC文档中文翻译计划