golang轻松管理SSH别名配置的命令行工具插件manssh的使用
Golang轻松管理SSH别名配置的命令行工具插件manssh的使用
manssh是一个用Go编写的命令行工具,用于轻松管理你的SSH别名配置,灵感来自storm项目。
特性
- 无依赖
- 添加、列出、查询、删除SSH别名记录
- 备份SSH配置
- 支持Include指令
安装
Go安装
Go 1.17之前版本:
go get -u github.com/xwjdsh/manssh/cmd/manssh
Go 1.17或更高版本:
go install github.com/xwjdsh/manssh/cmd/manssh
Homebrew安装
brew tap xwjdsh/tap
brew install xwjdsh/tap/manssh
Docker安装
alias manssh='docker run -t --rm -v ~/.ssh/config:/root/.ssh/config wendellsun/manssh'
手动安装
从GitHub releases页面下载并解压到你的PATH目录。
使用示例
基本用法
% manssh
NAME:
manssh - Manage your ssh alias configs easily
USAGE:
manssh [global options] command [command options] [arguments...]
VERSION:
master
COMMANDS:
add, a Add a new SSH alias record
list, l List or query SSH alias records
update, u Update SSH record by specifying alias name
delete, d Delete SSH records by specifying alias names
backup, b Backup SSH config files
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--file value, -f value (default: "/Users/wendell/.ssh/config")
--help, -h show help
--version, -v print the version
添加新别名
# 添加简单别名
% manssh add test2 2.2.2.2
# 添加带用户名、端口和身份文件的别名
% manssh add test1 root@1.1.1.1:77 -i ~/.ssh/wendell
✔ alias[test1] added successfully.
test1 -> root@1.1.1.1:77
identityfile = /Users/wendell/.ssh/wendell
列出或查询别名
# 列出所有别名
% manssh list
# 查询特定别名
% manssh list test1 77
✔ Listing 1 records.
test1 -> root@1.1.1.1:77
identityfile = /Users/wendell/.ssh/wendell
更新别名
# 重命名别名
% manssh update test1 -r test3
# 更新主机名和端口
% manssh update test1 -i "" -r test3 -c hostname=3.3.3.3 -c port=22022
✔ alias[test3] updated successfully.
test3 -> root@3.3.3.3:22022
删除别名
% manssh delete test1 test2
✔ alias[test1,test2] deleted successfully.
备份SSH配置
% manssh backup ./config_backup
✔ backup ssh config to [./config_backup] successfully.
Include指令支持
如果你使用Include
指令,有一些额外的注意事项:
- 为
list
,add
,update
,delete
命令添加-p
(–path)标志以显示别名所在的文件路径 - 为
add
命令添加-ap
(–addpath)标志以指定要添加别名的文件路径
可以通过环境变量设置:
export MANSSH_SHOW_PATH=true
export MANSSH_ADD_PATH=~/.ssh/config.d/temp
示例代码
以下是一个完整的Go示例,展示如何使用manssh工具:
package main
import (
"fmt"
"os/exec"
)
func main() {
// 添加新的SSH别名
addCmd := exec.Command("manssh", "add", "myserver", "user@192.168.1.100:2222", "-i", "~/.ssh/id_rsa")
out, err := addCmd.CombinedOutput()
if err != nil {
fmt.Printf("添加别名失败: %v\n", err)
return
}
fmt.Printf("添加成功:\n%s\n", out)
// 列出所有别名
listCmd := exec.Command("manssh", "list")
out, err = listCmd.CombinedOutput()
if err != nil {
fmt.Printf("列出别名失败: %v\n", err)
return
}
fmt.Printf("当前SSH别名:\n%s\n", out)
}
注意事项
- 用户名和端口是可选的,默认使用当前登录用户名和端口22
- 使用
-c
设置更多配置选项 -i xxx
可以替代-c identityfile=xxx
- 使用
-r
标志重命名别名
更多关于golang轻松管理SSH别名配置的命令行工具插件manssh的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang轻松管理SSH别名配置的命令行工具插件manssh的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用manssh轻松管理Golang中的SSH别名配置
manssh是一个用Go编写的轻量级命令行工具,可以帮助开发者轻松管理SSH别名配置,简化SSH连接过程。下面我将详细介绍如何使用manssh以及如何集成到你的Golang项目中。
manssh简介
manssh的主要功能是帮助用户管理~/.ssh/config
文件中的SSH别名配置,提供简单的命令行界面来添加、删除、列出和搜索SSH连接配置。
安装manssh
go get -u github.com/xwjdsh/manssh
基本使用方法
1. 添加SSH别名
manssh add my_server -H 192.168.1.100 -u root -p 22
2. 列出所有配置
manssh list
3. 搜索配置
manssh search my
4. 删除配置
manssh delete my_server
Golang集成示例
以下是如何在Golang程序中使用manssh的示例代码:
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
// 添加SSH配置
addSSHConfig("my_server", "192.168.1.100", "root", 22)
// 列出所有配置
listSSHConfigs()
// 搜索配置
searchSSHConfigs("my")
// 删除配置
deleteSSHConfig("my_server")
}
func addSSHConfig(name, host, user string, port int) {
cmd := exec.Command("manssh", "add", name, "-H", host, "-u", user, "-p", fmt.Sprintf("%d", port))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Printf("添加SSH配置失败: %v\n", err)
}
}
func listSSHConfigs() {
cmd := exec.Command("manssh", "list")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Printf("列出SSH配置失败: %v\n", err)
}
}
func searchSSHConfigs(keyword string) {
cmd := exec.Command("manssh", "search", keyword)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Printf("搜索SSH配置失败: %v\n", err)
}
}
func deleteSSHConfig(name string) {
cmd := exec.Command("manssh", "delete", name)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Printf("删除SSH配置失败: %v\n", err)
}
}
高级用法:直接操作SSH配置
如果你不想依赖manssh命令行工具,也可以直接在Golang中操作SSH配置文件:
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
)
const sshConfigPath = "~/.ssh/config"
type SSHConfig struct {
Host string
HostName string
User string
Port int
}
func main() {
// 添加配置
config := SSHConfig{
Host: "my_server",
HostName: "192.168.1.100",
User: "root",
Port: 22,
}
addSSHConfig(config)
// 列出配置
configs := listSSHConfigs()
fmt.Println("所有SSH配置:")
for _, c := range configs {
fmt.Printf("%s -> %s@%s:%d\n", c.Host, c.User, c.HostName, c.Port)
}
}
func addSSHConfig(config SSHConfig) error {
configLine := fmt.Sprintf(`
Host %s
HostName %s
User %s
Port %d
`, config.Host, config.HostName, config.User, config.Port)
file, err := os.OpenFile(expandPath(sshConfigPath), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
return err
}
defer file.Close()
_, err = file.WriteString(configLine)
return err
}
func listSSHConfigs() []SSHConfig {
var configs []SSHConfig
content, err := os.ReadFile(expandPath(sshConfigPath))
if err != nil {
return configs
}
lines := strings.Split(string(content), "\n")
var currentConfig *SSHConfig
for _, line := range lines {
line = strings.TrimSpace(line)
if strings.HasPrefix(line, "Host ") {
if currentConfig != nil {
configs = append(configs, *currentConfig)
}
currentConfig = &SSHConfig{Host: strings.TrimSpace(line[5:])}
} else if strings.HasPrefix(line, "HostName ") && currentConfig != nil {
currentConfig.HostName = strings.TrimSpace(line[9:])
} else if strings.HasPrefix(line, "User ") && currentConfig != nil {
currentConfig.User = strings.TrimSpace(line[5:])
} else if strings.HasPrefix(line, "Port ") && currentConfig != nil {
fmt.Sscanf(strings.TrimSpace(line[5:]), "%d", ¤tConfig.Port)
}
}
if currentConfig != nil {
configs = append(configs, *currentConfig)
}
return configs
}
func expandPath(path string) string {
if strings.HasPrefix(path, "~/") {
home, _ := os.UserHomeDir()
return filepath.Join(home, path[2:])
}
return path
}
总结
manssh是一个简单实用的工具,可以帮助开发者高效管理SSH配置。无论是通过命令行直接使用,还是集成到Golang项目中,都能显著提升工作效率。对于需要频繁连接多个SSH服务器的开发者来说,这是一个非常值得尝试的工具。
如果你需要更复杂的功能,也可以基于上述代码进行扩展,比如添加配置验证、模板支持等功能。