Golang UDP удаленная оболочка с паролем - PullRequest
0 голосов
/ 17 апреля 2019

Я делаю UDP-оболочку на Голанге (которую я нашел в Интернете), но с оговоркой, что сначала он запрашивает пароль.

Сравнение пароля выполнено (с помощью простогосравнение), но я хочу сделать так, чтобы, как только пользователь ввел пароль, оболочка открылась и больше не запрашивала пароль до тех пор, пока соединение не будет закрыто.

Поэтому моя идея заключалась в том, чтобы попроситьпароль и, если пароль правильный, для подключения обратно к хосту через другой порт (обратная оболочка), соединение происходит, но мне не разрешено писать в оболочке.

Вот мой код:

package main

import (
    "bufio"
    "strings"
    "fmt"
    "io"
    "log"
    "net"
    "os/exec"
    "syscall"
    "time"
)

func main() {
    udp_bind()
}


func udp_bind() {
    message := make([]byte, 2048)
    addr := net.UDPAddr{
        Port: 6666,
        IP:   net.ParseIP("127.0.0.1"),
    }
    ser, err := net.ListenUDP("udp", &addr)
    if err != nil {
        fmt.Printf("Some error %v\n", err)
        return
    }
    for {
        rlen, remoteaddr, err := ser.ReadFromUDP(message)
        if err != nil {
            fmt.Printf("Some error  %v", err)
            continue
        }
        data := strings.TrimSpace(string(message[:rlen]))
        fmt.Printf("received: %s from %s\n", data, remoteaddr)
        if data == "pwd" {
            go sendResponse(ser, remoteaddr, "From server: correct password ")
            go udp_reverse(remoteaddr)
        } else {
            go sendResponse(ser, remoteaddr, "From server: wrong password ")
        }

    }
}

func udp_reverse(host *net.UDPAddr) {
    obj := host.IP.String() + ":5555"
    remoteAddr, err := net.ResolveUDPAddr("udp", obj)
    conn, err := net.DialUDP("udp", nil, remoteAddr)
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("Established connection to %s \n", remoteAddr)
    log.Printf("Remote UDP address : %s \n", conn.RemoteAddr().String())
    log.Printf("Local UDP client address : %s \n", conn.LocalAddr().String())
    defer conn.Close()
    // receive message from server
    buffer := make([]byte, 1024)
    n, addr, err := conn.ReadFromUDP(buffer)

    fmt.Println("UDP Server : ", addr)
    fmt.Println("Received from UDP server : ", string(buffer[:n]))
}

Я запускаю сервер с go run main.go, соединяюсь с netcat с клиента с помощью ncat -4u -w1 localhost 6666 и настраиваю слушателя с клиента с помощью ncat localhost -vvul 5555.

Идея заключается вчто клиент подключается к серверу через netcat к порту 6666, вводит пароль, и, если пароль правильный, сервер подключается к клиенту через порт 5555 (ранее открытый в клиенте) и изКлиент может записывать данные на сервер.Если клиент закрывает соединение, обратное соединение прекращается, в то время как порт 6666 постоянно прослушивает сервер.

Но я делаю соединение bind, сервер прослушивает, я ввожу пароль, сервер отвечает, что онправильно, и он открывает обратное соединение через порт 5555, но я не могу ничего написать на настроенном netcat слушателе.

...