Rubutun software tare da ayyuka na kayan aikin abokin ciniki-uwar garken Windows, Sashe na 01

Gaisuwa.

A yau ina so in duba tsarin rubuta aikace-aikacen abokin ciniki-server wanda ke aiwatar da ayyukan daidaitattun kayan aikin Windows, kamar Telnet, TFTP, da cetera, da cetera a cikin Java mai tsafta. A bayyane yake cewa ba zan kawo wani sabon abu ba - duk waɗannan abubuwan amfani suna aiki cikin nasara fiye da shekara guda, amma na yi imanin ba kowa ya san abin da ke faruwa a ƙarƙashin hular ba.

Wannan shi ne ainihin abin da za a tattauna a karkashin yanke.

A cikin wannan labarin, don kada a jawo shi, ban da cikakkun bayanai, zan rubuta game da uwar garken Telnet kawai, amma a halin yanzu akwai kuma kayan aiki akan sauran kayan aiki - zai kasance a cikin ƙarin sassan jerin.

Da farko, kana buƙatar gano abin da Telnet yake, abin da ake buƙata, da abin da ake amfani dashi. Ba zan faɗi maɓuɓɓuka baki ɗaya ba (idan ya cancanta, zan haɗa hanyar haɗi zuwa kayan akan batun a ƙarshen labarin), zan ce kawai Telnet yana ba da damar nesa zuwa layin umarni na na'urar. Gabaɗaya, anan ne aikin sa ya ƙare (Na yi shiru da gangan game da shiga tashar sabar; ƙari akan hakan daga baya). Wannan yana nufin cewa don aiwatar da shi, muna buƙatar karɓar layi akan abokin ciniki, ƙaddamar da shi zuwa uwar garken, gwada ƙaddamar da shi zuwa layin umarni, karanta layin umarni, idan akwai ɗaya, mayar da shi ga abokin ciniki kuma nuna shi akan allon, ko, idan kurakurai, bari mai amfani ya san cewa wani abu ba daidai ba ne.

Don aiwatar da abin da ke sama, daidai da haka, muna buƙatar azuzuwan aiki guda 2 da wasu nau'ikan gwaji waɗanda za mu ƙaddamar da sabar kuma ta hanyar da abokin ciniki zai yi aiki.
Saboda haka, a halin yanzu tsarin aikace-aikacen ya ƙunshi:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

Bari mu bi ta kowannensu:

TelnetClient

Duk wannan ajin ya kamata ya iya yi shine aika umarni da aka karɓa da nuna martanin da aka karɓa. Bugu da kari, kana buƙatar samun damar haɗawa zuwa tashar jiragen ruwa na sabani (kamar yadda aka ambata a sama) na na'ura mai nisa kuma ka cire haɗin daga gare ta.

Don cimma wannan, an aiwatar da ayyuka masu zuwa:

