@@ -1,251 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"net"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh"
|
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// 生成SSH密钥对
|
|
||||||
privateKeyBytes, err := os.ReadFile("../.ssh/id_rsa")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("无法读取私钥文件:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
privateKey, err := ssh.ParsePrivateKey(privateKeyBytes)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("无法解析私钥:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 配置SSH服务器
|
|
||||||
config := &ssh.ServerConfig{
|
|
||||||
PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) {
|
|
||||||
// 这里可以进行密码验证逻辑,例如检查用户名和密码是否匹配
|
|
||||||
if conn.User() == "admin" && string(password) == "123456" {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("密码错误")
|
|
||||||
},
|
|
||||||
PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
|
|
||||||
// 这里可以进行公钥验证逻辑,例如检查用户的公钥是否在允许的公钥列表中
|
|
||||||
return nil, fmt.Errorf("公钥验证失败")
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
config.AddHostKey(privateKey)
|
|
||||||
|
|
||||||
// 启动SSH服务器
|
|
||||||
listener, err := net.Listen("tcp", "192.168.2.119:2222")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("无法监听端口:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Println("SSH服务器已启动,监听端口:2222")
|
|
||||||
|
|
||||||
for {
|
|
||||||
conn, err := listener.Accept()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("无法接受连接:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
go handleSSHConnection(conn, config)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleSSHConnection(conn net.Conn, config *ssh.ServerConfig) {
|
|
||||||
// SSH握手
|
|
||||||
sshConn, chans, reqs, err := ssh.NewServerConn(conn, config)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("SSH握手失败:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("SSH连接已建立,客户端版本:%s,用户:%s", sshConn.ClientVersion(), sshConn.User())
|
|
||||||
|
|
||||||
// 处理SSH请求
|
|
||||||
go ssh.DiscardRequests(reqs)
|
|
||||||
|
|
||||||
// 处理SSH通道
|
|
||||||
for newChannel := range chans {
|
|
||||||
if newChannel.ChannelType() != "session" {
|
|
||||||
newChannel.Reject(ssh.UnknownChannelType, "不支持的通道类型")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
channel, requests, err := newChannel.Accept()
|
|
||||||
if err != nil {
|
|
||||||
log.Println("无法接受通道:", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
go handleSSHChannel(channel, requests)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleSSHChannel(channel ssh.Channel, requests <-chan *ssh.Request) {
|
|
||||||
for req := range requests {
|
|
||||||
switch req.Type {
|
|
||||||
case "exec":
|
|
||||||
// 执行远程命令
|
|
||||||
cmd := exec.Command("cmd", "/c", strings.TrimSpace(string(req.Payload)))
|
|
||||||
cmd.Stdin = channel
|
|
||||||
cmd.Stdout = channel
|
|
||||||
cmd.Stderr = channel.Stderr()
|
|
||||||
log.Println("cmd:", strings.TrimSpace(string(req.Payload)))
|
|
||||||
|
|
||||||
err := cmd.Run()
|
|
||||||
if err != nil {
|
|
||||||
log.Println("无法执行命令:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
channel.SendRequest("exit-status", false, []byte{0, 0, 0, 0})
|
|
||||||
channel.Close()
|
|
||||||
case "shell":
|
|
||||||
// // 处理交互式shell会话
|
|
||||||
// // 在这里添加您的处理逻辑,例如启动一个shell进程并将其连接到channel
|
|
||||||
// // 请注意,处理交互式shell会话需要更复杂的逻辑,您可能需要使用类似于pty包来处理终端相关的操作
|
|
||||||
// channel.Write([]byte("交互式shell会话已启动\n"))
|
|
||||||
// channel.Close()
|
|
||||||
handleSSHShell(channel)
|
|
||||||
default:
|
|
||||||
req.Reply(false, nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleSSHShell(channel ssh.Channel) {
|
|
||||||
defer channel.Close()
|
|
||||||
|
|
||||||
// 检查通道是否支持终端
|
|
||||||
term := terminal.NewTerminal(channel, "> ")
|
|
||||||
|
|
||||||
// 启动交互式shell会话
|
|
||||||
for {
|
|
||||||
line, err := term.ReadLine()
|
|
||||||
if err != nil {
|
|
||||||
if err == io.EOF {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
log.Println("Failed to read line: ", err)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// 在这里处理输入的命令
|
|
||||||
// 您可以根据需要添加更多的逻辑
|
|
||||||
if strings.TrimSpace(line) == "exit" {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
response := fmt.Sprintf("You entered: %s\n", line)
|
|
||||||
term.Write([]byte(response))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// func main() {
|
|
||||||
// // 读取 SSH 私钥文件
|
|
||||||
// privateKeyBytes, err := os.ReadFile("../.ssh/private_key.pem")
|
|
||||||
// if err != nil {
|
|
||||||
// log.Fatalf("Failed to load private key: %v", err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 解析私钥
|
|
||||||
// privateKey, err := ssh.ParsePrivateKey(privateKeyBytes)
|
|
||||||
// if err != nil {
|
|
||||||
// log.Fatalf("Failed to parse private key: %v", err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 配置 SSH 服务器
|
|
||||||
// config := &ssh.ServerConfig{
|
|
||||||
// PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) {
|
|
||||||
// // 在此处验证密码
|
|
||||||
// if string(password) == "123456" {
|
|
||||||
// return nil, nil
|
|
||||||
// }
|
|
||||||
// return nil, fmt.Errorf("password rejected for %s", conn.User())
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 添加私钥到配置
|
|
||||||
// config.AddHostKey(privateKey)
|
|
||||||
|
|
||||||
// // 启动 SSH 服务器
|
|
||||||
// listener, err := net.Listen("tcp", "0.0.0.0:2222")
|
|
||||||
// if err != nil {
|
|
||||||
// log.Fatalf("Failed to listen on 2222: %v", err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// log.Println("SSH server listening on 0.0.0.0:2222")
|
|
||||||
|
|
||||||
// for {
|
|
||||||
// conn, err := listener.Accept()
|
|
||||||
// if err != nil {
|
|
||||||
// log.Fatalf("Failed to accept incoming connection: %v", err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 处理 SSH 连接
|
|
||||||
// go func() {
|
|
||||||
// sshConn, chans, reqs, err := ssh.NewServerConn(conn, config)
|
|
||||||
// if err != nil {
|
|
||||||
// log.Printf("Failed to handshake: %v", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
|
|
||||||
// log.Printf("SSH connection established from %s", sshConn.RemoteAddr())
|
|
||||||
|
|
||||||
// // 处理 SSH 请求
|
|
||||||
// go ssh.DiscardRequests(reqs)
|
|
||||||
|
|
||||||
// // 处理 SSH 通道
|
|
||||||
// for newChannel := range chans {
|
|
||||||
// if newChannel.ChannelType() != "session" {
|
|
||||||
// newChannel.Reject(ssh.UnknownChannelType, "unknown channel type")
|
|
||||||
// continue
|
|
||||||
// }
|
|
||||||
|
|
||||||
// channel, requests, err := newChannel.Accept()
|
|
||||||
// if err != nil {
|
|
||||||
// log.Printf("Failed to accept channel: %v", err)
|
|
||||||
// continue
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 处理 SSH 会话
|
|
||||||
// go func(in <-chan *ssh.Request) {
|
|
||||||
// for req := range in {
|
|
||||||
// log.Printf("Received out-of-band request: %v", string(req))
|
|
||||||
// }
|
|
||||||
// }(requests)
|
|
||||||
|
|
||||||
// // 示例:执行远程命令
|
|
||||||
// go func() {
|
|
||||||
// defer channel.Close()
|
|
||||||
|
|
||||||
// command := "echo 'Hello, SSH!'"
|
|
||||||
// output, err := execCommand(command)
|
|
||||||
// if err != nil {
|
|
||||||
// log.Printf("Failed to execute command: %v", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
|
|
||||||
// _, err = channel.Write([]byte(output))
|
|
||||||
// if err != nil {
|
|
||||||
// log.Printf("Failed to write output: %v", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// }()
|
|
||||||
// }
|
|
||||||
// }()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func execCommand(command string) (string, error) {
|
|
||||||
// // 在此处执行远程命令并返回结果
|
|
||||||
// return "hello ssh", nil
|
|
||||||
// }
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/gliderlabs/ssh"
|
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
|
||||||
)
|
|
||||||
|
|
||||||
// func main() {
|
|
||||||
// ssh.Handle(func(s ssh.Session) {
|
|
||||||
// io.WriteString(s, "Hello world\n")
|
|
||||||
// })
|
|
||||||
|
|
||||||
// log.Fatal(ssh.ListenAndServe(":2222", nil, ssh.HostKeyFile("../.ssh/id_rsa")))
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func main() {
|
|
||||||
// ssh.ListenAndServe(":2222", nil, ssh.HostKeyFile("../.ssh/id_rsa"),
|
|
||||||
// ssh.PasswordAuth(func(ctx ssh.Context, pass string) bool {
|
|
||||||
// return pass == "123456"
|
|
||||||
// }),
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
ssh.Handle(func(s ssh.Session) {
|
|
||||||
|
|
||||||
term := terminal.NewTerminal(s, "> ")
|
|
||||||
for {
|
|
||||||
line, err := term.ReadLine()
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
// 在这里处理输入的命令
|
|
||||||
// 您可以根据需要添加更多的逻辑
|
|
||||||
if strings.TrimSpace(line) == "exit" {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Println(line)
|
|
||||||
if line != "" {
|
|
||||||
term.Write(append([]byte(line), '\n'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Println("terminal closed")
|
|
||||||
})
|
|
||||||
|
|
||||||
log.Println("starting ssh server on port 2222...")
|
|
||||||
ssh.ListenAndServe(":2222", nil, ssh.HostKeyFile("../.ssh/id_rsa"),
|
|
||||||
ssh.PasswordAuth(func(ctx ssh.Context, pass string) bool {
|
|
||||||
return pass == "123456"
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Handle(sess ssh.Session) {
|
|
||||||
term := terminal.NewTerminal(sess, "> ")
|
|
||||||
for {
|
|
||||||
line, err := term.ReadLine()
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
// 在这里处理输入的命令
|
|
||||||
// 您可以根据需要添加更多的逻辑
|
|
||||||
if strings.TrimSpace(line) == "exit" {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Println(line)
|
|
||||||
if line != "" {
|
|
||||||
term.Write(append([]byte(line), '\n'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Println("terminal closed")
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user