0

我有一台连接到我的机器(本地到我的电脑)的目标机器(基于 *nix)。我想在这个目标上执行一些命令。

所以,我正在使用 Java 套接字来实现相同的目的。

socket = new Socket("100.200.400.300", 23, null, 0 );
                         remote            local 

在这里,在上述行之后 -

socket.isConnected() returns true.

现在,我有这个 Socket 对象的 I/O 流,我正在做 -

while((string = bufferedReader.readLine()) != null) {
     outputStream.write(string .getBytes());
     outputStream.flush(); }

缓冲读取器从本地文件读取命令并写入套接字对象以在目标机器上执行。下面从 Socket 读取的代码 -

while((myIntVar = is.read()) != -1) {
//Below line prints some junk data ... hash, updaward arrow and spaces and then
// loop hangs to raise a Socket I/O exception.
System.out.println((char) i);
stringBuffer.append((char) i);}

在这里,我的理解是,因为我已经建立了套接字连接,所以我可以传递我的命令,这些命令应该在另一端执行(如果错了,请纠正我)。

但这不起作用。正如我上面提到的,我收到了垃圾字符,还有一件事 - 我没有传递用户名和密码来建立套接字连接 - 我是否必须像我们为 telnet 所做的那样传递它(如何... ? 我在这里迷路了)。

而且,仅供参考 - 上面的代码就是我所拥有的(没有在其他各种线程中提到的服务器或客户端代码)。

4

1 回答 1

1

Telnet 不像您那样使用原始套接字。Telnet 有特殊的结束线路和结束消息的方式。您需要制定正确的协议来使用,实际上有几种不同的 telnet 实现。使用库可能更容易。

一个简单的解决方法是过滤任何不属于我们想要的正确 ascii 范围的字符。

private static String cleanMessage(String in) {
    StringBuilder sb = new StringBuilder();
    for (Character i : in.toCharArray()) {
        int charInt = i.hashCode();
        if (charInt >= 32 && charInt <= 126) {
            sb.append(i);
        }
    }
    return sb.toString();
}

Apache Commons库有一个 Telnet 处理的实现,这里有一个例子

于 2013-02-18T11:03:23.160 回答