Bathar-bog sgrìobhaidh le comas-gnìomh goireasan frithealaiche teachdaiche Windows, pàirt 01

Beannachdan.

An-diugh bu mhath leam coimhead air a’ phròiseas airson a bhith a’ sgrìobhadh thagraidhean frithealaiche teachdaiche a bhios a’ coileanadh gnìomhan goireasan àbhaisteach Windows, leithid Telnet, TFTP, et cetera, et cetera ann an Java fìor. Tha e soilleir nach toir mi dad ùr - tha na goireasan sin uile air a bhith ag obair gu soirbheachail airson còrr air bliadhna, ach tha mi a’ creidsinn nach eil fios aig a h-uile duine dè a tha a’ dol fon chochall.

Is e seo dìreach a thèid a dheasbad fon ghearradh.

Anns an aiste seo, gus nach slaod e a-mach, a bharrachd air fiosrachadh coitcheann, bidh mi a 'sgrìobhadh a-mhàin mu dheidhinn an t-seirbheisiche Telnet, ach an-dràsta tha cuideachd stuth air goireasan eile - bidh e ann an tuilleadh phàirtean den t-sreath.

An toiseach, feumaidh tu obraich a-mach dè a th 'ann an Telnet, carson a tha feum air, agus carson a tha e ga chleachdadh. Cha toir mi luaidh air stòran facal air an fhacal (ma tha sin riatanach, cuiridh mi ceangal ri stuthan air a’ chuspair aig deireadh an artaigil), cha bhith mi ag ràdh ach gu bheil Telnet a’ toirt cothrom iomallach air loidhne-àithne an inneil. Gu h-iomlan, is ann an seo a thig a ghnìomhachd gu crìch (chum mi sàmhach a dh’aona ghnothach mu bhith a’ faighinn cothrom air port an fhrithealaiche; barrachd air sin nas fhaide air adhart). Tha seo a’ ciallachadh, airson a bhuileachadh, gum feum sinn gabhail ri loidhne air an neach-dèiligidh, a chuir chun t-seirbheisiche, feuchainn ri a thoirt don loidhne-àithne, leugh freagairt na loidhne-àithne, ma tha fear ann, thoir air ais e chun neach-dèiligidh agus seall e air an sgrion, no, ma tha mearachdan ann, leig fios don neach-cleachdaidh gu bheil rudeigin ceàrr.

Gus na tha gu h-àrd a chuir an gnìomh, a rèir sin, feumaidh sinn 2 chlasaichean obrach agus cuid de chlas deuchainn às an cuir sinn air bhog am frithealaiche agus tro am bi an neach-dèiligidh ag obair.
Mar sin, aig an àm seo tha structar an tagraidh a’ toirt a-steach:

  • TelnetClient
  • TelnetClientTester
  • Freiceadan Telnet
  • TelnetServerTester

Rachamaid tro gach aon dhiubh:

TelnetClient

Bu chòir a h-uile càil a bu chòir don chlas seo a dhèanamh ach òrdughan a fhuaireadh a chuir agus na freagairtean a fhuaireadh a shealltainn. A bharrachd air an sin, feumaidh tu a bhith comasach air ceangal a dhèanamh ri port neo-riaghailteach (mar a chaidh ainmeachadh gu h-àrd) de inneal iomallach agus dì-cheangal bhuaithe.

Gus seo a choileanadh, chaidh na gnìomhan a leanas a chur an gnìomh:

Gnìomh a bheir seòladh socaid mar argamaid, a dh’ fhosglas ceangal agus a thòisicheas sruthan cuir a-steach is toraidh (tha caochladairean sruth air an ainmeachadh gu h-àrd, tha na stòran slàn aig deireadh an artaigil).

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

A’ luchdachadh cus den aon ghnìomh, a’ ceangal ris a’ phort àbhaisteach - airson telnet is e seo 23


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

Bidh an gnìomh a’ leughadh charactaran bhon mheur-chlàr agus gan cur chun t-socaid toraidh - a tha àbhaisteach, ann am modh loidhne, chan e modh caractar:


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

Bidh an gnìomh a’ faighinn dàta bhon t-socaid agus ga thaisbeanadh air an sgrion


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

Bidh an gnìomh a’ cur stad air fàilteachadh agus sgaoileadh dàta


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

Freiceadan Telnet

Feumaidh comas a bhith aig a’ chlas seo àithne fhaighinn bho shoitheach, a chuir airson a chuir gu bàs, agus freagairt bhon àithne a chuir air ais chun t-socaid. Chan eil am prògram a dh’aona ghnothach a’ sgrùdadh an dàta cuir a-steach, oir an toiseach, eadhon ann an “boxed telnet” tha e comasach cruth a chuir air diosc an fhrithealaiche, agus san dàrna àite, tha cùis tèarainteachd san artaigil seo air fhàgail ann am prionnsapal, agus is e sin as coireach nach eil facal mu chrioptachadh no SSL.

Chan eil ann ach 2 ghnìomh (tha aon dhiubh air a luchdachadh cus), agus san fharsaingeachd chan e cleachdadh fìor mhath a tha seo, ach airson adhbharan na h-obrach seo, bha e coltach gu robh e iomchaidh dhomh a h-uile dad fhàgail mar a tha e.

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

    }

Bidh am prògram a’ fosgladh port an fhrithealaiche, a’ leughadh dàta bhuaithe gus an coinnich e ri caractar crìochnachaidh àithne, a’ dol seachad air an àithne gu pròiseas ùr, agus ag ath-stiùireadh an toraidh bhon phròiseas chun t-socaid. Tha a h-uile dad cho sìmplidh ri raidhfil ionnsaigh Kalashnikov.

Mar sin, tha cus luchd ann airson a’ ghnìomh seo le port bunaiteach:

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

Uill, a rèir sin, tha an gnìomh a chuireas stad air an t-seirbheisiche cuideachd beag, bidh e a ’briseadh a-steach don lùb shìorraidh, a’ briseadh a staid.

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

Cha toir mi seachad clasaichean deuchainn an seo, tha iad gu h-ìosal - chan eil aca ach sgrùdadh a dhèanamh air comasachd dhòighean poblach. Tha a h-uile dad air an git.

Gus geàrr-chunntas a dhèanamh, ann an oidhche no dhà tuigidh tu prionnsapalan obrachaidh prìomh ghoireasan tòcan. A-nis, nuair a bhios sinn a’ telenet gu coimpiutair iomallach, tha sinn a’ tuigsinn dè tha a’ tachairt - tha an draoidheachd air a dhol à bith)

Mar sin, na ceanglaichean:
Bha, tha agus bidh a h-uile stòr an seo
Mu Telnet
Tuilleadh mu Telnet

Source: www.habr.com

Cuir beachd ann