如何在遠程 Linux 服務器上運行本地腳本

已發表: 2022-09-10
藍色背景上的筆記本電腦,顯示 Linux 命令行界面。
fatmawati achmad zaenuri/Shutterstock.com

編寫重複性任務的腳本提高了系統管理的效率。 這對本地機器來說很好,但是如果你監督遠程服務器呢? 您可以在遠程計算機上運行本地腳本嗎? 是的!

遠程連接

遠程系統管理通常涉及通過安全外殼連接與遠程計算機建立連接。 SSH 連接為您提供遠程計算機上的命令提示符。 然後,您可以繼續執行所需的任何系統維護。

Shell 腳本通過讓您將一系列命令包裝到可以像程序一樣運行的腳本中來提供幫助,將許多操作組合到一個命令行指令中。

隨著時間的推移,您將調整和改進您的腳本。 如果您有許多遠程機器要管理,那麼讓每台服務器上的每個腳本的副本保持最新和最新是一件痛苦的事情,而且是令人討厭的開銷。 它本身就變成了一項管理任務,並消耗了使用腳本應該提供的時間節省。

理想的解決方案是讓您將腳本保存在本地計算機上,並通過 SSH 連接在遠程計算機上運行它們。 這將使您通過集中的腳本集合簡化管理,並且在所有計算機上運行相同的最新腳本。

Bash 和 SSH 提供了一種方法來做到這一點。

無密碼 SSH 連接

最好的方法是使用 SSH 密鑰進行無密碼連接。 通過在本地計算機上生成 SSH 密鑰並將其發送到每台遠程計算機,您可以安全方便地連接到遠程計算機,而無需每次都提示輸入密碼。

如何從 Linux Shell 創建和安裝 SSH 密鑰
相關如何從 Linux Shell 創建和安裝 SSH 密鑰

儘管對於初次使用的用戶來說它們可能會令人生畏,但 SSH 密鑰確實並不難。 它們易於生成,易於安裝在遠程服務器上,並且在您將它們與 SSH 一起使用時不會發生摩擦。 唯一的先決條件是遠程計算機運行 SSH 守護程序sshd ,並且您在遠程計算機上有一個用戶帳戶。

如果您已經在對它們進行遠程系統管理,則必須已經滿足這兩個要求。

要生成 SSH 密鑰對,請鍵入:

 ssh-keygen

如果您在名為“fedora-36.local”的計算機上有一個名為“dave”的帳戶,您可以使用以下命令發送並安裝您的 SSH 公鑰:

 ssh-copy-id [email protected]

現在,以通常的方式建立 SSH 連接將使用 SSH 密鑰進行身份驗證。 您將進入遠程服務器上的命令提示符,而不會提示您輸入密碼。

 ssh [email protected]

遠程運行本地腳本

對於這些測試,我們的遠程服務器是一台名為“fedora-36.local”的 Linux 計算機。 我們已經設置了 SSH 密鑰,並測試了從本地計算機到遠程服務器的無密碼連接。

我們的腳本非常簡單。 它將時間戳寫入遠程服務器上名為“timestamp.txt”的文件中。 請注意,腳本以 exit 命令結束。 這很重要,在某些較舊的系統上,腳本可以運行完成,但 SSH 連接保持打開狀態。

 #!/bin/bash

日期>>時間戳.txt

出口 0

將此文本複製到編輯器中,將其保存為“local.sh”,然後使用chmod使其可執行。

 chmod +x local.sh 

使用 chmod 使腳本可執行

在我們的本地機器上,我們將像這樣啟動腳本:

 ssh [email protected] 'bash -s' < local.sh 

啟動本地腳本以通過 SSH 在遠程服務器上運行

這是它的工作原理。

  • ssh [email protected] :我們與遠程機器建立的 SSH 連接。 這使用ssh命令、遠程服務器上預先存在的用戶帳戶以及遠程服務器的地址。
  • 'bash -s' :這會導致 Bash 從標準輸入流中讀取命令。 它讓 Bash 讀取重定向或管道輸入。
  • < local.sh :我們將腳本重定向到 Bash。

