Show HN: Sshsync – 用于在多个远程服务器上运行 Shell 命令的 CLI 工具
`sshsync` 是一个 CLI 工具,通过 SSH 在多台远程服务器上并发执行 shell 命令。它支持对所有主机或特定组进行操作,提供文件推送/拉取功能,并具备试运行模式、操作历史记录和日志记录。用户可以通过 `pip` 或手动安装,并使用简单的命令进行配置和管理。该工具依赖于现有的 SSH 配置,并将组信息存储在 YAML 文件中。未来计划增加实时结果显示、性能优化和更多身份验证方法。
sshsync 是一个快速、简洁的 CLI 工具,用于通过 SSH 在多个远程服务器上运行 shell 命令。 它可以轻松地以所有服务器或仅特定组为目标,非常适合系统管理员、开发人员和自动化工作流程。
重要提示 :
sshsync
使用asyncssh
进行 SSH 连接。 如果您使用受密码保护的 SSH 密钥,则必须运行ssh-agent
,并通过ssh-add
添加密钥。sshsync
将依赖 SSH 代理转发来使用受保护的密钥进行身份验证。- 在本文档中,只要提到 “host”,它指的是
~/.ssh/config
文件中Host
指令定义的 SSH 别名,而不是实际的主机名(HostName
指令)。sshsync
使用这些别名进行所有操作。
功能 ✨
- 🔁 在所有主机或特定组上运行 shell 命令
- 🚀 在服务器上并发执行命令
- 🧠 基于组的配置,易于定位
- 🕒 可调整的 SSH 超时设置
- 📁 在本地和远程主机之间推送/拉取文件
- 📊 操作历史记录和日志记录
- 🔍 Dry-run mode (试运行模式),可以在执行前预览操作
演示 📽️
安装 📦
要求
- Python 3.10 或更高版本
使用 pip 安装
pip install sshsync
手动安装
克隆并手动安装:
git clone https://github.com/Blackmamoth/sshsync.git
cd sshsync
pipx install .
用法 🚀
sshsync [OPTIONS] COMMAND [ARGS]...
全局选项:
--install-completion
- 为当前 shell 安装补全--show-completion
- 显示当前 shell 的补全--help
- 显示帮助信息并退出
命令 & 用法 🛠️
sshsync [OPTIONS] COMMAND [ARGS]...
在服务器上运行命令
在所有主机上执行
sshsync all [OPTIONS] CMD
选项:
--timeout INTEGER
- SSH 命令执行的超时时间(秒),默认为 10--dry-run
- 显示命令和主机信息,但不执行
示例:
# 检查所有服务器上的磁盘空间,超时时间为 20 秒
sshsync all --timeout 20 "df -h"
# 预览哪些主机将收到该命令,但不执行
sshsync all --dry-run "systemctl restart nginx"
在特定组上执行
sshsync group [OPTIONS] NAME CMD
选项:
--timeout INTEGER
- SSH 命令执行的超时时间(秒),默认为 10--dry-run
- 显示命令和主机信息,但不执行
示例:
# 重启生产服务器上的 Web 服务
sshsync group web-servers "sudo systemctl restart nginx"
# 预览数据库服务器上的命令执行情况,但不执行
sshsync group db-servers --dry-run "service postgresql restart"
文件传输操作
将文件推送到远程主机
sshsync push [OPTIONS] LOCAL_PATH REMOTE_PATH
选项:
--all
- 推送到所有已配置的主机--group TEXT
- 推送到特定组的主机--host TEXT
- 推送到单个特定主机--recurse
- 递归推送目录及其内容--dry-run
- 显示传输和主机信息,但不执行
示例:
# 将配置文件推送到所有主机
sshsync push --all ./config.yml /etc/app/config.yml
# 将目录递归推送到 web-servers 组
sshsync push --group web-servers --recurse ./app/ /var/www/app/
# 预览文件传输到特定主机,但不执行
sshsync push --host staging-db --dry-run ./db-config.json /etc/postgres/conf.d/
从远程主机拉取文件
sshsync pull [OPTIONS] REMOTE_PATH LOCAL_PATH
选项:
--all
- 从所有已配置的主机拉取--group TEXT
- 从特定组的主机拉取--host TEXT
- 从单个特定主机拉取--recurse
- 递归拉取目录及其内容--dry-run
- 显示传输和主机信息,但不执行
示例:
# 从所有数据库服务器拉取日志文件
sshsync pull --group db-servers /var/log/mysql/error.log ./logs/
# 从特定主机拉取配置目录
sshsync pull --host prod-web-01 --recurse /etc/nginx/ ./backups/nginx-configs/
# 预览哪些文件将被拉取,但不执行
sshsync pull --group web-servers --dry-run /var/log/nginx/access.log ./logs/
配置管理
将主机添加到组
sshsync gadd [OPTIONS] GROUP
参数:
GROUP
- 要将主机添加到的组(必需)
示例:
# 将主机添加到 'web' 组
sshsync gadd web
向 SSH 配置添加主机
sshsync hadd [OPTIONS]
此命令以交互方式将新主机添加到您的 SSH 配置文件。
示例:
# 将新主机添加到您的 SSH 配置
sshsync hadd
同步未分组的主机
sshsync sync [OPTIONS]
此命令提示为所有未分组的主机分配组,并更新配置。
示例:
# 将组分配给所有未分组的主机
sshsync sync
列出已配置的主机和组
sshsync ls [OPTIONS]
选项:
--with-status
- 显示主机是否可达
示例:
# 列出所有主机及其连接状态
sshsync ls --with-status
显示版本
sshsync version
配置 🔧
sshsync
将其配置存储在位于~/.config/sshsync/config.yaml
的 YAML 文件中。 它使用~/.ssh/config
中现有的 SSH 配置来获取主机连接详细信息,并且仅在其自己的配置文件中存储组信息。 建议在运行其他命令之前,先运行sshsync sync
将主机分配给组,以便更轻松地定位。 关于主机的说明 :sshsync
使用 SSH 别名(Host
指令),而不是实际的主机名。 这意味着,当您在任何sshsync
命令中指定主机时,您指的是您在 SSH 配置中定义的 SSH 别名。
配置文件结构
groups:
dev:
- example.site
work:
- work.dev
- ssh.work.dev
web:
- cloudmesh
- example.com
您可以手动编辑此文件,也可以使用内置命令来管理组和主机。
注意 :
sshsync
利用您现有的 SSH 配置来获取主机详细信息,从而更易于维护 SSH 连接的单一可信源。
日志记录 📝
sshsync
现在包含操作历史记录和日志记录功能。 日志存储在特定于平台的位置:
- Windows :
%LOCALAPPDATA%\sshsync\logs
- macOS :
~/Library/Logs/sshsync
- Linux :
~/.local/state/sshsync
这些日志跟踪命令执行、文件传输以及操作期间发生的任何错误。
示例 🧪
# 检查所有服务器上的磁盘空间
sshsync all "df -h"
# 使用增加的超时时间查看所有数据库服务器上的内存使用情况
sshsync group db-servers --timeout 30 "free -m"
# 预览一个可能具有破坏性的命令,但不执行
sshsync all --dry-run "sudo apt update && sudo apt upgrade -y"
# 将配置文件递归推送到生产服务器
sshsync push --group production --recurse ./configs/ /etc/app/configs/
# 从所有 Web 服务器拉取日志文件
sshsync pull --group web-servers /var/log/nginx/error.log ./logs/
# 预览文件传输以在执行前验证路径
sshsync push --all --dry-run ./sensitive-config.json /etc/app/config.json
# 将主机添加到 dev 组
sshsync gadd dev
# 将新主机添加到您的 SSH 配置
sshsync hadd
# 将组分配给所有未分组的主机
sshsync sync
# 检查主机是否可达
sshsync ls --with-status
即将推出的功能 🛣️
- 实时结果显示(
--live
标志)以显示命令完成时的输出 - 针对大型服务器集群的性能优化
- 支持其他身份验证方法
- 使用
release-please
进行自动化版本控制,以简化发布
许可 📄
MIT 许可证