Ayyukan da ke ɗaukar adireshin soket azaman gardama, buɗe haɗi kuma fara shigarwa da rafukan fitarwa (an bayyana masu canjin rafi a sama, cikakkun tushe suna ƙarshen labarin).

 public void run(String ip, int port)
    {
        try {
            Socket socket = new Socket(ip, port);
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();
            Scanner keyboard = new Scanner(System.in);
            reader = new Thread(()->read(keyboard, sout));
            writer = new Thread(()->write(sin));
            reader.start();
            writer.start();
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

Yin lodin aiki iri ɗaya, haɗawa zuwa tashar tashar tsoho - don telnet wannan shine 23


    public void run(String ip)
    {
        run(ip, 23);
    }

Aikin yana karanta haruffa daga madannai kuma yana aika su zuwa soket ɗin fitarwa - wanda shine na yau da kullun, cikin yanayin layi, ba yanayin hali ba:


    private void read(Scanner keyboard, OutputStream sout)
    {
        try {
            String input = new String();
            while (true) {
                input = keyboard.nextLine();
                for (char i : (input + " n").toCharArray())
                    sout.write(i);
            }
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

Aikin yana karɓar bayanai daga soket kuma yana nuna shi akan allon


    private void write(InputStream sin)
    {
        try {
            int tmp;
            while (true){
                tmp = sin.read();
                System.out.print((char)tmp);
            }
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

Ayyukan yana dakatar da karɓar bayanai da watsawa


    public void stop()
    {
        reader.stop();
        writer.stop();
    }
}

TelnetServer

Dole ne wannan aji ya kasance yana da aikin karɓar umarni daga soket, aika shi don aiwatarwa, da aika amsa daga umarnin zuwa soket. Shirin da gangan ba ya bincika bayanan shigarwa, saboda da farko, ko da a cikin "boxed telnet" yana yiwuwa a tsara faifan uwar garke, na biyu kuma, batun tsaro a cikin wannan labarin an cire shi bisa ka'ida, kuma shine dalilin da ya sa babu. kalma game da boye-boye ko SSL.

Ayyuka guda 2 ne kawai (ɗaya daga cikinsu yana da nauyi), kuma gabaɗaya wannan ba aiki mai kyau ba ne, amma don manufar wannan aikin, ya zama daidai a gare ni in bar komai yadda yake.

 boolean isRunning = true;
    public void run(int port)    {

        (new Thread(()->{ try {
            ServerSocket ss = new ServerSocket(port); // создаем сокет сервера и привязываем его к вышеуказанному порту
            System.out.println("Port "+port+" is waiting for connections");

            Socket socket = ss.accept();
            System.out.println("Connected");
            System.out.println();

            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту.
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();

            Map<String, String> env = System.getenv();
            String wayToTemp = env.get("TEMP") + "tmp.txt";
            for (int i :("Connectednnr".toCharArray()))
                sout.write(i);
            sout.flush();

            String buffer = new String();
            while (isRunning) {

                int intReader = 0;
                while ((char) intReader != 'n') {
                    intReader = sin.read();
                    buffer += (char) intReader;
                }


                final String inputToSubThread = "cmd /c " + buffer.substring(0, buffer.length()-2) + " 2>&1";


                new Thread(()-> {
                    try {

                        Process p = Runtime.getRuntime().exec(inputToSubThread);
                        InputStream out = p.getInputStream();
                        Scanner fromProcess = new Scanner(out);
                        try {

                            while (fromProcess.hasNextLine()) {
                                String temp = fromProcess.nextLine();
                                System.out.println(temp);
                                for (char i : temp.toCharArray())
                                    sout.write(i);
                                sout.write('n');
                                sout.write('r');
                            }
                        }
                        catch (Exception e) {
                            String output = "Something gets wrong... Err code: "+ e.getStackTrace();
                            System.out.println(output);
                            for (char i : output.toCharArray())
                                sout.write(i);
                            sout.write('n');
                            sout.write('r');
                        }

                        p.getErrorStream().close();
                        p.getOutputStream().close();
                        p.getInputStream().close();
                        sout.flush();

                    }
                    catch (Exception e) {
                        System.out.println("Error: " + e.getMessage());
                    }
                }).start();
                System.out.println(buffer);
                buffer = "";

            }
        }
        catch(Exception x) {
            System.out.println(x.getMessage());
        }})).start();

    }

Shirin yana buɗe tashar jiragen ruwa na uwar garken, yana karanta bayanai daga gare ta har sai ya ci karo da yanayin ƙarshen umarni, ya ba da umarnin zuwa wani sabon tsari, kuma ya tura fitarwa daga tsari zuwa soket. Komai mai sauki ne kamar bindigar Kalashnikov.

Dangane da haka, akwai obalodi don wannan aikin tare da tsohuwar tashar jiragen ruwa:

 public void run()
    {
        run(23);
    }

To, saboda haka, aikin da ke dakatar da uwar garken shima ba shi da mahimmanci, yana katse madauki na har abada, yana keta yanayinsa.

    public void stop()
    {
        System.out.println("Server was stopped");
        this.isRunning = false;
    }

Ba zan ba da azuzuwan gwaji a nan ba, suna ƙasa - duk abin da suke yi shine duba ayyukan hanyoyin jama'a. Komai yana kan git.

Don taƙaitawa, a cikin maraice biyu za ku iya fahimtar ƙa'idodin aiki na manyan kayan aikin wasan bidiyo. Yanzu, lokacin da muke wayar tarho zuwa kwamfuta mai nisa, mun fahimci abin da ke faruwa - sihirin ya ɓace)

Don haka, hanyoyin:
Duk kafofin sun kasance, suna kuma za su kasance a nan
Game da Telnet
Karin bayani game da Telnet

source: www.habr.com

Add a comment