请选择 进入手机版 | 继续访问电脑版

[LINUX] Linux中rsh长途 shell下令 的利用 技巧分析

[复制链接]
查看81 | 回复5 | 2021-9-4 23:21:03 | 显示全部楼层 |阅读模式

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 123457092 | 2021-9-25 06:22:54 | 显示全部楼层
哥回复的不是帖子,是寂寞!
回复

使用道具 举报

avatar 心素如菊棺 | 2021-10-18 20:30:09 | 显示全部楼层
什么狗屁帖子啊,admin楼主的语文是苍老师教的吗?
回复

使用道具 举报

avatar 梦的衣裳323 | 2021-10-18 23:37:34 | 显示全部楼层
论坛的人气越来越旺了!
回复

使用道具 举报

雷锋做好事不留名,都写在帖子里!
回复

使用道具 举报

admin楼主写的很经典!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则