Unix遠程命令調(diào)用的實現(xiàn)
計算機網(wǎng)絡的發(fā)展雖然十分迅速,但當前網(wǎng)絡資源利用率卻比較低。網(wǎng)絡中相同資源的重復安裝和配置增加了許多不必要的運營成本,如何有效地利用網(wǎng)絡中有限的資源實現(xiàn)協(xié)同工作是十分現(xiàn)實的問題。本文介紹一種Unix系統(tǒng)遠程命令調(diào)用機制,它不是常規(guī)意義上的telnet功能,而是一種更為快捷方便的利用NFS協(xié)議建立起來的on命令操作,并在此基礎上實現(xiàn)了豐富的遠程控制功能,可廣泛地應用于局域網(wǎng)和廣域網(wǎng)。
系統(tǒng)要求
● 客戶端和遠程系統(tǒng)需同時運行Unix系統(tǒng),HP-UX、Sun Solaris等均可;
● 客戶端設置為NFS服務器,遠程系統(tǒng)設置為NFS客戶機,這樣可將客戶端環(huán)境及工作目錄仿真到遠程系統(tǒng),利用遠程系統(tǒng)豐富的資源,執(zhí)行命令并將結(jié)果返回到客戶端;
● 通過inetd服務進程在遠程系統(tǒng)配置好rexd服務,通過RPC(Remote Process Control),響應客戶端運行的on命令遠程調(diào)用請求;
● 實現(xiàn)遠程調(diào)用的用戶要在兩端系統(tǒng)中擁有相同的UserID和GroupID;
● 客戶端只能以普通用戶而非超級用戶(root)執(zhí)行on命令操作;
● 在利用該機制進行軟件開發(fā)時,兩端操作系統(tǒng)版本號要保持一致,否則會導致生成的二進制代碼不兼容的問題。
實現(xiàn)原理
用戶在客戶端本地執(zhí)行“on host command”實現(xiàn)在遠程主機上進行命令調(diào)用的功能。遠程主機收到on命令調(diào)用請求后自動由inetd服務進程啟動rexd進程。如果請求包中附帶的UserID在遠程主機中存在,則以該用戶執(zhí)行相應命令,否則出錯退出。
命令執(zhí)行期間rexd自動將客戶端工作環(huán)境仿真到遠程系統(tǒng)上,并通過NFS協(xié)議自動將其工作目錄臨時掛接到遠程系統(tǒng)的特定目錄下。命令執(zhí)行完畢輸出結(jié)果返回到客戶端后,用戶工作目錄自動卸載,rexd進程也自動退出。所有這一切后臺操作對用戶而言都是透明的。
設置步驟
本文以HP-UX 10.20為例介紹遠程調(diào)用的具體實現(xiàn)過程(在其他Unix系統(tǒng)上,如SCO OpenServer上同樣調(diào)試通過)。以下配置均需超級用戶(root)執(zhí)行。
1.遠程系統(tǒng)
設置并啟動NFS客戶機 :
# vi /etc/rc.config.d/nfs.conf
nfs.clIEnt=1
# /sbin/init.d/nfs.client start
設置并啟動rexd后臺服務程序,自動響應客戶端遠程調(diào)用請求:
# vi /etc/inetd.conf
rpc stream tcp nowait root /usr/sbin/rpc.rexd 100017 1 rpc.rexd
# inetd -c
2.客戶端系統(tǒng)
設置并啟動NFS服務器:
# vi /etc/rc.config.d/nfs.conf
nfs.server=1
# /sbin/init.d/nfs.server start
假設遠程主機名為server,將本地資源授權(quán)給遠程系統(tǒng):
# vi /etc/exports
/ -root = server
# exportfs -ua
# exportfs -a
這樣一來,當遠程系統(tǒng)rpc.rexd收到客戶端on遠程調(diào)用請求時,自動檢查客戶端配置情況,如授權(quán)許可則通過NFS協(xié)議將客戶端用戶工作目錄自動掛接到 /usr/spool/rexd/rexdXXXXXX,其中XXXXXX是運行rexd的進程序列號。以上任何一個環(huán)節(jié)出錯都會導致遠程調(diào)用失敗并返回相應錯誤信息。
命令調(diào)用
on 命令只允許以普通用戶執(zhí)行,格式如下:
on [ -i | -n ] [ -d ] hostname [command]
例如:
on -i server
on server ls -l /home/yyf
其中:
● -i: 表示交互式操作;
● -n: 命令執(zhí)行期間無需輸入?yún)?shù);
● -d: 調(diào)試模式;
● hostname: 遠程主機名;
● command: 要執(zhí)行的命令,如果省略則進入一個交互式的shell提示符下,以后發(fā)送的每一個命令都將在遠程主機仿真的用戶工作目錄下執(zhí)行(如/var/spool/rexd/rexda00756/home/yyf)。
安全考慮
● 為最大限度地保護本地文件系統(tǒng),以防止非法存取,客戶端設置/etc/exports時應通過授權(quán)給確定的遠程主機普通用戶而非超級用戶操作,明確只能在指定的遠程主機上調(diào)用命令。如:
/home -rw = host1:host2
/usr -rw = host3
● 在遠程系統(tǒng)上編輯安全設置文件:
/var/adm/inetd.sec
僅限制在特定的客戶機上執(zhí)行on命令調(diào)用。
● 清理遠程系統(tǒng)中不必要的普通用戶,防止客戶端任意用戶執(zhí)行遠程命令調(diào)用。
● 在遠程系統(tǒng)上啟動rpc.rexd服務進程時帶上 -r 參數(shù),增強對客戶端系統(tǒng)的安全檢查,或帶上 -l logfile參數(shù)將每次遠程調(diào)用請求信息(包括診斷、警告、出錯等)記入特定日志文件,供管理員定期監(jiān)控分析。
