0

0

如何在Linux中执行远程命令 Linux ssh命令安全连接指南

P粉602998670

P粉602998670

发布时间:2025-08-30 08:46:01

|

1007人浏览过

|

来源于php中文网

原创

最核心的远程命令执行方式是SSH,通过加密通道确保通信安全。使用ssh user@host 'command'可执行非交互式命令,结合SSH密钥认证(如ssh-keygen生成密钥、ssh-copy-id上传公钥)可大幅提升安全性。建议禁用密码登录、更改默认端口、限制允许用户,并配合Fail2Ban和防火墙规则强化防护。执行时注意环境变量、变量传递及伪终端需求,用-t或-v等选项处理交互和调试问题。

如何在linux中执行远程命令 linux ssh命令安全连接指南

在Linux中执行远程命令,最核心、最安全的方式无疑是使用SSH(Secure Shell)。它不仅能让你在远程服务器上运行指令,还能确保整个通信过程加密,不被窃听。简单来说,就是通过一个加密的通道,把你的指令安全地送到远端机器,再把结果安全地传回来。

解决方案

要在Linux中执行远程命令,基本语法非常直观:

ssh [用户名]@[远程主机IP或域名] '[要执行的命令]'

举个例子,如果你想查看远程服务器上

/var/log
目录的内容,并且你的用户名是
user
,远程服务器IP是
192.168.1.100
,你可以这样操作:

ssh user@192.168.1.100 'ls -l /var/log'

系统会提示你输入密码(如果使用的是密码认证),或者直接执行(如果配置了密钥认证)。

如果你需要执行多条命令,可以用分号

;
&&
连接起来。
&&
表示前一条命令成功后才执行后一条。

ssh user@192.168.1.100 'cd /tmp && mkdir my_new_dir && echo "Hello" > my_new_dir/test.txt'

这会在

/tmp
下创建一个新目录
my_new_dir
,并往里面写入一个文件。但要注意,如果远程命令需要交互式输入,或者需要持续运行(比如启动一个服务),这种单行执行的方式就不太合适了。通常,它更适用于那些一次性、非交互式的任务。

SSH密钥认证如何保障远程连接安全?

我个人是坚决反对还在用密码登录SSH的,那简直是给自己挖坑。密码再复杂,也架不住暴力破解和字典攻击,更别说那些被泄露的密码。SSH密钥认证才是王道,它基于非对称加密,安全性高出不止一个量级。

原理很简单:你本地有一对密钥,一个私钥(自己保管,绝不能泄露),一个公钥(可以公开)。你把公钥放到远程服务器的

~/.ssh/authorized_keys
文件里。当你尝试连接时,远程服务器会用你的公钥加密一段数据,然后发送给你。你的本地SSH客户端用对应的私钥解密这段数据,如果成功,就证明你是合法的,连接随即建立。整个过程,私钥从未离开你的机器,极大地降低了被盗用的风险。

操作步骤:

  1. 生成密钥对: 在你的本地机器上,打开终端,输入:

    ssh-keygen -t rsa -b 4096

    -t rsa
    指定加密算法为RSA,
    -b 4096
    指定密钥长度为4096位,这能提供非常高的安全性。一路回车即可,或者设置一个复杂的密码保护你的私钥(强烈推荐,这相当于给你的私钥再加了一把锁)。 这会在
    ~/.ssh/
    目录下生成
    id_rsa
    (私钥)和
    id_rsa.pub
    (公钥)。

  2. 上传公钥到远程服务器: 最方便的方式是使用

    ssh-copy-id
    命令:

    ssh-copy-id user@remote_host_ip

    它会自动把你的公钥添加到远程服务器的

    ~/.ssh/authorized_keys
    文件中。如果远程服务器上没有这个文件或目录,它也会帮你创建。 如果没有
    ssh-copy-id
    ,你也可以手动复制:

    cat ~/.ssh/id_rsa.pub | ssh user@remote_host_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

    (注意:

    cat >>
    是追加,不是覆盖)

  3. 禁用密码认证(可选但强烈推荐): 在远程服务器上,编辑SSH配置文件

    /etc/ssh/sshd_config
    。找到并修改以下行:

    PasswordAuthentication no
    PermitRootLogin no  # 顺便把root登录也禁了,安全第一

    修改后,重启SSH服务:

    sudo systemctl restart sshd  # 或者 service sshd restart

    重要提示: 在禁用密码认证前,请务必确保你的密钥认证已经成功配置并且可以登录,否则你可能会把自己锁在服务器外面!

    Pomelli
    Pomelli

    Google Labs推出的AI营销工具

    下载

优化SSH服务器配置,提升远程访问安全性

除了密钥认证,对SSH服务器的配置进行一些调整,能显著提升整体安全性。这就像给你的房子多加几道锁,虽然麻烦点,但心里踏实。

  1. 更改默认端口: SSH默认使用22端口,这是所有扫描器首要攻击的目标。将其更改为一个不常用的高位端口(例如22222),可以有效减少自动化攻击的尝试。 编辑

    /etc/ssh/sshd_config

    Port 22222

    然后重启SSH服务。记住,以后连接时需要指定新端口:

    ssh -p 22222 user@remote_host_ip

  2. 限制允许登录的用户: 如果你知道只有特定用户需要SSH访问,可以明确指定允许哪些用户登录。 在

    /etc/ssh/sshd_config
    中添加或修改:

    AllowUsers user1 user2

    这样,只有

    user1
    user2
    可以通过SSH登录,其他用户(包括root)都将被拒绝。这比禁用root登录更进一步,实现了白名单机制。

  3. 使用Fail2Ban等入侵防御工具 即使你做了很多安全措施,总有人会尝试暴力破解。Fail2Ban是一个非常实用的工具,它会监控SSH日志,一旦发现某个IP地址在短时间内多次尝试登录失败,就会自动将该IP地址加入防火墙黑名单,阻止其进一步尝试。 安装和配置Fail2Ban通常很简单,在大多数发行版中都可以通过包管理器安装。

  4. 配置防火墙规则: 确保你的服务器防火墙(如

    ufw
    firewalld
    )只允许SSH端口(无论是默认的22还是你自定义的端口)的入站连接。限制源IP地址范围也是个好主意,如果你的访问IP是固定的,只允许你的IP连接SSH端口,这能极大缩小攻击面。 例如,使用
    ufw

    sudo ufw allow 22222/tcp  # 允许新端口
    sudo ufw enable

    或者更严格地限制来源IP:

    sudo ufw allow from your_static_ip to any port 22222

远程命令执行中的常见挑战与高级技巧

在实际操作中,远程执行命令会遇到一些细节问题,掌握一些高级技巧能让你的工作更顺畅。

  1. 环境变量问题: 当你通过SSH执行远程命令时,远程会话的环境变量可能与你直接登录时不同。例如,

    PATH
    变量可能不包含你想要执行的命令所在的目录。 解决方案:

    • 使用命令的绝对路径:
      ssh user@host '/usr/local/bin/my_script.sh'
    • 在命令前设置环境变量:
      ssh user@host 'export PATH=$PATH:/usr/local/bin && my_script.sh'
  2. 传递本地变量到远程命令: 如果你想在远程命令中使用本地脚本的变量,直接在单引号内引用是行不通的,因为单引号会阻止本地变量的展开。 解决方案:

    • 使用双引号,但要小心内部的特殊字符转义:
      LOCAL_VAR="Hello World"
      ssh user@host "echo \"$LOCAL_VAR\""
    • 更健壮的方式是使用
      here-string
      here-document
      LOCAL_VAR="Hello World"
      ssh user@host "bash -s" <<< "echo '$LOCAL_VAR' from remote"

      或者对于多行脚本:

      ssh user@host 'bash -s' << 'EOF'
      echo "This is a multi-line script."
      echo "The current directory is: $(pwd)"
      EOF

      注意

      EOF
      前的单引号
      'EOF'
      可以防止本地变量展开,确保脚本原封不动地发送过去。

  3. 非交互式命令与伪终端: 有些命令在没有交互式终端时会表现异常或拒绝运行。SSH默认在执行单条命令时不会分配伪终端。 解决方案: 使用

    -t
    选项强制SSH分配一个伪终端:

    ssh -t user@host 'sudo apt update'

    这在需要

    sudo
    密码或者需要某些交互式行为时特别有用。

  4. 调试连接问题: 如果SSH连接失败,或者远程命令没有按预期执行,

    ssh -v
    选项是你的好帮手。它会输出详细的调试信息,帮助你定位问题所在。

    ssh -v user@host 'ls'

    输出会告诉你SSH客户端尝试了哪些认证方式,连接到了哪个IP和端口,以及其他潜在的问题。

远程命令执行和SSH安全是一个持续学习和实践的过程。没有一劳永逸的方案,但遵循这些最佳实践,能让你的远程管理工作既高效又安全。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

317

2023.08.02

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

402

2023.08.14

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

701

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

572

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

545

2023.07.20

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

40

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号