الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف أقوم بأتمتة تنفيذ أوامر telnet؟

مغلق
بدأه وليد محمد الحسن في 14 سبتمبر 2006 · 10 رد · 7,635 مشاهدة · في برمجة الشبكات والتطبيقات الموزعة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

طلب مني القيام بأتمتة تنفيذ عمليات إدارية على سيرفر يدار بواسطة الtelnet وبالبحث وجدت مكتبة خاصة بإدارة الاتصال ببرتوكول telnet اسمها ScriptingTelnet وهي مرفقة.

التعامل مع المكتبة يكون عبر الكود:

string ip = "some server IP";
			int port = 23;
			int timeout = 10;

			try
			{
				ScriptingTelnet session = new ScriptingTelnet(ip, port, timeout);

				// Try to connect
				bool connected = session.Connect();

				if (connected)
				{
					// connected successfully

					//int startingPrompt = session.WaitFor("Username: "); // this line does not succeed
					int startingPrompt = session.WaitFor("login:", " ");
					if (startingPrompt == 0)
					{
						// if the username prompt is found so we send the username
						// and wait to recieve our password prompt
						session.SendAndWait("login_name", "Password:");

						// and now send the password and wait for the next prompt
						// in this example I except to recieve a success message
						session.SendAndWait("login_password", "Success");
					}
					else
					{
						Console.WriteLine("Username prompt was not found");
					}
				}
				else
				{
					Console.WriteLine("Unable to connect to the server");
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex.Message);
			}

ولكن ما يحدث هو أنها تعطي خطأ في كود التعامل في السطر

int startingPrompt = session.WaitFor("login:", " ");

مع نتيجة تنفيذ كالتالي:

telnet_error.jpg

ماهو سبب الخطأ وكيف يمكن الاتصال بسيرفر عبر بروتكول telnet عبر الكود بغرض أتمتة تنفيذ عمليات إدارية؟

ScriptingTelnet.zip

فكر بطريقة أخرى

#2

اشرح بتفاصل أكثر يا باشا,, هل تريد عمل تسجيل الدخول وكل هذه الأشياء بالكود مثلا وبعدها يظهر لك شاشه تكتب بها الأومر ؟ وتحصل على الـ Output في نفس الشاشه أيضا ؟؟

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#3
اقتباس
هل تريد عمل تسجيل الدخول وكل هذه الأشياء بالكود مثلا

نعم

المطلوب هو برنامج يقوم بأتمتة تنفيذ عمليات إدارية على سيرفر بما فيها تسجيل الدخول، وهذه العمليات تنفذ يدويا عن بعد باستخدام التلنت.

اقتباس
وبعدها يظهر لك شاشه تكتب بها الأومر ؟ وتحصل على الـ Output في نفس الشاشه أيضا ؟؟

البرنامج يفترض أن يدخل على التلنت وينفذ الأوامر هناك، حيث أن المستخدم يفترض أن يقوم بتنفيذ العمليات الإدارية بالاختيار من قوائم والضغط على أزرار بدلا مما الطريقة الحالية لتنفيذ العميات الإدارية من كتابة أوامر واختيار من قوائم تظهر على command prompt.

طيب أفرض مثلا أننا نريد أتمتة تنفيذ الأوامر التالية بجلسة telnet على سيرفر يعمل باللينوكس :

rm -r --force /var/log/somelogfile

exit

لحذف log file كبير الحجم، هذا طبعا بعد تمرير اسم المستخدم وكلمة السر بالكود.

البرنامج يمرر هذه الأوامر للقيام بالعمليات الإدارية المطلوبة ولا شأن له بمخرج التنفيذ.

جربت أيضا باستخدام Process وProcessStartInfo وتمرير الأوامر إلى الخاصية StandardInput الموجودة في System.Diagnostics.Process Class واستخراج ناتج التنفيذ من الخاصية StandardOutput الموجودة أيضا في System.Diagnostics.Process Class، بالطريقة الموجودة في موضوع تنفيذ أوامر DOS من داخل الـ #C

هكذا:

ProcessStartInfo info = new ProcessStartInfo("telnet", "telnet.server -l login_name");
info.UseShellExecute = false;
info.CreateNoWindow = false;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.WindowStyle = ProcessWindowStyle.Hidden;

