掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB クライアント から Linux サーバー への telnet ログインするには? (ID:89978)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
猫葉さま、通りすがりさま ご回答、参考意見など ありがとうございます。 試行錯誤の上、どうにか ログインプロンプトの受信までこぎつけました。 足りなかったのは < FF FD 18 IAC-DO-TerminalType 受信に対応したデータの送信のようです。 (Teratermのログにはありませんが・・^^;) 上記コマンドに > FF FB 18 IAC-WILL-TerminalType を送信することでログインまでサクサク進みました。^^ まだ別途問題がございますが、 こちらについては、別質問を立てさせていただき、 とりあえず、本件については解決としたいと思います。 ありがとうございました。 ↓↓↓↓ 修正した箇所を 関数ごとに転載します ↓↓↓↓ '******************************************************************* '** TCP 通信 : Telent ネゴシエートコマンドを受信する '** argCnt = -1 : 受信済のものすべてを読み込む '** argCnt <>-1 : 指定バイトだけ読み込む '******************************************************************* Function TelnetGetData(ByRef argStr As String, ByVal argCnt As Long) As Integer On Error GoTo ErrorHandler Dim bytTmp() As Byte Dim intIndex As Integer '** リターン正常を設定 TelnetGetData = 0 If argCnt = -1 Then Call Me.tcpClient.GetData(bytTmp, vbByte + vbArray) Else Call Me.tcpClient.GetData(bytTmp, vbByte + vbArray, argCnt) End If Call HexConvStr(bytTmp, argStr) Exit Function ErrorHandler: Call ErrorReport(ERROR_TRAPPED, Err.Number, Err.Description) '** リターン異常を設定 TelnetGetData = -1 Exit Function End Function '*********************************************************** '** TCP 通信 : Telent ネゴシエートコマンドを1個ずつ読む '*********************************************************** Private Function TelnetReadCmd() As String On Error GoTo ErrorHandler ' Dim bytTmp(128) As Byte Dim intRc As Integer Dim strCmd As String Dim strTmp As String Dim intIndex As Integer Dim bytUser(64) As Byte Dim bytPass(64) As Byte TelnetReadCmd = "" mStrCmd = "" While Len(mStrCmd) < 6 '** mStrCmd はグローバル変数 intRc = TelnetGetData(strTmp, 3) '** 16進モード If intRc <> 0 Then Exit Function End If If Len(strTmp) <= 0 Then Exit Function End If mStrCmd = mStrCmd & strTmp Wend '** 受信データが Telnet コマンドの場合 strTmp = Mid(mStrCmd, 1, 4) If strTmp = "FFFB" Or strTmp = "FFFD" Or strTmp = "FFFE" Then ' FFxxxx TelnetReadCmd = Mid(mStrCmd, 1, 6) Exit Function ElseIf strTmp = "FFFA" Then ' SB 可変長。SE(FFF0) までがコマンド While InStr(mStrCmd, "FFF0") <= 0 intRc = TelnetGetData(strTmp, 1) ' 16進モード If intRc <> 0 Then Exit Function End If mStrCmd = mStrCmd & strTmp Wend intIndex = InStr(mStrCmd, "FFF0") TelnetReadCmd = Mid(mStrCmd, 1, 6) mStrCmd = Mid(mStrCmd, intIndex + 4) '** 受信データが Telnet コマンド以外の場合 Else intRc = TelnetGetData(strTmp, -1) ' 16進モード mStrCmd = mStrCmd & strTmp '** 「ログインユーザー入力プロンプト」が表示されたら If InStr(mStrCmd, "6C6F67696E3A") > 0 Then '** ログインユーザーを送信する bytUser(1) = CLng("&H72") '** 「r」 bytUser(2) = CLng("&H6F") '** 「o」 bytUser(3) = CLng("&H6F") '** 「o」 bytUser(4) = CLng("&H74") '** 「t」 bytUser(5) = CLng("&H0D") '** 「<CR>」 Call tcpClient.SendData(bytUser) End If End If Exit Function ErrorHandler: Call ErrorReport(ERROR_TRAPPED, Err.Number, Err.Description) End Function '*********************************************************** '** TCP 通信 : '** Telent ネゴシエートコマンドを1個ずつ読む '** および、対応した データを送信する '*********************************************************** Private Sub TelnetRecvData() On Error GoTo ErrorHandler Dim strCmd As String Dim strTmp As String Dim bytCmd(128) As Byte Do While 1 ' telnet ネゴシエート開始 strCmd = TelnetReadCmd() ' 16進モードでコマンドを受信 Select Case strCmd Case "FFFD20", "FFFD23", "FFFD27", "FFFD24", "FFFE23", "FFFE27", "FFFE24", "FFFD01", "FFFD21" Call StrConvHex("FFFC" & Mid(strCmd, 5), bytCmd) Call tcpClient.SendData(bytCmd) Case "FFFD18", "FFFD03" Call StrConvHex("FFFB" & Mid(strCmd, 5), bytCmd) Call tcpClient.SendData(bytCmd) Case "FFFB01" Call StrConvHex("FFFD" & Mid(strCmd, 5), bytCmd) Call tcpClient.SendData(bytCmd) Case "FFFB03" Call StrConvHex("FFFD" & Mid(strCmd, 5), bytCmd) Call tcpClient.SendData(bytCmd) Case "FFFB05" Call StrConvHex("FFFE" & Mid(strCmd, 5), bytCmd) Call tcpClient.SendData(bytCmd) Case "FFFD1F" ' IAC SB Window Call StrConvHex("FFFA1F00500018FFF0", bytCmd) Call tcpClient.SendData(bytCmd) ' window size 80x24 'Call StrConvHex("FFFA1F00840020FFF0", bytCmd) 'Call tcpClient.SendData(bytCmd) ' window size 132x32 Case "FFFA18" ' IAC SB Terminal-Type Call StrConvHex("FFFA18007674313030FFF0", bytCmd) Call tcpClient.SendData(bytCmd) ' IAC SB Terminal-Type vt100 ' Case "FFFE01" ' コマンド終了 ' Exit Do Case "" ' コマンド終了 Exit Do Case Else Call MsgBox("<" & strCmd, vbOKOnly + vbInformation, "RecvMes") End Select Loop Exit Sub ErrorHandler: Call ErrorReport(ERROR_TRAPPED, Err.Number, Err.Description) End Sub
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.