tourze / server-shell-bundle
服务端Shell执行
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:symfony-bundle
pkg:composer/tourze/server-shell-bundle
Requires
- php: ^8.1
- 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
- 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/filesystem: ^6.4
- symfony/form: ^6.4
- symfony/http-foundation: ^6.4
- symfony/http-kernel: ^6.4
- symfony/messenger: ^6.4
- tourze/bundle-dependency: 0.0.*
- tourze/doctrine-timestamp-bundle: 0.0.*
- tourze/doctrine-track-bundle: 0.1.*
- tourze/doctrine-user-bundle: 0.0.*
- tourze/easy-admin-menu-bundle: 0.1.*
- tourze/enum-extra: 0.1.*
- tourze/server-command-bundle: 0.0.*
- tourze/server-node-bundle: 0.0.*
Requires (Dev)
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2025-10-31 07:47:36 UTC
README
A powerful Symfony bundle for managing and executing shell scripts on remote servers. This bundle provides a comprehensive system for creating, managing, and executing shell scripts across multiple nodes with full execution tracking and asynchronous processing support.
Table of Contents
- Features
- Installation
- Configuration
- Quick Start
- API Reference
- Advanced Usage
- Admin Interface
- Security Considerations
- Dependencies
- Contributing
- License
Features
- Script Management: Create, update, and manage shell scripts with metadata
- Remote Execution: Execute scripts on remote nodes via SSH
- Execution Tracking: Track script execution status, results, and performance metrics
- Asynchronous Processing: Support for async script execution using Symfony Messenger
- Security: Configurable sudo execution and script validation
- EasyAdmin Integration: Built-in admin interface for script management
- History & Logging: Complete execution history with detailed logging
- Flexible Configuration: Configurable working directories, timeouts, and execution parameters
- Tag-based Organization: Organize scripts with tags for easy categorization
Installation
composer require tourze/server-shell-bundle
Configuration
Bundle Registration
Register the bundle in your config/bundles.php:
return [ // ... other bundles ServerShellBundle\ServerShellBundle::class => ['all' => true], ];
Database Setup
Run migrations to create the required database tables:
php bin/console doctrine:migrations:migrate
Script Parameters
- name: Human-readable script name
- content: Shell script content
- workingDirectory: Directory to execute the script in (default: /tmp)
- useSudo: Whether to execute with sudo privileges (default: false)
- timeout: Execution timeout in seconds (default: 300)
- tags: Array of tags for organization
- description: Script description
- enabled: Whether the script is enabled for execution (default: true)
Execution Tracking
Each script execution creates a ScriptExecution entity that tracks:
- Execution status (PENDING, RUNNING, COMPLETED, FAILED, TIMEOUT, CANCELED)
- Execution results and output
- Execution time and performance metrics
- Associated node and script information
- Exit codes and error information
Quick Start
Basic Usage
<?php use ServerShellBundle\Service\ShellScriptService; use ServerNodeBundle\Entity\Node; // Inject the service public function __construct( private ShellScriptService $shellScriptService ) {} // Create a new script $script = $this->shellScriptService->createScript( name: 'System Update', content: "#!/bin/bash\napt update && apt upgrade -y", workingDirectory: '/tmp', useSudo: true, timeout: 300, tags: ['system', 'update'], description: 'Updates system packages' ); // Execute script on a node $node = $this->nodeRepository->find(1); $execution = $this->shellScriptService->executeScript($script, $node); // Check execution status echo "Status: " . $execution->getStatus()->value; echo "Result: " . $execution->getResult();
Asynchronous Execution
// Schedule script for async execution $execution = $this->shellScriptService->scheduleScript($script, $node); // The script will be executed asynchronously via Symfony Messenger // Check status later using the execution ID $execution = $this->shellScriptService->findExecutionById($execution->getId());
API Reference
ShellScriptService
The main service for script management:
// Create script createScript(string $name, string $content, ...): ShellScript // Update script updateScript(ShellScript $script, ...): ShellScript // Execute script executeScript(ShellScript $script, Node $node): ScriptExecution // Schedule async execution scheduleScript(ShellScript $script, Node $node): ScriptExecution // Find scripts findScriptById(int $id): ?ShellScript findAllEnabledScripts(): array findScriptsByTags(array $tags): array // Find executions findExecutionById(int $id): ?ScriptExecution findExecutionsByNode(Node $node): array findExecutionsByScript(ShellScript $script): array
Entities
- ShellScript: Represents a shell script with metadata
- ScriptExecution: Tracks individual script executions
- CommandStatus: Enum for execution status values
Advanced Usage
Batch Script Execution
// Execute multiple scripts on multiple nodes $scripts = $this->shellScriptService->findScriptsByTags(['deployment']); $nodes = $this->nodeRepository->findByEnvironment('production'); foreach ($scripts as $script) { foreach ($nodes as $node) { $this->shellScriptService->scheduleScript($script, $node); } }
Custom Script Templates
// Create script from template $script = $this->shellScriptService->createScript( name: 'Database Backup', content: $this->renderTemplate('database_backup.sh.twig', [ 'database' => 'app_prod', 'backup_path' => '/backups' ]) );
Execution Monitoring
// Monitor execution progress $execution = $this->shellScriptService->findExecutionById($id); if ($execution->getStatus() === CommandStatus::RUNNING) { echo "Execution time: " . $execution->getExecutionTime() . "s"; } elseif ($execution->getStatus() === CommandStatus::COMPLETED) { echo "Completed in: " . $execution->getExecutionTime() . "s"; echo "Exit code: " . $execution->getExitCode(); }
Admin Interface
The bundle provides EasyAdmin controllers for managing scripts and viewing execution history:
- ShellScriptCrudController: Manage shell scripts
- ScriptExecutionCrudController: View execution history and results
Security Considerations
- Scripts are temporarily stored in /tmp/shell_scriptswith restricted permissions (0700)
- Remote script files are automatically cleaned up after execution
- Sudo execution is configurable per script
- All executions are logged for audit purposes
Dependencies
This bundle depends on:
- tourze/server-node-bundle: For remote node management
- tourze/server-command-bundle: For remote command execution
- symfony/messenger: For asynchronous processing
- easycorp/easyadmin-bundle: For admin interface
Contributing
Please see CONTRIBUTING.md for details.
License
The MIT License (MIT). Please see License File for more information.