Process p = new Process();
p.StartInfo = info;
//Process.Start(info);
p.Start();

Console.WriteLine("Connected successfully");

StreamReader sr = p.StandardOutput;
StreamWriter sw = p.StandardInput;

//sw.WriteLine("login_password");
Thread.Sleep(5000);
p.StandardInput.WriteLine("login_password");
//Console.WriteLine(sr.ReadToEnd());
Console.WriteLine(p.StandardOutput.ReadToEnd());
Thread.Sleep(5000);
sw.WriteLine("ls -l");
Console.WriteLine(p.StandardOutput.ReadToEnd());


p.WaitForExit();
p.Close();

ولكن لم تنفذ بالصورة المطلوبة ولم تعرض مخرجات التنفيذ.

:huh:

فكر بطريقة أخرى

#4

السلام عليكم اخي العزيز walcom , يمكن الإتصل مع الـTelnet Server من خلال الـSocket وذلك بتمرير الـCommands الخاصة بالـTelnet إلى الـServer مستخدما NetworkStream وقراءة الناتج من الـServer بالستخدام الـStreamReader وكما يلي كمثال:

using System.Net;
using System.Net.Sockets;
using System.IO;
.
.

TcpClient Server = new TcpClient(Telnet_Server,23);
string CRLF = "\r\n"; // لإدخال الأمر وعمل سطر جديد				
string Data;
byte[] Data;
NetworkStream NetStrm;
Status.Items.Clear();

NetStrm = Server.GetStream();
StreamReader RdStrm= new StreamReader(Server.GetStream());
Status.Items.Add(RdStrm.ReadLine());

Data = "OPEN "+ Textbox.Text+CRLF;				
Data = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());

Data = "PASS "+ Textbox.Text+CRLF;				
Data = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());

Data = "SEND "+ Textbox.Text+CRLF;				
Data = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
.
.
.

ويتم تنفيذ كافة أوامر الـTelnet بهذا الشكل بحيث ترسل الـCommand إلى الـServer من خلال الـNetworkStream وسيرجع لك الـServer الـResponse من خلال الـSocket المتصل معها ليتم بعد ذلك عرض الـOutput من خلال الـStreamReader ...

تم تعديل هذه المشاركة بواسطة fmo_82 في 15 سبتمبر 2006 في 15:41

#5

الموضوع للأسف معقد قليلا :( والاتصال على كل حال يجب أن يتم من خلال البورت بالـ Sockets كما قال الأخ فادي. أنا أقرأ الآن في الـ Protocol بتاعها. وان شاء الله أتواصل عندما أصل الى شئ.

لم أكن أتوقع أنها بهذه "الغلاسه" !!

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#6

الموضوع صار أعقد مما تخيلناه

قمت بتطبيق كود الأخ فادي هكذا:

string crlf = "\r\n";
TcpClient telnet = new TcpClient("telnet_server_ip", 23);

string data;
byte[] bData;
NetworkStream netStream = telnet.GetStream();
StreamReader readStream = new StreamReader(netStream);

//data = "OPEN telnet_server_ip " + crlf;
data = "OPEN login_name " + crlf;
bData = Encoding.ASCII.GetBytes(data.ToCharArray());
netStream.Write(bData, 0, bData.Length);
Console.WriteLine(readStream.ReadLine());
// التنفيذ يتوقف ويعلق هنا

data = "PASS login_password" + crlf;
bData = Encoding.ASCII.GetBytes(data.ToCharArray());
netStream.Write(bData, 0, bData.Length);
Console.WriteLine(readStream.ReadLine());


data = "send ls -l" + crlf;
bData = Encoding.ASCII.GetBytes(data.ToCharArray());
netStream.Write(bData, 0, bData.Length);
Console.WriteLine(readStream.ReadLine());

مرت علي طريقة تنفيذ أخرى معقدة أكثر، تتمثل في التنصت على جلسة telnet باستعمال البرنامج ethereal ومن ثم تسجيل أوامر مرحلة الhandshaking وإرسالها عبر البرنامج على TcpClinet

تفاصيل مرحلة الhandshaking موجودة في الملف المرفق.

مزيدا من التفاصيل حول البروتوكول في هذا الرابط: The TELNET Protocol و The Telnet Protocol

وهذا code snippet ربما قد يفيد

Communicate to Host using telnet protocol without using register control

:unsure: :huh:

Chapter_26__Telnet_and_Rlogin_Remote_Login.rar

تم تعديل هذه المشاركة بواسطة walcom في 16 سبتمبر 2006 في 18:45

فكر بطريقة أخرى

#7

لا اعتقد ان هناك حد سيدخل في المشاركه في هذة الصفحة

2 مشرفين و1 جبير حرام راعو النس الذي حولكم

#8

الموضوع معقد علينا أيضا يا KARIMSOFT زي مانت شايف (h) أنا قرفت من الـ TelNet دي.

قمت يا اخ Walcom بتحميل سورس برنامج من :

http://www.csharphelp.com/archives/archive239.html

على ما الواحد يلم بالبروتوكول ده. وقمت بعمل بعض التعديلات عليه, بحيث يناسبك.

افتح البرنامج وادخل الـ IP و رقم الـ Port. وادخل الـ UserName والـ Password التي تمكنك من عمل Open لهذا الـ IP.

فهو يفعل برمجيا ما تفعله يدويا هكذا :

تفتح الـ Telnet.

تكتب Open SomeIP.

وتدخل الـ UserName , Password.

وبعدها سيظهر لك شاشه تدخل فيها المدخلات وتشاهد منها المخرجات بقدرة الله تعالى وربنا يستر :lol:

اعطني رأيك حوله.

WaLTeL.rar

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#9

خلونا في الموضوع أحسن، ومن يريد الدخول فليتفضل. :^)

