SSH 遠程執行任務

SSH 是 Linux 下進行遠程鏈接的基本工具,可是若是僅僅用它來登陸那但是太浪費啦!SSH 命令但是完成遠程操做的神器啊,藉助它咱們能夠把不少的遠程操做自動化掉!下面就對 SSH 的遠程操做功能進行一個小小的總結。shell

遠程執行命令

若是咱們要查看一下某臺主機的磁盤使用狀況,是否是必需要登陸到目標主機上才能執行 df 命令呢?固然不是的,咱們可使用 ssh 命令在遠程的主機上執行 df 命令,而後直接把結果顯示出來。整個過程就像是在本地執行了一條命令同樣:bash

$ ssh nick@xxx.xxx.xxx.xxx "df -h"

那麼如何一次執行多條命令呢?其實也很簡單,使用分號把不一樣的命令隔起來就 OK 了:服務器

$ ssh nick@xxx.xxx.xxx.xxx "pwd; cat hello.txt"

第一條命令返回的結果: /home/nick
這說明用這種方式執行命令時的當前目錄就是登錄用戶的家目錄。
第二條命令返回 hello.txt 文件的內容。
注意,當命令多於一個時最好用引號括起來,不然在有的系統中除了第一個命令,其它都是在本地執行的。ssh

執行須要交互的命令

有時候咱們須要遠程執行一些有交互操做的命令。工具

$ ssh nick@xxx.xxx.xxx.xxx "sudo ls /root"
$ ssh nick@xxx.xxx.xxx.xxx "top"

這兩條命令雖然提示的失敗緣由不一樣,但它們有一個共同點:都須要與用戶交互(須要 TTY)。因此它們失敗的緣由也是相同的:
默認狀況下,當你執行不帶命令的 ssh 鏈接時,會爲你分配一個 TTY。由於此時你應該是想要運行一個 shell 會話。
可是當你經過 ssh 在遠程主機上執行命令時,並不會爲這個遠程會話分配 TTY。此時 ssh 會當即退出遠程主機,因此須要交互的命令也隨之結束。
好在咱們能夠經過 -t 參數顯式的告訴 ssh,咱們須要一個 TTY 遠程 shell 進行交互!
添加 -t 參數後,ssh 會保持登陸狀態,直到你退出須要交互的命令。spa

做爲總結,咱們看看 -t 參數的官方解釋:
"Force pseudo-terminal allocation.  This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services.  Multiple -t options force tty allocation, even if ssh has no local tty."
好吧,更強悍的是咱們竟然能夠指定多個 -t 參數!3d

執行多行的命令

有時候咱們可能須要隨手寫幾行簡單的邏輯,這也沒有問題,ssh 能輕鬆搞定!code

你能夠用單引號或雙引號開頭,而後寫上幾行命令,最後再用相同的引號來結束。
那麼若是須要在命令中使用引號該怎麼辦?
其實針對相似的狀況有一條比較通用的規則,就是混合使用單雙引號。這條規則在這裏也是適用的:blog

當咱們在命令中引用了變量時會怎麼樣呢?ip

請注意上圖中的最後一行,並無輸出咱們指望的 nick。這裏多少有些詭異,由於若是變量沒有被解釋的話,輸出的應該是 $name 纔對。可是這裏卻什麼都沒有輸出。
對於引用變量的寫法,能夠經過下面的方式保證變量被正確解釋:

注意,咱們在上圖的命令中爲 bash 指定了 -c 參數。

遠程執行腳本

對於要完成一些複雜功能的場景,若是是僅僅能執行幾個命令的話,簡直是弱爆了。咱們可能須要寫長篇累牘的 shell 腳本去完成某項使命!此時 SSH 依然是不辱使命的好幫手(哈哈,前面的內容僅僅是開胃菜啊!)。

執行本地的腳本

咱們在本地建立一個腳本文件 test.sh,內容爲:

ls
pwd

而後運行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx < test.sh

經過重定向 stdin,本地的腳本 test.sh 在遠程服務器上被執行。

接下來咱們我指望能爲腳本 test.sh 傳遞一個參數,爲了驗證傳入的參數,在 test.sh 文件的末尾添加兩行:

echo $0
echo $1

而後嘗試執行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx < test.sh helloworld
$ ssh nick@xxx.xxx.xxx.xxx < "test.sh helloworld"

下圖顯示了執行的結果:

看來上面的方法都沒法爲腳本傳遞參數。
要想在這種狀況下(遠程執行本地的腳本)執行帶有參數的腳本,須要爲 bash 指定 -s 參數:

$ ssh nick@xxx.xxx.xxx.xxx 'bash -s' < test.sh helloworld

在上圖的最後兩行,輸出的是 "bash" 和 "helloworld" 分別對應 $0 和 $1。

執行遠程服務器上的腳本

除了執行本地的腳本,還有一種狀況是腳本文件存放在遠程服務器上,而咱們須要遠程的執行它!
此時在遠程服務器上用戶 nick 的家目錄中有一個腳本 test.sh。文件的內容以下:

ls
pwd

執行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx "/home/nick/test.sh"

注意,此時須要指定腳本的絕對路徑!

下面咱們也嘗試爲腳本傳遞參數。在遠程主機上的 test.sh 文件的末尾添加兩行:

echo $0
echo $1

而後嘗試執行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx /home/nick/test.sh helloworld

真棒,最後兩行 "/home/nick/test.sh" 和 "helloworld" 分別對應 $0 和 $1。

總結

本文經過 demo 演示了 ssh 遠程操做的基本方式。這些基本用法將爲咱們在更復雜的場景中完成各類艱鉅的任務打下基礎。

相關文章
相關標籤/搜索