溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux中rsh遠(yuǎn)程shell命令的使用技巧

發(fā)布時(shí)間:2021-09-15 15:37:36 來(lái)源:億速云 閱讀:297 作者:chen 欄目:系統(tǒng)運(yùn)維

本篇內(nèi)容主要講解“Linux中rsh遠(yuǎn)程shell命令的使用技巧”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Linux中rsh遠(yuǎn)程shell命令的使用技巧”吧!

rsh有兩種使用模式:

rsh $host : 遠(yuǎn)程登錄,啟動(dòng)交互式進(jìn)程。
rsh $host $command :遠(yuǎn)程執(zhí)行命令,并顯示輸出。

rsh hosthostcommand

rsh $host $command的作用是:

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

代碼如下:


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


后臺(tái)執(zhí)行rsh命令時(shí),提示了和標(biāo)準(zhǔn)輸入相關(guān)的錯(cuò)誤信息。這是因?yàn)閞sh默認(rèn)會(huì)把當(dāng)前窗口的標(biāo)準(zhǔn)輸入重定向到遠(yuǎn)端進(jìn)程。
而本地rsh進(jìn)程作為后臺(tái)程序運(yùn)行的話,標(biāo)準(zhǔn)輸入被“阻塞”了。

通過(guò)-n選項(xiàng)制定不需要重定向標(biāo)準(zhǔn)輸入(stdin)。


遠(yuǎn)端進(jìn)程的執(zhí)行

執(zhí)行命令

代碼如下:

rsh somehost infinite-loop

在遠(yuǎn)端機(jī)器上查看相關(guān)進(jìn)程:

代碼如下:


$ pstree -a -p 3353
in.rshd,3353
 └─csh,3363 -c infinite-loop
     └─infinite-loop,3632 /u/szhang/bin/infinite-loop


可以看出,遠(yuǎn)端機(jī)器上的rshd進(jìn)程負(fù)責(zé)啟動(dòng)遠(yuǎn)端進(jìn)程。而且可以看出是通過(guò)csh -c的方式啟動(dòng)的(這里用戶的默認(rèn)Shell是C Shell)。

遠(yuǎn)端進(jìn)程的標(biāo)準(zhǔn)IO

檢查遠(yuǎn)端進(jìn)程的文件描述符:

代碼如下:


$ 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]


可以看出遠(yuǎn)端里程的標(biāo)準(zhǔn)輸入輸出是被重定向到socket上的:

1.stdin 和 stdout 共享一個(gè)socket連接
2.stderr 則通過(guò)一個(gè)pipe重定向(重定向到stdout ???)
3.rsh 的返回值

rsh程序自身的返回值表明的是rsh自身的運(yùn)行狀況,而不是遠(yuǎn)端進(jìn)程的返回值。

獲得遠(yuǎn)端進(jìn)程的返回值

代碼如下:


# 遠(yuǎn)端是C Shell
$ rsh $host "$command ; echo $status"

代碼如下:


# 遠(yuǎn)端是Bash Shell
$ rsh $host "$command ; echo $?"

代碼如下:


# 遠(yuǎn)端Shell類型不確定
$ rsh $host "sh -c '$command ; echo $?'"

啟動(dòng)遠(yuǎn)端進(jìn)程所用的Shell

由于用于啟動(dòng)遠(yuǎn)端進(jìn)程的Shell類型是未知的,而有些操作的語(yǔ)法在不同Shell里是不同的。

比如輸入輸出重定向、命令返回值等。

解決該問題的方法之一是通過(guò)明確指定的Shell來(lái)啟動(dòng)真正需要的里程。比如:

代碼如下:


# 不確定遠(yuǎn)端Shell的類型,顯式通過(guò)Bash Shell來(lái)啟動(dòng)需要的進(jìn)程
$ rsh -n $host "sh -c '$command > /dev/null 2>&1'"


另一種思路,則是通過(guò)一個(gè)wrapper程序來(lái)啟動(dòng)真正的命令。

通過(guò)rsh在遠(yuǎn)端執(zhí)行后臺(tái)進(jìn)程

想在遠(yuǎn)端機(jī)器上執(zhí)行后臺(tái)進(jìn)程。命令rsh $host "$command &"是不起作用的,會(huì)導(dǎo)致本地的rsh進(jìn)程不能結(jié)束。

背后的原因應(yīng)該是,$command的標(biāo)準(zhǔn)輸入輸出通常仍然綁定在rsh連接的socket上,從而導(dǎo)致本地的rsh進(jìn)程無(wú)法讀取到文件結(jié)束符EOF。

知道了原因就知道該怎么辦了,關(guān)鍵是關(guān)閉后臺(tái)進(jìn)程續(xù)定在rsh連接上的標(biāo)準(zhǔn)輸入輸出。

代碼如下:


# 如果遠(yuǎn)端Shell是C Shell
$ rsh -n $host "$command >& /dev/null &"

代碼如下:


# 如果遠(yuǎn)端Shell是Bash Shell
$ rsh -n $host "$command > /dev/null 2>&1 &"

代碼如下:


# 不確定遠(yuǎn)端Shell的類型
$ rsh -n $host "sh -c '$command > /dev/null 2>&1 &'"


但上面這樣重定向的辦法有個(gè)缺點(diǎn)是不能得到任何遠(yuǎn)端進(jìn)程的輸出,而有時(shí)我們希望獲得一些輸出信息。
這時(shí)就需要遠(yuǎn)端進(jìn)程能夠以守護(hù)進(jìn)程(daemon)的方式運(yùn)行。

這種情況下,rsh命令可以簡(jiǎn)單地寫作:$ rsh -n $host "$command &"

遠(yuǎn)端后臺(tái)進(jìn)程的內(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連接到此應(yīng)該結(jié)束。


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

這時(shí)遠(yuǎn)端進(jìn)程需要通過(guò)fork的方式結(jié)束自己,并啟動(dòng)真正的后臺(tái)進(jìn)程(守護(hù)進(jìn)程)。

rsh進(jìn)程的阻塞和超時(shí)處理

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

我們希望設(shè)置一個(gè)超時(shí)(timeout)機(jī)制來(lái)解決這個(gè)問題。

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


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

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

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

命令rsh $host連接遠(yuǎn)程主機(jī)的513端口。

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

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

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

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

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

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

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

根據(jù)配置文件/proc/sys/net/ipv4/tcp_keepalive_time顯示,需要等待2個(gè)小時(shí),那些端口才會(huì)因?yàn)槌瑫r(shí)而被真正關(guān)閉,從而釋放出來(lái)。

代碼如下:


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

到此,相信大家對(duì)“Linux中rsh遠(yuǎn)程shell命令的使用技巧”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI