הקדמה
מיקרוסופט כוללת עם מערכת ההפעלה מספר תוכנות שירות חשובות לאיתור תקלות ובדיקת רשתות tcp/ip לדוגמה התוכנית PING בודק את איכות הקשר בין מחשבים ברשת.
במאמר זה נלמד כיצד להשתמש באובייקטים כדוגמת WScript.Shell ו Scripting.FileSystemObject על מנת להריץ תוכניות אלו מתך ASP ולהציג את הפלט שלהן. למאמר מצורף קוד מלא של היישומים המוצגים בו.
הפעלת תוכנות שירות של סביבת DOS מ ASP
מיקרוסופט כוללת עם מערכת ההפעלה מספר תוכנות שירות חשובות לאיתור תקלות ובדיקת רשתות TCP/IP לדוגמה, התוכנית PING שולחת מספר מנות נתונים מהמחשב שלנו למחשב מרוחק ובודקת את איכות הקשר בניהם (כמה זמן לקח למנות להגיע ,כמה מנות אבדו בדרך ועוד ). הקש מחלון DOS במערכת ההפעלה את הפקודה
ping www.asp.org.il
ותראה מה תקבל.
תוכנית נוספת היא netstat המציגה סטטיסטיקה ונתונים על חיבורי TCP/IP לשרת. הקש מחלון DOS במערכת ההפעלה את הפקודה
netstat -n
ותראה מה תקבל
תוכניות נוספות הם TRACERT הבודקת מסלול ניתוב למערכת מרוחקת או route המציגה את טבלת הניתוב המקומית (אם אתה רוצה ללמוד יותר על התוכניות הללו הקש את שם התוכנית בחלון DOS ללא פרמטרים נלווים, למשל רק את המילה PING ו ENTER ותקבל הסבר קצר עליהם).
ובכן חשבתי לעצמי כמה שימושי אילו יכולתי להפעיל תוכניות אילו מדף ASP ,הייתי יכול לקבל נתונים בזמן אמת על הרשת והשרת שלי או שרתים אחרים גם אם אני לא ליד השרת עצמו, אלא מכל מקום בו יש חיבור לאינטרנט.
מדוע זה נחוץ ? אולי רק דוגמה קטנה, לפני מספר שבועות תוך ניצול "חור במערכת ההפעלה " הותקפתי ע"י התולעת code red worm שתקפה אלפי שרתים ברחבי העולם, ראיתי שהשרת עובד לאט ומשהוא לא בסדר. רק כאשר הקשתי netstat –n חשכו עיני ראיתי שהשרת יצר אלפי חיבורי tcp/ip ומשתמשים בשרת שלי לתקוף שרתים אחרים - "מתקפת מניעת שרות" .
אז כיצד נצור דף ASP כנ"ל ? אפשרות אחת היא ליצור אובייקט COM ובו לפנות לפונקציות API מתאימות המפעילות תוכנות אילו (על API תוכלו לקרוא במאמרים קודמים שלי) נשמע מסובך – אכן כן.
אפשרות אחרת היא לרכוש אובייקטי COM מוכנים יש הרבה בשוק ואכן בחלקם השתמשתי, אבל אז מצאתי פתרון פשוט ואלגנטי ללא כל אוביקטי COM כלל.
הפתרון מורכב משלושה שלבים:
שלב א שימוש באוביקט WScript.Shell
אובייקט זה מאפשר לנו להריץ תוכניות מדפי ASP, כל תוכנית שתרצו!!!
למשל הקוד:
Set WShShell = Server.CreateObject("WScript.Shell")
RetCode = WShShell.Run("c:\winnt\System32\calc.exe",1,true)
Response.Write(retcode)
set WShShell= nothing
יריץ את המחשבון כל פעם שנקרא לדף ה ASP
הפונקציה RUN מקבלת שלושה פרמטרים : הראשון שם ונתיב הקובץ להרצה , השני פרמטרים לגבי החלון בו תרוץ התוכנית - לא מעניין אותנו כאנשי APS והשלישי הוא ערך בוליאני הקובע האם הסקריפט של דף ה ASP ימתין עד לביצוע התוכנית ואז ימשיך לרוץ (TRUE ) או לא יחכה לסיום התוכנית וימשיך לרוץ מיד (FALSE ).
אם בחרנו ב TRUE הפונקציה RUN תמתין עד לסיום התוכנית ותחזיר ערך 0 אם הפעולה הצליחה או מספר שגיאה אם התוכנית נכשלה, בדוגמת הקוד הזו התשובה מאוחסנת במשתנה RetCode
אם נריץ את הקוד הבא
Set WShShell = Server.CreateObject("WScript.Shell")
RetCode = WShShell.Run("ping www.vega.co.il",1,true)
set WShShell= nothing
כל פעם שדף ה ASP ירוץ השרת ישלח PING לכתובת www.vega.co.il הבעיה היא כיצד ללכוד את הפלט.
אין שום תועלת בדף ASP השולח PING אם התשובה לא מוצגת בדף אלה בשרת (במקרה זה פרמטר החלון, בו לא דננו, הוא כזה שהתוכנית רצה בשקט אפילו במסך המחובר לשרת לא נקבל פלט).
שלב ב' אחסון הפלט בקובץ טקסט
בשלב זה נזכרתי בכמה פקודות DOS שלמדתי בימים עברו – תתפלאו אבל חיים עוד עמנו מספר אנשים שבמשך שנים ידעו רק DOS (-;
לדוגמה אפשר להגיד ל DOS אלכסן את הפלט של התוכנית בקובץ טקסט במקום להציג אותה על המסך.
הקש מחלון DOS במערכת ההפעלה את הפקודה
ping www.vega.co.il > c:\ping.txt
תוצאת ה PING תישמר בקובץ הטקסט ping.txt כמובן שניתן לתת לקובץ כל שם אחר.
כמו כן ניתן להכין בDOS קבצי אצווה BATCH FILES המקבלים פרמטרים ומריצים שורה של פקודות במערכת ההפעלה. זהו קובץ טקסט רגיל המכיל פקודות DOS והנשמר עם הסיומת bat למשל xxx.bat .
אם תפתחו את הקובץ ping.bat המצורף למאמר הרי שתראו בו שורה אחת בלבד
ping %1 > %2
זה אומר שכאשר הקובץ ירוץ הוא יקבל שני פרמטרים ויריץ את הפקודה PING בצירוף שני הפרמטרים.
שימו לב רק במקרה שם קובץ ה BAT זהה לפקודה שהוא מריץ יכולתי לקרוא לו בכל שם אחר.
אם כך הדרך סלולה לבניית היישום שלנו:
1. בעזרת האובייקט WshShell נריץ את קובץ אצווה ping.bat
2. קובץ זה יריץ פקודת ping של מערכת ההפעלה תוך שהוא מקבל שני פרמטרים: הכתובת אליה ישלח ה PING (דומין או כתובת IP ) ושם הקובץ בו יאוחסן הפלט.
3. התוצאה תישמר בקובץ ping.txt גם כאן יכולתי לקרוא לקבצים בכל שם אחר, בדוק את הקובץ Ping.asp המצורף וראה כצד זה מבוצע .
חשוב! במאמר מובאים רק חלקים של הקוד ומוסברים העקרונות, על מנת לנתח את הקוד מומלץ להוריד את הקבצים המצורפים לשמור את כולם באותה מחיצה, לבדוק שבמחיצה זו יש הרשאת כתיבה, ולהריץ את קבצי ה ASP דרך השרת (לא נדרשת כל התקנה מיוחדת בנוסף) ולאחר מכן לעין בקוד.
שלב ג' יצירת הפלט
אם הפלט מאוחסן כקובץ טקסט הרי שאין לנו בעיה, ASP יודעת לקרוא קובץ טקסט בעזרת האובייקט Scripting.FileSystemObject וכול שנותר הוא להדפיס אותו למסך.
הנה חלק קוד המבצע את כל השלבים ויוצר PING
המשתנה DNAME מכיל את כתובת המחשב המרוחק אליו נשלח PING - דומין או IP והוא יכול להכיל ערך קבוע או תוצאה של שדה טופס
Set OFS = Server.CreateObject("Scripting.FileSystemObject")
ilePath=left(Request.ServerVariables("path_translated"),_
len(Request.ServerVariables("path_translated"))-8)
OutputTxtFile=FilePath & "ping.txt"
BatComFile=FilePath & "ping.bat"
set Shell=Server.CreateObject("WScript.Shell")
ShellResult = Shell.Run(BatComFile & " " & Dname & " " & OutputTxtFile, 1, True)
If ShellResult=0 then
set objTxt=ofs.OpenTextFile(OutputTxtFile, 1)
OutputTxt = objTxt.ReadAll
OutputTxt = Replace(OutputTxt, vbCrLf , " ")
OutputTxt = Dname &" "& now &"
"& OutputTxt
Response.Write "connection information pinging to: " & OutputTxt
Else
Response.Write "Natestat command couldn't be executed "
Response.Write " Error: "& ShellResult &""
End If
למאמר צרפתי דוגמאות קוד למספר יישומים נוספים של הקונספט שהוצג, שחקו עם הקוד ותוכלו להריץ פקודות נוספות ויישומים אחרים (למשל פקודת DIR ב DOS )
להורדת קובץ ZIP עם הדוגמאות, לחץ כאן
בהצלחה
|