Golang SSH源端口

Golang SSH源端口,go,ssh,proxy,openssh,netcat,Go,Ssh,Proxy,Openssh,Netcat,我需要使用静态源端口。我们将基于此源端口执行IPTables重定向规则。因此,静态源端口用作标识符,因为多个连接挂起到服务器上的同一目标端口。把穷人的TCP多路复用看作是一个laiptables 我遵循了Golang示例并拼凑了一些混乱的代码。我不是程序员 ssh.dial函数处理了很多问题,当您使用net.dial以及ssh.NewClientConn、ssh.NewClient和ssh.NewSession时,这一点就显而易见了 我发现OpenSSH配置选项中没有类似的ProxyComman

我需要使用静态源端口。我们将基于此源端口执行IPTables重定向规则。因此,静态源端口用作标识符,因为多个连接挂起到服务器上的同一目标端口。把穷人的TCP多路复用看作是一个la
iptables

我遵循了Golang示例并拼凑了一些混乱的代码。我不是程序员

ssh.dial
函数处理了很多问题,当您使用
net.dial
以及
ssh.NewClientConn
ssh.NewClient
ssh.NewSession
时,这一点就显而易见了

我发现OpenSSH配置选项中没有类似的
ProxyCommand
。我使用的是:

ssh -o ProxyCommand="ncat --source-port %h %p" ...
以实现Bash脚本中的需求

另外,我为一个加载的问题道歉,但是
ncat
等。请允许我立即重用源端口。 而Golang SSH在Arch Linux上会留出
等待时间0 0 192.168.99.53:31337 192.168.99.7:22
60秒。 显然,随后绑定到所述源端口会导致错误

请输入以下代码:

  • 我省略了
    示例hostkeycheck
    功能
  • 我知道
    sClient.Listen
    是一个拙劣的尝试
  • 服务器上未显示远程端口转发
  • 我假设现在需要更多的代码来处理通道等
  • shell命令不起作用,文件显示在
    /tmp/

谢谢。

你好,罗伯特,你看到了吗?“这会有帮助吗?”布莱克格林:我以前读过那篇文章。不是我要找的,谢谢。嗨,罗伯特,你看到了吗?“这会有帮助吗?”布莱克格林:我以前读过那篇文章。不是我想要的,谢谢。
package main

import (
  "bytes"
  "log"
  "net"
  "os"
  "bufio"
  "strings"
  "path/filepath"

  "golang.org/x/crypto/ssh"
)

func main() {

  hostKey, err := ExampleHostKeyCheck()
  conf := &ssh.ClientConfig{
    User: "robert",
      Auth: []ssh.AuthMethod{
      ssh.Password("password"),
    },
    HostKeyCallback: ssh.FixedHostKey(hostKey),
  }

  server, _ := net.ResolveTCPAddr("tcp", "centos7.ephemeric.local:22")
  client, _ := net.ResolveTCPAddr("tcp", ":31337")
  cc, err := net.DialTCP("tcp", client, server)
  //cc, err := net.DialTCP("tcp", nil, server)

  if err != nil {
    log.Fatalf("%s", err)
  }

  defer cc.Close()

  conn, chans, reqs, err := ssh.NewClientConn(cc, "", conf)
    if err != nil {
    log.Fatalf("%s", err)
    }
  defer conn.Close()

  // https://stackoverflow.com/questions/35906991/go-x-crypto-ssh-how-to-establish-ssh-connection-to-private-instance-over-a-ba
  sClient := ssh.NewClient(conn, chans, reqs)
    if err != nil {
    log.Fatalf("%s", err)
    }
  defer sClient.Close()

  session, err := sClient.NewSession()
  if err != nil {
    log.Fatalf("%s", err)
  }
  defer session.Close()

    sListen, err := sClient.Listen("tcp", "127.0.0.1:31337")
    if err != nil {
        log.Fatal("unable to register tcp forward: ", err)
    }
    defer sListen.Close()

  var b bytes.Buffer  // import "bytes"
  session.Stdout = &b // get output
  // You can also pass what gets input to the stdin, allowing you to pipe content from client to server session.Stdin = bytes.NewBufferString("MyInput").
  err = session.Run("echo slobwashere >>/tmp/slobwashere; ls")
}