linux rsh Linux怎么学
大家好,关于linux rsh很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Linux怎么学的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
如何配置linux的rsh服务
如何配置rsh服务
redhat linux下配置rsh和rcp--
1:安装前准备:
机器A:192.168.0.4(安装rsh server)
机器B:192.168.0.10(rsh client调用执行192.168.0.4的命令)
2:首先确认机器A是否安装rsh包:
[root@mg04 root]# rpm-aq|grep rsh
rsh-0.17-14
rsh-server-0.17-14
如果没有安装以上两个包,请找到相关软件安装(如果是LINUX,可以从安装碟中找到)
安装包:
rpm-ivh rsh-0.17-5(linux操作系统)
rpm-ivh rsh-server-0.17-5(linux操作系统)
3:确认是否启动rsh服务:
方法一:
使用命令setup,查看service是否将[*] rsh加上*,如果加上*表示可以启动。
/etc/rc.d/init.d/xinetd restart或者 service xinetd restart
方法二:
rsh属于xinetd服务,可以直接修改/etc/xinetd.d/rsh脚本文件。
service shell
{
disable= no
socket_type= stream
wait= no
user= root
log_on_success+= USERID
log_on_failure+= USERID
server=/usr/sbin/in.rshd
}
当然方法很多,目的就是使用rsh服务能启动。
/etc/rc.d/init.d/xinetd restart
检查是否启动: rsh server监听和TCP是514。
[root@mg04 root]# netstat-an|grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
如果能看到514在监听说明服务器已经启动。
4:配置rsh server:
修改/etc/securetty文件: echo rsh>>/etc/securetty
如果打算用root作为rsh用户的话:
先用root登录到机器A中进行以下操作:
cd~/
echo"192.168.0.10 root">>.rhosts允许192.168.0.10以root访问
echo"192.168.0.4 root">>.rhosts
重启rsh server.
5:测试和注意的问题:
登录到b机器进行测试: rsh-l root 192.168.0.204 ps-ef
看是否能看到结果。如果看到
[root@mg04 etc]# rsh-l root 192.168.0.204 ps-ef
Permission denied.
这是由于权权限问题,一般是由于.rhosts没有配置正确。.rhosts一般位于
rsh server服务器相对应账号目录下比如root(与.bash_profile在同一目录)
rsh在执行命令有时会找不到。rsh在调用命令是最好使用绝对路径。默认搜索路径为:
[root@mg04 etc]# rsh-l root 192.168.0.4 env|grep PATH
PATH=/usr/bin:/bin
rh8.0下rcp的用法设置
只对root用户生效
1、在双方root用户根目录下建立.rhosts文件,并将双方的hostname加进去.在此之前应在双方的/etc/hosts文件中加入对方的IP和hostname
2、把rsh服务启动起来,redhat默认是不启动的。方法:用执行ntsysv命令,在rsh选项前用空格键选中,确定退出。然后执行:service xinetd restart即可。
3、到/etc/pam.d/目录下,把rsh文件中的auth required/lib/security/pam_securetty.so一行用“#
rsh是什么意思
rsh是远程外壳(remote shell)的缩写(外壳是操作系统的一种命令接口)。
一、rsh的简介
运行于远程计算机上的rshd后台程序,接收rsh命令,验证用户名和主机名信息,并执行该命令。当用户不愿或不需要与远程计算机建立远程会话时,可以使用rsh工具执行输入的命令。
rsh工具允许用户在远程计算机上执行单条命令,而无需在该远程计算机上进行登录。在运行RSH服务的远程计算机上运行命令。Windows XP和Windows 2000不提供RSH服务。
Windows 2000 Server Resource Kit提供名为 Rshsvc.exe的RSH服务。使用不带参数的rsh显示帮助。
二、rsh的格式
一般格式:rsh [-Kdnx] [-k realm] [-l username] host [command]
一般常用格式:rsh host [command]
三、rsh的参数
1、Host指定运行 command的远程计算机。
2、-l UserName指定远程计算机上使用的用户名。在省略情况下,使用当前登录用户的名称。
3、-n将 rsh的输入重定向到 NULL设备。这防止本地计算机命令结果的显示。
4、Command指定要运行的命令。
5、在命令提示符显示帮助。
rsh的配置过程
一、安装前准备
1、主机ahost ip 192.168.200.123
配置其/etc/hosts文件
配置其/etc/sysconfig/network
2、主机bhost ip 192.168.200.200
配置其/etc/hosts文件
配置其/etc/sysconfig/network
二、是否安装rsh包
[root@ahost]# rpm-aq|grep rsh
安装包1:rsh-0.17-14
安装包2:rsh-server-0.17-14
安装包3:rpm-ivh rsh-0.17-5(linux操作系统)
安装包4:rpm-ivh rsh-server-0.17-5(linux操作系统)
三、是否启动rsh服务
1、方法一:使用命令setup,查看service是否将[*] rsh加上*,如果加上*表示可以启动。
/etc/rc.d/init.d/xinetd restart或者service xinetd restart
2、方法二:rsh属于xinetd服务,可以直接修改/etc/xinetd.d/rsh脚本文件。
service shell,{disable= no,socket_type= stream,wait= no,user= root,log_on_success+= USERID,log_on_failure+= USERID,server=/usr/sbin/in.rshd}。
3、检查是否启动:rsh server监听和TCP是514。
[root@mg04 root]# netstat-an|grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
4、如果能看到514在监听说明服务器已经启动。
四、配置rsh server
1、修改/etc/securetty文件: echo rsh>etc/securetty或者 echo"rsh">etc/securetty都可以。
2、先用root登录到机器ahost中进行以下操作:cd~echo"192.168.200.200 root">rhosts允许192.168.200.200以root访问,主要作用是使得bhost来的主机可以不用输入用户名和密码就可以登录。
3、重启rsh server.
五、测试和注意
登录到bhost机器进行测试: rsh-l root ahost ps-ef,看是否能看到结果。
Linux中rsh远程shell命令的使用技巧解析
rsh有两种使用模式:
rsh$host:远程登录,启动交互式进程。
rsh$host$command:远程执行命令,并显示输出。
rsh hosthostcommand
rsh$host$command的作用是:
1.在远程机器上执行命令$command
2.通过网络连接(socket)重定向当前进程和远端进程的标准输入和标准输出
3.远端rsh进程在远端进程结束后结束
4.本地rsh进程读取远端进程的标准输出直到结束(EOF)
深刻理解这个执行过程有助于理解各种“奇怪”的现象和用法。
代码如下:
+ Suspended(tty input)
$ rsh localhost infinite-loop
[1]+ Suspended(tty input) rsh pv007 infinite-loop
$ rsh-n localhost infinite-loop
#执行正常
后台执行rsh命令时,提示了和标准输入相关的错误信息。这是因为rsh默认会把当前窗口的标准输入重定向到远端进程。
而本地rsh进程作为后台程序运行的话,标准输入被“阻塞”了。
通过-n选项制定不需要重定向标准输入(stdin)。
远端进程的执行
执行命令
代码如下:
rsh somehost infinite-loop
在远端机器上查看相关进程:
代码如下:
$ pstree-a-p 3353
in.rshd,3353
└─csh,3363-c infinite-loop
└─infinite-loop,3632/u/szhang/bin/infinite-loop
可以看出,远端机器上的rshd进程负责启动远端进程。而且可以看出是通过csh-c的方式启动的(这里用户的默认Shell是C Shell)。
远端进程的标准IO
检查远端进程的文件描述符:
代码如下:
$ ls-l/proc/3363/fd/proc/3632/fd
/proc/3363/fd:
total 0
lrwx------. 1 Jul 30 23:47 16- socket:[1184748899]
lrwx------. 1 Jul 30 23:47 17- socket:[1184748899]
l-wx------. 1 Jul 30 23:47 18- pipe:[1184749092]
lrwx------. 1 Jul 30 23:47 19- socket:[1184748899]
代码如下:
/proc/3632/fd:
total 0
lrwx------. 1 Jul 30 23:47 0- socket:[1184748899]
lrwx------. 1 Jul 30 23:47 1- socket:[1184748899]
l-wx------. 1 Jul 30 23:47 2- pipe:[1184749092]
可以看出远端里程的标准输入输出是被重定向到socket上的:
1.stdin和 stdout共享一个socket连接
2.stderr则通过一个pipe重定向(重定向到stdout???)
3.rsh的返回值
rsh程序自身的返回值表明的是rsh自身的运行状况,而不是远端进程的返回值。
获得远端进程的返回值
代码如下:
#远端是C Shell
$ rsh$host"$command; echo$status"
代码如下:
#远端是Bash Shell
$ rsh$host"$command; echo$?"
代码如下:
#远端Shell类型不确定
$ rsh$host"sh-c'$command; echo$?'"
启动远端进程所用的Shell
由于用于启动远端进程的Shell类型是未知的,而有些操作的语法在不同Shell里是不同的。
比如输入输出重定向、命令返回值等。
解决该问题的方法之一是通过明确指定的Shell来启动真正需要的里程。比如:
代码如下:
#不确定远端Shell的类型,显式通过Bash Shell来启动需要的进程
$ rsh-n$host"sh-c'$command/dev/null 21'"
另一种思路,则是通过一个wrapper程序来启动真正的命令。
通过rsh在远端执行后台进程
想在远端机器上执行后台进程。命令rsh$host"$command"是不起作用的,会导致本地的rsh进程不能结束。
背后的原因应该是,$command的标准输入输出通常仍然绑定在rsh连接的socket上,从而导致本地的rsh进程无法读取到文件结束符EOF。
知道了原因就知道该怎么办了,关键是关闭后台进程续定在rsh连接上的标准输入输出。
代码如下:
#如果远端Shell是C Shell
$ rsh-n$host"$command/dev/null"
代码如下:
#如果远端Shell是Bash Shell
$ rsh-n$host"$command/dev/null 21"
代码如下:
#不确定远端Shell的类型
$ rsh-n$host"sh-c'$command/dev/null 21'"
但上面这样重定向的办法有个缺点是不能得到任何远端进程的输出,而有时我们希望获得一些输出信息。
这时就需要远端进程能够以守护进程(daemon)的方式运行。
这种情况下,rsh命令可以简单地写作:$ rsh-n$host"$command"
远端后台进程的内容用Tcl表示,大意如下:
代码如下:
#/bin/env tclsh
puts"I am a background job"
puts"This Can Be Seen by Remote rsh Process"
close stdout
close stderr
# rsh连接到此应该结束。
puts"This Can NOT Be Seen by Remote rsh Process"
更进就步,我们可以甚至忽略rsh命令中的后台运行符:$ rsh-n$host"$command"
这时远端进程需要通过fork的方式结束自己,并启动真正的后台进程(守护进程)。
rsh进程的阻塞和超时处理
在程序中调用rsh$host$command时可能由于各种奇怪的原因发生rsh进程的阻塞,这不是我们希望看到的。
我们希望设置一个超时(timeout)机制来解决这个问题。
在Tcl程序中的一种实现可以这样: TODO
TCP Connection连接数过多引起的rsh失败
监控邮件显示rsh$host$command命令失败,错误提示为“poll: protocol failure in circuit setup"
怀疑是网络连接数过多所引起。
rsh$host$command的网络连接过程
命令rsh$host连接远程主机的513端口。
命令rsh$host$command则连接远程主机的514端口,并随后发送一个本地端口号给远程主机,要求远程主机建立一个新的TCP连接到这个端口(还不清楚这个新的连接有什么作用)。然后才是传送命令和等待命令结束。
这样做的结果就是在rsh$host$command进程过多时,本地开放的端口资源被消耗完了,从而导致新的rsh$host$command失败。
这是rsh$host的使用则依然正常。
这里提到的rsh的缺陷,也是建议尽量使用ssh的原因之一。
没有完全关闭的网络连接:
在远程主机上kill掉相关的rsh进程后,会导致TCP连接没有完全关闭。
netstat命令显示CLOSE_WAIT状态,端口资源并没有释放出来。
根据配置文件/proc/sys/net/ipv4/tcp_keepalive_time显示,需要等待2个小时,那些端口才会因为超时而被真正关闭,从而释放出来。
代码如下:
% netstat-a| grep localhost
tcp 0 0 localhost:933 localhost:935 CLOSE_WAIT
% cat/proc/sys/net/ipv4/tcp_keepalive_time
7200;# in seconds.= 2 hours
% echo"net.ipv4.tcp_keepalive_time= 120"/etc/sysctl.con