golang最简单的server和client

client端

package main
import (
	"bytes"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)
func main() {
	request_url := "http://localhost:8080/"
	// 要 POST的 参数
	form := url.Values{
		"name": {"xiaoming"},
		"address":  {"beijing"},
		"subject":  {"Hello"},
		"from":     {"china"},
	}
	// func Post(url string, bodyType string, body io.Reader) (resp *Response, err error) {
	//对form进行编码
	body := bytes.NewBufferString(form.Encode())
	rsp, err := http.Post(request_url, "application/x-www-form-urlencoded", body)
	if err != nil {
		panic(err)
	}
	defer rsp.Body.Close()
	body_byte, err := ioutil.ReadAll(rsp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(body_byte))
}

 

server端

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", ExampleHandler)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

func ExampleHandler(w http.ResponseWriter, r *http.Request) {

    // Double check it's a post request being made
    if r.Method != http.MethodPost {
        w.WriteHeader(http.StatusMethodNotAllowed)
        fmt.Fprintf(w, "invalid_http_method")
        return
    }

    // Must call ParseForm() before working with data
    r.ParseForm()

    // Log all data. Form is a map[]
    log.Println(r.Form)

    // Print the data back. We can use Form.Get() or Form["name"][0]
    fmt.Fprintf(w, "Hello "+r.Form.Get("name"))
}


//可以直接命令行请求

//curl -X POST http://localhost:8080 -d "name=zhangsan"

 

