د وینډوز مراجعینو-سرور اسانتیاوو فعالیت سره د سافټویر لیکلو برخه، 01 برخه

سلامونه.

نن زه غواړم د مراجعینو-سرور غوښتنلیکونو لیکلو پروسې ته وګورم چې د معیاري وینډوز اسانتیاو دندې ترسره کوي، لکه ټیلنټ، TFTP، et cetera، et cetera په خالص جاوا کې. دا روښانه ده چې زه به هیڅ نوی نه راوړم - دا ټولې اسانتیاوې له یو کال څخه په بریالیتوب سره کار کوي، مګر زه باور لرم چې هرڅوک نه پوهیږي چې د هود لاندې څه تیریږي.

دا هغه څه دي چې د کټ لاندې به پرې بحث وشي.

په دې مقاله کې، د دې د ایستلو لپاره، د عمومي معلوماتو سربیره، زه به یوازې د Telnet سرور په اړه ولیکئ، مګر دا مهال د نورو اسانتیاوو په اړه مواد هم شتون لري - دا به د لړۍ په نورو برخو کې وي.

لومړی، تاسو اړتیا لرئ معلومه کړئ چې ټیلنټ څه شی دی، دا د څه لپاره اړین دی، او د څه لپاره کارول کیږي. زه به د سرچینو لفظي حواله ونه کړم (که اړتیا وي ، زه به د مقالې په پای کې د موضوع په اړه موادو ته لینک ضمیمه کړم) ، زه به یوازې ووایم چې ټیلنټ د وسیلې کمانډ لاین ته لیرې لاسرسی چمتو کوي. په لویه کچه ، دا هغه ځای دی چیرې چې د دې فعالیت پای ته رسیږي (ما په قصدي ډول د سرور پورټ ته د لاسرسي په اړه چوپ پاتې شوم؛ پدې اړه نور وروسته). دا پدې مانا ده چې د دې پلي کولو لپاره ، موږ اړتیا لرو په پیرودونکي کې یوه کرښه ومنو ، سرور ته یې واستوئ ، هڅه وکړئ دا د کمانډ لاین ته واستوو ، د کمانډ لاین ځواب ولولئ ، که چیرې شتون ولري ، دا بیرته پیرودونکي ته واستوئ او دا په سکرین کې ښکاره کړئ، یا، که غلطي وي، کاروونکي ته اجازه ورکړئ چې پوه شي چې یو څه غلط دی.

د پورته پلي کولو لپاره، په دې اساس، موږ 2 کاري ټولګیو او ځینې ازموینې ټولګي ته اړتیا لرو چې له هغې څخه به موږ سرور پیل کړو او د کوم له لارې به مراجع کار وکړي.
په دې اساس، دا مهال د غوښتنلیک جوړښت کې شامل دي:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

راځئ چې د دوی هر یو ته لاړ شو:

TelnetClient

دا ټول ټولګي باید وکوالی شي ترلاسه شوي کمانډونه واستوي او ترلاسه شوي ځوابونه وښیې. سربیره پردې ، تاسو اړتیا لرئ د دې وړ اوسئ چې د ریموټ وسیلې له خپل سري (لکه څنګه چې پورته یادونه وشوه) بندر سره وصل شئ او له هغې څخه وصل شئ.

د دې ترلاسه کولو لپاره، لاندې دندې پلي شوي:

یو فنکشن چې د دلیل په توګه د ساکټ پته اخلي، اړیکه پرانیزي او د ننوتلو او محصول جریان پیل کوي (د جریان تغیرات پورته اعلان شوي، بشپړ سرچینې د مقالې په پای کې دي).

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

د ورته فنکشن ډیر بار کول، د ډیفالټ پورټ سره وصل کول - د ټیلنټ لپاره دا 23 دی


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

فنکشن د کیبورډ څخه کرکټرونه لولي او د محصول ساکټ ته لیږي - کوم چې معمول دی ، په لاین حالت کې ، نه د کرکټر حالت:


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

فنکشن د ساکټ څخه ډاټا ترلاسه کوي او په سکرین کې یې ښیې


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

فنکشن د معلوماتو ترلاسه کول او لیږد بندوي


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

TelnetServer

دا ټولګي باید د ساکټ څخه د قوماندې ترلاسه کولو فعالیت ولري، د اجرا کولو لپاره یې لیږل، او د قوماندې څخه ځواب بیرته ساکټ ته لیږل کیږي. برنامه په قصدي ډول د ان پټ ډیټا نه ګوري ، ځکه چې لومړی ، حتی په "باکس شوي ټیلنیټ" کې د سرور ډیسک فارمیټ کول امکان لري ، او دوهم ، پدې مقاله کې د امنیت مسله په اصولو کې له پامه غورځول شوې ، او له همدې امله شتون نلري. د کوډ کولو یا SSL په اړه یوه کلمه.

دلته یوازې 2 دندې شتون لري (یو یې ډیر بار دی) ، او په عموم کې دا خورا ښه عمل ندی ، مګر د دې دندې اهدافو لپاره ، دا زما لپاره مناسب بریښي چې هرڅه لکه څنګه چې وي پریږدم.

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

    }

برنامه د سرور بندر خلاصوي ، له هغې څخه ډیټا لولي تر هغه چې دا د کمانډ پای کرکټر سره مخ شي ، قوماندې نوي پروسې ته تیریږي ، او محصول له پروسې څخه ساکټ ته راستوي. هرڅه د کلاشینکوف برید ټوپک په څیر ساده دي.

په دې اساس، د ډیفالټ بندر سره د دې فنکشن لپاره ډیر بار شتون لري:

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

ښه، په دې اساس، هغه فعالیت چې سرور ودروي هم کوچنی دی، دا د ابدي لوپ مداخله کوي، د دې حالت څخه سرغړونه کوي.

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

زه به دلته د ازموینې ټولګي نه ورکوم، دوی لاندې دي - ټول هغه څه چې دوی یې کوي د عامه میتودونو فعالیت چیک کوي. هرڅه په ګیټ کې دي.

د لنډیز لپاره، په یو څو ماښامونو کې تاسو کولی شئ د اصلي کنسول اسانتیاوو د عملیاتو په اصولو پوه شئ. اوس، کله چې موږ لیرې کمپیوټر ته ټیلینټ کوو، موږ پوهیږو چې څه پیښیږي - جادو ورک شوی دی)

نو، لینکونه:
ټولې سرچینې دلته وې، دي او دلته به وي
د Telnet په اړه
د Telnet په اړه نور

سرچینه: www.habr.com

Add a comment