Я делаю 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
слушателе.