<think>嗯,用户之前问过关于Python的subprocess模块,现在又问Go语言中的SSH相关的内容。看来他们可能在开发需要执行外部命令或与远程服务器交互的应用。先前的回答详细介绍了subprocess,所以这次需要同样详细地讲解Go中的SSH实现。 用户可能的需求是什么?他们可能想用Go编写自动化脚本,管理远程服务器,或者进行部署工具的开发。需要知道如何在Go中建立SSH连接、执行命令、传输文件,以及处理认证错误。 用户可能不太熟悉Go的SSH包,或者想了解有哪些库可用。需要比较标准库第三方库,比如golang.org/x/crypto/ssh第三方如github.com/pkg/sftp。同时,他们可能关心安全性,比如密钥认证错误处理。 要注意用户可能的背景,他们可能已经了解Python的相关方法,现在转向Go,所以需要解释两者的不同。例如,Go的并发模型在处理多个SSH会话时可能更有优势。 需要提供代码示例,这样用户可以直接参考如何建立连接、执行命令。同时,提醒常见问题,如超时设置、密钥格式、权限问题,以及不同服务器的兼容性。 另外,用户可能对实际应用场景感兴趣,比如批量执行命令、文件传输、隧道代理等,可以简要举例说明,帮助他们理解如何应用这些技术。 最后,确保回答结构清晰,分点讲解核心概念、库、示例、注意事项应用场景,保持与之前回答风格一致,便于用户比较消化信息。</think>Go 语言通过标准库第三方包提供了 SSH 客户端服务器的实现,可以用于远程执行命令、文件传输(SFTP)、端口转发等操作。以下是 Go 中 SSH 相关开发的核心知识点实践方法: --- ### **核心库** 1. **标准库 `golang.org/x/crypto/ssh`** Go 官方维护的 SSH 协议实现,支持客户端服务端开发,功能包括: - 认证(密码、密钥、代理等) - 会话管理(执行命令、分配终端) - 端口转发(本地/远程隧道) - SFTP(需结合第三方包如 `github.com/pkg/sftp`) 2. **第三方库** - `github.com/pkg/sftp`:SFTP 客户端实现,与 `ssh` 库配合使用。 - `github.com/gliderlabs/ssh`:简化 SSH 服务器开发。 --- ### **SSH 客户端示例** #### 1. 基础连接与命令执行 ```go package main import ( "fmt" "log" "golang.org/x/crypto/ssh" ) func main() { // 配置 SSH 客户端 config := &ssh.ClientConfig{ User: "username", Auth: []ssh.AuthMethod{ ssh.Password("your_password"), // 或使用密钥认证: // ssh.PublicKeys(privateKey), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境需验证 HostKey } // 建立连接 client, err := ssh.Dial("tcp", "host:22", config) if err != nil { log.Fatal("连接失败:", err) } defer client.Close() // 创建会话 session, err := client.NewSession() if err != nil { log.Fatal("创建会话失败:", err) } defer session.Close() // 执行命令并获取输出 output, err := session.CombinedOutput("ls -l") if err != nil { log.Fatal("命令执行失败:", err) } fmt.Println("输出:\n", string(output)) } ``` #### 2. 使用私钥认证 ```go import ( "golang.org/x/crypto/ssh" "io/ioutil" ) func loadPrivateKey(path string) (ssh.AuthMethod, error) { key, err := ioutil.ReadFile(path) if err != nil { return nil, err } signer, err := ssh.ParsePrivateKey(key) if err != nil { return nil, err } return ssh.PublicKeys(signer), nil } // 在 ClientConfig 中使用: privateKeyAuth, _ := loadPrivateKey("/path/to/private_key") config.Auth = []ssh.AuthMethod{privateKeyAuth} ``` --- ### **SFTP 文件传输** 结合 `github.com/pkg/sftp` 实现文件上传/下载: ```go import ( "github.com/pkg/sftp" ) func sftpExample(client *ssh.Client) { // 创建 SFTP 客户端 sftpClient, err := sftp.NewClient(client) if err != nil { log.Fatal(err) } defer sftpClient.Close() // 上传文件 localFile, _ := os.Open("local.txt") remoteFile, _ := sftpClient.Create("remote.txt") io.Copy(remoteFile, localFile) // 下载文件 remoteFile, _ = sftpClient.Open("remote.txt") localFile, _ = os.Create("downloaded.txt") io.Copy(localFile, remoteFile) } ``` --- ### **SSH 服务器示例** 使用 `golang.org/x/crypto/ssh` 实现简单 SSH 服务器: ```go package main import ( "log" "net" "golang.org/x/crypto/ssh" ) func main() { config := &ssh.ServerConfig{ PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) { if conn.User() == "username" && string(password) == "password" { return nil, nil // 认证成功 } return nil, fmt.Errorf("认证失败") }, } // 加载主机密钥 privateKeyBytes, _ := ioutil.ReadFile("host_key") privateKey, _ := ssh.ParsePrivateKey(privateKeyBytes) config.AddHostKey(privateKey) // 监听端口 listener, _ := net.Listen("tcp", ":2222") defer listener.Close() for { conn, _ := listener.Accept() _, chans, reqs, _ := ssh.NewServerConn(conn, config) go ssh.DiscardRequests(reqs) go handleChannels(chans) } } func handleChannels(chans <-chan ssh.NewChannel) { for newChan := range chans { if newChan.ChannelType() != "session" { newChan.Reject(ssh.UnknownChannelType, "未知通道类型") continue } channel, _, _ := newChan.Accept() defer channel.Close() // 处理命令或 Shell channel.Write([]byte("Hello SSH!\n")) } } ``` --- ### **注意事项** 1. **安全性** - 避免硬编码密码,优先使用密钥认证。 - 生产环境需验证 `HostKey`(禁用 `InsecureIgnoreHostKey`)。 - 使用加密算法时注意兼容性(如 RSA/SHA-256)。 2. **超时与错误处理** - 为连接会话设置超时(`context` 包或 `net.DialTimeout`)。 - 处理网络中断、认证失败等异常。 3. **并发** - Go 的并发模型适合处理多 SSH 连接,但需注意资源释放(如 `defer` 关闭连接)。 4. **跨平台** - 某些命令(如 `ls`)在 Windows Linux 下行为不同。 --- ### **常见应用场景** 1. **批量远程管理** 在多台服务器上执行命令(结合 Goroutine 实现并行)。 2. **自动化部署** 上传文件(SFTP)并执行安装脚本。 3. **隧道与代理** 通过 SSH 建立加密隧道(端口转发)。 4. **CI/CD 集成** 在流水线中通过 SSH 触发远程操作。 --- Go 的 SSH 实现兼具灵活性性能,适合构建高并发、安全的远程管理工具。开发时需注意安全实践错误处理的完备性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扬子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值