ios – Telnet获取空输出并且没有登录密码

ios – Telnet获取空输出并且没有登录密码,第1张

概述我尝试编写 Swift片段来向Telnet发送命令,但我需要先登录. 在OSX上我生成了一个Telnet服务:launchctl load -F /System/Library/LaunchDaemons/telnet.plist.之后我能够从其他计算机连接到IP:XXX.XXX.X.XXX端口23. 例如,从Windows 7: telnet XXX.XXX.X.XXX 23.....Dar 我尝试编写 Swift片段来向Telnet发送命令,但我需要先登录.

在OSX上我生成了一个Telnet服务:launchctl load -F /System/library/launchdaemons/telnet.pList.之后我能够从其他计算机连接到IP:XXX.XXX.X.XXX端口23.

例如,从windows 7:

telnet XXX.XXX.X.XXX 23.....Darwin/BSD (fess.local) (ttys009)login: snaggsPassword:xxxxxxsnaggs:~ lur$

在命令行中,Telnet要求我输入用户名和密码.之后我可以运行任何linux命令.到现在为止还挺好.

我为AndroID编写了Telnet模块,因此OSX Telnet服务正常运行.这意味着我看到登录:和密码:输出,所以我能够处理它.

现在我坚持使用iOS Swift,我用Googled找到了非常好的解决方案,应该适用于我的情况:

> receiving-data-from-nsinputstream-in-swift
> using-sockets-in-swift-like-in-java

所以我写了我的家庭作品:

class TelnetClIEnt : NSObject,NsstreamDelegate{    private var inputStream: NSinputStream!    private var outputStream: NSOutputStream!func initNetworkCommunication(){        let host : CFString = "XXX.XXX.X.XXX"        let port : UInt32 = 23        var readstream : Unmanaged<CFReadStream>?        var writestream : Unmanaged<CFWriteStream>?        CFStreamCreatePairWithSocketToHost(kcfAllocatorDefault,host,port,&readstream,&writestream) //        var _inputStream: NSinputStream?  //        var _outputStream: NSOutputStream?  //        Nsstream.getStreamsToHostWithname("XXX.XXX.X.XXX",port: 23,inputStream: &_inputStream,outputStream: &_outputStream)  //        self.inputStream = _inputStream!  //        self.outputStream = _outputStream!        self.inputStream = readstream!.takeRetainedValue()        self.outputStream = writestream!.takeRetainedValue()        self.inputStream.delegate = self        self.outputStream.delegate = self        self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(),forMode: NSDefaultRunLoopMode)        self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(),forMode: NSDefaultRunLoopMode)        self.inputStream.open()        self.outputStream.open()    }func sendMessage(message:String){    let data: NSData = message.dataUsingEnCoding(NSASCIIStringEnCoding,allowLossyConversion: true)! //NSUTF8StringEnCoding    let stream: NSinputStream = NSinputStream(data: data)        var buffer = [UInt8](count: 8,repeatedValue: 0)        stream.open()        if stream.hasBytesAvailable {          let result :Int = stream.read(&buffer,maxLength: buffer.count)        }        self.outputStream.write(&buffer,maxLength: buffer.count)        println("wrote to Server: \(message)")    }}

来自NsstreamDelegate的流回调覆盖方法:

func stream(aStream: Nsstream,handleEvent eventCode: NsstreamEvent) {        switch (eventCode){        case NsstreamEvent.ErrorOccurred:            NSLog("ErrorOccurred")            break        case NsstreamEvent.EndEncountered:            NSLog("EndEncountered")            break        case NsstreamEvent.None:            NSLog("None")            break        case NsstreamEvent.HasBytesAvailable:            NSLog("HasBytesAvaible")            // ... NEVER ENTERS HERE            var buffer = [UInt8](count: 4096,repeatedValue: 0)        if ( aStream == self.inputStream){            while (self.inputStream.hasBytesAvailable){                var len = self.inputStream.read(&buffer,maxLength: buffer.count)                if(len > 0){                    var output = Nsstring(bytes: &buffer,length: buffer.count,enCoding: NSUTF8StringEnCoding)                    if (output != ""){                        NSLog("server saID: %@",output!)                    }                }            }        }            break        //case NsstreamEvent.allZeros:        //    NSLog("allZeros")        //     break        case NsstreamEvent.OpenCompleted:            NSLog("OpenCompleted") // <-- called on initialisation            break        case NsstreamEvent.HasspaceAvailable:            NSLog("HasspaceAvailable")            break        default:             NSLog("default")             break        }    }

首先,当我尝试调用initNetworkCommunication()时没有任何反应.我希望调用func流或者我错了?它应该是NsstreamEvent.HasBytesAvailable状态还是我错了?

当我调用sendMessage(“snags”)时,我得到流中的响应,该响应属于NsstreamEvent.HasspaceAvailable案例.这是什么意思?

我的预期结果:在连接上我应该登录:输出但什么也得不到.

解决方法 你几乎完成了关于NsstreamDelegate,但你需要知道’rfc 854 telnet协议规范’.

在通信之前,需要在主机和代码之间进行telnet协商.

在你的回调’NsstreamEvent.HasBytesAvailable’的情况下,转储你的缓冲区,转换为NSData,就像

NSLog( "%@",NSData(bytes: buffer,length: len) )

你会得到

<fffd18ff fd20fffd 23fffd27 fffd24>

这是telnet协商,你必须根据规范做出回应.

第二个问题.

NsstreamEvent.HasspaceAvailable意味着’一个布尔值,指示是否可以写入接收器.’

在通过NSOutputStream发送消息之前,必须在“sendMessage”方法中检查NSOutputStream的hasspaceAvailable属性.

或者使用队列来发送数据并在NsstreamEvent.HasBytesAvailable上发送它,这是我的建议.

看到这个答案.
How to use NSInputStream and NSOutputStream

总结

以上是内存溢出为你收集整理的ios – Telnet获取空输出并且没有登录/密码全部内容,希望文章能够帮你解决ios – Telnet获取空输出并且没有登录/密码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1104133.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存