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指令,有一些额外的注意事项:

  1. list,add,update,delete命令添加-p(–path)标志以显示别名所在的文件路径
  2. 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)
}

注意事项

  1. 用户名和端口是可选的,默认使用当前登录用户名和端口22
  2. 使用-c设置更多配置选项
  3. -i xxx可以替代-c identityfile=xxx
  4. 使用-r标志重命名别名

更多关于golang轻松管理SSH别名配置的命令行工具插件manssh的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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", &currentConfig.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服务器的开发者来说,这是一个非常值得尝试的工具。

如果你需要更复杂的功能,也可以基于上述代码进行扩展,比如添加配置验证、模板支持等功能。

回到顶部