通過 SSH 在遠(yuǎn)程 Linux 系統(tǒng)上執(zhí)行命令
有一天,我正在測(cè)試如何在 ??將文件或目錄復(fù)制到多個(gè)位置和系統(tǒng)時(shí)保持完整的文件權(quán)限??。當(dāng)我想檢查遠(yuǎn)程系統(tǒng)上的文件權(quán)限時(shí),我必須通過 SSH 登錄它并檢查屬性。從遠(yuǎn)程系統(tǒng)多次登錄和注銷的過程讓我有點(diǎn)煩,我想,如果我可以在遠(yuǎn)程 Linux 系統(tǒng)上通過 SSH 執(zhí)行命令就好了。
幸運(yùn)的是,在瀏覽了 ??ssh?
? 命令的手冊(cè)頁(yè)后,我找到了一個(gè)解決辦法。
如果你想知道如何本地運(yùn)行遠(yuǎn)程系統(tǒng)上運(yùn)行命令或腳本,而不登錄到遠(yuǎn)程系統(tǒng),下面的內(nèi)容會(huì)告訴你如何做。
1、通過 SSH 在遠(yuǎn)程 Linux 系統(tǒng)上執(zhí)行命令
從本地系統(tǒng)通過 SSH 在遠(yuǎn)程系統(tǒng)上運(yùn)行命令或腳本的典型方法是:
允許我給你們舉幾個(gè)例子:
1.1、通過 SSH 在遠(yuǎn)程系統(tǒng)上運(yùn)行單個(gè)命令
假設(shè)你想要 ??查找遠(yuǎn)程 Linux 系統(tǒng)的內(nèi)核詳細(xì)信息??。為此,只需運(yùn)行:
這里,
- ?
?sk?
? 是遠(yuǎn)程系統(tǒng)的用戶名, - ?
?192.168.225.22?
? 是遠(yuǎn)程系統(tǒng)的 IP 地址, - ?
?uname -a?
? 是我想在遠(yuǎn)程系統(tǒng)上運(yùn)行的命令。
示例輸出:
通過 SSH 在遠(yuǎn)程 Linux 系統(tǒng)上執(zhí)行命令
看到?jīng)]?我并沒有實(shí)際登錄到遠(yuǎn)程系統(tǒng),但通過 SSH 在遠(yuǎn)程系統(tǒng)上執(zhí)行了 ??uname?
? 命令,并在本地系統(tǒng)的終端上顯示了輸出。
你還可以像下面這樣用引號(hào)指定命令。
或者,
如果你已經(jīng) ??更改了 SSH 協(xié)議的默認(rèn)端口??,只需使用 ??-p?
? 參數(shù)指定它。
1.2、通過 SSH 在遠(yuǎn)程主機(jī)上執(zhí)行多個(gè)命令
你還可以在遠(yuǎn)程主機(jī)上運(yùn)行多個(gè)命令,方法是將它們放在引號(hào)中。
或者:
上面的命令將顯示我的 Ubuntu 服務(wù)器的內(nèi)核版本和發(fā)行版詳細(xì)信息。
示例輸出:
在 Linux 上通過 SSH 在遠(yuǎn)程主機(jī)上運(yùn)行多個(gè)命令
正如一位讀者在下面的評(píng)論部分提到的那樣,你應(yīng)該用引號(hào)指定多個(gè)命令。如果不使用引號(hào),第一個(gè)命令將在遠(yuǎn)程系統(tǒng)上執(zhí)行,第二個(gè)命令將僅在本地計(jì)算機(jī)上執(zhí)行。整個(gè)帶引號(hào)的命令將按預(yù)期在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行。
提示: 了解 ?
?&&?
? 和 ??;?
? 在命令中的區(qū)別:?
?&&?
? 操作符只有在第一個(gè)命令成功時(shí)才執(zhí)行第二個(gè)命令。示例:
sudo apt-get update && sudo apt-get upgrade
在上述示例中,如果第一個(gè)命令成功,才會(huì)執(zhí)行 ?
?sudo apt-get upgrade?
?。否則,它將不會(huì)運(yùn)行。?
?;?
? 操作符會(huì)執(zhí)行第二個(gè)命令,無論第一個(gè)命令是成功還是失敗。示例:
sudo apt-get update ; sudo apt-get upgrade
在上述示例中,即使第一個(gè)命令失敗,?
?sudo apt-get upgrade?
? 也會(huì)執(zhí)行。
1.3、通過 SSH 在遠(yuǎn)程機(jī)器上調(diào)用有 sudo 權(quán)限的命令
有些命令需要 ??sudo?
? 權(quán)限才能運(yùn)行。例如,以下命令將在我的遠(yuǎn)程系統(tǒng)上安裝 ??apache2?
?。
示例輸出:
通過 SSH 在遠(yuǎn)程機(jī)器上運(yùn)行有 Sudo 權(quán)限的命令
注意到了嗎?我在上面的命令中使用了 ??-t?
? 標(biāo)志,我們需要使用它來強(qiáng)制進(jìn)行偽終端分配。它用于在遠(yuǎn)程機(jī)器上執(zhí)行任意基于屏幕的程序,這非常有用。例如,在實(shí)現(xiàn)菜單服務(wù)時(shí)。
另外,我輸入了兩次密碼。第一次是遠(yuǎn)程用戶的密碼,以便從本地系統(tǒng)通過 SSH 訪問遠(yuǎn)程系統(tǒng),第二次是為了向遠(yuǎn)程用戶賦予 sudo 權(quán)限,以便安裝應(yīng)用程序(在本例中為 apache2)。
讓我們用以下命令檢查 Apache 服務(wù)是否正在運(yùn)行:
同樣的,我們可以通過 SSH 在本地系統(tǒng)上運(yùn)行遠(yuǎn)程系統(tǒng)上的任何命令或腳本。
1.4、通過 SSH 在遠(yuǎn)程系統(tǒng)上運(yùn)行本地腳本
讓我們?cè)诒镜叵到y(tǒng)上創(chuàng)建一個(gè)簡(jiǎn)單的腳本來顯示關(guān)于遠(yuǎn)程系統(tǒng)的發(fā)行版名稱、包管理和基本細(xì)節(jié)等。
添加以下行:
按下 ??ESC?
? 鍵,輸入 ??:wq?
? 保存退出。
現(xiàn)在,通過 SSH 命令在遠(yuǎn)程系統(tǒng)上運(yùn)行這個(gè)腳本:
示例輸出:
如果你沒有在上面的命令中指定 ??bash -s?
?,你將獲得遠(yuǎn)程系統(tǒng)的詳細(xì)信息,但偽終端不會(huì)被分配。
1.5、將遠(yuǎn)程主機(jī)的命令輸出保存到本地主機(jī)
如果你希望與支持團(tuán)隊(duì)或同事共享遠(yuǎn)程系統(tǒng)上運(yùn)行的命令輸出,那么這非常有用。
以下命令將通過 SSH 在遠(yuǎn)程系統(tǒng)運(yùn)行 ??du -ah?
?,并將輸出保存在本地系統(tǒng)的 ??diskusage.txt?
? 文件中。
然后,你可以通過使用 ??cat?
? 命令或文本編輯器查看 ??diskusage.txt?
? 文件來分析磁盤使用細(xì)節(jié)。
1.6、配置 SSH 密鑰認(rèn)證,避免輸入密碼
如果你經(jīng)常在遠(yuǎn)程系統(tǒng)上運(yùn)行命令,你可能需要配置基于 SSH 密鑰的身份驗(yàn)證,以便每次跳過密碼輸入。更多細(xì)節(jié)可以在以下鏈接中找到。
配置了基于 SSH 密鑰的認(rèn)證后,我們可以通過 SSH 在遠(yuǎn)程機(jī)器上執(zhí)行命令,從而不需要輸入密碼:
2、通過 sshpass 在遠(yuǎn)程機(jī)器上運(yùn)行命令
如果你不想配置基于 SSH 密鑰的身份驗(yàn)證,你可以使用 ??sshpass?
? 實(shí)用程序。
2.1、什么是 sshpass?
??sshpass?
? 是為使用鍵盤交互密碼身份驗(yàn)證模式運(yùn)行 ssh 而設(shè)計(jì)的,但它以非交互的方式。簡(jiǎn)單來說,??sshpass?
? 提供了非交互式的方式來驗(yàn)證 SSH 會(huì)話。
SSH 使用直接 TTY 訪問來確保密碼確實(shí)是由交互式鍵盤用戶發(fā)出的。??sshpass?
? 在一個(gè)專用 tty 中運(yùn)行 SSH,讓它誤以為從交互用戶那里獲得了密碼。
2.2、在 Linux 中安裝 sshpass
在許多 Linux 發(fā)行版的默認(rèn)倉(cāng)庫(kù)中都有 ??sshpass?
? 實(shí)用程序。例如,在 Debian、Ubuntu 及其衍生版本中,你可以使用下面的命令來安裝 ??sshpass?
?:
2.3、通過 SSH 和 sshpass 在遠(yuǎn)程機(jī)器上執(zhí)行命令
??sshpass?
? 可以通過參數(shù)接受密碼,或者通過環(huán)境變量讀取密碼,也可以從文本文件中讀取密碼。
警告: 所有這些方法都是 高度不安全的。所有系統(tǒng)用戶都可以通過 ??ps?
? 命令看到命令中的密碼。不建議在生產(chǎn)中使用這些方法。最好使用基于密鑰的身份驗(yàn)證。
讓我們看看每種方法的示例。
將密碼作為參數(shù)提供
將密碼作為參數(shù)提供,使用 ??-p?
? 選項(xiàng),如下所示:
示例輸出:
其中,
- ?
?-p ubuntu?
? - 提供遠(yuǎn)程系統(tǒng)的密碼。 - ?
?ostechnix@192.168.1.30?
? - 遠(yuǎn)程系統(tǒng)用戶名和地址。 - ?
?uname -a?
? - 要在遠(yuǎn)程計(jì)算機(jī)上執(zhí)行的命令。
示例輸出:
密碼作為環(huán)境變量提供
在這個(gè)方法中,我們聲明一個(gè)名為 ??SSHPASS?
? 的環(huán)境變量,用遠(yuǎn)程環(huán)境的密碼作為其值。然后我們使用 ??-e?
? 標(biāo)志,如下所示:
從文本文件中讀取密碼
使用 ??echo?
? 命令在文本文件中追加密碼:
現(xiàn)在,將密碼文件傳遞給帶有 ??-f?
? 標(biāo)志的 ??sshpass?
?,如下所示:
通過 SSH 和 sshpass 在遠(yuǎn)程機(jī)器上執(zhí)行命令
總結(jié)
在本教程中,我們學(xué)習(xí)了一些通過安全的網(wǎng)絡(luò)連接在遠(yuǎn)程計(jì)算機(jī)上調(diào)用命令或程序的方法。在所有的方法中,??sshpass?
? 方法是最不安全的,建議用戶避免在生產(chǎn)系統(tǒng)中使用它。