linux rsh用法,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 2>&1'"

另一种思路,则是通过一个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 2>&1 &"

复制代码代码如下:

# 不确定远端shell的类型

$ rsh -n $host "sh -c '$command > /dev/null 2>&1 &'"

但上面这样重定向的办法有个缺点是不能得到任何远端进程的输出,而有时我们希望获得一些输出信息。

这时就需要远端进程能够以守护进程(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LoadRunner监控Linux rstat协议允许网络上的用户获得同一网络上各机器的性能参数。 需要下载3个包: (1)rsh-0.17-14.i386.rpm (2)rsh-server-0.17-14.i386.rpm (3)rpc.rstatd-4.0.1.tar.gz 一、安装rsh 查看是否安装并卸载rsh [root@localhost /]# rpm –qa |grep rsh      --查看是否安装rsh [root@localhost /]# rpm –e + 版本号   --卸载该版本 安装rsh,rsh-server [root@localhost /]# rpm –ivh rsh-0.17-14.i386.rpm [root@localhost /]# rpm –ivh rsh-server-0.17-14.i386.rpm 二、安装rstatd 下载并安装rstatd,下载地址:http://sourceforge.net/projects/rstatd,上传至/usr/local 查看是否安装,一般来说Linux都没有安装 [root@localhost /]# find / -name rpc.rstatd 安装rstatd [root@localhost /]# tar -xzvf rpc.rstatd-4.0.1.tar.gz [root@localhost /]# cd rpc.rstatd-4.0.1 [root@localhost /]# ./configure [root@localhost /]# make [root@localhost /]# make install 三、安装完成后配置rstatd目标守护进程xinetd,配置文件于/etc/xinet.d目录下 修改/etc/xinetd.d目录下面的3个conf(rogin,rsh,rexec)的disable均设置为no [root@localhost /]# cd /etc/xinetd.d      --进入到/etc/xinetd.conf目录 [root@localhost /]# vi rlogin     --编辑disable=no,保存 [root@localhost /]# vi rsh  --编辑disable=no,保存 [root@localhost /]# vi rexec --编辑disable=no,保存 四、启动rpc.rstatd [root@localhost /]# rpc.rstatd --启动rpc.rstatd进程 [root@localhost /]# rpcinfo -p --执行此命令检查rpc服务的状态 如果未出现上图的rstatd说明没有安装成功,需要重复以上步骤。 到这为止,LR监控Linux必要的服务都已安装好了。 五、关闭防火墙 [root@localhost /]# service iptables stop 六、利用LR的Controller监控Linux资源 在Controller,将System Resource Graphs的Unix resources拖到右侧的资源监控区域。 鼠标右键选择Add Measurements,添加被监控Linux的IP地址x.x.x.x,选择需要监控的性能指标,确认。 七、遇到的问题 1. LoadRunner监控Linux资源时弹出如下错误: Monitor name :UNIX Resources. Cannot initialize the monitoring on 192.168.52.189. Error while creating the RPC client. Ensure that the machine can be connected and that it runs the rstat daemon (use rpcinfo utility for this
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值