tourze / server-command-bundle
服务端命令执行
Installs: 50
Dependents: 1
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: ^8.1
- ext-filter: *
- doctrine/collections: ^2.3
- doctrine/data-fixtures: ^2.0
- doctrine/dbal: ^4.0
- doctrine/doctrine-bundle: ^2.13
- doctrine/doctrine-fixtures-bundle: ^4.0
- doctrine/orm: ^3.0
- doctrine/persistence: ^3.1 || ^4
- easycorp/easyadmin-bundle: ^4
- knplabs/knp-menu: ^3.7
- phpseclib/phpseclib: ^3.0.43
- phpunit/php-timer: ^6.0.0
- psr/log: ^3|^2|^1
- symfony/config: ^6.4
- symfony/console: ^6.4
- symfony/dependency-injection: ^6.4
- symfony/doctrine-bridge: ^6.4
- symfony/form: ^6.4
- symfony/framework-bundle: ^6.4
- symfony/http-foundation: ^6.4
- symfony/http-kernel: ^6.4
- symfony/messenger: ^6.4
- symfony/routing: ^6.4
- symfony/security-bundle: ^6.4
- symfony/serializer: ^6.4
- symfony/yaml: ^6.4 || ^7.1
- tourze/async-contracts: 0.0.*
- tourze/bundle-dependency: 0.0.*
- tourze/doctrine-indexed-bundle: 0.0.*
- tourze/doctrine-timestamp-bundle: 0.0.*
- tourze/doctrine-track-bundle: 0.1.*
- tourze/doctrine-user-bundle: 0.0.*
- tourze/easy-admin-attribute: 0.1.*
- tourze/easy-admin-menu-bundle: 0.1.*
- tourze/enum-extra: 0.1.*
- tourze/server-node-bundle: 0.0.*
- tourze/symfony-routing-auto-loader-bundle: 0.0.*
- tourze/symfony-schedule-entity-clean-bundle: 0.1.*
Requires (Dev)
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2025-06-03 09:26:28 UTC
README
服务器 SSH 命令执行 Bundle,用于在远程服务器上执行命令。
安装
composer require tourze/server-command-bundle
功能
- 远程命令执行
- 命令执行状态追踪
- 支持同步和异步执行命令
- 提供 sudo 命令执行支持
- 使用 phpseclib3 库进行 SSH 连接
- 支持SSH密钥认证和密码认证
- Shell脚本存储和执行
- 脚本执行结果记录和追踪
- 服务器终端模拟器 - 提供类似终端的Web界面
SSH认证方式
Bundle 支持两种SSH认证方式,具有智能回退机制:
1. SSH密钥认证(推荐)
使用SSH私钥进行认证,安全性更高:
<?php use ServerNodeBundle\Entity\Node; $node = new Node(); $node->setSshHost('192.168.1.100'); $node->setSshPort(22); $node->setSshUser('root'); $node->setSshPrivateKey('-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7VJTUt9Us8cKB UO1WOeNcPugFiTt0OzUpPtU3RLXZJ5VBL+wJ4w4YhOGxF5GhB8iV2jWzYkQpJLqE ... -----END PRIVATE KEY-----');
支持的私钥格式:
- RSA私钥 (
-----BEGIN RSA PRIVATE KEY-----
) - OpenSSH私钥 (
-----BEGIN OPENSSH PRIVATE KEY-----
) - PKCS#8私钥 (
-----BEGIN PRIVATE KEY-----
) - 加密私钥 (
-----BEGIN ENCRYPTED PRIVATE KEY-----
)
2. 密码认证
使用用户名和密码进行认证:
<?php use ServerNodeBundle\Entity\Node; $node = new Node(); $node->setSshHost('192.168.1.100'); $node->setSshPort(22); $node->setSshUser('root'); $node->setSshPassword('your_password');
3. 混合认证(智能回退)
同时配置私钥和密码,系统会优先使用私钥认证,失败时自动回退到密码认证:
<?php use ServerNodeBundle\Entity\Node; $node = new Node(); $node->setSshHost('192.168.1.100'); $node->setSshPort(22); $node->setSshUser('root'); $node->setSshPrivateKey('-----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----'); $node->setSshPassword('fallback_password'); // 私钥认证失败时使用
认证流程
- 优先私钥认证:如果配置了私钥,系统首先尝试使用私钥认证
- 降级密码认证:如果私钥认证失败或未配置私钥,尝试使用密码认证
- 认证失败:如果所有认证方式都失败,抛出连接异常
系统会记录详细的认证日志,便于调试连接问题。
使用方法
服务器终端模拟器
Bundle 提供了一个Web终端界面,可以通过后台管理系统访问:
- 登录后台管理系统
- 在左侧菜单中选择 "服务器管理" -> "服务器终端"
- 在顶部选择要连接的服务器节点
- 在底部输入命令并按回车执行
终端功能特性:
- 支持选择不同的服务器节点
- 显示历史执行命令和结果
- 实时显示命令执行状态和耗时
- 支持上下箭头键浏览命令历史
- 模拟真实终端的显示样式
- 自动保存执行记录
快捷键:
Enter
- 执行命令↑/↓
- 浏览命令历史
远程命令执行
<?php use ServerNodeBundle\Entity\Node; use ServerCommandBundle\Service\RemoteCommandService; // 获取服务 $service = $container->get(RemoteCommandService::class); // 创建命令 $command = $service->createCommand( $node, // ServerNodeBundle\Entity\Node 实例 '更新系统', // 命令名称 'apt update', // 命令内容 '/root', // 工作目录 true, // 是否使用 sudo 300, // 超时时间(秒) ['system'] // 标签 ); // 同步执行命令 $result = $service->executeCommand($command); // 异步执行命令 $service->scheduleCommand($command);
Shell脚本管理和执行
<?php use ServerNodeBundle\Entity\Node; use ServerCommandBundle\Service\ShellScriptService; // 获取服务 $service = $container->get(ShellScriptService::class); // 创建Shell脚本 $script = $service->createScript( '系统信息脚本', // 脚本名称 '#!/bin/bash\nuname -a\ndf -h', // 脚本内容 '/root', // 工作目录 true, // 是否使用 sudo 300, // 超时时间(秒) ['system'], // 标签 '获取系统基本信息' // 描述 ); // 在指定节点上执行脚本 $execution = $service->executeScript($script, $node); // 异步执行脚本 $execution = $service->scheduleScript($script, $node); // 查询脚本执行结果 $result = $execution->getResult(); $status = $execution->getStatus();
API 接口
终端API
# 执行命令 POST /admin/terminal/execute { "nodeId": "1", "command": "ls -la", "workingDir": "/root" } # 获取历史命令 GET /admin/terminal/history/{nodeId}
数据填充
Bundle 提供了用于开发和测试的数据填充功能:
# 加载所有数据填充 php bin/console doctrine:fixtures:load --group=server_ssh # 仅加载脚本数据,不加载执行记录 php bin/console doctrine:fixtures:load --group=server_ssh_script # 加载SSH密钥认证演示数据 php bin/console doctrine:fixtures:load --group=ssh-key-auth # 加载终端命令演示数据 php bin/console doctrine:fixtures:load --group=terminal-commands # 追加数据(不清除现有数据) php bin/console doctrine:fixtures:load --append --group=server_ssh
数据填充包含:
-
Shell脚本:
- 系统信息脚本 - 收集系统基本信息
- 磁盘清理脚本 - 清理临时文件和日志
- 服务状态检查脚本 - 检查关键服务运行状态
-
执行记录:
- 不同状态的脚本执行记录(已完成、失败、超时、运行中、待执行)
- 真实的执行结果示例
-
SSH密钥认证演示:
- SSH密钥认证测试命令
- 混合认证回退演示
- 密钥格式验证命令
- 密钥权限检查示例
-
终端命令历史:
- 常用Linux命令执行示例(ls、ps、df等)
- 终端会话模拟数据
配置
使用时无需额外配置,直接加载 bundle 即可:
// config/bundles.php return [ // ... ServerCommandBundle\ServerCommandBundle::class => ['all' => true], // ... ];
路由配置
如果需要自定义路由前缀,可以在路由配置中添加:
# config/routes.yaml server_command_terminal: resource: "@ServerCommandBundle/Controller/TerminalController.php" type: annotation prefix: /admin/terminal
注意事项
- 终端执行的命令默认超时时间为30秒
- 所有通过终端执行的命令都会被标记为
terminal
标签 - 历史命令最多显示最近20条记录
- 建议在生产环境中谨慎使用终端功能,避免执行危险命令
故障排除
常见问题
-
SSH连接失败
- 检查服务器节点的SSH连接信息是否正确
- 确认防火墙是否允许SSH连接
-
命令执行超时
- 可以在创建命令时设置适当的超时时间
- 检查网络连接是否稳定
-
权限不足
- 确认SSH用户是否有执行相应命令的权限
- 对于需要root权限的命令,检查sudo配置