Telnet erhält leere Ausgabe und Login / Passwort fehlt

8

Ich versuche Swift-Snippets zu schreiben, um Befehle an Telnet zu senden, aber ich muss mich zuerst einloggen.

Unter OSX habe ich einen Telnet-Dienst generiert: launchctl load -F /System/Library/LaunchDaemons/telnet.plist . Danach kann ich mich von anderen Computern mit IP verbinden: XXX.XXX.X.XXX port 23 .

Zum Beispiel von Windows 7:

%Vor%

In der Befehlszeile fragt mich Telnet nach dem Benutzer und dem Passwort. Danach kann ich alle Linux-Befehle ausführen. So weit so gut.

Ich habe das Telnet-Modul für Android geschrieben, damit der OSX-Telnet-Dienst ordnungsgemäß funktioniert. Das bedeutet, dass ich login: und password: Ausgaben sehe, damit ich damit umgehen kann.

Jetzt bin ich mit iOS Swift festgefahren, ich habe gegoogelt und eine ziemlich gute Lösung gefunden, die in meinem Fall funktionieren sollte:

Also habe ich meine Hausaufgaben geschrieben:

%Vor%

Stream Callback Override-Methode von NSStreamDelegate :

%Vor%

Zuerst passiert nichts, wenn ich initNetworkCommunication() aufrufen möchte. Ich erwarte Aufruf von func stream oder ich liege falsch? . Es sollte NSStreamEvent.HasBytesAvailable state sein oder ich liege falsch?

Wenn ich sendMessage("snags") aufruft, erhalte ich eine Antwort in stream , die auf case NSStreamEvent.HasSpaceAvailable fällt. Was bedeutet das?

Meine erwarteten Ergebnisse: bei connect sollte ich login: output bekommen aber nichts bekommen.

    
snaggs 12.09.2015, 14:40
quelle

1 Antwort

-1

Sie sind fast fertig mit NStreamDelegate, aber Sie müssen 'rfc 854 telnet protocol specification' kennen.

Vorhergehende Kommunikation erfordert eine Telnet-Verhandlung zwischen Host und Ihrem Code.

Lassen Sie in Ihrem Callback-Fall "NSStreamEvent.HasBytesAvailable" Ihren Pufferspeicher frei und konvertieren Sie ihn in NSData, wie

%Vor%

Sie werden

erhalten %Vor%

Dies ist die Telnet-Aushandlung, die Sie entsprechend der Spezifikation ausführen müssen.

2. Frage.

NStreamEvent.HasSpaceAvailable bedeutet, dass 'Ein boolescher Wert, der angibt, ob der Empfänger beschrieben werden kann.'

Bevor Sie eine Nachricht über NSOutputStream senden, müssen Sie die hasSpaceAvailable-Eigenschaft von NSOutputStream in Ihrer Methode "sendMessage" überprüfen.

Oder verwenden Sie die Warteschlange für die zu sendenden Daten und senden Sie sie, wenn sie auf NStreamEvent.HasBytesAvailable fallen, das ist meine Empfehlung.

Siehe diese Antwort. Verwendung von NSInputStream und NSOutputStream

    
Satachito 18.09.2015 08:26
quelle

Tags und Links