Ritun hugbúnaðar með virkni Windows biðlara-miðlara tólum, hluti 01

Kveðjur.

Í dag langar mig að skoða ferlið við að skrifa biðlara-miðlara forrit sem framkvæma aðgerðir venjulegra Windows tóla, eins og Telnet, TFTP, osfrv, osfrv í hreinu Java. Það er ljóst að ég mun ekki koma með neitt nýtt - allar þessar veitur hafa virkað með góðum árangri í meira en eitt ár, en ég tel að ekki allir viti hvað er að gerast undir hettunni.

Þetta er einmitt það sem verður rætt undir niðurskurðinum.

Í þessari grein, til að draga það ekki á langinn, til viðbótar við almennar upplýsingar, mun ég aðeins skrifa um Telnet netþjóninn, en í augnablikinu er einnig efni um önnur tól - það mun vera í frekari hlutum seríunnar.

Fyrst af öllu þarftu að finna út hvað Telnet er, til hvers það er nauðsynlegt og til hvers það er notað. Ég mun ekki vitna orðrétt í heimildir (ef nauðsyn krefur mun ég setja hlekk á efni um efnið í lok greinarinnar), ég segi aðeins að Telnet veitir fjaraðgang að skipanalínu tækisins. Í stórum dráttum er þetta þar sem virkni þess endar (ég þagði viljandi um aðgang að netþjónshöfninni; meira um það síðar). Þetta þýðir að til að innleiða það þurfum við að samþykkja línu á biðlaranum, senda hana til þjónsins, reyna að senda hana á skipanalínuna, lesa skipanalínusvarið, ef það er eitt, senda það aftur til biðlarans og birta það á skjánum, eða, ef villur koma upp, láttu notandann vita að eitthvað er að.

Til að innleiða ofangreint, í samræmi við það, þurfum við 2 vinnuflokka og einhvern prófflokk sem við munum ræsa netþjóninn frá og í gegnum sem viðskiptavinurinn mun vinna.
Í samræmi við það, í augnablikinu inniheldur umsóknaruppbyggingin:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

Við skulum fara í gegnum hvert þeirra:

TelnetClient

Allt sem þessi flokkur ætti að geta gert er að senda mótteknar skipanir og sýna móttekin svör. Að auki þarftu að geta tengst handahófskenndu (eins og getið er hér að ofan) tengi ytra tækis og aftengt það.

Til að ná þessu voru eftirfarandi aðgerðir útfærðar:

Fall sem tekur socket vistfang sem rök, opnar tengingu og byrjar inntaks- og úttaksstrauma (straumbreytur eru lýstar yfir hér að ofan, allar heimildir eru í lok greinarinnar).

 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());
        }
    }

Ofhleðsla sömu aðgerð, tenging við sjálfgefna tengi - fyrir telnet er þetta 23


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

Aðgerðin les stafi af lyklaborðinu og sendir þá í úttaksinnstunguna - sem er dæmigert, í línuham, ekki stafaham:


    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());
        }
    }

Aðgerðin tekur við gögnum úr innstungunni og sýnir þau á skjánum


    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());
        }
    }

Aðgerðin stöðvar móttöku og sendingu gagna


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

TelnetServer

Þessi flokkur verður að hafa þá virkni að taka á móti skipun úr fals, senda hana til framkvæmdar og senda svar frá skipuninni aftur í fals. Forritið athugar vísvitandi ekki inntaksgögnin, því í fyrsta lagi, jafnvel í „boxed telnet“ er hægt að forsníða netþjónsdiskinn, og í öðru lagi er öryggismálinu í þessari grein sleppt í grundvallaratriðum, og þess vegna er það ekki orð um dulkóðun eða SSL.

Það eru aðeins 2 aðgerðir (ein þeirra er ofhlaðin) og almennt er þetta ekki mjög góð æfing, en í tilgangi þessa verkefnis fannst mér rétt að láta allt vera eins og það er.

 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();

    }

Forritið opnar netþjónsgáttina, les gögn úr því þar til það rekst á skipunarlokstaf, sendir skipunina í nýtt ferli og beinir úttakinu frá ferlinu yfir í falsið. Allt er eins einfalt og Kalashnikov árásarriffill.

Í samræmi við það er ofhleðsla fyrir þessa aðgerð með sjálfgefna tengi:

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

Jæja, í samræmi við það er aðgerðin sem stöðvar netþjóninn líka léttvæg, hún truflar eilífu lykkjuna og brýtur í bága við ástand hans.

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

Ég mun ekki gefa próftíma hér, þeir eru fyrir neðan - allt sem þeir gera er að athuga virkni opinberra aðferða. Allt er á hausnum.

Til að draga saman, á nokkrum kvöldum geturðu skilið meginreglur um rekstur helstu vélabúnaðar. Nú, þegar við telenetum við fjartengda tölvu, skiljum við hvað er að gerast - galdurinn er horfinn)

Svo, hlekkirnir:
Allar heimildir voru, eru og verða hér
Um Telnet
Meira um Telnet

Heimild: www.habr.com

Bæta við athugasemd