通過 SSH 在遠程 Linux 系統上執行命令


我正在測試如何 複製文件或目錄時不要更改文件權限 適用於多個位置和系統。如果要檢查遠程系統上的文件權限,則需要通過 SSH 連接到該系統並檢查屬性。一遍又一遍地登錄和退出遠程系統的過程對我來說有點麻煩。我認為如果我可以在遠程 Linux 系統上通過 SSH 運行命令會更好。

幸運的是,我通過查看手冊頁找到了解決方法 ssh 命令。如果您想知道如何在不登錄遠程系統的情況下從本地系統本身在遠程系統上運行命令或腳本,請參閱操作方法。

內容

  1. 通過 SSH 在遠程 Linux 系統上執行命令
    1. 通過 SSH 在遠程系統上執行單個命令
    2. 通過 SSH 在遠程系統上執行多個命令
    3. 使用“運行命令 sudo”通過 SSH 訪問遠程系統的權限
    4. 通過 SSH 在遠程系統上運行本地腳本
    5. 將遠程系統的輸出保存到本地系統
      1. 配置基於 SSH 密鑰的身份驗證以避免密碼輸入

通過 SSH 在遠程 Linux 系統上執行命令

從本地系統通過 SSH 在遠程系統上運行命令或腳本的常用方法是:

$ ssh <[email protected]_Address-or-Doman_name> <Command-or-Script>

讓我給你看一些例子。

通過 SSH 在遠程系統上執行單個命令

假設你想要 查找內核詳細信息 遠程 Linux 系統。為此,請運行:

$ ssh [email protected] uname -a

這裡,

  • sk 遠程系統的用戶名。
  • 192.168.225.22 是遠程系統的 IP 地址。
  • 什麼時候 "uname -a" 您要從本地系統在遠程系統上運行的命令。

示例輸出:

通過 SSH 在遠程 Linux 系統上執行命令

看?我實際上並沒有登錄到遠程系統,但正在運行 uname 通過 SSH 在遠程系統上執行命令並在本地系統的終端上顯示輸出。

您還可以在引號中指定命令,如下所示。

$ ssh [email protected] "uname -a"

再次,

$ ssh [email protected] 'uname -a'

如果你有 更改 SSH 協議默認端口只需提及它使用 -p 參數是:

$ ssh -p 2200 [email protected] uname -a

通過 SSH 在遠程系統上執行多個命令

您還可以通過在引號中指定它們來遠程運行多個命令:

$ ssh [email protected] "uname -r && lsb_release -a"

再次,

$ ssh [email protected] "uname -r ; lsb_release -a"

上述命令將顯示 Ubuntu 服務器的內核版本和分發詳細信息。

示例輸出:

在 Linux 中通過 SSH 在遠程系統上執行多個命令

正如我們的一位讀者在下面的評論部分中提到的那樣,必須在引號中指定多個命令。沒有引號,第一個命令在遠程系統上運行,第二個命令只在本地計算機上運行。整個引用的命令按預期遠程。

筆記: 知道區別 “&&” 什麼時候 “;” 命令之間的運算符:

這個 “&&” 僅當第一個命令成功時,操作員才執行第二個命令。

例子:

sudo apt-get update && sudo apt-get upgrade

在上述情況下,第二個命令 (sudo apt-get upgrade) 如果第一個命令成功則執行。否則它不會運行。

這個 “;” 即使第一個命令成功或失敗,操作員也會執行第二個命令。

例子:

sudo apt-get update ; sudo apt-get upgrade

在上述情況下,第二個命令 (sudo apt-get upgrade) 即使第一個命令失敗也會被執行。

使用“運行命令 sudo”通過 SSH 訪問遠程系統的權限

有些命令有 "sudo" 執行權限。比如用命令安裝 維姆 在我的遠程系統上。

$ ssh -t [email protected] sudo apt install apache2

示例輸出:

運行命令

使用“運行命令 sudo”通過 SSH 訪問遠程系統的權限

你注意到了嗎?我用了 -t 上述命令的標誌。我不得不提到這一點 -t 強制偽終端分配的標誌。這可用於在遠程機器上運行任何基於屏幕的程序。這很有用,例如,在實現菜單服務時。

