通过 SSH 在远程 Linux 系统上执行命令

前几天我在测试如何 在复制文件或目录时保持文件权限不变 到多个位置和系统。 当我想检查远程系统上的文件权限时,我必须通过 SSH 登录到该系统并检查属性。 多次从远程系统登录和注销的过程对我来说有点烦人。 我认为如果我能够通过 SSH 在远程 Linux 系统上执行命令会更好。

幸运的是,我在查看手册页后找到了解决方法 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]2 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' 在上述命令中,您将获得远程系统的详细信息,但不会分配伪终端。

Save 从远程系统输出到本地系统

如果您想与支持团队或同事共享通过 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 访问
  • 如何在 Linux 中阻止 SSH 会话断开连接
  • 如何在 FreeBSD 上启用 SSH
  • Vim 技巧 – 在 Linux 上使用 Vim 编辑远程文件

希望这可以帮助。