如何通过 SSH 远程连接 Linux 系统并执行命令
通过安全的网络连接在远程计算机上调用命令或程序。
如果你想知道如何本地运行远程系统上运行命令或脚本,而不登录到远程系统,下面的内容不念会告诉你如何做。
1、通过 SSH 在远程 Linux 系统上执行命令
从本地系统通过 SSH 在远程系统上运行命令或脚本的典型方法是:
$ ssh
允许我给你们举几个例子:
1.1、通过 SSH 在远程系统上运行单个命令
假设你想要 。为此,只需运行:
$ ssh sk@192.168.225.22 uname -a
这里,
-
sk
是远程系统的用户名, -
192.168.225.22
是远程系统的 IP 地址, -
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 服务器的内核版本和发行版详细信息。
示例输出:
SSH远程Linux
正如一位读者在下面的评论部分提到的那样,你应该用引号指定多个命令。如果不使用引号,第一个命令将在远程系统上执行,第二个命令将仅在本地计算机上执行。整个带引号的命令将按预期在远程计算机上运行。
提示:了解
&&
和;
在命令中的区别:&&
操作符只有在第一个命令成功时才执行第二个命令。 示例: sudo apt-get update && sudo apt-get upgrade 在上述示例中,如果第一个命令成功,才会执行sudo apt-get upgrade
。否则,它将不会运行。;
操作符会执行第二个命令,无论第一个命令是成功还是失败。 示例: 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远程Linux
注意到了吗?我在上面的命令中使用了 -t
标志,我们需要使用它来强制进行伪终端分配。它用于在远程机器上执行任意基于屏幕的程序,这非常有用。例如,在实现菜单服务时。
另外,我输入了两次密码。第一次是远程用户的密码,以便从本地系统通过 SSH 访问远程系统,第二次是为了向远程用户赋予 sudo 权限,以便安装应用程序(在本例中为 apache2)。
让我们用以下命令检查 Apache 服务是否正在运行:
$ ssh -t sk@192.168.225.22 sudo systemctl status apache2
sk@192.168.225.22'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 在本地系统上运行远程系统上的任何命令或脚本。
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'
示例输出:
sk@192.168.225.22'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
,你将获得远程系统的详细信息,但伪终端不会被分配。
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 ./.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 .
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
示例输出:
$ sshpass -p ubuntu ssh ostechnix@192.168.1.30 uname -a
其中,
-
-p ubuntu
– 提供远程系统的密码。 -
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远程Linux
总结
在本教程中,我们学习了一些通过安全的网络连接在远程计算机上调用命令或程序的方法。在所有的方法中,sshpass
方法是最不安全的,建议用户避免在生产系统中使用它。
------本页内容已结束,喜欢请分享------
© 版权声明
本站声明 1 本网站名称: 不念博客 2 本站永久网址: www.bunian.cn 3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。 4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。 5 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报 6 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
THE END
推荐阅读
-
在 linux 系统上进行远程连接(ssh+putty)的详细步骤
-
nodejs 系列 - 如何使用 JS 代码连接远程服务器并执行命令以创建文件 - ssh2
-
如何通过 SSH 远程连接 Linux 系统并执行命令
-
如何在VSCode中快速简单地下载与安装,以便通过远程连接Linux进行容器编排及格式学习
-
如何在Docker中通过SSL证书为远程连接上锁(并附带IDEA连接设置指南)
-
如何使用Python快速批量连接SSH并执行命令
-
玩转Java底层:JMX详解 - jconsole与自定义MBean监控工具的实际应用与区别" 在日常JVM调优中,我们熟知的jconsole工具通过JMX包装的bean以图形化形式展示管理数据,而像jstat和jmap这类内建监控工具则由JVM直接支持。本文将以jconsole为例,深入讲解其实质——基于JMX的MBean功能,包括可视化界面上的bean属性查看和操作调用。 MBeans在jconsole中的体现是那些可观察的组件属性和方法,如上图所示,通过名为"Verbose"的属性能看到其值为false,同时还能直接操作该bean的方法,例如"closeJerryMBean"。 尽管jconsole给我们提供了直观的可视化界面,但请注意,这里的MBean并非固定不变,开发者可根据JMX提供的接口将自己的自定义bean展示到jconsole。以下步骤展示了如何创建并注册一个名为"StudyJavaMBean"的自定义MBean: 1. 首先定义接口`StudyJavaMBean`,接口需遵循MBean规范,即后缀为"MBean"且包含getter方法代表属性,如`getApplicationName`,和无返回值的setter方法代表操作,如`closeJerryMBean`。 ```java public interface StudyJavaMBean { String getApplicationName(); void closeJerryMBean(); } ``` 2. 编写接口的实现类`StudyJavaMBeanImpl`,实现接口中的方法: ```java public class StudyJavaMBeanImpl implements StudyJavaMBean { @Override public String getApplicationName() { return "每天学Java"; } @Override public void closeJerryMBean() { System.out.println("关闭Jerry应用"); } } ``` 3. 在代码中注册自定义MBean,涉及的关键步骤包括: - 获取平台MBeanServer - 定义ObjectName,指定唯一的MBean标识符 - 注册MBean到服务器 - 启动RMI连接器服务,以便jconsole能够访问 ```java public void registerMBean() throws Exception { // ... 具体实现省略 ... } ``` 实际运行注册后的MBean,您将在jconsole中发现并查看自定义bean的属性和调用相关方法。然而,这种方式相较于传统的属性/日志查看和HTTP接口,实用性相对有限,可能存在潜在的安全风险。但不可否认的是,JMX及其MBean机制对于获取操作系统信息、内存状态等关键性能指标仍然具有重要价值。例如: 1. **获取操作系统信息**:通过JMX MBean,可以直接获取到诸如CPU使用率、操作系统版本等系统级信息,这对于资源管理和优化工作具有显著帮助。
-
如何在Ubuntu系统下通过SSH远程登录香橙派Orange Pi Zero2开发板?
-
如何在Linux中保障系统安全?一文教你禁止或限制用户通过SSH登录
-
超简单!教你如何通过SSH和SCP在远程服务器上登录并传输文件