文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-01 02:33

关注

有一天,我正在测试如何在 ​​将文件或目录复制到多个位置和系统时保持完整的文件权限​​。当我想检查远程系统上的文件权限时,我必须通过 SSH 登录它并检查属性。从远程系统多次登录和注销的过程让我有点烦,我想,如果我可以在远程 Linux 系统上通过 SSH 执行命令就好了。

幸运的是,在浏览了 ​​ssh​​ 命令的手册页后,我找到了一个解决办法。

如果你想知道如何本地运行远程系统上运行命令或脚本,而不登录到远程系统,下面的内容会告诉你如何做。

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

从本地系统通过 SSH 在远程系统上运行命令或脚本的典型方法是:

$ ssh  

允许我给你们举几个例子:

1.1、通过 SSH 在远程系统上运行单个命令

假设你想要 ​​查找远程 Linux 系统的内核详细信息​​。为此,只需运行:

$ ssh sk@192.168.225.22 uname -a

这里,

示例输出:

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

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

你还可以像下面这样用引号指定命令。

$ ssh sk@192.168.225.22 "uname -a"

或者,

$ ssh sk@192.168.225.22 'uname -a'

如果你已经 ​​更改了 SSH 协议的默认端口​​,只需使用 ​​-p​​ 参数指定它。

$ ssh -p 2200 sk@192.168.225.22 uname -a

1.2、通过 SSH 在远程主机上执行多个命令

你还可以在远程主机上运行多个命令,方法是将它们放在引号中。

$ ssh sk@192.168.225.22 "uname -r && lsb_release -a"

或者:

$ ssh sk@192.168.225.22 "uname -r ; lsb_release -a"

上面的命令将显示我的 Ubuntu 服务器的内核版本和发行版详细信息。

示例输出:

在 Linux 上通过 SSH 在远程主机上运行多个命令

正如一位读者在下面的评论部分提到的那样,你应该用引号指定多个命令。如果不使用引号,第一个命令将在远程系统上执行,第二个命令将仅在本地计算机上执行。整个带引号的命令将按预期在远程计算机上运行。

提示: 了解 ​​&&​​ 和 ​​;​​ 在命令中的区别:

​&&​​ 操作符只有在第一个命令成功时才执行第二个命令。

示例:

  1. sudo apt-get update && sudo apt-get upgrade

在上述示例中,如果第一个命令成功,才会执行 ​​sudo apt-get upgrade​​。否则,它将不会运行。

​;​​ 操作符会执行第二个命令,无论第一个命令是成功还是失败。

示例:

  1. sudo apt-get update ; sudo apt-get upgrade

在上述示例中,即使第一个命令失败,​​sudo apt-get upgrade​​ 也会执行。

1.3、通过 SSH 在远程机器上调用有 sudo 权限的命令

有些命令需要 ​​sudo​​ 权限才能运行。例如,以下命令将在我的远程系统上安装 ​​apache2​​。

$ ssh -t sk@192.168.225.22 sudo apt install apache2

示例输出:

通过 SSH 在远程机器上运行有 Sudo 权限的命令

注意到了吗?我在上面的命令中使用了 ​​-t​​ 标志,我们需要使用它来强制进行伪终端分配。它用于在远程机器上执行任意基于屏幕的程序,这非常有用。例如,在实现菜单服务时。

另外,我输入了两次密码。第一次是远程用户的密码,以便从本地系统通过 SSH 访问远程系统,第二次是为了向远程用户赋予 sudo 权限,以便安装应用程序(在本例中为 apache2)。

让我们用以下命令检查 Apache 服务是否正在运行:

$ ssh -t sk@192.168.225.22 sudo systemctl status apache2sk@192.168.225.22's password: [sudo] password for sk: ● apache2.service - The Apache HTTP ServerLoaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)Drop-In: /lib/systemd/system/apache2.service.d└─apache2-systemd.confActive: active (running) since Thu 2019-12-19 11:08:03 UTC; 52s agoMain 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 startDec 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:fDec 19 11:08:03 ubuntuserver systemd[1]: Started The Apache HTTP Server.

同样的,我们可以通过 SSH 在本地系统上运行远程系统上的任何命令或脚本。

1.4、通过 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 sk@192.168.225.22 'bash -s' < system_information.sh

示例输出:

sk@192.168.225.22's password: /etc/debian_version /etc/lsb-release /etc/os-releasebuster/sidDISTRIB_ID=UbuntuDISTRIB_RELEASE=18.04DISTRIB_CODENAME=bionicDISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"NAME="Ubuntu"VERSION="18.04.2 LTS (Bionic Beaver)"ID=ubuntuID_LIKE=debianPRETTY_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=bionicUBUNTU_CODENAME=bionic

