He escrito un pequeño script de Powershell.

Utiliza .Sistema De Red.IO.StreamReader y del Sistema.IO.StreamWriter para leer y escribir datos desde/a el socket TCP.

Me gustaría conectar un socket telnet con estilo y enviar/recibir comandos.

Estoy tratando de leer las líneas con la ReadLine() método del Sistema.IO.StreamReader pero los datos desde el servidor tal vez no llegue a tiempo(?) o IDK. No estoy utilizando async comandos. Por favor me ayuda con eso!

Aquí está mi script:

$FTPServer = "localhost"
$FTPPort = "21"

$tcpConnection = New-Object System.Net.Sockets.TcpClient($FTPServer, $FTPPort)
$tcpStream = $tcpConnection.GetStream()
$reader = New-Object System.IO.StreamReader($tcpStream)
$writer = New-Object System.IO.StreamWriter($tcpStream)
$writer.AutoFlush = $true

while ($tcpConnection.Connected)
{
    while ($tcpStream.DataAvailable)
    {
        $reader.ReadLine()
    }

    if ($tcpConnection.Connected)
    {
        Write-Host -NoNewline "prompt> "
        $command = Read-Host

        if ($command -eq "escape")
        {
            break
        }

        $writer.WriteLine($command) | Out-Null
    }
}

$reader.Close()
$writer.Close()
$tcpConnection.Close()

Y aquí está el resultado:

PS C:\Windows\System32\WindowsPowerShell\v1.0> test.ps1
220 Microsoft FTP Service
prompt> user username
331 Password required
prompt> pass password
230-Directory has 58,145,996,800 bytes of disk space available.
prompt> 
230 User logged in.
500 Command not understood.
prompt> help
214-The following commands are recognized (* ==>'s unimplemented).
    ABOR 
    ACCT 
    ADAT *
    ALLO 
    APPE 
    AUTH 
    CCC 
    CDUP 
    CWD 
    DELE 
    ENC *
    EPRT 
    EPSV 
    FEAT 
    HELP 
    HOST 
    LANG 
    LIST 
    MDTM 
    MIC *
    MKD 
    MODE 
    NLST 
    NOOP 
    OPTS 
    PASS 
    PASV 
    PBSZ 
    PORT 
    PROT 
    PWD 
    QUIT 
    REIN 
    REST 
    RETR 
    RMD 
    RNFR 
    RNTO 
    SITE 
prompt> escape

PS C:\Windows\System32\WindowsPowerShell\v1.0>
  • Hay un ejemplo de aquí. Es la implementación de la IO uso de tampones. Creo que en el código, olvida el TCP de entrada mientras se espera la entrada del usuario. También este uno se implementa el uso de búferes.
InformationsquelleAutor gazsiazasz | 2015-04-20

3 Comentarios

  1. 5

    Trate de usar un buffer para leer en la respuesta. El código sería este:

    $tcpConnection = New-Object System.Net.Sockets.TcpClient($FTPServer, $FTPPort)
    $tcpStream = $tcpConnection.GetStream()
    $reader = New-Object System.IO.StreamReader($tcpStream)
    $writer = New-Object System.IO.StreamWriter($tcpStream)
    $writer.AutoFlush = $true
    
    $buffer = new-object System.Byte[] 1024
    $encoding = new-object System.Text.AsciiEncoding 
    
    while ($tcpConnection.Connected)
    {
        while ($tcpStream.DataAvailable)
        {
    
            $rawresponse = $reader.Read($buffer, 0, 1024)
            $response = $encoding.GetString($buffer, 0, $rawresponse)   
        }
    
        if ($tcpConnection.Connected)
        {
            Write-Host -NoNewline "prompt> "
            $command = Read-Host
    
            if ($command -eq "escape")
            {
                break
            }
    
            $writer.WriteLine($command) | Out-Null
        }
        start-sleep -Milliseconds 500
    }
    
    $reader.Close()
    $writer.Close()
    $tcpConnection.Close()
  2. 1

    Me encontré con que el NetworkStream DataAvailable propiedad no era suficiente, y que es necesario un pequeño empujón antes de entrar en el segundo bucle while. He probado esta y funciona como un encanto cuando se conecta a un dispositivo CISCO través de telnet.

    $routerAddress = "192.168.10.126"
    $port = "23"
    $tcp = New-Object System.Net.Sockets.TcpClient($routerAddress,$Port)
    $tcpstream = $tcp.GetStream()
    $reader = New-Object System.IO.StreamReader($tcpStream)
    $writer = New-Object System.IO.StreamWriter($tcpStream)
    $writer.AutoFlush = $true
    
    while ($tcp.Connected)
    {       
    write-host ([char]$reader.Read()) -NoNewline
    while(($reader.Peek() -ne -1) -or ($tcp.Available)){        
        write-host ([char]$reader.Read()) -NoNewline
    }
    if ($tcp.Connected)
    {
        Write-Host -NoNewline "_"
        $command = Read-Host
    
        if ($command -eq "escape")
        {
            break
        }
        $writer.WriteLine($command) | Out-Null
    }     
    }
    $reader.Close()
    $writer.Close()
    $tcp.Close()
  3. 0

    La razón por la que su línea de lectura se bloquea es probablemente porque usted no es la terminación de la cadena que se envía con ‘\n’.

    Código de cliente:

    [System.Net.Sockets.TcpClient] $tcpClient = [System.Net.Sockets.TcpClient]::new("localhost", "50001")
    
    $tcpStream = $tcpClient.GetStream()
    [System.IO.StreamReader] $reader = [System.IO.StreamReader]::new($tcpStream)
    [System.IO.StreamWriter] $writer = [System.IO.StreamWriter]::new($tcpStream)
    
    while ($tcpClient.Connected) {
        while ($tcpStream.DataAvailable) {
            $res = $reader.ReadLine()
            Write-Host $res
        }
    }

    Código del servidor (nodejs)

    const server = net.createServer(socket => {
        socket.write(
            "Testing !" +
                socket.remoteAddress +
                ":" +
                socket.remotePort +
                "\n"
        );
        socket.pipe(socket);
        console.log("Client connected!");
    });
    server.listen(50001, "localhost");

    sólo werks.

Dejar respuesta

Please enter your comment!
Please enter your name here