专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

Linux中rsh远程shell命令的使用技巧解析

来源:小易整编  作者:小易  发布时间:2023-09-04 03:24
摘要:  rsh有两种使用模式:  rsh$host:远程登录,启动交互式进程。  rsh$host$command:远程执行命令,并显示输出。  rshhosthostcommand  rsh$host$command的作用是...

  rsh有两种使用模式:

Linux中rsh远程shell命令的使用技巧解析

  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


本文地址:网络知识频道 https://www.hkm168.com/jiqiao/1049505.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


网络知识
小编:小易整编
相关文章相关阅读
  • html如何解析%%

    html如何解析%%

    html是一种用于创建网页结构的标记语言,它提供了一种方式来标记文本、图像、链接以及其他与网站相关的内容。html可以在网页中插入各种元素,包括表格、列表、图像、表格等等。本文将讨论html的解析过程以及如何编写有效的html代码。HTML...

  • 什么是Linux系统中nc命令?nc命令的用法详解

    什么是Linux系统中nc命令?nc命令的用法详解

    这篇文章主要介绍了linux系统中nc命令的基本用法,nc命令非常之强大,这里先简单介绍它用来作端口扫描以及文件传输等的基础使用。功能说明:功能强大的网络工具,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小...

  • cmd命令怎么打开?

    cmd命令怎么打开?

    cmd命令的打开方法:1、在电脑桌面中使用“win+r”组合键,打开的“运行”窗口,输入“cmd”命令并回车即可打开;2、打开“开始”菜单,在搜索框中输入“cmd”,点击“cmd.exe”即可打开。CMD一般指命令提示符,命令提示符是在操作...

  • linux怎么判断pcre是否安装

    linux怎么判断pcre是否安装

    在linux中,可以利用“rpm-qapcre”命令判断pcre是否安装;rpm命令专门用于管理各项套件,使用该命令后,若结果中出现pcre的版本信息,则表示pcre已经安装,若没有出现版本信息,则表示没有安装pcre。本教程操作环境:...

  • 如何解决 Windows 7 远程桌面出现黑屏的问题:11 种方法

    如何解决 Windows 7 远程桌面出现黑屏的问题:11 种方法

    远程桌面连接(rdc)是专业版和企业版windows上的一项有用功能,允许用户远程连接到另一台计算机,而无需其他软件。但是windows11远程桌面上的黑屏可能会毁掉这一切。黑屏问题是用户遇到的最常见问题之一。你想知道为什么屏...

  • linux中lib指的是什么

    linux中lib指的是什么

    在linux中,lib是库文件目录,包含了所有对系统有用的库文件;库文件是应用程序、命令或进程正确执行所需要的文件。几乎所有的应用程序都需要使用位于lib目录中的共享库文件,lib的功能类似于Windows中的DLL文件。lib是Lib...

  • linux umask是什么

    linux umask是什么

    umask是linux中的一个命令,用于为用户文件创建权限掩码,语法“umask[-s][权限掩码]”;其中,“权限掩码”是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。本教程操作环境:linux...

  • linux命令ls是什么意思

    linux命令ls是什么意思

    在linux中,ls全称“list”,中文意思为“列表”,其主要功能是显示指定工作目录下的内容(列出工作目录所含之文件及子目录),也可以查看文件权限,语法“ls[选项]目录名称”。当ls命令不使用任何选项时,默认只会显示非隐藏文件的名称...

  • 周排行
  • 月排行
  • 年排行

精彩推荐