詳解SSH 遠(yuǎn)程執(zhí)行任務(wù)的方法
SSH 是 Linux 下進(jìn)行遠(yuǎn)程連接的基本工具,但是如果僅僅用它來(lái)登錄那可是太浪費(fèi)啦!SSH 命令可是完成遠(yuǎn)程操作的神器啊,借助它我們可以把很多的遠(yuǎn)程操作自動(dòng)化掉!下面就對(duì) SSH 的遠(yuǎn)程操作功能進(jìn)行一個(gè)小小的總結(jié)。
遠(yuǎn)程執(zhí)行命令
如果我們要查看一下某臺(tái)主機(jī)的磁盤(pán)使用情況,是不是必須要登錄到目標(biāo)主機(jī)上才能執(zhí)行 df 命令呢?當(dāng)然不是的,我們可以使用 ssh 命令在遠(yuǎn)程的主機(jī)上執(zhí)行 df 命令,然后直接把結(jié)果顯示出來(lái)。整個(gè)過(guò)程就像是在本地執(zhí)行了一條命令一樣:
$ ssh nick@xxx.xxx.xxx.xxx "df -h"
那么如何一次執(zhí)行多條命令呢?其實(shí)也很簡(jiǎn)單,使用分號(hào)把不同的命令隔起來(lái)就 OK 了:
$ ssh nick@xxx.xxx.xxx.xxx "pwd; cat hello.txt"
第一條命令返回的結(jié)果: /home/nick
這說(shuō)明用這種方式執(zhí)行命令時(shí)的當(dāng)前目錄就是登陸用戶(hù)的家目錄。
第二條命令返回 hello.txt 文件的內(nèi)容。
注意,當(dāng)命令多于一個(gè)時(shí)最好用引號(hào)括起來(lái),否則在有的系統(tǒng)中除了第一個(gè)命令,其它都是在本地執(zhí)行的。
執(zhí)行需要交互的命令
有時(shí)候我們需要遠(yuǎn)程執(zhí)行一些有交互操作的命令。
$ ssh nick@xxx.xxx.xxx.xxx "sudo ls /root" $ ssh nick@xxx.xxx.xxx.xxx "top"
這兩條命令雖然提示的失敗原因不同,但它們有一個(gè)共同點(diǎn):都需要與用戶(hù)交互(需要 TTY)。所以它們失敗的原因也是相同的:
默認(rèn)情況下,當(dāng)你執(zhí)行不帶命令的 ssh 連接時(shí),會(huì)為你分配一個(gè) TTY。因?yàn)榇藭r(shí)你應(yīng)該是想要運(yùn)行一個(gè) shell 會(huì)話。
但是當(dāng)你通過(guò) ssh 在遠(yuǎn)程主機(jī)上執(zhí)行命令時(shí),并不會(huì)為這個(gè)遠(yuǎn)程會(huì)話分配 TTY。此時(shí) ssh 會(huì)立即退出遠(yuǎn)程主機(jī),所以需要交互的命令也隨之結(jié)束。
好在我們可以通過(guò) -t 參數(shù)顯式的告訴 ssh,我們需要一個(gè) TTY 遠(yuǎn)程 shell 進(jìn)行交互!
添加 -t 參數(shù)后,ssh 會(huì)保持登錄狀態(tài),直到你退出需要交互的命令。
作為總結(jié),我們看看 -t 參數(shù)的官方解釋?zhuān)?br />
"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."
好吧,更強(qiáng)悍的是我們居然可以指定多個(gè) -t 參數(shù)!
執(zhí)行多行的命令
有時(shí)候我們可能需要隨手寫(xiě)幾行簡(jiǎn)單的邏輯,這也沒(méi)有問(wèn)題,ssh 能輕松搞定!
你可以用單引號(hào)或雙引號(hào)開(kāi)頭,然后寫(xiě)上幾行命令,最后再用相同的引號(hào)來(lái)結(jié)束。
那么如果需要在命令中使用引號(hào)該怎么辦?
其實(shí)針對(duì)類(lèi)似的情況有一條比較通用的規(guī)則,就是混合使用單雙引號(hào)。這條規(guī)則在這里也是適用的:
當(dāng)我們?cè)诿钪幸昧俗兞繒r(shí)會(huì)怎么樣呢?
請(qǐng)注意上圖中的最后一行,并沒(méi)有輸出我們期望的 nick。這里多少有些詭異,因?yàn)槿绻兞繘](méi)有被解釋的話,輸出的應(yīng)該是 $name 才對(duì)。但是這里卻什么都沒(méi)有輸出。
對(duì)于引用變量的寫(xiě)法,可以通過(guò)下面的方式保證變量被正確解釋?zhuān)?/p>
注意,我們?cè)谏蠄D的命令中為 bash 指定了 -c 參數(shù)。
遠(yuǎn)程執(zhí)行腳本
對(duì)于要完成一些復(fù)雜功能的場(chǎng)景,如果是僅僅能執(zhí)行幾個(gè)命令的話,簡(jiǎn)直是弱爆了。我們可能需要寫(xiě)長(zhǎng)篇累牘的 shell 腳本去完成某項(xiàng)使命!此時(shí) SSH 依然是不辱使命的好幫手(哈哈,前面的內(nèi)容僅僅是開(kāi)胃菜?。?。
執(zhí)行本地的腳本
我們?cè)诒镜貏?chuàng)建一個(gè)腳本文件 test.sh,內(nèi)容為:
ls pwd
然后運(yùn)行下面的命令:
$ ssh nick@xxx.xxx.xxx.xxx < test.sh
通過(guò)重定向 stdin,本地的腳本 test.sh 在遠(yuǎn)程服務(wù)器上被執(zhí)行。
接下來(lái)我們我期望能為腳本 test.sh 傳遞一個(gè)參數(shù),為了驗(yàn)證傳入的參數(shù),在 test.sh 文件的末尾添加兩行:
echo $0 echo $1
然后嘗試執(zhí)行下面的命令:
$ ssh nick@xxx.xxx.xxx.xxx < test.sh helloworld $ ssh nick@xxx.xxx.xxx.xxx < "test.sh helloworld"
下圖顯示了執(zhí)行的結(jié)果:
看來(lái)上面的方法都無(wú)法為腳本傳遞參數(shù)。
要想在這種情況下(遠(yuǎn)程執(zhí)行本地的腳本)執(zhí)行帶有參數(shù)的腳本,需要為 bash 指定 -s 參數(shù):
$ ssh nick@xxx.xxx.xxx.xxx 'bash -s' < test.sh helloworld
在上圖的最后兩行,輸出的是 "bash" 和 "helloworld" 分別對(duì)應(yīng) $0 和 $1。
執(zhí)行遠(yuǎn)程服務(wù)器上的腳本
除了執(zhí)行本地的腳本,還有一種情況是腳本文件存放在遠(yuǎn)程服務(wù)器上,而我們需要遠(yuǎn)程的執(zhí)行它!
此時(shí)在遠(yuǎn)程服務(wù)器上用戶(hù) nick 的家目錄中有一個(gè)腳本 test.sh。文件的內(nèi)容如下:
ls pwd
執(zhí)行下面的命令:
$ ssh nick@xxx.xxx.xxx.xxx "/home/nick/test.sh"
注意,此時(shí)需要指定腳本的絕對(duì)路徑!
下面我們也嘗試為腳本傳遞參數(shù)。在遠(yuǎn)程主機(jī)上的 test.sh 文件的末尾添加兩行:
echo $0 echo $1
然后嘗試執(zhí)行下面的命令:
$ ssh nick@xxx.xxx.xxx.xxx /home/nick/test.sh helloworld
真棒,最后兩行 "/home/nick/test.sh" 和 "helloworld" 分別對(duì)應(yīng) $0 和 $1。
總結(jié)
本文通過(guò) demo 演示了 ssh 遠(yuǎn)程操作的基本方式。這些基本用法將為我們?cè)诟鼜?fù)雜的場(chǎng)景中完成各種艱巨的任務(wù)打下基礎(chǔ)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ssh遠(yuǎn)程執(zhí)行命令方法和Shell腳本實(shí)例
- ssh(ssh-keygen)配置免輸入密碼登錄遠(yuǎn)程主機(jī)的方法
- 關(guān)于SSH 遠(yuǎn)程執(zhí)行命令你要知道的二三事
- SSH遠(yuǎn)程登錄和端口轉(zhuǎn)發(fā)詳解
- 詳解Ubuntu下ssh服務(wù)的安裝與登陸(ssh遠(yuǎn)程登陸)
- ssh遠(yuǎn)程登陸沒(méi)有用戶(hù)名和主機(jī)名的解決方法
- 解決ssh遠(yuǎn)程登陸linux顯示-bash-4.1$的問(wèn)題
- 遠(yuǎn)程SSH連接服務(wù)與基本排錯(cuò)經(jīng)驗(yàn)總結(jié)
相關(guān)文章
基于Ubuntu 16.04設(shè)置固定IP的方法教程
這篇文章主要給大家介紹了基于Ubuntu 16.04設(shè)置固定IP的方法教程,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10CentOS 7中Nginx日志定時(shí)拆分實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了CentOS 7中Nginx日志定時(shí)拆分實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Linux中對(duì)MySQL優(yōu)化實(shí)例詳解
這篇文章主要介紹了Linux中對(duì)MySQL優(yōu)化實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05linux服務(wù)器校對(duì)時(shí)間方法命令詳解
Linux中有個(gè)ntp包可以自動(dòng)校準(zhǔn)時(shí)間,并且非常好用,這篇文章主要介紹了linux服務(wù)器校對(duì)時(shí)間方法,需要的朋友可以參考下2022-08-08Linux 4.9內(nèi)核正式發(fā)布!來(lái)看看更新了什么?
Linus Torvalds 在 2016年12月11日發(fā)布了Linux內(nèi)核4.9的正式版本,這次主要帶來(lái)了一些新的功能和一些驅(qū)動(dòng)更新,當(dāng)然,還有一些底層的改進(jìn)。想要看看詳細(xì)的介紹,下面來(lái)通過(guò)這篇文章來(lái)一起看看吧。2016-12-12