الأخ معتز

الكود الذي أرفقته هو نفس الذي أشرت إليه في ردي السابق (h)

walcom كتب:
وهذا code snippet ربما قد يفيد

Communicate to Host using telnet protocol without using register control

:unsure: :huh:

جربته بالأمس وقد نجح في إجراء الاتصال، الآن جاري تعديله ليستطيع إرسال الأوامر

معليش استحمل معانا شوية، وخليك معانا على الخط :P

فكر بطريقة أخرى

#10

ان شاء الله معاك على الخط حتى يتم الله هذا الأمر :)

بالنسبه للبرنامج الذي أرفقته. أنا قمت بالتعديل على الموجود في الـ CSharpHelp لجعله يدخل الـ Username والـ Password بطريقه تلقائيه في وقت التشغيل بدون تدخل من المستخدم. وقمت بعمل ComboBox في النافذه BaseForm تمكنك من اختيار الأمر والضغط على Enter ليتم ارساله ( جعلت الـ ComboBox فارغه فضف بها ما تشاء وجعلت الأوامر التي تكتبتها بيدك تضاف اليها حتى تسترجعها مره اخرى بسهوله ).

تم تعديل هذه المشاركة بواسطة معتز شمس في 17 سبتمبر 2006 في 12:23

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#11

البرنامج الذي أرفقته يا معتز نجح، ولكن بعد أن استبدلت السطور في دالة OnRecievedData

if (lastLine == "login: ")
	DispatchMessage("ECHO " + myLoginForm.Username + "\r\n");
if (lastLine == "password: ")
	DispatchMessage("ECHO " + myLoginForm.Password + "\r\n");

بالسطور:

if (lastLine.Contains("login: "))
	DispatchMessage(myLoginForm.Username + "\r\n");

if (lastLine.Contains("Password: "))
	DispatchMessage(myLoginForm.Password + "\r\n");

وقد يستبدل وفق طريقة العمل اليدوية على الtelnet server، لأن بعضها يطلب كلمة سر فقط بدون اسم دخول، وبعضها يطلب أكثر من اسم دخول أو كلمة سر.

وأيضا في نهاية دالة ProcessOptions أضفت السطر

this.richTextBoxOutput.Text += m_DISPLAYTEXT;

والذي يعرض مخرجات العملية

أجزل الشكر لكل من حاول

:)

فكر بطريقة أخرى

هذا الموضوع مغلق.

مواضيع مشابهة