سلامونه.
نن زه غواړم د مراجعینو-سرور غوښتنلیکونو لیکلو پروسې ته وګورم چې د معیاري وینډوز اسانتیاو دندې ترسره کوي، لکه ټیلنټ، 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;
}
زه به دلته د ازموینې ټولګي نه ورکوم، دوی لاندې دي - ټول هغه څه چې دوی یې کوي د عامه میتودونو فعالیت چیک کوي. هرڅه په ګیټ کې دي.
د لنډیز لپاره، په یو څو ماښامونو کې تاسو کولی شئ د اصلي کنسول اسانتیاوو د عملیاتو په اصولو پوه شئ. اوس، کله چې موږ لیرې کمپیوټر ته ټیلینټ کوو، موږ پوهیږو چې څه پیښیږي - جادو ورک شوی دی)
نو، لینکونه:
سرچینه: www.habr.com