通过telnet连接到远程服务器并以编程方式更新文件

时间:2016-08-31 14:05:53

标签: java telnet

我想从Web应用程序更改PROROUTE无线蜂窝路由器(H685)的设置。 更改设置的唯一方法是通过telnet登录路由器并在编辑器中更改文件(即vi)并重新启动。

我想使用JAVA从服务器端以编程方式执行此操作, 我可以使用TelnetClient

连接到路由器并发送命令

以下是通过telnet和send命令连接到路由器的示例代码

public class Test
{
    private TelnetClient telnet = new TelnetClient();
    private InputStream in;
    private PrintStream out;
    private String prompt = "#";

    public Test(String server, String user, String password) {
        try {
            // Connect to the specified server
            telnet.connect(server, 23);
            // Get input and output stream references
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());
            // Log the user on
            readUntil("Login:");
            write(user);
            readUntil("Password:");
            write(password);
            // Advance to a prompt
            readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String readUntil(String pattern) {
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            StringBuffer sb = new StringBuffer();
            boolean found = false;
            char ch = (char) in.read();
            while (true) {
                System.out.print(ch);
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        return sb.toString();
                    }
                }
                ch = (char) in.read();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void write(String value) {
        try {
            out.println(value);
            out.flush();
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String sendCommand(String command) {
        try {
            write(command);
            return readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void disconnect() {
        try {
            telnet.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            Test telnet = new Test("192.168.1.1", "username", "pwd");
            telnet.sendCommand("ls");
            telnet.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

但我必须在编辑器中更新文件。

  1. 发送命令以在vi
  2. 中打开文件

    $ vi /flash/.disable_fun_list

    function_dtu:

    function_wifi:

    function_gps: 。 。 。

    function_wifi:on(此行需要更改)

    然后发送命令重启路由器。

    $重新启动

    任何想法,如何做到这一点。

3 个答案:

答案 0 :(得分:0)

你想要做的事听起来很糟糕。

我觉得没有必要在properties([ pipelineTriggers([ triggers: [ [ $class: 'jenkins.triggers.ReverseBuildTrigger', upstreamProjects: "some_project", result: hudson.model.Result.SUCCESS ] ] ]), ]) 编辑器中打开此文件。在这种情况下,人们通常建议创建一个临时文件并将其替换为原始文件。

建议的方法:

  1. 使用FileReader上的BufferedReader打开要修改的文件。

  2. 修改字符串,如果要替换当前读取的行;如果没有,那么只需进入第3步。

  3. 现在,一旦你准备好字符串(无论是否更改或未更改)写入文件,然后创建一个临时文件,并将读取字符串(行)写入此临时文件。

  4. 有一次,您已完成原始文件的所有行,然后关闭BufferedReader,并删除(或更好地重命名为原始文件)。将临时文件重命名为原始文件名,并将此临时文件移动到您复制(和修改)内容的原始文件的位置!

  5. 代码应该像:

    vi

答案 1 :(得分:0)

您可以在命令行中使用vi而无需实际打开vi作为应用

你可以将args传递给vi来替换你需要的字符串 你可以传递args来保存文件,当然还有文件路径。

因此您可能最终通过telnet连接执行此命令

vi -c "%s/function_wifi:on/function_wifi:off/g|wq" /path/to/config/file

这将用function_wifi:on替换字符串function_wifi:off并保存文件。

然后发送reboot命令。

了解更多支票this link

答案 2 :(得分:0)

将上述程序更改为

private String prompt = ">";

而不是

private String prompt = "#";