sshsync 是一个快速、简洁的 CLI 工具,用于通过 SSH 在多个远程服务器上运行 shell 命令。 它可以轻松地以所有服务器或仅特定组为目标,非常适合系统管理员、开发人员和自动化工作流程。

重要提示 :

  1. sshsync 使用 asyncssh 进行 SSH 连接。 如果您使用受密码保护的 SSH 密钥,则必须运行 ssh-agent,并通过 ssh-add 添加密钥。 sshsync 将依赖 SSH 代理转发来使用受保护的密钥进行身份验证。
  2. 在本文档中,只要提到 “host”,它指的是 ~/.ssh/config 文件中 Host 指令定义的 SSH 别名,而不是实际的主机名(HostName 指令)。 sshsync 使用这些别名进行所有操作。

功能 ✨

演示 📽️

演示

安装 📦

要求

使用 pip 安装

pip install sshsync

手动安装

克隆并手动安装:

git clone https://github.com/Blackmamoth/sshsync.git
cd sshsync
pipx install .

用法 🚀

sshsync [OPTIONS] COMMAND [ARGS]...

全局选项:

命令 & 用法 🛠️

sshsync [OPTIONS] COMMAND [ARGS]...

在服务器上运行命令

在所有主机上执行

sshsync all [OPTIONS] CMD

选项:

示例:

# 检查所有服务器上的磁盘空间,超时时间为 20 秒
sshsync all --timeout 20 "df -h"
# 预览哪些主机将收到该命令,但不执行
sshsync all --dry-run "systemctl restart nginx"

在特定组上执行

sshsync group [OPTIONS] NAME CMD

选项:

示例:

# 重启生产服务器上的 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

选项:

示例:

# 将配置文件推送到所有主机
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

选项:

示例:

# 从所有数据库服务器拉取日志文件
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

参数:

示例:

# 将主机添加到 'web' 组
sshsync gadd web

向 SSH 配置添加主机

sshsync hadd [OPTIONS]

此命令以交互方式将新主机添加到您的 SSH 配置文件。

示例:

# 将新主机添加到您的 SSH 配置
sshsync hadd

同步未分组的主机

sshsync sync [OPTIONS]

此命令提示为所有未分组的主机分配组,并更新配置。

示例:

# 将组分配给所有未分组的主机
sshsync sync

列出已配置的主机和组

sshsync ls [OPTIONS]

选项:

示例:

# 列出所有主机及其连接状态
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 现在包含操作历史记录和日志记录功能。 日志存储在特定于平台的位置:

这些日志跟踪命令执行、文件传输以及操作期间发生的任何错误。

示例 🧪

# 检查所有服务器上的磁盘空间
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

即将推出的功能 🛣️

许可 📄

MIT 许可证