Xp_cmdshell - ilDBA Portal

Xp_cmdshell

16/11/2011 | פורסם על ידי

הפרוצדורה הנ"ל שהיא Extended Stored Procedure מאפשרת להריץ Command Lines שהשרת תומך בהם, מתוך SQL Server.

קודם כל הכוונה לפקודות הוותיקות המוכרות לנו מימי DOS העליזים- Copy, Dir, Type, Del, MD, RD וכו',
ובהמשך לכך Command Lines של מערכות שונות שהותקנו על השרת: SQL Server עצמו עם פקודות כמו BCP או SQLCMD, ועוד.

החל מגרסת 2005 הפרוצדורה מנוטרלת כברירת מחדל בשל בעיות האבטחה הכרוכות בהפעלתה: הפקודה מופעלת על ידי השרת עם ההרשאות של ה-Agent בהתייחס ל-SQL Server ולשרת הפיזי, ומכיוון שיש לו בדרך כלל הרשאות גבוהות שאין לכל משתמש או מתכנת – ניתן להריץ בעזרת xp_cmdshell פקודות שונות מול ה-File System של השרת (כולל מחיצות שלמשתמש עצמו אין הרשאה לגשת אליהן), ובעזרת SQLCMD להריץ פקודות SQL שלמשתמש עצמו אין הרשאה לבצע.

ניתן להתגבר על הבעייה תוך שימוש ב-Proxy.
כך מאפשרים את השימוש בפרוצדורה כך:

Exec sp_configure 'show advanced options', 1
GO
ReConfigure
GO
Exec sp_configure 'xp_cmdshell', 1
GO
ReConfigure
יתכן ובמקום Reconfigure צריך להשתמש ב-ReConfigure With Override בשל רגישות הנושא (כלומר- המערכת מוגדרת כך שיש צורך באישור מיוחד בגלל הבעייתיות בפרוצדורה).
השימוש בפרוצדורה:
Exec master..xp_cmdshell 'Dir C:\'
והפלט המוצג ב-SSMS בצורת Grid הוא הפלט שהיינו רואים לו הרצנו את פקודת \:Dir C ממסך Cmd.
את הפלט ניתן "ללכוד" כך:
Create Table #Tmp(Txt Varchar(Max));
Go
Insert Into #Tmp(Txt)
Exec master..xp_cmdshell 'Dir C:\/b';
Go
Select * From #Tmp;
במקרה זה השתמשתי בפקודה Dir C:\/b שמחזירה רשימת קבצים נקיה ללא תאריכים, גדלים וכותרות.
דוגמה לשימוש בשיטה זו לקליטת תוכן של קובץ לתוך טבלה ניתן לראות בפוסט קודם שלי (יש לחפש שם את xp_cmdshell).
אפשרות אחרת לשלוף את שמות הקבצים מהמחיצה כפקודת Select היא באופן הבא:
Select    *
From Openrowset ('Sqloledb','Server=localhost;Trusted_Connection=Yes','Set Fmtonly Off Exec Master..Xp_Cmdshell ''Dir C:\/b''')
כאשר במקום localhost ניתן לציין את שם השרת במפורש (למשל כאשר פונים מתוך Instance).
במקרה זה ניתן למיין את הרשימה, להוסיף תנאי Where וכו'.
ולבסוף דוגמה לשימוש ב-xp_cmdshell תוך גיבוי הפלט למחיצה נפרדת כששם קובץ הגיבוי כולל את התאריך השוטף, כדי שניתן יהיה לעקוב אחר מה שנעשה.
אני מדגים שמירת קובץ עם Dir של מחיצה בדיסק, כשהכוונה שלי להמחיש כיצד ניתן ללכוד את הפלט של כל מה שמופעל מה-Command Line ולשמור אותו לבקרה:
Declare    @File Varchar(8000),
@Cmd Varchar(8000);
Set        @File=Convert(NVarChar(20),GetDate(),112)+'.txt';
Set        @Cmd='dir c:\ > C:\Gibuy\'+@File;
Exec master..xp_cmdshell @Cmd;
משום מה, xp_cmdshell מסרב להפעיל פקודות השמורות במשתני (Varchar(Max ולכן "הסתפקתי" ב-(Varchar(8000.
קצת "מורשת קרב" אישית: לפני מספר שנים עבדתי במקום בו השתמשו ב-DataStage (כלי ETL) ליצוא נתונים ממערכות מסויימות ולקליטתן באחרות,
כאשר הכל נוהל על ידי מערכת Control M (מערכת לתזמון תהליכים) שהייתה אחראית על הפעלת יצוא הנתונים בעזרת ה-DataStage, העברת קבצי הפלט למחיצת הקלט, והפעלת ה-DataStage לקליטתם ביעד.
המשימה שלי פחות או יותר הייתה ליצור Command Lines בעזרת xp_cmdshell שייצרו ג'ובים מתאימים ב-Control M, שהם עצמם יפעילו בעזרת Command Lines את ה-DataStage..
בקיצור- אפשר לנהל את כל העולם עם xp_cmdshell!

נתראה ברשומה הבאה!

גרי רשף
לרשומה המקורית ולרשומות נוספות של גרי ניתן להיכנס לבלוג שלו: gerireshef.wordpress.com
ניתן גם לפנות במייל GeriReshef@gmail.com
The following two tabs change content below.

גרי רשף

Latest posts by גרי רשף (see all)

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

הפונקציה COALESCE

כולם מכירים את הפונקציה NVL, ומשתמשים בה לא מעט. לעומת זאת, הפונקציה COALESCE, השייכת לאותה משפחה של פונקציות, פחות מוכרת, למרות שהיא קיימת כבר מגרסה 9i ועולה ביכולותיה על NVL הישנה והטובה. מצד שני, אף [...]

טיפ: איך לזכור ב-SQLPLUS שאתה בסביבת היצור

כמה פעמים קרה לנו שעבדנו עם sqlplus  מול סביבת יצור ביחד עם עוד כמה חלונות פתוחים ועם קצת לחץ? בקיצור כרגיל… מכוון שהכול כל כך לחוץ, הרצנו איזה פקודה הרסנית, ומיד הצטערנו עליה מאוד: אוי! הרצתי [...]
עבודה

עבודה תחת סביבת FireWall

אורי לרנר בטיפ קצר ושימושי על עבודה בסביבת אורקל [...]
Indexes

Indexes in SQL Server 2

ערן שקד ממשיך בסדרת מאמרים על אינדקסים בSQL [...]
Copyright 2019 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: