SSM 是一个轻量级的 SSH 连接管理工具,旨在简化和优化 SSH 连接体验。通过智能的历史记录管理、多种认证方式支持和跳板机功能,让 SSH 连接变得更加便捷高效。
- 📚 历史记录管理:自动保存连接历史,支持快速重连
- 🔄 智能配置复用:自动复用认证信息,减少重复输入
- 📱 终端自适应:自动适应终端窗口大小变化
- ⚡ 快速连接:通过简洁的命令行接口实现一键连接
- 🔗 端口转发:支持本地和远程端口转发
- 📁 文件传输:基于SFTP的安全文件传输,支持递归目录复制
- 🔑 SSH密钥认证:支持多种密钥格式(RSA、Ed25519、ECDSA、DSA)
- 🔒 密码认证:安全的交互式密码输入
- 🔀 混合认证:智能选择最佳认证方式
- 📋 认证优先级:publickey → password 标准SSH认证流程
- 🔐 安全存储:配置文件权限设置为 0600
- 🚫 无明文参数:密码通过安全的交互式输入获取
- ✅ 连接验证:只有连接成功后才保存配置
- 🔄 智能重试:失败时不保存错误配置
- 📡 跳板机支持:完整的 ProxyJump 功能实现
- 🔌 端口转发:支持本地(-L)和远程(-R)端口转发
- 🔧 标准SSH语法:兼容标准SSH客户端语法
- 🖥️ 跨平台:支持 Linux、macOS、Windows
- 🎨 终端兼容:支持各种终端模拟器
git clone https://github.com/wuxs/ssm.git
cd ssm
go mod tidy
go build -o ssmgo install github.com/wuxs/ssm@latest# 连接到远程服务器
ssm user@hostname
ssm user@hostname:2222
ssm hostname # 使用当前用户名# 通过跳板机连接
ssm -J jumphost user@target
ssm -J user@jumphost:2222 user@target:22
ssm --proxy-jump jump.example.com user@target.example.com# 上传文件到远程服务器
ssm cp file.txt user@hostname:/remote/path/
# 从远程服务器下载文件
ssm cp user@hostname:/remote/file.txt ./
# 递归复制目录
ssm cp -r local-dir user@hostname:/remote/
# 通过跳板机传输文件
ssm cp -J jumphost file.txt user@target:/path/# 列出所有保存的配置
ssm --list
# 删除指定配置
ssm --delete user@hostname:22| 参数 | 短参数 | 说明 | 示例 |
|---|---|---|---|
--identity |
-i |
指定私钥文件 | -i ~/.ssh/id_rsa |
--port |
-p |
指定端口 | -p 2222 |
| 参数 | 短参数 | 说明 | 示例 |
|---|---|---|---|
--proxy-jump |
-J |
跳板机地址 | -J user@jumphost:22 |
| 参数 | 短参数 | 说明 | 示例 |
|---|---|---|---|
--recursive |
-r |
递归复制目录 | cp -r dir/ user@host:/path/ |
--verbose |
-v |
显示详细输出 | cp -v file user@host:/path/ |
--preserve |
保持文件属性 | cp --preserve file user@host:/path/ |
|
--identity |
-i |
指定私钥文件 | cp -i ~/.ssh/key file user@host:/path/ |
--proxy-jump |
-J |
通过跳板机传输 | cp -J jump user@host:/file ./ |
| 参数 | 短参数 | 说明 | 示例 |
|---|---|---|---|
--list |
-l |
列出所有配置 | --list |
--delete |
-d |
删除指定配置 | --delete user@host:22 |
--help |
-h |
显示帮助信息 | --help |
~/.ssm/ssh_config.json
{
"items": {
"user@hostname:22": {
"host": "hostname",
"username": "user",
"port": "22",
"private_key": "/home/user/.ssh/id_rsa",
"password": "",
"proxy_jump": "",
"last_used": "2025-01-01T12:00:00Z"
}
}
}- ✅ 自动保存:成功连接后自动保存配置
- ✅ 智能更新:自动更新最后使用时间
- ✅ 配置复用:自动复用已保存的认证信息
- ✅ 失败保护:连接失败时不保存错误配置
- 🔑 优先使用SSH密钥:比密码认证更安全
- 🔐 定期轮换密钥:提高安全性
- 📂 正确设置权限:确保配置文件权限为 0600
- 🚫 避免共享配置:不要在多用户环境中共享配置文件
- 🔒 配置文件加密存储:权限控制为 0600
- 🚫 无命令行密码参数:避免密码在进程列表中暴露
- ✅ 标准SSH认证流程:遵循SSH客户端最佳实践
- 🔄 智能认证重试:减少认证失败风险
- 密码会以明文形式存储在配置文件中,请谨慎使用
- 建议在生产环境中使用SSH密钥认证
- 定期检查和清理不需要的配置
- 大文件传输时注意网络稳定性和磁盘空间
Q: 连接失败,提示 "Permission denied" A: 检查以下几个方面:
- 确认用户名和主机地址是否正确
- 检查SSH密钥权限:
chmod 600 ~/.ssh/id_rsa - 确认目标服务器的SSH服务是否正常运行
- 尝试使用标准ssh命令测试连接
Q: 跳板机连接失败 A: 排查步骤:
- 先测试能否直接连接到跳板机
- 确认跳板机支持端口转发功能
- 检查跳板机的防火墙设置
- 验证目标服务器从跳板机可达
Q: 端口转发不工作 A: 检查项目:
- 确认端口转发参数格式正确
- 检查本地/远程端口是否已被占用
- 确认防火墙允许相关端口通信
- 查看是否有错误信息输出
Q: 配置文件损坏或丢失 A: 解决方法:
- 检查
~/.ssm/ssh_config.json文件是否存在 - 验证JSON格式是否正确
- 备份并重新创建配置文件
- 重新连接以生成新的配置
Q: 终端窗口大小不自适应 A: 检查项目:
- 确认终端支持 SIGWINCH 信号
- 检查终端模拟器设置
- 尝试重新调整终端窗口大小
- 重启SSH会话
Q: 文件传输失败或中断 A: 排查步骤:
- 检查网络连接是否稳定
- 确认远程路径是否存在且有写权限
- 验证磁盘空间是否充足
- 对于大文件,考虑使用
-v选项查看进度 - 检查防火墙和SSH配置
Q: 递归目录复制不完整 A: 检查项目:
- 确认使用了
-r递归标志 - 检查源目录的权限设置
- 验证目标路径是否正确
- 查看是否有符号链接或特殊文件
我们欢迎各种形式的贡献!
- 在 GitHub Issues 中详细描述问题
- 提供复现步骤和环境信息
- 附上相关的错误日志
- 描述功能的用途和价值
- 提供具体的使用场景
- 考虑向后兼容性
- Fork 项目仓库
- 创建功能分支:
git checkout -b feature/new-feature - 提交代码:
git commit -am 'Add new feature' - 推送分支:
git push origin feature/new-feature - 创建 Pull Request
- 遵循 Go 语言标准规范
- 添加必要的注释和文档
- 确保代码测试通过
- 保持向后兼容性
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
感谢所有为这个项目做出贡献的开发者和用户!
💡 提示:如果您在使用过程中遇到任何问题,请随时在 GitHub Issues 中反馈。