亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

Linux中rsh遠程shell命令的使用

添加時間:2016-3-20 18:49:43  添加: 思海網絡 
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

關鍵字:Linux、rsh、遠程、shell、命令
分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站