如果你没有在上面的命令中指定 ​​bash -s​​,你将获得远程系统的详细信息,但伪终端不会被分配。

1.5、将远程主机的命令输出保存到本地主机

如果你希望与支持团队或同事共享远程系统上运行的命令输出,那么这非常有用。

以下命令将通过 SSH 在远程系统运行 ​​du -ah​​,并将输出保存在本地系统的 ​​diskusage.txt​​ 文件中。

$ ssh sk@192.168.225.22 du -ah > diskusage.txt

然后,你可以通过使用 ​​cat​​ 命令或文本编辑器查看 ​​diskusage.txt​​ 文件来分析磁盘使用细节。

$ cat diskusage.txt 4.0K ./.profile4.0K ./.gnupg/private-keys-v1.d8.0K ./.gnupg76K ./data/image.jpg128K ./data/file.pdf20K ./data/text.docx5.9M ./data/audio.mp36.1M ./data0 ./.sudo_as_admin_successful4.0K ./pacman?inline=false4.0K ./.bash_logout4.0K ./.wget-hsts4.0K ./.bash_history0 ./.cache/motd.legal-displayed4.0K ./.cache4.0K ./deb-pacman_1.0-0.deb4.0K ./.bashrc6.2M .

1.6、配置 SSH 密钥认证,避免输入密码

如果你经常在远程系统上运行命令,你可能需要配置基于 SSH 密钥的身份验证,以便每次跳过密码输入。更多细节可以在以下链接中找到。

Linux 系统下如何配置 SSH 密钥认证

配置了基于 SSH 密钥的认证后,我们可以通过 SSH 在远程机器上执行命令,从而不需要输入密码:

$ ssh sk@192.168.225.22 sudo apt update

2、通过 sshpass 在远程机器上运行命令

如果你不想配置基于 SSH 密钥的身份验证,你可以使用 ​​sshpass​​ 实用程序。

2.1、什么是 sshpass?

​sshpass​​ 是为使用键盘交互密码身份验证模式运行 ssh 而设计的,但它以非交互的方式。简单来说,​​sshpass​​ 提供了非交互式的方式来验证 SSH 会话。

SSH 使用直接 TTY 访问来确保密码确实是由交互式键盘用户发出的。​​sshpass​​ 在一个专用 tty 中运行 SSH,让它误以为从交互用户那里获得了密码。

2.2、在 Linux 中安装 sshpass

在许多 Linux 发行版的默认仓库中都有 ​​sshpass​​ 实用程序。例如,在 Debian、Ubuntu 及其衍生版本中,你可以使用下面的命令来安装 ​​sshpass​​:

$ sudo apt install sshpass

2.3、通过 SSH 和 sshpass 在远程机器上执行命令

​sshpass​​ 可以通过参数接受密码,或者通过环境变量读取密码,也可以从文本文件中读取密码。

警告: 所有这些方法都是 高度不安全的。所有系统用户都可以通过 ​​ps​​ 命令看到命令中的密码。不建议在生产中使用这些方法。最好使用基于密钥的身份验证。

让我们看看每种方法的示例。

将密码作为参数提供

将密码作为参数提供,使用 ​​-p​​ 选项,如下所示:

$ sshpass -p  ssh remoteuser@ip-address 

示例输出:

$ sshpass -p ubuntu ssh ostechnix@192.168.1.30 uname -a

其中,

示例输出:

Linux Ubuntu22CT 5.15.60-1-pve #1 SMP PVE 5.15.60-1 (Mon, 19 Sep 2022 17:53:17 +0200) x86_64 x86_64 x86_64 GNU/Linux
密码作为环境变量提供

在这个方法中,我们声明一个名为 ​​SSHPASS​​ 的环境变量,用远程环境的密码作为其值。然后我们使用 ​​-e​​ 标志,如下所示:

$ SSHPASS=ubuntu sshpass -e ssh ostechnix@192.168.1.30 uname -a
从文本文件中读取密码

使用 ​​echo​​ 命令在文本文件中追加密码:

$ echo "ubuntu" > mypassword.txt

现在,将密码文件传递给带有 ​​-f​​ 标志的 ​​sshpass​​,如下所示:

$ sshpass -f mypassword.txt ssh ostechnix@192.168.1.30 uname -a

通过 SSH 和 sshpass 在远程机器上执行命令

总结

在本教程中,我们学习了一些通过安全的网络连接在远程计算机上调用命令或程序的方法。在所有的方法中,​​sshpass​​ 方法是最不安全的,建议用户避免在生产系统中使用它。

来源:Linux中国内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