1. 程式人生 > >Linux下使用SSH非互動式遠端執行命令指令碼

Linux下使用SSH非互動式遠端執行命令指令碼

原創文章,轉載請註明— 作者: 黃文海 出處: http://viscent.iteye.com/

http://blog.viscenthuang.info
     非互動式在遠端主機上執行命令或者指令碼可以幫助我們快速完成一些任務。比如,在叢集環境中,同時在各個結點上的日誌檔案中查詢特定的關鍵字。 
     通過SSH命令遠端執行命令首先需要建立相關主機間的信任關係。否則,在執行命令前SSH命令會提示你輸入遠端主機的密碼,這就產生了系統與人的互動,不利於指令碼的自動化。建立主機間信任關係的方法如下: 
假設我們有兩臺主機。主機名分別為linuxa和linuxb。首先在linuxa上以當前使用者執行如下命令生成本主機的公鑰和私鑰檔案: 

ssh-keygen -t rsa 
     上述命令執行後,隱藏目錄~/.ssh下會出現兩個檔案:id_rsa和id_rsa.pub。其中,id_rsa.pub為公鑰檔案。將該檔案的內容追加到對端主機linuxb上~/.ssh目錄下的authorized_keys檔案中。若該檔案不存在,可自行建立之。下面是一個id_rsa.pub檔案示例的檔案內容: 
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtbW/vKjrIkTfFjSJP9FyVb3kQStc31oBuiKVaCZzoejxSM2+ck6CB09l4BoFujpI0+omL4NptxkEAgkCGnMco2yXrVSOqhqyaQV2BnDPkyMoEq2MGB9hSc9xQKa+Q==
[email protected]
 


     接下來,就可以在不輸入密碼的情況下在遠端主機私執行命令了。命令格式如下: 
     ssh 遠端使用者名稱@遠端主機IP地址 ‘遠端命令或者指令碼’ 
     比如, 
    ssh [email protected] 'hostname' 
    上述命令執行後,終端輸出的是對端主機的主機名,而不是你當前登入的主機的主機名。說明hostname這個命令其實是在對端主機上執行的。 
    若要遠端執行指令碼,只需要將上面的命令的第三個引數改為要執行的遠端指令碼的檔名全稱即可。比如: 
    ssh [email protected]
'/home/userA/script/test.sh' 

    需要特別注意的是:當遠端指令碼中使用了一些命令,而這些命令被Shell解析器的識別依賴於PATH環境變數時,該指令碼需要在其第一行中包含執行profile檔案的命令。比如,在Bash中,該指令碼的第一行為: 
    source ~/.bashrc 
    否則,遠端指令碼可能報一些命令無法找到的錯誤。