Windows ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ์ž‘์„ฑ, 01๋ถ€

์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ Telnet, TFTP ๋“ฑ๊ณผ ๊ฐ™์€ ํ‘œ์ค€ Windows ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ๊ธฐ๋Šฅ์„ ์ˆœ์ˆ˜ Java๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์„ ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” XNUMX๋…„ ๋„˜๊ฒŒ ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™ํ•ด ์™”์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‚ด๋ถ€์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•„๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ปท์—์„œ ๋…ผ์˜๋  ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ผ๋ฐ˜ ์ •๋ณด ์™ธ์— ํ…”๋„ท ์„œ๋ฒ„์— ๋Œ€ํ•ด์„œ๋งŒ ์ž‘์„ฑํ•˜์ง€๋งŒ ํ˜„์žฌ๋Š” ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ๋Œ€ํ•œ ์ž๋ฃŒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์€ ์‹œ๋ฆฌ์ฆˆ์˜ ์ถ”๊ฐ€ ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋จผ์ € Telnet์ด ๋ฌด์—‡์ธ์ง€, ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€, ์–ด๋–ค ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์ธ์šฉํ•˜์ง€๋Š” ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ์‚ฌ ๋์— ํ•ด๋‹น ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž๋ฃŒ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค). Telnet์ด ์žฅ์น˜์˜ ๋ช…๋ น์ค„์— ๋Œ€ํ•œ ์›๊ฒฉ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ ๋งŒ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€์ฒด๋กœ ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ์ด ๋๋‚˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค(์ €๋Š” ์˜๋„์ ์œผ๋กœ ์„œ๋ฒ„ ํฌํŠธ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์นจ๋ฌต์„ ์ง€์ผฐ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค). ์ด๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ผ์ธ์„ ์ˆ˜๋ฝํ•˜๊ณ , ์ด๋ฅผ ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๊ณ , ์ด๋ฅผ ๋ช…๋ น์ค„์— ์ „๋‹ฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ , ๋ช…๋ น์ค„ ์‘๋‹ต์„ ์ฝ๊ณ , ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋‹ค์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์˜ ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด 2๊ฐœ์˜ ์ž‘์—… ํด๋ž˜์Šค์™€ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž‘๋™ํ•  ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํ˜„์žฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ํ…”๋„ทํด๋ผ์ด์–ธํŠธ
  • Telnetํด๋ผ์ด์–ธํŠธํ…Œ์Šคํ„ฐ
  • ํ…”๋„ท์„œ๋ฒ„
  • ํ…”๋„ท์„œ๋ฒ„ํ…Œ์Šคํ„ฐ

๊ฐ๊ฐ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ…”๋„ทํด๋ผ์ด์–ธํŠธ

์ด ํด๋ž˜์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์€ ์ˆ˜์‹ ๋œ ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  ์ˆ˜์‹ ๋œ ์‘๋‹ต์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์›๊ฒฉ ์žฅ์น˜์˜ ์ž„์˜ ํฌํŠธ์— ์—ฐ๊ฒฐํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ๋Š์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์†Œ์ผ“ ์ฃผ์†Œ๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ์—ด๊ณ  ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค(์ŠคํŠธ๋ฆผ ๋ณ€์ˆ˜๋Š” ์œ„์—์„œ ์„ ์–ธ๋˜์—ˆ์œผ๋ฉฐ ์ „์ฒด ์†Œ์Šค๋Š” ๊ธฐ์‚ฌ ๋์— ์žˆ์Šต๋‹ˆ๋‹ค).

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

ํ…”๋„ท์„œ๋ฒ„

์ด ํด๋ž˜์Šค์—๋Š” ์†Œ์ผ“์—์„œ ๋ช…๋ น์„ ์ˆ˜์‹ ํ•˜๊ณ , ์‹คํ–‰์„ ์œ„ํ•ด ๋ณด๋‚ด๊ณ , ๋ช…๋ น์˜ ์‘๋‹ต์„ ๋‹ค์‹œ ์†Œ์ผ“์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ์˜๋„์ ์œผ๋กœ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ฒซ์งธ, "๋ฐ•์Šคํ˜• ํ…”๋„ท"์—์„œ๋„ ์„œ๋ฒ„ ๋””์Šคํฌ ํฌ๋งท์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๋‘˜์งธ, ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์›์น™์ ์œผ๋กœ ์ƒ๋žต๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ๋˜๋Š” 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();

    }

ํ”„๋กœ๊ทธ๋žจ์€ ์„œ๋ฒ„ ํฌํŠธ๋ฅผ ์—ด๊ณ , ๋ช…๋ น ๋ ๋ฌธ์ž๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ๋ช…๋ น์„ ์ƒˆ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌํ•˜๊ณ , ํ”„๋กœ์„ธ์Šค์˜ ์ถœ๋ ฅ์„ ์†Œ์ผ“์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด Kalashnikov ๋Œ๊ฒฉ ์†Œ์ด๋งŒํผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ธฐ๋Šฅ์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์„œ๋ฒ„๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์‚ฌ์†Œํ•˜๋ฉฐ ์˜๊ตฌ ๋ฃจํ”„๋ฅผ ์ค‘๋‹จํ•˜์—ฌ ํ•ด๋‹น ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์„œ๋Š” ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ํ•˜๋Š” ์ผ์€ ๊ณต์šฉ ๋ฉ”์†Œ๋“œ์˜ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด git์— ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ๋ฉฐ์น  ์ €๋…์ด๋ฉด ๊ธฐ๋ณธ ์ฝ˜์†” ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์›๊ฒฉ ์ปดํ“จํ„ฐ์— ํ…”๋ ˆ๋„ท์„ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งˆ๋ฒ•์ด ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.)

๋”ฐ๋ผ์„œ ๋งํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ์ถœ์ฒ˜๋Š” ์—ฌ๊ธฐ์— ์žˆ์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋„ ์žˆ๊ณ  ์•ž์œผ๋กœ๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ…”๋„ท ์†Œ๊ฐœ
ํ…”๋„ท์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€