# ssh_server **Repository Path**: little77/ssh_server ## Basic Information - **Project Name**: ssh_server - **Description**: 利用ssh对服务器批量执行命令 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-25 - **Last Updated**: 2026-01-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SSH连接脚本 一个功能强大的Python脚本,用于连接到远程SSH服务器并执行命令。支持单服务器操作和基于YAML配置文件的多服务器批量操作。 ## 功能特点 - **单服务器操作**: - 支持密码认证和SSH密钥认证 - 可以执行单个命令并获取输出 - 支持自定义SSH端口 - 详细的日志记录功能 - 友好的命令行界面 - 完善的错误处理机制 - **批量操作(基于YAML配置)**: - 支持4种配置方案 - 支持全局配置和服务器级配置 - 支持服务器分组管理 - 支持命令行参数覆盖配置文件 - 批量执行状态追踪 ## 安装方法 ### 直接安装(推荐用于开发环境) 1. 克隆或下载项目到本地 2. 安装依赖 ```bash pip install paramiko pyyaml ``` 或者 ```bash pip install -e . ``` ### 容器化部署(推荐用于生产环境) 1. 确保您的系统已安装Docker 2. 构建Docker镜像: ```bash docker build -t ssh-script . ``` 3. 运行容器: - 单服务器操作示例: ```bash docker run --rm ssh-script example.com username -c "ls -la" ``` - 使用SSH密钥: ```bash docker run --rm -v ~/.ssh/id_rsa:/app/id_rsa ssh-script example.com username -k /app/id_rsa -c "ls -la" ``` - 使用YAML配置文件: ```bash docker run --rm -v $(pwd)/servers.yaml:/app/servers.yaml ssh-script --batch ``` - 使用自定义YAML配置文件: ```bash docker run --rm -v $(pwd)/my_servers.yaml:/app/my_servers.yaml ssh-script --batch --config /app/my_servers.yaml ``` 4. 使用Docker Compose(可选): - 查看帮助信息: ```bash docker-compose run --rm ssh-script --help ``` - 单服务器操作: ```bash docker-compose run --rm ssh-script example.com username -c "ls -la" ``` - 使用YAML配置文件(需要先挂载配置文件到docker-compose.yml): ```bash docker-compose run --rm ssh-script --batch ``` ## 使用示例 ### 单服务器操作 #### 1. 使用密码认证执行命令 ```bash python main.py example.com username -P password -c "ls -la" ``` #### 2. 使用SSH密钥认证执行命令 ```bash python main.py example.com username -k ~/.ssh/id_rsa -c "ls -la" ``` #### 3. 使用自定义端口 ```bash python main.py example.com username -p 2222 -c "ls -la" ``` #### 4. 启用详细日志输出 ```bash python main.py example.com username -v -c "ls -la" ``` #### 5. 仅建立连接(不执行命令) ```bash python main.py example.com username -P password ``` ### 批量操作 #### 1. 使用默认配置文件(servers.yaml) ```bash python main.py --batch ``` #### 2. 使用指定配置文件 ```bash python main.py --batch --config my_servers.yaml ``` #### 3. 使用命令行参数覆盖配置文件中的命令 ```bash python main.py --batch --command "whoami" ``` #### 4. 启用详细日志输出 ```bash python main.py --batch -v ``` ## 命令行参数说明 ``` usage: main.py [-h] [-p PORT] [-c COMMAND] [-P PASSWORD] [-k KEY_FILENAME] [-v] [--batch] [--config CONFIG] [hostname] [username] SSH连接脚本 - 连接到远程服务器并执行命令 positional arguments: hostname 远程服务器的主机名或IP地址(单服务器模式) username 用于SSH连接的用户名(单服务器模式) options: -h, --help 显示帮助信息并退出 -p PORT, --port PORT SSH服务器的端口号(默认为22) -c COMMAND, --command COMMAND 要在远程服务器上执行的命令 -P PASSWORD, --password PASSWORD 用于SSH连接的密码(不推荐在命令行使用,考虑使用密钥认证) -k KEY_FILENAME, --key_filename KEY_FILENAME SSH私钥文件的路径 -v, --verbose 启用详细日志输出 --batch 启用批量操作模式 --config CONFIG YAML配置文件路径(默认为servers.yaml) ``` ## YAML配置文件 脚本支持4种YAML配置方案,以下是详细说明: ### 方案1:服务器列表+全局命令 **适用场景**:对所有服务器执行相同命令的场景 ```yaml # 全局配置 global: command: ls -la port: 22 # 服务器列表 servers: - host: server1.example.com username: user1 password: pass1 - host: server2.example.com username: user2 key_filename: /path/to/key2.pem - host: server3.example.com username: user3 password: pass3 port: 2222 # 覆盖全局端口设置 ``` ### 方案2:服务器列表+服务器级命令 **适用场景**:对不同服务器执行不同命令的场景 ```yaml servers: - host: server1.example.com port: 22 username: user1 password: pass1 command: ls -la - host: server2.example.com port: 22 username: user2 key_filename: /path/to/key2.pem command: df -h - host: server3.example.com port: 2222 username: user3 password: pass3 command: uptime ``` ### 方案3:混合模式(全局命令+服务器级命令) **适用场景**:大多数场景,既支持全局命令,又允许为特定服务器指定不同命令 ```yaml # 全局配置 global: command: ls -la port: 22 # 服务器列表 servers: - host: server1.example.com username: user1 password: pass1 - host: server2.example.com username: user2 key_filename: /path/to/key2.pem command: df -h # 覆盖全局命令 - host: server3.example.com username: user3 password: pass3 port: 2222 # 覆盖全局端口 ``` ### 方案4:任务分组模式 **适用场景**:需要将服务器分组,对不同组执行不同命令的复杂场景 ```yaml # 服务器分组 groups: web_servers: command: systemctl status nginx db_servers: command: systemctl status mysql port: 2222 # 服务器列表 servers: - host: web1.example.com username: user1 password: pass1 group: web_servers - host: web2.example.com username: user2 key_filename: /path/to/key2.pem group: web_servers - host: db1.example.com username: user3 password: pass3 group: db_servers - host: db2.example.com username: user4 password: pass4 group: db_servers command: mysql -u root -p -e 'SHOW DATABASES;' # 覆盖组命令 ``` ### 配置文件示例 项目中提供了一个示例配置文件 `servers.yaml.example`,包含了所有4种方案的示例。您可以将其复制为 `servers.yaml` 并根据需要修改: ```bash cp servers.yaml.example servers.yaml ``` ## 注意事项 1. **安全性考虑**: - 不推荐在命令行中直接使用密码参数(-P/--password),因为密码会被保存在命令历史中 - 建议使用SSH密钥认证,更加安全方便 - 不要在YAML配置文件中明文存储密码(生产环境建议使用密钥认证或其他安全的密码管理方案) - 确保密钥文件的权限正确(建议设置为600) 2. **首次连接**: - 首次连接到新服务器时,脚本会自动接受服务器的主机密钥 - 如果服务器的主机密钥发生变化,脚本会拒绝连接以防止中间人攻击 3. **命令执行**: - 脚本支持执行任意命令,但需要确保用户有足够的权限 - 对于需要交互式输入的命令,建议使用完整的SSH客户端 - 命令在远程服务器上以非交互方式执行 4. **复杂命令处理**: - **包含引号、特殊字符的命令**: - 使用双引号包裹包含单引号的命令:`command: "echo 'Hello World'"` - 对单引号进行转义:`command: echo \'Hello World\'` - 对命令中的双引号进行转义:`command: echo \"Hello World\"` - **需要管道或重定向的命令**: - 使用bash -c包裹整个命令:`command: bash -c "ls -la | grep .py > python_files.txt"` - 确保正确处理多层引号嵌套 - **执行多个命令**: - 使用分号分隔命令:`command: "cd /tmp && mkdir test && echo 'done'"` - 对于复杂序列使用bash -c:`command: bash -c "cd /tmp; mkdir test; cd test; touch file.txt"` - **需要sudo权限的命令**: - 建议在目标服务器上配置相关命令的sudo免密码执行 - 避免尝试在命令中直接使用`sudo`要求密码(脚本不支持交互式输入) - **长命令的可读性**: - 使用YAML多行字符串语法: ```yaml command: | bash -c " echo 'Starting maintenance...' ls -la /var/log grep error /var/log/syslog echo 'Maintenance complete' " ``` - **命令输出处理**: - 对于产生大量输出的命令,考虑重定向到文件:`command: bash -c "du -sh / 2>/dev/null > disk_usage.txt"` - 注意检查stderr内容以捕获错误信息 - **环境变量**: - 显式设置需要的环境变量:`command: "ENV_VAR=value python script.py"` - 如需完整用户环境,使用`bash -l -c`(登录shell) 5. **批量操作**: - 批量操作会按顺序执行,一个服务器完成后再处理下一个 - 即使个别服务器操作失败,也会继续处理其他服务器 - 最终退出状态码反映整体操作是否成功 ## 开发说明 - 项目使用Python 3.12开发 - 主要依赖:paramiko(SSH协议实现)、pyyaml(YAML配置文件解析) ## 许可证 MIT