最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

非是非   發(fā)布時間:2016-03-11 10:57:56   作者:風行水上   我要評論
這篇文章主要介紹了Linux中rsh遠程shell命令的使用技巧解析,包括一些rsh由于進程和連接數(shù)等方面問題造成的操作失敗的解決方法,需要的朋友可以參考下

rsh有兩種使用模式:

rsh $host : 遠程登錄,啟動交互式進程。
rsh $host $command :遠程執(zhí)行命令,并顯示輸出。

rsh hosthostcommand

rsh $host $command的作用是:

1.在遠程機器上執(zhí)行命令$command
2.通過網(wǎng)絡連接(socket)重定向當前進程和遠端進程的標準輸入和標準輸出
3.遠端rsh進程在遠端進程結(jié)束后結(jié)束
4.本地rsh進程讀取遠端進程的標準輸出直到結(jié)束(EOF)
深刻理解這個執(zhí)行過程有助于理解各種“奇怪”的現(xiàn)象和用法。

復制代碼
代碼如下:

+ Suspended (tty input)
$ rsh localhost infinite-loop &
[1] + Suspended (tty input) rsh pv007 infinite-loop
$ rsh -n localhost infinite-loop &
# 執(zhí)行正常

后臺執(zhí)行rsh命令時,提示了和標準輸入相關(guān)的錯誤信息。這是因為rsh默認會把當前窗口的標準輸入重定向到遠端進程。
而本地rsh進程作為后臺程序運行的話,標準輸入被“阻塞”了。

通過-n選項制定不需要重定向標準輸入(stdin)。


遠端進程的執(zhí)行

執(zhí)行命令

復制代碼
代碼如下:
rsh somehost infinite-loop

在遠端機器上查看相關(guān)進程:

復制代碼
代碼如下:

$ 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在遠端執(zhí)行后臺進程

想在遠端機器上執(zhí)行后臺進程。命令rsh $host "$command &"是不起作用的,會導致本地的rsh進程不能結(jié)束。

背后的原因應該是,$command的標準輸入輸出通常仍然綁定在rsh連接的socket上,從而導致本地的rsh進程無法讀取到文件結(jié)束符EOF。

知道了原因就知道該怎么辦了,關(guān)鍵是關(guān)閉后臺進程續(xù)定在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 &"

遠端后臺進程的內(nèi)容用Tcl表示,大意如下:

復制代碼
代碼如下:

#/bin/env tclsh
puts "I am a background job"
puts "This Can Be Seen by Remote rsh Process"
close stdout
close stderr
# rsh連接到此應該結(jié)束。

puts "This Can NOT Be Seen by Remote rsh Process"
更進就步,我們可以甚至忽略rsh命令中的后臺運行符:$ rsh -n $host "$command"

這時遠端進程需要通過fork的方式結(jié)束自己,并啟動真正的后臺進程(守護進程)。

rsh進程的阻塞和超時處理

在程序中調(diào)用rsh $host $command時可能由于各種奇怪的原因發(fā)生rsh進程的阻塞,這不是我們希望看到的。

我們希望設置一個超時(timeout)機制來解決這個問題。

在Tcl程序中的一種實現(xiàn)可以這樣: TODO


TCP Connection連接數(shù)過多引起的rsh失敗
監(jiān)控郵件顯示rsh $host $command命令失敗,錯誤提示為“poll: protocol failure in circuit setup"

懷疑是網(wǎng)絡連接數(shù)過多所引起。

rsh $host $command 的網(wǎng)絡連接過程

命令rsh $host連接遠程主機的513端口。

命令rsh $host $command則連接遠程主機的514端口,并隨后發(fā)送一個本地端口號給遠程主機,要求遠程主機建立一個新的TCP連接到這個端口(還不清楚這個新的連接有什么作用)。然后才是傳送命令和等待命令結(jié)束。

這樣做的結(jié)果就是在rsh $host $command進程過多時,本地開放的端口資源被消耗完了,從而導致新的rsh $host $command失敗。

這是rsh $host的使用則依然正常。

這里提到的rsh的缺陷,也是建議盡量使用ssh的原因之一。

沒有完全關(guān)閉的網(wǎng)絡連接:

在遠程主機上kill掉相關(guān)的rsh進程后,會導致TCP連接沒有完全關(guān)閉。

netstat命令顯示CLOSE_WAIT狀態(tài),端口資源并沒有釋放出來。

根據(jù)配置文件/proc/sys/net/ipv4/tcp_keepalive_time顯示,需要等待2個小時,那些端口才會因為超時而被真正關(guān)閉,從而釋放出來。

復制代碼
代碼如下:

%> 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

相關(guān)文章

  • 管理用SSH遠程登錄Linux服務器的用戶的權(quán)限

    這篇文章主要介紹了管理用SSH遠程登錄Linux服務器的用戶的權(quán)限,包括維護安全時禁止登錄等方法,需要的朋友可以參考下
    2015-07-03
  • LINUX怎么利用遠程管理命令進行關(guān)機和重啟?

    LINUX怎么利用遠程管理命令進行關(guān)機和重啟?LINUX系統(tǒng)想要關(guān)機重啟,方法很多,今天我們就來看看遠程管理命令進行關(guān)機重啟的教程,需要的朋友可以參考下
    2018-11-19
  • 詳解Linux下常用遠程登陸命令telnet和rlogin的用法

    這篇文章主要介紹了詳解Linux下常用遠程登陸命令telnet和rlogin的用法,是Linux工作環(huán)境與生產(chǎn)環(huán)境連接使用中的基礎,需要的朋友可以參考下
    2016-01-19
  • linux文件夾怎么與遠程系統(tǒng)同步?

    linux文件夾怎么與遠程系統(tǒng)同步?linux系統(tǒng)中的文件夾想要與遠程的系統(tǒng)進行同步,該怎么操作額?下面我們就來看看詳細的教程,需要的朋友可以參考下
    2019-03-14
  • deepin20終端遠程管理服務器的方法

    deepin20終端怎么遠程管理服務?deepin20終端界面提供ssh遠程管理服務器的功能,該怎么使用呢?下面我們就來看看詳細的教程,需要的朋友可以參考下
    2021-01-15
  • Linux遠程管理及權(quán)限命令詳解

    這篇文章主要為大家介紹了Linux遠程管理及權(quán)限的命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-12

最新評論

郴州市| 永城市| 齐河县| 博爱县| 丹棱县| 苍山县| 锡林郭勒盟| 惠安县| 明星| 永定县| 五大连池市| 巢湖市| 左云县| 盖州市| 双流县| 酉阳| 莱阳市| 长沙县| 扶风县| 武定县| 车致| 治县。| 和顺县| 乌拉特后旗| 金川县| 屏山县| 兴国县| 根河市| 民乐县| 凤山县| 什邡市| 抚顺县| 徐水县| 博湖县| 宁夏| 天镇县| 五家渠市| 保亭| 孝感市| 和林格尔县| 昌黎县|