简介:  
    rsh是“remote shell”(远程 shell)的缩写,该命令在指定的远程主机上启动一个shell并执行用户在rsh命令行中指定的命令;如果用户没有给出要执行的命令,rsh就用 rlogin命令使用户登录到远程机上。


rsh命令的一般格式是: 
rsh [-Kdnx] [-k realm] [-l username] host [command]

常用格式:
rsh host [command ] 
command可以是从shell提示符下键人的任何Linux命令。

    -K 关闭所有的Kerbero确认。该选项只在与使用Kerbero确认的主机连接时才使用。
  -d 打开与远程主机进行通信的TCP sockets的socket调试。要了解更多的信息,请查阅setsockopt的联机帮助。
  -k 请求rsh获得在指定区域内的远程主机的Kerberos许可,而不是获得由krb_relmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。
  -l 缺省情况下,远程用户名与本地用户名相同。本选项允许指定远程用户名,如果指定了远程用户名,则使用Kerberos 确认,与在rlogin命令中一样。
  -n 重定向来自特殊设备/dev/null的输入。
  -x 为传送的所有数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。linux把标准输入放入rsh命令中,并把它拷贝到要远程执行的命令的标准输入中。它把远程命令的标准输出拷贝到rsh的标准输出中。它还把远程标准错误拷贝到本地标准错误文件中。任何退出、中止和中断信号都被送到远程命令中。当远程命令终止了,rsh也就终止了。


安装:
1、装包:
   rsh
   rsh-server
2、echo "rexec
         rsh
         rlogin" >> /etc/securetty
3、开启rsh
   因为rsh属于xinetd服务,所以可以直接配置xinetd
   vim /etc/xinetd.d/rsh
   disable                 = no(将yes改为no)
  
   vim /etc/xinetd.d/rlogin
   disable                 = no(将yes改为no)

4、配置.rhosts文件 
  vim /root/.rhosts
192.168.1.159 root
192.168.1.73 root

5、测试rlogin和rsh是否可以无密码登录
[root@73 ~]# rlogin 192.168.1.159
connect to address 192.168.1.159 port 543: Connection refused
Trying krb4 rlogin...
connect to address 192.168.1.159 port 543: Connection refused
trying normal rlogin (/usr/bin/rlogin)
Last login: Sat Nov 12 22:36:21 from 192.168.1.73
[root@159 ~]# exit
logout
rlogin: connection closed.
[root@73 ~]# rsh 192.168.1.159
Last login: Sat Nov 12 22:52:06 from 192.168.1.73
[root@159 ~]# exit
logout
rlogin: connection closed.
[root@73 ~]#


注意:
[root@73 bin]# rsh 192.168.1.159 mkdir 12345
connect to address 192.168.1.159 port 544: Connection refused
Trying krb4 rsh...
connect to address 192.168.1.159 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
解决方法:
1、cd /usr/kerberos/bin
2、mv rsh rshbak
3、ln -s /usr/bin/rsh rsh
(高版本的kerberos rsh执行时会出错:原因是rsh会首先尝试使用k shell建立连接。)

4、hosts.equiv文件详解:
   hosts.equiv文件是为了便于远程主机在本地计算机上执行远程命令而设计的。
   /etc/hosts.equiv和$HOME/.rhosts定义了哪些计算机和用户可以不用提供口令就在本地计算机上执行远程命令,如rexec, rcp, rlogin等等。这些不需要提供口令的计算机和用户称为受信任的。
   当本地计算机收到执行远程命令的请求时,相应的远程命令服务进程,如rlogind,首先检查/etc/hosts.equiv来确认请求是否来自受信任 的计算机和用户。如果这个文件不存在或者虽然存在但不包括相应的计算机和用户,服务进程就会去检查$HOME/.rhosts文件。
     /etc/hosts.equiv的权限必须设置为只有root能够写,建议权限为600。如果这个文件被设置为同组或其它用户可写,远程命令服务进程就会忽略它的存在。
    /etc/hosts.equiv的权限必须设置为只有root能够写,建议权限为600。如果这个文件被设置为同组或其它用户可写,远程命令服务进程就会忽略它的存在。
     如果远程命令是由root用户发起的,远程命令服务进程会忽略/etc/hosts.equiv文件的存在而去直接检查/.rhosts文件。
     hosts.equiv文件格式:
添加对计算机/用户的信任:
hostname: 信任计算机hostname上的所有普通用户
hostname username:信任计算机hostname上的用户username
+:信任所有计算机上的所有普通用户

禁止对计算机/用户的信任:
如果计算机名和用户都没有在/etc/hosts.equiv中被定义为受信任的,那么它们就是不受信任的。另外,您还可以用以下方法明确地禁止对计算机/用户的信任。
-hostname:不信任计算机hostname上的所有用户
hostname -username: 不信任计算机hostname上的用户username

注:
1、/etc/hosts.equiv中记录的顺序:
在/etc/hosts.equiv文件中,记录的顺序十分重要。远程命令服务进程在检查/etc/hosts.equiv文件时会在第一个匹配发现后返回,也就是说,下面这个例子中的禁止信任记录是不起作用的:
hostname
hostname -user1
计算机hostname上的用户user1将能够在不提供口令的情况下在本地计算机上执行远程命令。而下面这个例子能够提供期望中的结果:
hostname -user1
hostname

2、
hosts.equiv与NIS:
在/etc/hosts.equiv中也可以指定是否信任NIS网络组(NETGROUP)。
+@netgroup: 信任网络组netgroup中的所有计算机
-@netgroup:禁止信任网络组netgroup中的所有计算机
hostname +@netgroup: 信任来自计算机hostname的所有网络组netgroup的成员用户的请求
hostname -@netgroup: 禁止信任来自计算机hostname的所有网络组netgroup的成员用户的请求