通过SSH在远程Linux系统上执行命令
通过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 .