walcom

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

11 ردود في هذا الموضوع

طلب مني القيام بأتمتة تنفيذ عمليات إدارية على سيرفر يدار بواسطة ال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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

نعم

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

وبعدها يظهر لك شاشه تكتب بها الأومر ؟ وتحصل على الـ 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:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم اخي العزيز 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الموضوع معقد علينا أيضا يا 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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

الأخ معتز

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

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

Communicate to Host using telnet protocol without using register control

:unsure: :huh:

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

تم تعديل بواسطه معتز شمس
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

البرنامج الذي أرفقته يا معتز نجح، ولكن بعد أن استبدلت السطور في دالة 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;

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

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

:)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .