【n8n教程】:SSH节点,实现远程服务器自动化管理

45 阅读6分钟

【n8n教程】:SSH节点,实现远程服务器自动化管理

SSH(Secure Shell)是远程访问服务器的标准安全协议。在n8n中,SSH节点让您能够在工作流中执行远程命令、上传和下载文件,从而实现强大的服务器自动化管理能力。无论是定期检查服务器状态、批量部署应用,还是自动化日志清理,SSH节点都是您的得力助手。


点击获取最新AI资讯、n8n工作流、开发经验分享

为什么选择SSH节点?

在n8n中使用SSH节点有以下优势:

  • 安全可靠:基于SSH加密协议,确保通信安全
  • 功能全面:支持命令执行、文件上传/下载三大核心操作
  • 自动化强大:将重复的服务器任务自动化,节省时间和人力
  • 灵活集成:与其他节点无缝配合,构建复杂的自动化流程
  • 远程控制:从任何地方管理多台服务器

核心功能详解

1. 执行命令(Execute Command)

这是SSH节点最常用的功能。您可以在远程服务器上执行任何Shell命令。

常用场景:

  • 检查服务器磁盘空间:df -h /
  • 查看内存使用情况:free -h
  • 检查进程状态:ps aux | grep nginx
  • 重启服务:systemctl restart nginx
  • 运行脚本:bash /path/to/script.sh

2. 下载文件(Download File)

将远程服务器上的文件下载到n8n工作流中进行处理。

适用场景:

  • 定期备份配置文件
  • 收集日志文件进行分析
  • 获取服务器生成的报告

3. 上传文件(Upload File)

将文件从n8n上传到远程服务器。

适用场景:

  • 部署配置文件更新
  • 上传新版本脚本
  • 批量传输文件到服务器

快速开始

第一步:配置SSH凭证

在使用SSH节点前,需要先创建SSH凭证:

  1. 打开n8n工作流编辑器
  2. 添加SSH节点:在左侧节点面板搜索"SSH"
  3. 点击"创建新凭证",选择身份验证方式

支持两种认证方式:

方式A - 密码认证(Password)

  • 主机地址:远程服务器的IP或域名
  • 用户名:SSH用户名(如 ubuntu、root等)
  • 密码:SSH密码
  • 端口:通常为22(如非默认需修改)

方式B - 私钥认证(Public Key) ⭐ 推荐

  • 主机地址:远程服务器的IP或域名
  • 用户名:SSH用户名
  • 私钥:您的SSH私钥内容(PEM格式)
  • 密码短语(可选):如果私钥有密码保护
  • 端口:通常为22

✅ 私钥认证为什么更好?

  • 更安全(不需要存储明文密码)
  • 自动化友好(无需人工输入)
  • 通常是生产环境标准做法

第二步:配置操作参数

以"执行命令"为例:

参数说明示例
凭证选择已创建的SSH凭证SSH连接
命令要执行的Shell命令df -h /
工作目录可选,命令执行的目录/home/user

实战案例:服务器健康检查工作流

现在让我们构建一个完整可执行的工作流,定时检查服务器健康状态。

工作流功能说明

该工作流每5分钟:

  1. 自动连接到远程服务器
  2. 执行系统命令获取磁盘、内存、运行时间
  3. 处理和格式化输出结果
  4. 保存数据供后续使用(可扩展为发送告警)

完整工作流JSON代码

{
  "name": "SSH远程服务器检查",
  "nodes": [
    {
      "parameters": {
        "rule": [
          {
            "interval": ["minutes", 5]
          }
        ]
      },
      "id": "Cron",
      "name": "定时触发器",
      "type": "n8n-nodes-base.cron",
      "typeVersion": 1,
      "position": [250, 100]
    },
    {
      "parameters": {
        "authentication": "publicKey",
        "host": "your-server.com",
        "username": "ubuntu",
        "privateKey": "-----BEGIN OPENSSH PRIVATE KEY-----\nyour_private_key_content_here\n-----END OPENSSH PRIVATE KEY-----",
        "port": 22,
        "command": "df -h / && echo '---' && free -h && echo '---' && uptime"
      },
      "id": "SSH执行命令",
      "name": "SSH执行命令",
      "type": "n8n-nodes-base.ssh",
      "typeVersion": 1,
      "position": [500, 100]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "checkResult",
              "type": "object",
              "value": "{\n  \"timestamp\": $now.toISOString(),\n  \"diskStatus\": $json.stdout,\n  \"status\": \"success\",\n  \"server\": \"your-server.com\"\n}"
            }
          ]
        }
      },
      "id": "格式化数据",
      "name": "格式化数据",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [750, 100]
    }
  ],
  "connections": {
    "Cron": {
      "main": [
        [
          {
            "node": "SSH执行命令",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SSH执行命令": {
      "main": [
        [
          {
            "node": "格式化数据",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {}
}

如何导入和使用

  1. 复制上面的JSON代码
  2. 打开n8n工作流编辑器
  3. 点击右上角菜单(...)→ 导入工作流
  4. 选择从URL或直接粘贴JSON
  5. 修改以下参数:
    • host:替换为您的服务器地址
    • username:替换为您的SSH用户名
    • privateKey:替换为您的实际私钥内容
  6. 配置SSH凭证后保存并运行

常见命令示例

系统监控

# 查看磁盘使用情况
df -h /

# 查看内存使用
free -h

# 查看CPU负载
uptime

# 查看运行进程
ps aux | grep nginx

# 综合检查
df -h / && free -h && uptime

服务管理

# 重启Nginx
systemctl restart nginx

# 查看服务状态
systemctl status mysql

# 启动Docker容器
docker restart container_name

# 查看日志
tail -f /var/log/nginx/error.log

文件操作

# 列出文件
ls -la /home/user/

# 文件大小统计
du -sh /var/www/

# 查找文件
find /home -name "*.log" -type f

# 文件权限修改
chmod 755 /path/to/file

多命令执行

# 使用 && 连接(前一个成功才执行下一个)
cd /app && npm install && npm start

# 使用 ; 连接(无论成否都执行下一个)
cd /app; ls; pwd

# 使用管道 |
cat /var/log/app.log | grep ERROR | wc -l

进阶技巧

1. 动态参数使用

在复杂工作流中,可能需要从前面节点获取动态参数:

主机:$json.serverHost
用户名:$json.username
命令:df -h $json.path

2. 错误处理

添加"If"节点判断SSH命令是否成功:

条件:$json.exitCode === 0
- 成功分支:继续处理数据
- 失败分支:发送告警通知

3. 多服务器管理

使用"Loop"或"Merge"节点连接多个SSH命令,依次或并行处理多台服务器。

4. 大文件处理

下载大文件时,可配合"Stream"节点处理,避免内存溢出。


常见问题排查

问题原因解决方案
连接超时网络不通或防火墙阻止检查防火墙规则,确认服务器地址正确
认证失败凭证错误验证用户名密码/私钥,确保格式正确
命令失败命令不存在或权限不足检查命令语法,或使用sudo提权
私钥格式错误PEM格式不对确保使用OpenSSH格式的私钥
编码问题输出乱码在命令前加 export LANG=en_US.UTF-8

安全最佳实践

推荐做法:

  • 使用SSH密钥认证而非密码
  • 将凭证存储在n8n的安全凭证存储中
  • 定期轮换SSH密钥
  • 限制SSH端口的访问权限
  • 使用非root用户执行任务
  • 为SSH用户配置最小权限

避免做法:

  • 在工作流中硬编码密码
  • 使用root账户执行普通任务
  • 保存凭证到代码或文档
  • 在公网上暴露SSH端口

下一步建议

掌握了SSH节点基础后,您可以尝试:

  1. 构建监控系统:定时检查多台服务器,异常时发送Slack/邮件告警
  2. 自动化部署:配合Webhook节点,实现代码更新后自动部署
  3. 日志收集:定期从服务器下载日志,集中分析和备份
  4. 批量配置管理:统一更新多台服务器的配置文件
  5. 备份自动化:定时执行服务器备份脚本,保障数据安全