当前位置: 首页 > 科技观察

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

时间:2023-03-20 10:27:57 科技观察

有一天,我正在测试如何在将文件或目录复制到多个位置和系统时保持完整的文件权限。当我想检查远程系统上的文件权限时,我必须通过SSH连接到它并检查属性。从远程系统多次登录和注销的过程让我有点烦恼,所以我想如果我能在远程Linux系统上通过SSH执行命令就好了。幸运的是,在浏览了ssh命令的手册页后,我找到了解决方法。如果您想知道如何在不登录远程系统的情况下在远程系统上本地运行命令或脚本,下面将向您展示如何操作。1.通过SSH在远程Linux系统上执行命令从本地系统通过SSH在远程系统上运行命令或脚本的典型方式是:$ssh请允许我举几个例子:1.1。通过SSH在远程系统上运行单个命令假设您想要查找远程Linux系统的内核详细信息。为此,只需运行:$sshsk@192.168.225.22uname-a这里,sk是远程系统的用户名,192.168.225.22是远程系统的IP地址,uname-a是我要运行的命令在远程系统上。示例输出:通过SSH在远程Linux系统上执行命令看到了吗?我实际上并没有登录到远程系统,但我通过SSH在远程系统上执行了uname命令,并在本地系统的终端上显示了输出。您还可以像这样用引号指定命令。$sshsk@192.168.225.22"uname-a"或$sshsk@192.168.225.22'uname-a'如果您更改了SSH协议的默认端口,只需使用-p参数指定它。$ssh-p2200sk@192.168.225.22uname-a1.2。通过SSH在远程主机上执行多个命令您还可以通过将多个命令括在引号中来在远程主机上运行多个命令。$sshsk@192.168.225.22"uname-r&&lsb_release-a"或者:$sshsk@192.168.225.22"uname-r;lsb_release-a"上面的命令会显示我的Ubuntu服务器的内核版本和发布细节信息。示例输出:在Linux上通过SSH在远程主机上运行多个命令正如下面评论部分提到的读者,您应该用引号指定多个命令。如果不使用引号,第一个命令将在远程系统上执行,而第二个命令将仅在本地计算机上执行。整个引用的命令将在远程机器上按预期运行。提示:了解&&和;之间的区别incommands:&&运算符仅在第一个命令成功时才执行第二个命令。示例:sudoapt-getupdate&&sudoapt-getupgrade在上面的示例中,sudoapt-getupgrade只有在第一个命令成功时才会执行。否则,它不会运行。这;操作员执行第二个命令,而不管第一个命令的成功或失败。示例:sudoapt-get更新;sudoapt-getupgrade在上面的示例中,即使第一个命令失败,sudoapt-getupgrade也会被执行。1.3.通过SSH在远程机器上调用具有sudo权限的命令有些命令需要sudo权限才能运行。例如,以下命令将在我的远程系统上安装apache2。$ssh-tsk@192.168.225.22sudoaptinstallapache2示例输出:通过SSH在远程机器上以sudo权限运行命令注意到了吗?我在上面的命令中使用了-t标志,我们需要强制分配伪终端。它对于在远程机器上执行任意基于屏幕的程序很有用。例如,在实现菜单服务时。另外,我输入了两次密码。第一次是远程用户的密码,以便从本地系统通过SSH访问远程系统,第二次是授予远程用户sudo权限,以便安装应用程序(在本例中为apache2)。让我们使用以下命令检查Apache服务是否正在运行:$ssh-tsk@192.168.225.22sudosystemctlstatusapache2sk@192.168.225.22'spassword:[sudo]passwordforsk:apache2.service-ApacheHTTPServerLoaded:已加载(/lib/systemd/system/apache2.service;已启用;供应商预设:已启用)Drop-In:/lib/systemd/system/apache2.service.d└─apache2-systemd.confActive:活动(运行)自周四2019-12-1911:08:03UTC;52s前MainPID:5251(apache2)Tasks:55(limit:2318)CGroup:/system.slice/apache2.service├─5251/usr/sbin/apache2-kstart├─5253/usr/sbin/apache2-kstart└─5254/usr/sbin/apache2-kstartDec1911:08:03ubuntuserversystemd[1]:启动ApacheHTTP服务器...12月19日11:08:03ubuntuserverapachectl[5227]:AH00558:apache2:可能无法可靠地确定服务器的完全限定域名,使用2409:4072:51f:a1b6:a00:27ff:fDec1911:08:03ubuntuserversystemd[1]:已启动ApacheHTTP服务器。同样,我们可以通过SSH在本地系统上运行远程系统上的任何命令或脚本。1.4.通过SSH在远程系统上运行本地脚本让我们在本地系统上创建一个简单的脚本来显示有关远程系统的分发名称、包管理和基本详细信息等。$visystem_information.sh添加以下行:#!/bin/bash#Name:DisplaySystemDetails#Owner:OSTechNIx#-----------------------------echo/etc/*_ver*/etc/*-rel*;cat/etc/*_ver*/etc/*-rel*按ESC并输入:wq保存退出。现在,通过SSH命令在远程系统上运行此脚本:$sshsk@192.168.225.22'bash-s'diskusage.txt然后,您可以使用cat命令或文本编辑器查看diskusage.txt文件来分析磁盘使用详细信息。$catdiskusage.txt4.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,配置SSHkey认证,避免频繁输入密码在远程系统上运行命令时,您可能希望将基于SSH密钥的身份验证配置为每次都跳过密码输入。可以在下面的链接中找到更多详细信息。Linux系统下如何配置SSH密钥认证配置SSH密钥认证后,我们可以通过SSH在远程机器上执行命令,无需输入密码:$sshsk@192.168.225.22sudoaptupdate2。通过sshpass在远程计算机上运行命令如果您不想配置基于SSH密钥的身份验证,则可以使用sshpass实用程序。2.1.什么是sshpass?sshpass设计用于使用键盘交互式密码身份验证模式运行ssh,但它是以非交互式方式运行的。简单来说,sshpass提供了一种非交互式的方法来验证SSH会话。SSH使用直接TTY访问来确保密码实际上是由交互式键盘的用户发出的。sshpass在专用tty中运行SSH,诱使它认为它从交互式用户那里获得了密码。2.2.在Linux中安装sshpass许多Linux发行版的默认存储库中都提供了sshpass实用程序。例如,在Debian、Ubuntu及其衍生版本中,可以使用以下命令安装sshpass:$sudoaptinstallsshpass2.3,通过SSH和sshpass在远程机器上执行命令sshpass可以通过参数接受密码,或者通过环境读取密码变量,或从文本文件中读取密码。警告:所有这些方法都非常不安全。所有系统用户都可以通过ps命令看到命令中的密码。不建议在生产中使用这些方法。最好使用基于密钥的身份验证。让我们看一下每种方法的示例。提供密码作为参数要提供密码作为参数,请使用-p选项,如下所示:$sshpass-psshremoteuser@ip-address示例输出:$sshpass-pubuntusshostechnix@192.168.1.30uname-a其中-pubuntu-提供远程系统的密码。ostechnix@192.168.1.30-远程系统用户名和地址。uname-a-在远程计算机上执行的命令。示例输出:LinuxUbuntu22CT5.15.60-1-pve#1SMPPVE5.15.60-1(Mon,19Sep202217:53:17+0200)x86_64x86_64x86_64GNU/Linux密码在此方法中作为环境变量提供,我们声明一个名为SSHPASS的环境变量,并将远程环境的密码作为其值。然后我们使用-e标志如下:$SSHPASS=ubuntusshpass-esshostechnix@192.168.1.30uname-a从文本文件中读取密码使用echo命令追加到文本文件中密码:$echo"ubuntu">mypassword.txt现在,使用-f标志将密码文件传递给sshpass,如下所示:$sshpass-fmypassword.txtsshostechnix@192.168。1.30uname-a通过SSH和sshpass在远程机器上执行命令总结在本教程中,我们学习了一些通过安全网络连接在远程机器上调用命令或程序的方法。在所有方法中,sshpass方法是最不安全的,建议用户在生产系统中避免使用它。