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

时间:2020-03-21 11:47:50  来源:igfitidea点击:

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

在来自本地系统的SSH上运行命令或者脚本在远程系统上运行命令或者脚本的典型方式是:

$ssh <Hyman@theitroad_Address-or-Doman_name> <Command-or-Script>

请允许我向我们展示一些例子。

通过SSH在远程系统上运行一个命令

让我们说我们想找到远程Linux系统的内核详细信息。

要这样做,只需运行:

$ssh Hyman@theitroad uname -a

其中

  • SK是我远程系统的用户名,
  • 192.168.225.22是远程系统的IP地址,
  • "uname -a"是我想从我本地系统上的远程系统运行的命令。

我实际上没有登录到远程系统,但在SSH上执行了远程系统上的UNAME命令,并在本地系统终端中显示输出。

我们还可以在下面的引号中指定命令。

$ssh Hyman@theitroad "uname -a"

或者,

$ssh Hyman@theitroad 'uname -a'

如果我们已更改SSH协议的默认端口,请使用下面的-p参数提及它。

$ssh -p 2200 Hyman@theitroad uname -a

通过SSH在远程系统上运行多个命令

我们还可以通过在如下引号内指定它们在远程上运行多个命令。

$ssh Hyman@theitroad "uname -r && lsb_release -a"

或者,

$ssh Hyman@theitroad "uname -r ; lsb_release -a"

上述命令将显示Ubuntu Server的内核版本和分发详细信息。

我们应该在引号中指定多个命令。
如果不使用引号,则第一个命令将在远程系统上执行,并且第二个命令将仅在本地计算机上进行评估。
引号中的整个命令将按预期远程处理。

注意:知道"&&"和";"之间的差异。
命令之间的运算符:

"&&"运算符仅在第一个命令成功时执行第二个命令。

例子:

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

在上面的情况下,如果第一个命令成功,则将执行第二个命令(sudo apt-get升级)。
否则,它不会运行。

这 ";"运算符即使第一个命令成功或者失败,也执行第二个命令。

例子:

sudo apt-get update ; sudo apt-get upgrade

在上面的情况下,即使第一个命令失败,也将执行第二个命令(sudo apt-get升级)。

通过SSH在远程系统上使用"sudo"权限运行命令

某些命令需要"sudo"权限运行。
例如,以下命令将在远程系统上安装Vim。

$ssh -t Hyman@theitroad sudo apt install apache2

我在上面的命令中使用了-T标志。
我们需要提到此-t标志以强制伪终端分配。
这可用于在远程计算机上执行任意屏幕的程序,这可能非常有用,例如,实现菜单服务时。

此外,我还输入了两次密码。
我第一次输入远程用户的密码以从我的本地系统访问远程系统,并且需要第二个密码,以便在远程系统上为远程用户提供sudo权限以在远程系统上安装应用程序(即apache2) 。

让我们检查Apache服务是否使用命令运行:

$ssh -t Hyman@theitroad sudo systemctl status apache2
Hyman@theitroad'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: theitroad
#---------------------------
echo /etc/*_ver* /etc/*-rel*; cat /etc/*_ver* /etc/*-rel*

按Esc键和类型:WQ保存并退出文件。

现在使用命令在远程系统上运行此脚本:

$ssh Hyman@theitroad 'bash -s' < system_information.sh

示例输出:

Hyman@theitroad'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 Hyman@theitroad du -ah > diskusage.txt

然后,我们可以通过使用CAT命令或者文本查看器查看磁盘usage.txt文件来分析磁盘使用详细信息。

$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 .