當腳本運行時,我們將返回到本地機器的命令提示符。 跳到我們的遠程機器上,我們可以使用 cat 查看“timestamp.txt”文件的內部。

 貓時間戳.txt 

我們可以看到最後一個(也是目前唯一的)連接的時間戳。 多次運行本地腳本會為遠程文件添加相應的時間戳。

 貓時間戳.txt 

當然,在現實世界中,您的腳本會做一些更有用的事情。 但即使是我們的簡單示例也確實表明本地腳本正在遠程服務器上執行。

將參數傳遞給腳本

您可以將命令行參數傳遞給腳本。 我們將修改我們的腳本以期望三個命令行參數。 這些與時間戳一起被重定向到“timestamp.txt”文件中。

將此腳本另存為“local2.sh”,並使用chmod使其可執行。

 #!/bin/bash

echo "$1 $2 $3" >> timestamp.txt
日期>>時間戳.txt

出口 0

我們需要使用的命令與前面的示例類似,但有一些更改。

 ssh [email protected] "bash -s" -- < local2.sh "How-To\ Geek" "Linux" "Articles" 

使用命令行參數啟動本地腳本以通過 SSH 在遠程服務器上運行

雙連字符“ -- ”告訴 Bash,後面的內容不應被視為ssh命令的命令行參數。 像往常一樣,腳本的三個參數跟在腳本名稱後面。 請注意,我們使用反斜杠“ \ ”來轉義“How-To\ Geek”參數中的空格。

我們可以用cat檢查我們的參數是否在遠程服務器上正確接收和處理。

 貓時間戳.txt 

檢查腳本的參數是否在遠程服務器上正確接收和處理

遠程運行腳本的一部分

如果您有一個腳本需要進行一些本地處理以確定遠程服務器上可能需要哪些操作,您可以在該腳本中添加一個部分來為您執行遠程操作。

如何在 Linux 上的 Bash 中使用“這裡的文檔”
相關如何在 Linux 上的 Bash 中使用“這裡的文檔”

我們可以通過使用這裡的文檔來實現這一點。 這裡的文檔允許我們將腳本的標記部分中的行重定向到命令中。 本地處理可以在here文檔的上方和下方進行。

這是腳本“local3.sh”,其中包含一個此處的文檔。

 #!/bin/bash

# 本地處理可以在這裡完成

# 遠程處理在這裡完成
ssh -T [email protected] << _remote_commands

# 要遠程運行的命令將被添加到這裡
cd /home/dave/文檔
# ETC。

# 最後更新時間戳文件
echo "Script3.sh:" $(date) >> /home/dave/timestamp.txt

# 這是標記重定向結束的標籤
_remote_commands

# 這裡可以做更多的本地處理

出口 0

我們使用的ssh命令與之前的連接詳細信息相同。 我們以用戶“dave”的身份連接到名為“fedora-36.local”的遠程服務器上。 我們還使用了-T (禁用偽終端分配)選項。 這可以防止遠程服務器為此連接提供交互式終端。

重定向“ << ”後跟標籤的名稱。 在此示例中,我們使用“_remote_commands”。 這個標籤沒有什麼特別之處,它只是一個標籤。

重定向出現在行上的所有命令都通過 SSH 連接發送。 遇到標籤時重定向停止。 然後腳本的執行將繼續執行標籤後面的行。

讓我們運行我們的混合本地/遠程處理腳本。

 ./local3.sh 

使用本地和遠程處理混合啟動 script3.sh

正如預期的那樣,我們在“timestamp.txt”文件中看到了一個新條目。

 貓時間戳.txt 

擴大您的影響力

能夠遠程運行腳本(在本地編寫、存儲和維護)提供了一種方便的管理工具。 知道在您的所有遠程服務器上運行完全相同版本的腳本會使管理變得更加容易。

相關:如何使用 Cockpit Web 界面管理 Linux 服務器