我也輸入了密碼 兩次從本地系統通過 SSH 訪問遠程系統,首先輸入遠程用戶的密碼並允許遠程用戶在遠程系統上安裝應用程序需要第二個密碼 sudo(即,在本例中為 apache2)。

讓我們使用以下命令確保 Apache 服務正在運行:

$ ssh -t [email protected] sudo systemctl status apache2
[email protected]'s password: 
[sudo] password for sk: 
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2019-12-19 11:08:03 UTC; 52s ago
Main PID: 5251 (apache2)
Tasks: 55 (limit: 2318)
CGroup: /system.slice/apache2.service
├─5251 /usr/sbin/apache2 -k start
├─5253 /usr/sbin/apache2 -k start
└─5254 /usr/sbin/apache2 -k start

Dec 19 11:08:03 ubuntuserver systemd[1]: Starting The Apache HTTP Server...
Dec 19 11:08:03 ubuntuserver apachectl[5227]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2409:4072:51f:a1b6:a00:27ff:f
Dec 19 11:08:03 ubuntuserver systemd[1]: Started The Apache HTTP Server.

同樣,您可以從本地系統通過 SSH 在遠程系統上運行任意命令或腳本。

通過 SSH 在遠程系統上運行本地腳本

讓我們在本地系統上創建一個簡單的腳本來顯示有關遠程系統的分發名稱、包管理、基本詳細信息等的所有可用信息。

$ vi system_information.sh

添加以下行:

#!/bin/bash
#Name: Display System Details
#Owner: OSTechNIx
#----------------------------
echo /etc/*_ver* /etc/*-rel*; cat /etc/*_ver* /etc/*-rel*

根據 ESC 鍵和類型 :wq 保存文件並退出。

使用以下命令通過 SSH 在遠程系統上運行此腳本:

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

示例輸出:

[email protected]'s password: 
/etc/debian_version /etc/lsb-release /etc/os-release
buster/sid
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

如果沒有指定 'bash -s' 上述命令將允許您獲取遠程系統的詳細信息,但不會分配偽終端。

將遠程系統的輸出保存到本地系統

這對於通過 SSH 與您的支持團隊或同事共享在遠程系統上運行的命令的輸出非常有用。

執行以下命令 "du -ah" 在遠程系統上運行 SSH 並將輸出保存到: diskusage.txt 本地系統中的文件。

$ ssh [email protected] du -ah > diskusage.txt

然後你可以查看 diskusage.txt 使用文件 cat 命令或文本查看器。

$ cat diskusage.txt 
4.0K ./.profile
4.0K ./.gnupg/private-keys-v1.d
8.0K ./.gnupg
76K ./data/image.jpg
128K ./data/file.pdf
20K ./data/text.docx
5.9M ./data/audio.mp3
6.1M ./data
0 ./.sudo_as_admin_successful
4.0K ./pacman?inline=false
4.0K ./.bash_logout
4.0K ./.wget-hsts
4.0K ./.bash_history
0 ./.cache/motd.legal-displayed
4.0K ./.cache
4.0K ./deb-pacman_1.0-0.deb
4.0K ./.bashrc
6.2M .

配置基於 SSH 密鑰的身份驗證以避免密碼輸入

如果您經常在遠程系統上運行命令,您可能需要配置基於 SSH 密鑰的身份驗證以跳過每次輸入密碼。有關更多信息,請參閱下面的鏈接。

  • 如何在 Linux 上配置基於 SSH 密鑰的身份驗證

推薦閱讀:

  • 如何使用 Rsync 通過 SSH 恢復部分傳輸的文件
  • 如何一次在多個遠程系統上運行單個命令
  • DSH – 一次在多台主機上運行 Linux 命令
  • 如何在 Linux 中創建 SSH 別名
  • SSLH – 為 HTTPS 和 SSH 共享同一個端口
  • ScanSSH – 快速 SSH 服務器和開放代理掃描器
  • 如何通過 SSH 連接到 Linux 中的特定目錄
  • 在 Linux 中允許或拒絕對特定用戶或組的 SSH 訪問
  • 如何防止 SSH 會話在 Linux 中斷開連接
  • 如何在 FreeBSD 上啟用 SSH
  • Vim 技巧——在 Linux 上使用 Vim 編輯遠程文件

希望這可以幫助。

通過 SSHLinuxSecure ShellSSH 執行命令