תחומים
    • הרשמה
    • התחברות
    • חיפוש
    • קטגוריות
    • פוסטים אחרונים
    • משתמשים
    • חיפוש
    1. דף הבית
    2. yossiz
    חוקי הפורום
    • פרופיל
    • עוקב אחרי 0
    • עוקבים 20
    • נושאים 111
    • פוסטים 5514
    • הגבוה ביותר 4586
    • שנוי במחלוקת 1
    • קבוצות 0

    yossiz

    @yossiz

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    14752
    מוניטין
    5411
    צפיות בפרופיל
    5514
    פוסטים
    20
    עוקבים
    0
    עוקב אחרי
    הצטרף ב- התחבר לאחרונה
    כתובת אימייל yossizahn@gmail.com

    yossiz הפסק לעקוב עקוב

    הפוסטים הטובים ביותר שנוצרו על ידי yossiz

    • מדריך: שורת הפקודה

      הבהרות

      הבהרה1: נא לסלוח על טעויות כתיב והחלפות זכר לנקבה וכדו', עברית היא לא שפת אם שלי
      הבהרה2: יש הרבה שורות פקודה, נשתדל לא להתמקד בשום אחד מהם אלא לדבר על דברים שקשורים לכולם
      הבהרה3: אין צורך בשום ידע מוקדם, חוץ מלדעת איפה נמצא כפתור ההפעלה של המחשב...
      הבהרה4: אין שום התחייבות להמשיך את הסדרה, זה על בסיס זמן פנוי וחשק...
      הבהרה5: למען הסדר הטוב, פתחתי עוד נושא לתגובות, נא להגיב שם. כאן אני מתכוון להעלות המשכים לסדרה.
      הבהרה6: בל"נ לא יהיו עוד הבהרות ומיד ניגש לענין...

      הקדמה: שורת הפקודה מהו

      לרוב האנשים המילה "תוכנה" אומרת: "חלון, ובתוכו אובייקטים גראפיים, שבאמצעות אינטראקציה איתם אפשר לעשות פעולות מסויימות". זהו התוכנה האינטראקטיבית. הוא נמצא כל הזמן (עד שתסגור אותו), כל מרכולתו פרושה לפניך, הוא יושב ומחכה לתגובה שלך, ורק נשאר לך לבחור מה אתה רוצה. אתה בוחר משהו, הוא עושה את הפעולה, ושוב חוזר ומחכה לתגובה הבא שלך. התוכנה ה"לא איטראקטיבי" או ה"פקודה", לעומת זאת, אינו יושב ומחכה לתגובה שלך (כמעט) אף פעם, מריצים אותו, הוא עושה מה שביקשת ומיד מסיים תהליך ונסגר. רוצה עוד משהו? צריך להריץ אותו שוב.
      בד"כ מריצים תוכנה באמצעות תוכנה אחרת שנקרא ה-shell (מעטפת). יש shell גראפי (בווינדוס נקרא explorer.exe) ובאמצעיתו אפשר להריץ תוכנות אינטראקטיביות ע"י לחיצה על אייקון, ויש shell טקסטואלי שבו מריצים תוכנות ע"י כתיבת שמם וזהו שורת הפקודה.

      שורת הפקודה = סביבה מבוסס טקסט שבה מריצים תוכנות (לרוב, פקודות לא אינטראקטיביות), (CMD ב-Windows ו-DOS (ז"ל) או Powershell בווינדוס, bash, sh, וכו' בלינוקס, וכו')

      למרבה האירוניה, למרות שדרך שורת הפקודה מריצים בד"כ רק תוכנות "לא אינטראקטיביות", אבל שורת הפקודה עצמה מתנהג יותר כתוכנה אינטראקטיבית. הוא מראה לך חלון עם סמן מהבהב ומחכה לקלט שלך. מגיב לפקודות, ובסיום הפקודה אינו נסגר אלה מחכה לעוד.

      רכיבים של שורת פקודה

      • מקום לקלט (input) - כאן מזינים את הפקודות.
      • מקום לפלט (output) - כאן מקבלים תוצאות. (בד"כ זה אותו חלון של הקלט)
      • PROMPT (הנחיה?) - רמז ויזואלי שהסביבה מוכן לקבל קלט. כאשר פקודה רצה, הסמן המהבהב נמצא בשורה בפנ"ע בלי PROMPT לפניה (לפעמים יש פלט של הפקודה שרצה, לפעמים לא). כאשר הפקודה מסתיימת, ושורת הפקודה מוכנה לקבל עוד פקודה, מודפס שוב שורת ה-PROMPT ואח"כ סמן מהבהב, זה סימן שאפשר להתחיל לכתוב עוד פקודה.
        זה נראה משהו כזה בווינדוס:
      C:\Users\yossi>_
      

      (למה כתוב נתיב ב-PROMPT? נגיע לזה יותר מאוחר).

      רכיבים של "פקודה" (תוכנה לא אינטראקטיבית)

      הרכיבים: קלט, פלט, וחישוב
      הפקודה מקבלת קלט עושה עם זה חישוב ומחזירה את הפלט. (לא תמיד חייבים כל הרכיבים).

      קלט

      יש כמה דרכים להכניס קלט לפקודה

      • דרך פרמטרים (נקראים גם switches, ו-arguments) = כל מה שכותבים אחרי שם הפקודה. כל זה מוזן לפקודה, הפקודה אמור להבין את זה ולפעול לפי"ז. כותבים את שם הפקודה. אח"כ כותבים את הפרמטרים. כל פקודה מחליטה לעצמה איך לתרגם את הפרמטרים שלה. (אם כי יש כמה מוסכמות מקובלות.)

      דוגמא:

      echo "Hello, World!"
      

      echo הוא שם הפקודה. פקודה זו לוקחת את הפרמטרים ופולט אותם החוצה, בלי להפעיל עליהם שום חישובים.
      "Hello, World!" הוא פרמטר שהפקודה מקבלת.
      הפלט:

      Hello, World!
      

      אפשר להזין יותר מפרמטר אחד. וכל פרמטר יכול להכיל יותר ממילה אחת. בד"כ רווח מחלק בין פרמטרים, אם כותבים גרשיים מסביב למילים זה מחבר אותם לפרמטר אחד. הפקודה echo יכולה לקבל יותר מפרמטר אחת. לפי"ז הייתי יכול לכתוב:

      echo Hello, World!
      

      ואז זה היה מתורגם לפקודה עם 2 פרמטרים - "Hello," ו-"World!". במקרה שיש יותר מפרמטר אחד, הפקודה echo פולט אותם החוצה עם רווח ביניהם, ונקבל אותו פלט.
      אמנם, מה יקרה אם נכתוב:

      echo "Hello,       World!"
      echo Hello,       World!
      

      הפלט יהיה:

      Hello,       World!
      Hello, World!
      

      (אזהרה: הנ"ל נכון רק ב-bash, ב-CMD זה לא יעבוד, אבל העיקרון נכון גם ב-CMD רק שecho הוא לא פקודה רגילה ב-CMD, אולי נסביר יותר בהמשך)
      במקרה הראשון יש פרמטר אחד עם הרבה רווחים באמצע, במקרה השני יש 2 פרמטרים בלי שום רווחים, הרווחים מתורגמים כמחלקים בין הפרמטרים, ולא מוזנים לפקודה.

      עוד דרכים להזנת קלט:

      • קבצים
      • משתני סביבה

      פלט

      • טקסט מודפס בחלון שורת הפקודה
      • פעולה שקורה (למשל כיבוי המחשב)
      • קבצים
      • קוד (מספר) שהתוכנה מחזירה - (return code)
      • ....

      ההמשך יבוא... (אולי כן, ואולי לא...)

      פורסם בתוכנה
      yossiz
      yossiz
    • RE: מדריך: שורת הפקודה

      משתני סביבה

      מה זה "משתנה"?

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

      msg yossi שלום Yossi!
      msg yossi שלום Dovid!
      ....
      ....
      

      (הפקודה msg מקבל 2 פרמטרים: שם המשתמש שיראה את ההודעה, ותוכן ההודעה. שם המשתמש במקרה זו הוא yossi והתוכן הוא "שלום פלוני!")

      או אני יכול לכתוב את הפקודה פעם אחת עם משתנים, שם ה"משתנה" הוא רק עוגן, וה-shell ממלא בכל פעם את הערך של המשתנה בזמן הרצה.

      (משתנים ב-CMD כותבים מסובבים ב-%-ים. התו % הוא תו מיוחד רק במקרה שהוא סובב משתנה שקיים במערכת. כדי לכתוב % בלי שיתורגם כתו מיוחד כותבים ^%. (דרך אגב, טכניקה זו לכתוב תו לפני תו מיוחד כדי שלא יתורגם בצורה מיוחדת, נקרא escaping - מילוט) אין צורך (וגם לא יעזור) לעשות מילוט ל-% הראשון אלא לשני.)

      למשל אכתוב:

      msg %username% שלום %ploni%!
      

      עכשיו ה-shell יבדוק עם יש משתנה מוגדר בשם "USERNAME", ותמיד יש כזה כי זה משתנה שמוגדר אוטומטי ע"י המערכת, וערכו הוא שם המשתמש הפעיל - בדוגמא שלנו "yossi". ה-shell ימחוק את השם של המשתנה ובמקום זה ימלא את הערך "yossi".

      עכשיו ה-shell יעבור לבדוק עם יש משתנה בשם PLONI. מכיון שאין, נצטרך להגדיר אחד כזה. ב-CMD עושים את זה כך:

      set PLONI=Dovid
      

      אם עכשיו נריץ את הפקודה - התוצאה:
      48a83b44-f3e1-4612-93fc-2f8601cef566-image.png

      משתני סביבה

      משתנה שמוגדר כ"משתנה סביבה" הוא משתנה ששייך לתהליך וכל התהליכים הבנים יקבלו אותו בירושה מהאבא. ב-CMD, כל המשתנים הם משתני סביבה. אם תגדיר משתנה, ואז תריץ פקודה - המשתנה יהיה מוגדר גם בתהליך של הפקודה שרצה. ב-bash יש 2 סוגים, משתנה רגיל, ומשתנה סביבה.

      אפשר לראות (וגם לערוך) משתני סביבה של תהליך בתוכנת Process Hacker
      a42ea64d-b4ec-4e46-83a5-9a67dbdd46e6-image.png
      אפשר לראות משתני הסביבה של תהליך CMD ע"י הפקודה set בלי פרמטרים.

      קראת? יש לך שאלה? השגה? רעיון לשיפור? בקשה להסבר על נושא ספציפי? במקום להצביע ולהמשיך הלאה, תכתוב כאן. הצבעות לא עוזרים לי, ע"י משוב שלכם אדע אם ואיך להמשיך.
      ומכאן קריאה למתקדמים (ולאלה שחושבים שהם מתקדמים) נא לקרוא את הפוסטים, אולי תלמדו משהו בדרך, אבל בעיקר נא לקרוא ע"מ לקנטר... אני בטוח שיש המון שגיאות ואי דיוקים.

      פורסם בתוכנה
      yossiz
      yossiz
    • אפשר לעשות קישור למלל מסויים בדף, הידעתם?

      אתם בכרום וחבריו? מצויין!
      לחצו על לינק זה

      שמתם לב?
      זה לוקח אותך ישירות לכותרת "תורני" וליתר בהירות, המילים צבועים בצבע צהוב יפה (?)

      תמיד ידענו שאפשר לעשות לינק לאלמנט בדף שיש לו ID על ידי הוספת ה-ID אחרי ההאש (#). מעתה (מכרום 80) אפשר לקשר לכל מלל בדף שתרצה, רק תוסיפו את זה להאש: :~:text=XXXX

      📜 תיעוד מלא: https://github.com/WICG/ScrollToTextFragment/#text-fragments

      תיעוד קצר בעברית מדוברת

      מבנה הקישור:

      • קודם כל, הכתובת של הדף, ואז -
      • האש - # (מסמן שכל הבא אחריו הוא כתובת של אלמנט בתוך הדף)
      • :~: (מסמן שכל הבא אחריו הוא חיפוש מלל)
      • text=1-,2,3,-4
        במקום 1,2,3,4 יש 4 פרמטרים שאפשר למלאות
        • קידומת (מילים שחייבים להופיע לפני המלל המסומן)
        • תחילת הסימון
        • סוף הסימון
        • סיומת (מילים שחייבים להופיע אחרי המלל המסומן)
      • אפשר להוסיף עוד איזורים מסומנים על ידי ‎&text=1,2,3,4

      דוגמאות:

      • https://netfree.link/wiki/נטפרי#:~:text=נטפרי ⬅ מסמן את המופע הראשון של המילה נטפרי
      • https://netfree.link/wiki/נטפרי#:~:text=נטפרי,סינון ⬅ מסמן מהמופע הראשון של המילה נטפרי עד המופע הבא של המילה סינון
      • https://netfree.link/wiki/נטפרי#:~:text=לספק-,נטפרי,סינון ⬅ מחפש את המופע הראשון של המילה נטפרי שמגיעה מיד אחרי המילה לספק ומסמן ממנה עד המופע הבא של המילה סינון
      • https://netfree.link/wiki/נטפרי#:~:text=לספק-,נטפרי,סינון,-חיפוש ⬅ מחפש את המופע הראשון של המילה נטפרי שמגיעה מיד אחרי המילה לספק ומסמן ממנה עד המופע הבא של המילה סינון שמיד אחריו נמצא המילה חיפוש
      • https://netfree.link/wiki/נטפרי#:~:text=נטפרי הינו,רווח&text=המערכת,נטפרי. ⬅ סימונים מרובים, מסמן את הקטע הראשון והשלישי

      אפשר להשמיט פרמטרים
      דוגמאות:

      • https://netfree.link/wiki/נטפרי#:~:text=סינון,-קבצי ⬅ רק הפרמטרים 2 ו-4
      • https://netfree.link/wiki/נטפרי#:~:text=סינון,קבצי ⬅ רק פרמטרים 2 ו-3

      קידוד נכון של תווים מיוחדים

      יש תווים שלא תקינים ב-URL וחייבים לקודד אותם.
      אם אתם רוצים לחפש פסיק ושלא יתורגם בצורה מיוחדת כמפסיק בין פרמטרים אפשר גם לקודד אותו
      הקידוד נקרא urlencode ויש כמה אתרים שמספקים ממשק נוח לקדד טקסט לקידוד זה.


      ידעתי כבר מזמן שיש כזו הצעה על הפרק, מה שהביא את זה לתשומת ליבי היום היא העובדה שכנראה גוגל התחילו לשים קישורים כאלה בתוצאות החיפוש
      דוגמה:
      b5d8bfa9-208b-4293-868e-d7c79f9998ab-image.png

      פורסם באינטרנט
      yossiz
      yossiz
    • מדריך לרג'יסטרי - Windows-Registry

      הקדמה

      מה זה הדבר הזה "הרג'יסטרי"?
      הרג'יסטרי הוא סוג של מסד נתונים, DB, בעגה המקצועית אפשר להגדיר אותו כ-key value store. כלומר, מקום אחסון עבור רשומות בצורה של key = value (מפתח = ערך). כלומר לכל רשומה ב-DB יש שם (ה"מפתח") וערך (value).
      בעבר היו שומרים מידע כזאת בקבצי ini או קבצי תצורה אחרות.
      יש אמנם כמה מאפיינים ייחודיים לרג'יסטרי שמעניקים לו התאמה מיוחדת לאחסון של הגדרות מערכת.

      • בגישה להגדרות שמאוחסנות בקבצי INI מסורתיים, יש רק שליטה מוגבלת על ידי הרשאות ברמת הקובץ (אם אתה נותן הרשאות קריאה או כתיבה למשתמש מסויים לקובץ ה-INI, הוא קיבל גישה לכל ההגדרות שנמצאים בתוכו), משא"כ הגישה למפתחות רג'יסטרי אפשר להגדיר הרשאות ברמת המפתח, לכל מפתח אפשר להגדיר הרשאות גישה לעצמו.
      • ההגדרות ברג'יסטרי מסודרות בצורה היררכית ולא בצורה שטוחה. כך הכל יותר מסודר וזה מקל על מציאת דברים.
      • הרג'יסטרי תומך בעדכונים אטומיים (כמו ב-DB, זה סוג עדכון שאתה מורה לרג'יסטרי, שאו שכל העדכון נכנס או שכולו לא נכנס, אסור להשאר במצב שחלק מעודכן וחלק לא).

      מבנה הרג'יסטרי

      הרג'יסטרי בנויה בצורה היררכית כמו עץ. יש ענפים ויש עלים, הענפים הם מפתחות/תקיות והעלים הם הערכים.
      בראש ההיררכיה יש 5 מפתחות שורש (root keys). מתחתם יש עוד מפתחות וערכים.
      מפתח רגיסטרי = תקייה
      ערך רג'יסטרי = מפה (associative array) של name = value
      לכל ערך יכול להיות כמה רשומות של name = value.
      לכל ערך מותר גם רשומה אחת אנונימי בלי שם. בעורך הרג'יסטרי זה מופיע כ-(default)
      (כן כן, המינוחים פה קצת מבלבלים...)
      לכל רשומה יש גם כן סווג של סוג הדאטה שהוא מכיל.
      הנפוצים הם:

      • REG_SZ = מחרוזת (string, מחרוזת של תווים)
      • REG_DWORD = מספר
      • REG_BINARY = דאטה בינארי
      • REG_MULTI_SZ = רשימה של כמה מחרוזות
      • REG_EXPAND_SZ = מחרוזת שיכול לכלול משתני סביבה

      מתוך חמשת מפתחות השורש, שלשה מהם הם וירטואליים (כלומר, הם מיוצרים בצורה דינאמית על ידי מערכת ההפעלה ולא שמורים בדיסק הקשיח):

      • HKEY_CURRENT_USER משקף את התוכן של תקיית המשתמש הנוכחי שנמצא מתחת ל-HKEY_USERS‏.
      • HKEY_CLASSES_ROOT הוא שילוב של התוכן של HKCU\Software\Classes ו-HKLM\Software\Classes.
      • HKEY_CURRENT_CONFIG אודה ולא אבוש שלא ברור לי לגמרי מה מטרתו.

      השניים האחרים שהם העקריים הם:

      • HKEY_LOCAL_MACHINE שמקבץ תחתיו את ההגדרות שנוגעות למחשב בכללות.
      • HKEY_USERS שמתחתיו יש תקייה לכל משתמש במערכת עם ההגדרות המיוחדות למשתמש ההוא (חשוב לדעת שתתי תקייה אלו נטענים רק במקרה שהמשתמש מחובר).

      עד כאן המבנה הלוגי,
      לגבי המבנה הפיזי, חלק המבנה קיים רק בזכרון המחשב, שאר המבנה שמור בדיסק בקבצים שנקראים hives (כוורות, עיין כאן עבור ההסבר המשעשע לבחירת השם הזה).

      • הגדרות המשתמש (HKCU) נמצא בקובץ ‎%userprofile%\ntuser.dat‎
      • הגדרות המערכת (HKLM) נמצאים בתקיית: C:\Windows\System32\config.

      ממשקי גישה לרג'יסטרי

      ווינדוס מספקת כמה ממשקים לרג'יסטרי

      • regedit = עורך גרפי
      • reg = פקודה שאפשר להריץ בשורתהפקודה ובתוך סקריפטים
      • קבצי REG = אפשר לשלב לעדכן או למחוק ערכים מהרג'יסטרי על ידי הרצת קבצי REG
      • ממשק עבור תוכנות (API בלע"ז). כמובן כל הממשקים האחרים משתמשים ב-API הזו מתחת לשטח

      רכיבי ווינדוס העקריים שמשתמשים ברג'יסטרי

      שירותי מערכת
      שירותים הם תהליכים שרצים בלי התערבות משתמשים. בווינדוס, המילה "שירותים" כוללת גם כן דרייברים. כל ההגדרות הנוגעות לשירותי מערכת מאוחסנים בנתיב: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

      הגדרות קרנל או רכיבי ליבה אחרים HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
      ועוד ב-HKEY_LOCAL_MACHINE\SYSTEM

      הגדרות תוכנה
      הגדרות ברמת מערכת: HKEY_LOCAL_MACHINE\SOFTWARE
      הגדרות ברמת משתמש: HKEY_CURRENT_USER\Software
      עבור תוכנות 32 סיביות:
      HKLM\SOFTWARE\WOW6432Node
      HKCU\SOFTWARE\WOW6432Node

      הגדרות רכיבי COM
      אל תשאל מה זה רכיבי COM... זה סיפור מורכב ביותר. אבל יש חלקים נרחבים של מערכת ווינדוס שבנויים על טכנולוגיית COM, וכדי שזה יעבוד צריך את החלק הזה של הרג'יסטרי...
      HKEY_CLASSES_ROOT
      גם שיוכי קבצים לתוכנות נמצאים (בעיקר) שם (אל תשאלו למה...).

      הגדרות לוח הבקרה ועוד
      HKEY_CURRENT_USER\Control Panel

      מדיניות קבוצתיות (GPO)
      בכמה מקומות מתחת לתקייות בשם policies. לדוגמה: HKLM\Software\Microsoft\Windows\CurrentVersion\Policies (מדיניות ווינדוס לכלל המערכת),
      HKCU\Software\Microsoft\Windows\CurrentVersion\Policies (מדיניות ווינדוס למשתמשים מסויימים),
      HKCU\Software\Policies, HKLM\SOFTWARE\Policies (מדיניות תוכנות אחרות)

      מציאת מיקום הגדרה ברג'יסטרי

      הנה מגיע החלק החשוב...
      א. חובה להיות מיומן בחיפושי גוגל... רוב המידע נמצא כבר שמה
      ב. procmon,
      ג. procmon,
      ד. ושוב procmon... 🙂

      ולקינוח:

      עריכת רגיסטרי לא מקוון

      אפשר לערוך הגדרות רג'יסטרי גם על מערכת "מתה"
      מייבאים את ה-hives לתוך עורך הרג'יסטרי במערכת "חיה" על ידי בחירת התפריט File -> Load Hive.
      חשוב לדעת איך עושים את זה כאשר רוצים לערוך הגדרות של מערכת הפעלה מתוך סביבת הריקוברי של ווינדוס

      לעוד פרטים טכניים מומלץ לקרוא את הכתבה בוויקיפידיה האנגלי
      יש שאלות? אשמח לנסות לתת מענה. (הרבה יותר קל לענות על שאלה ספציפית מאשר לכתוב סקירה על כל הנושא...)

      פורסם במדריכים
      yossiz
      yossiz
    • איך שואלים שאלות בפורום

      @yossiz אמר בעזרה ב...:

      (הערה קטנה: אי אפשר ככה להזמין קוד ולצפות שמישהו יספק את הסחורה בשבילך בחינם.)

      אנשים אולי יתפלאו על ההערה, הרי קורה לא מעט שיש שאלות ואני בעצמי עונה עם סקריפט גדול מוכן. למה פה בחרתי להעיר ובמקרים אחרים אני מספק את הסחורה?

      ובכן,
      א) אני בן אדם ולא תמיד עושה דברים רק על פי שכל... נראה לי שכולם מכירים את המאפיין המוזר הזה של בני אדם.

      ב) נראה לי שצריך להבחין בין שאלות לבקשת טובות. שאלות - הוגנות, בקשת טובות - לא כל כך. שימו לב שבקשות לא הוגנות גם לא מזמינות תשובות איכותיות, אז כדאי להכיר את הצורות:

      נקח לדוגמה צורך מסויים שמחייב כתיבת סקריפט.

      • אפשר לפתוח נושא על הצורך עצמו: "איך מטפלים בבעיה XYZ?". זו לטעמי שאלה לגיטימית לחלוטין. הבעיה מאוד מוגדרת וספיציפית. השואל לא יודע מה הפתרון, והוא מבקש עצות מהציבור.
      • או אפשר להחליט שהתשובה היא כתיבת סקריפט, אבל הבעיה היא שהשואל הרי לא יודע לכתוב סקריפט אז בוא נבקש מאחרים שיעשו את העבודה בשבילי. ואז מגיע פוסט בסגנון: "אני צריך סקריפט שעושה XYZ. למי יש? דחוף!" זו בקשת טובות, והיא לא הוגנת לטעמי. אתה לא מבקש עצה או פתרון, אלא מבקש שאחרים יעשו בשבילך עבודה שאתה לא מסוגל לעשות.

      לפעמים הקו שמפריד בין שאלה לגיטימית לבקשת טובות נראה לפום ריהטא כקו די דק. אפשר לשאול "איך אני עושה XYZ בתוך סקריפט?" והכוונה היא לשאול שאלה ולהחכים וללמוד מהתשובות ולא לבקש מאחרים שיעשו בשבילך עבודה. או אפשר לשאול אותה שאלה בדיוק והכוונה היא למצוא פראייר שיעשה בשילך את העבודה בחינם. אבל אחרי מעט התבוננות ניתן בד"כ להבחין בין שתי הצורות בקלות על ידי מדידת רוחב השאילה. כלומר, אם השאלה היא מאוד ספציפית ניתן להניח שמדובר בשאילת לימוד. אבל אם השאלה מאוד רחבה "בנה בשבילי תוכנה שתתקן את כל העולם!" אז ניתן להניח די בוודאות שמדובר בבקשת טובות.

      לסיכום, הפורום לא נועד לבקש טובות מהציבור אלא לבקש עצות, ידיעות, או דברי חכמה וכדומה.
      כמובן שמותר גם לבקש טובות, הלא חסד הוא אחד מהעמודים שעליהם העולם עמוד. אבל גם בבקשת טובות יש צורה, לא לכתוב "אני חייב דחוף XYZ! מי מתנדב בשבילי? דחוף מאוד מאוד! אה, וכמעט שכחתי, תודה מראש." וד"ל. וגם לדאוג לשמור על צביון הפורום שרוב הפוסטים יהיו שאלות ולא בקשות טובות. ובנוסף לתת את הדעת על גודל הטובה, האם זה משהו שאפשר לענות במחשבה של שנייה, או האם זה משהו שמצטרך השקעה של חצי שעה?

      פורסם במדריך לשימוש בפורום
      yossiz
      yossiz
    • RE: מדריך: שורת הפקודה

      פקודות פנימיים לעומת פקודות חיצוניים

      פקודות מגיעות ב2 טעמים - פנימי וחיצוני.
      פקודה חיצונית הוא תוכנה מהמחשב - לדוגמא אם נכתוב בשורת הפקודה notepad זה יריץ את הכתבן מהנתיבC:\Windows\notepad.exe. אבל יש גם פקודות שממומשות ע"י ה-shell עצמה. נזכיר, ש-shell = סביבה שמתוכה מריצים פקודות. ה-shell הוא גם תוכנה וחלק מהפקודות ממומשות על ידה בלי צורך להריץ תוכנה חיצונית.
      למשל, בכל ה-shellים, יש פקודה cd לשינוי תקייה נוכחי, פקודה זו חייבת להיות פקודה פנימית כי אין דרך לתוכנה חיצונית לשנות את התקייה הנוכחית לתהליך האב שלה. אם נכתוב ב-bash או ב-CMD את הפקודה (הפנימית) help נקבל רשימה של פקודות פנימיות. (ב-CMD, הרשימה כולל ג"כ פקודות חיצוניות, ב-bash לא).

      למה חשוב לדעת אם זה פנימי או חיצוני? שאלה טובה... (ב-bash, העזרה המובנית הוא רק לפקודות פנימיות, ב-CMD כמו ב-CMD המצב יותר מסובך...)

      תווים מיוחדים

      כמו שכבר הזכרנו בפוסט הראשון, הדרך להריץ פקודה הוא - לכתוב את שם הפקודה, ואח"כ פרמטרים. הפרמטרים מועברים לפקודה ע"י ה-shell. בד"כ הפרמטרים לא עוברים עיבוד ע"י ה-shell, אלא מועברים כמו שנכתבו. זה נכון כאשר אין תווים מיוחדים, כאשר יש תווים מיוחדים, תווים אלה יש להם משמעות מיוחדת ל-shell והם לא מועברים לפקודה אלא מתורגמים ע"י ה-shell. לכל shell יש כללים משלו מה נחשב לתו מיוחד, ואיזה פעולה כל תו יעשה. למשל ב-bash נחשב רווח כתו מיוחד, כאשר ה-shell פוגש ברווח, זה אומר לו: כאן סוף פרמטר, התו הבא שאינו רווח מתחיל פרמטר שני. משום כך לא משנה כמה רווחים תשים בין המילים, הפקודה תמיד יקבל את המילה שלפני הרווחים כפרמטר 1, והמילה שאח"כ כפרמטר 2, והרווחים נבלעים ע"י ה-shell.
      ב-CMD כמו ב-CMD המצב יותר מסובך... כל מה שמגיע אחרי הפקודה מועבר לפקודה (כולל כל הרווחים). עכשיו הפקודה עצמה יכול לבחור עם לעבד את הפרמטרים בעצמו (עם הכללים שהוא ירצה לייצר לעצמו) או להעביר את המחרוזת לווינדוס לעבד אותו לפי כללים ידועים.
      רוב הפקודות מעבירים את המחרוזת לעיבוד לפי הכללים הידועים. ובהם תקף הכלל הנ"ל שרווח מפסיק בין הפרמטרים, וגרשיים מחבר.
      תוכנות שנכתבו ב-C (שפת תיכנות ישישה ומכובדת) יעברו עיבוד אוטומטי ע"י ה-CRT (סביבת ההרצה של C - בעיקרון של ווינדוס שכבת תאימות עבור שפת C). (יש גם אפשרות לכתוב ב-C בלי לכלול את ה-CRT, אבל זה שייך ל"תכנות אקסקלוסיבי"...) התוכנה יכולה לבחור בכל זאת להתעלם ולהשתמש במחרוזת המקורית.

      איך מעבירים רווח לפקודה שמשתמש ברווח כתו מיוחד? למשל אם נרצה למחוק קובץ בשם c:\new file1.txt, אם נכתוב כך:

      del c:\new file1.txt
      

      נקבל תשובה

      Could Not Find c:\new
      Could Not Find C:\WINDOWS\system32\file1.txt
      

      כלומר שהקובץ new (פרמטר 1) לא נמצא, והקובץ file1.txt (פרמטר 2) לא נמצא. אנחנו צריכים לכתוב בפרמטר אחד את כל שם הקובץ, אבל שם הקובץ כולל רווח - שמחלק בין פרמטרים? בשביל זה יש עוד תו מיוחד ". הגרשיים מחברים כל מה שבתוכם לפרמטר אחד.

      del "c:\new file.txt"
      

      ד. א. כאשר ניסיתי כמה פקודות לצורך כתיבת הפוסט, מתברר ש-notepad משתמש במחרוזת המקורית, כולל רווחים. למעט רווחים בסוף המחרוזת (שגם מועברים לתוכנה אבל נמחקים ע"י notepad).
      echo משתמש במחרוזת המקורית. כנ"ל cd. כנ"ל start. (לכל אחד ייתכנו הבדלים עדינים בדרך שהם מתרגמים את המחרוזת שהם מקבלים).

      תווים מיוחדים ב-CMD

      כמו שהזכרנו, ב-CMD יש תווים שהתוכנה יכולה לבחור אם הם יחשבו כתווים מיוחדים או לא. יש תווים שהם מיוחדים מיוחדים... והם לא יועברו לתוכנה בשום פנים, ואלו הם:
      < > ^ | & ו-enter. (אולי יש יותר?)
      איך כותבים תווים אלו בלי שיתורגמו באופן מיוחד ע"י CMD ויועברו ישירות לפקודה? כותבים ^ לפני התו: ^| ^< ^> ^^ ^& ו- ^+enter.
      התו ", גם כן מיוחד קצת... כי תו מיוחד אחר (חוץ מ-enter) שמגיע אחרי ה" הפותח ולפני ה" הסוגר כבר לא נחשב כתו מיוחד.
      אני מאמין שיש עוד כמליון ואחד פרטים לגבי טיפול בתווים מיוחדים ב-CMD... מי שמכיר מוזמן לכתוב באשכול התגובות.

      פורסם בתוכנה
      yossiz
      yossiz
    • RE: מדריך: שורת הפקודה

      (למרות שכתבתי מראש שאני לא רוצה להתמקד על מימוש מסויים של שורת פקודה, אני רואה שיש יותר מדי הבדלים דקים בין המערכות ומכיון שרוב השימוש של מבקרי הפורום הוא בווינדוס, לכן מכאן והלאה, אם לא צויין אחרת מדובר ב-CMD - שורת הפקודה של ווינדוס)

      איזה פקודות ניתן להריץ משורת הפקודה?

      התשובה היא: כל תוכנה (קובץ EXE) שקיימת במערכת (או בדיסק חיצוני) + פקודות מובנות (ראה למעלה הסבר על פקודות מובנות/פנימיות).

      אומנם, יש תוכנות שנבנו מתחילה על דעת להשתמש בהם בסביבת שורת פקודה, ויש תוכנות שנבנו מתחילה על מנת להשתמש בהם בסביבה גרפית.
      תוכנה שנבנתה מתחילה לשם שימוש בשורת הפקודה, בד"כ יקבל הרבה יותר פרמטרים מאשר הסוג הגרפי (שהרבה מהם לא מקבלים פרמטרים כלל, או שמקבלים רק פרמטר של שם קובץ). זאת משום שפרמטרים היא אחת מהדרכים העיקריות להעביר קלט אל תוך התוכנה. בנוסף, הסוג הטקסטואלי, יכלול בתוכה קוד שיורה למערכת ההפעלה להדפיס את הפלט שלה בחלון הפקודות. מכיון שכן, אין טעם להריץ אותה מחוץ לשורת הפקודה, מכיון שאז לא יהיה ניתן לקרוא את הפלט שלה.

      בווינדוס (בניגוד ללינוקס) קיים דגל (ביט בינארי) בתוך קבצי EXE שאומר למערכת ההפעלה "הלו, אני מיועד לשימוש בסביבה השחורה של שורת הפקודה". זה גורם לווינדוס להתייחס לתוכנה בצורה שונה. זה מתבטא בכמה דברים.
      א) לחיצה כפולה על התוכנה תמיד יפתח אוטומטית חלון שחור של CMD, (מכיון שכנ"ל אין טעם להריץ אותו מבלי שיהיה לה מקום לפלוט אליו טקסט). ברוב המקרים פתיחת החלון האוטומטי לא עוזר למשתמש מכיון שהחלון נסגר אוטומטית ברגע שהתוכנה מסיים את פעולתה, ואתו נעלם כל הפלט של התוכנה. החכם עיניו בראשו, יפתח מראש חלון פקודה ויריץ את התוכנה מתוך שורת הפקודה.
      ב) גם בהרצה מתוך שורת הפקודות (על ידי כתיבת שם התוכנה ולחיצת אנטר) ווינדוס מבחינה בין השתיים. בהרצת הסוג הגרפי, השליטה יחזור מיד ל-shell אחרי הרצת הפקודה. זה ניכר על ידי הדפסה חוזרת של ה-PROMPT (מה זה PROMPT? אפשר לקרוא עליו בפוסט הראשון של הסדרה). זה אומר למשתמש: "אני מוכן לקבל עוד פקודות". לעומת זאת, בסוג הטקסטואלי, בעת ריצת התוכנה, חלון הפקודות נמצא בשליטת התוכנה, זה מתבטא בזה שאי אפשר להזין עוד פקודות, מה שמצויין על ידי חיסרון שורת ה-PROMPT לפני הסמן המהבהב. זאת כדי לתת אפשרות לתוכנה להדפיס מידע לחלון.

      (במערכות לינוקס, אין הבחנה בין סוגי התוכנות במבנה הקובץ, כל התוכנות תופסים בברירת מחדל את חלון הפקודות כל זמן הריצה, מערכת ההפעלה לא תפתח חלון פקודות אוטומטית עבור שום תוכנה שהיא, יש דרכים להריץ תוכנות מתוך שורת הפקודות בצורה שלא יתפסו את חלון הפקודות, אבל זה נושא לשיעור אחר).

      איך מריצים תוכנה XXX מתוך שורת הפקודה?

      (לקבל את התשובה המתומצתת, ראה סוף הפוסט)

      קודם כל, נסביר למה יש צורך לפעמים להריץ תוכנה דוקא מתוך שורת הפקודה?

      אם התוכנה פולטת טקסט לשורת הפקודה, אז חייבים להריץ אותה מתוך שורת הפקודה אחרת לא נוכל לצפות בפלט. גם אם אין פלט (או שאנחנו לא מעוניינים לצפות בפלט), עדיין יש מקרים שאנחנו רוצים להעביר מידע מסויים לתוכנה על ידי פרמטרים, [במקרה כזאת ניתן להריץ את התוכנה גם מתוך תיבת ההפעלה (windows+r)].

      עכשיו נסביר מה קורה כאשר מכניסים פקודה לשורת הפקודה:

      כמו שכתבנו למעלה (ואוו, כבר עברה שנה!) פקודות מגיעות בשני טעמים - פקודות פנימיות ופקודות חיצוניות. הפנימיות הם אלו שה-shell (מתרגם הפקודות) בעצמו מממשת (לדוגמה cd), כלומר, אם נריץ את הפקודה (זוכרים עדיין איך? פשוט כותבים את שם הפקודה ולאחריה הפרמטרים ואנטר לקינוח) ה-shell שמאזין לקלט מסתכל במילה הראשונה (שם הפקודה) ומבין שהפקודה מופנית אליו, ואז הוא קורא ומעבד את שורת הפקודה ומגיב בהתאם.
      פקודה חיצונית היא פקודה שלא מובנית בתוך תוכנת ה-shell, ה-shell מקבל את הקלט, בודק את שם הפקודה, ואופסס... הוא לא מזהה את הפקודה. ניקח לדוגמה את הפקודה: notepad (כתבן). אם נריץ חיפוש על קובץ ה-EXE של תוכנת CMD, נגלה שהמרוזת "notepad" לא נמצא בתוך הקובץ CMD.EXE בשום צורה שהיא. ובכל זאת CMD יודעת איך לטפל בפקודה.
      ההתנהגות של ה-shell עבור כל פקודה שהיא לא מכירה הוא לחפש את מערכת הקבצים עבור קובץ עם שם זהה לשם הפקודה, אם הוא מוצא קובץ כזאת הוא מריץ אותה עם הפרמטרים שהוזנו.

      אבל זה הרי ברור שאי אפשר לחפש את כל מליוני הקבצים במערכת הקבצים כדי למצוא תוכנה עם שם "notepad".
      התשובה היא ש-CMD מחפש רק בכמה נתיבים מוגדרים מראש. באיזה נתיבים?
      א) לפני הכל, בספריה הנוכחית. (ומה היא ה"ספריה הנוכחית"? ראה מסגרת.)
      קודם, CMD יחפש קובץ עם שם זהה לשם הפקודה. אם זה לא נמצא, ינסה CMD למצוא קובץ עם שם זהה לפקודה פלוס אחת מתוך כמה סיומות מוגדרות. בד"כ רשימת הסיומות יכלול: EXE BAT CMD VBS ועוד כמה. ניתן לשלוט על הרשימה באמצעות משתנה הסביבה: PATHEXT.

      ב) במידה ולא נמצאה שום קובץ מתאים בתקייה הנוכחית, יתחיל CMD לחפש בתוך רשימה מוגדרת של נתיבים נוספים. ניתן לשלוט על רשימת הנתיבים באמצעות מתשנה הסביבה PATH. להדפיס את ה-PATH הנוכחי, תריצו את הפקודה: set PATH. זה מדפיס רשימה של נתיבים שמובדלים באמצעות תו ;.

      הספריה הנוכחית - (Working Directory)

      תהליכים במערכת הפעלה מודרנית לא רצות בחלל הריק, שורת הפקודה ומערכת ההפעלה בשיתוף פעולה מכינות להם "סביבת ריצה". הסביבה הזאת כוללת המון דברים (כגון משתני סביבה), ובתוכם "ספריה נוכחית" - שזה אומר תקיית ברירת המחדל לכל פעולה במערכת הקבצים. נגיד שהתוכנה רוצה לכתוב לתוך קובץ, אולי לוג פעילות, אולי קובץ הגדרות, או משהו אחר, לאן לכתוב את הקובץ? לפעמים יש תקייה מוגדרת מראש שאליה יכניס התוכנה את כל קבצי הדאטה שלה, אז היא תגיד למערכת ההפעלה "תצור קובץ בשבילי בנתיב C:\XXX\XXX", אפשרות נוספת היא שהיא יכולה להגיד למערכת ההפעלה "תיצור בשבילי בבקשה קובץ בשם XXX" בלי נתיב, ומערכת ההפעלה תדע לייצר את הקובץ בתוך התיקייה שמוגדרת לתהליך כ"תיקייה הנוכחית".

      תוכנת CMD ככל תהליך אחר, גם כן רצה בתוך סביבה שכוללת בין השאר גם כן "ספריה נוכחית". אפשר לראות מהי הספריה הנוכחית בטקסט ה-PROMPT.

      הספריה הנוכחית באה לידי שימוש בכל מקום שבו כותבים שם של קובץ. אם היא בתוך הספריה הנוכחית, אין צרוך לכתוב את הנתיב המלא של הקובץ, רק את השם של הקובץ עצמו, ומערכת ההפעלה תדע מעצמה לחפש אותה בספריה הנוכחית.
      ניתן לשנות את הספריה הנוכחית של תהליך CMD באמצעות פקודת cd.
      בכל יצירת תהליך, מערכת ההפעלה תקבע את הספריה הנוכחית של התהליך לפי הספריה הנוכחית של תהליך האב. בהרצה מתוך CMD, הספריה הנוכחית תהיה הספריה הנוכחית של CMD.

      עכשיו נחזור לענות על השאלה שהצבנו בכותרת של חלק זה: איך מריצים תוכנה XXX מתוך שורת הפקודה?

      התשובה, לאור הנ"ל היא:

      • אם הפקודה היא מובנית/פנימית - כותבים את שם הפקודה
      • אם הפקודה היא חיצונית - אם הפקודה ממומשת על ידי תוכנה שנמצא בספריה הנוכחית או על ידי תוכנה שנמצא בתוך רשימת הנתיבים שב-PATH - אז ניתן להריץ אותה על ידי כתיבת שם קובץ ה-EXE (עם או בלי הסיומת - בתנאי שהסיומת היא מאלו שנמצאים ברשימת PATHEXT).
      • אם לא מתקיימים אף אחד מהתנאים הנ"ל, חייבים להביא ל-CMD את הנתיב המלא לקובץ, זה יכול להיות נתיב מלא שמתחיל משם הכונן (לדוגמה: c:\windows\system32\notepad.exe), או נתיב חלקי שמתחיל מהספריה הנוכחית (לדוגמה, נגיד שהספריה הנוכחית היא c:\users\yossi והקובץ נמצא בהורדות, נכתוב Downloads\XXXX)

      ⚠ במערכות לינוקס, אי אפשר להריץ תוכנה מתוך הספריה הנוכחית בלי לציין בפירוש ‎./XXXכלומר, נקודה, סלאש, ואז שם התוכנה (נקודה תמיד מציינת את הספריה הנוחכית), זה נכון גם אם הספריה הנוכחית הוא במקרה בתוך ה-PATH. בנוסף אי אפשר להשמיט את סיומת הקובץ ובד"כ אין סיומות לקבצי תוכנה. בנוסף חייבים לתת לקובץ התוכנה הרשאות ריצה (קבצים שהותקנו באמצעות מנהל החבילות של המערכת יקבלו את ההרשאה אוטומטית, קבצים שהורדו מהאינטרנט למשל, צריך לתת להם הרשאות ריצה על ידי הפקודה: chmod +x XXXX).

      פורסם בתוכנה
      yossiz
      yossiz
    • ניתוח חולשת PwnKit

      ניתוח חולשת PwnKit

      הקדמה

      ביום שלישי השבוע פירסמו חברת Qualys על חולשה ברכיב נפוץ בהרבה הפצות לינוקס שמאפשר לכל משתמש במערכת לקבל הרשאות רוט. החולשה קיבלה את השם PwnKit - הרכבה של שם הרכיב הפגיע (Polkit) והמילה Pwn שהוא סלנג לפריצה.

      מה שמעניין, לדעתי, בחולשה זו יותר מחולשות אחרות שמתפרסמות יום יום, זה העובדה שלמרות שמדובר בחולשה מסוג memory corruption כאשר בד"כ חולשות מסוג זה הם קשים יותר להבנה למי שלא עמוק בתחום, כאן אפשר עם קצת מאמץ להבין את החולשה והמימוש של האקפלויט מא' עד ת'. תעיד על זה העובדה שאפשר למצוא נכון להיום כ-80 פרוייקטים בגיטהאב שעוסקים בחולשה זו.

      איתגרתי את עצמי לנסות להסביר את זה. אשמח לשאלות, תגובות וביקורות באשכול נפרד.

      רקע

      setuid bit

      אחד מהתפקידים המרכזיים של מערכת הפעלה, זה לנהל את הגישה למשאבים משותפים. זה עובד בצורה כזו שכל גישה למשאב משותף חייבת לעבור דרך הקוד של הקרנל (ליבת מערכת ההפעלה) והנ"ל עושה חישוב לפי כמה משתנים ומחליט לאפשר או לסרב.

      אחת מהמשתנים המרכזיים שמשפיעים על ההחלטה אם לאפשר או לסרב, זה "מה רמת ההרשאות של התהליך שמבקשת גישה?"

      במערכות *NIX (שם כללי לסוגי היוניקס למיניהם, כולל לינוקס), לכל תהליך מוצמד מזהה של היוזר שמריץ את התהליך, וזה קובע את רמת ההרשאות של התהליך.

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

      בכל זאת, בשימוש היום יומי של המחשב יש לפעמים צורך לתת למשתמש מנהל אפשרות לעשות משהו שדורש הרשאות גבוהות. למשל לשנות הגדרה גלובלית, או לכבות את המחשב, או לעדכן מערכת וכו' וכו', לשם כך הומצאה פקודת sudo. הרעיון הוא שעבור כל דבר שדורש הרשאות גבוהות, המשתמש יצטרך לבקש בפירוש, ולעבור מבחן כדי להוכיח שהוא באמת מורשה לעשות את הפעולה. אפשר להגדיר כל מיני מדיניות ותנאים והגבלות בקבצי התצורה של תוכנת sudo וזה אמור למנוע מתהליכים זדוניים אקראיים את האפשרות של הסלמת הרשאות בלי לפגוע ביכולת המנהל להסלים הרשאות במידת הצורך בצורה מבוקרת.

      ואיך עובד הקסם הזה של sudo שפתאום אתה מצליח להסלים הרשאות? לשם כך המציאו את ה-setuid bit. זה סה"כ פיסת מידע קטן שמוצמד לקובץ הבינארי של פקודת sudo שאומר למערכת ההפעלה שכאשר מישהו מריץ פקודה זו, תן לפקודה הראשות רוט. (כמובן, רק מי שהוא כבר רוט, יכול להוסיף פיסת מידע זו לקובץ, אחרת כל אחד יוכל להסלים הראשות)

      מנגנון זה הוא חרב פיפיות, מצד אחד זה מאפשר למשתמש רגיל לנהל את המחשב, מצד שני אנחנו לא רוצים לתת אפשרות לתהליך לא רצוי להסלים הרשאות. לשם כך, יש הרבה בדיקות וגדרים בתוך הקוד של sudo שמוודא שרק מי שמורשה יכול להשתמש בו. מכיון שכן, הקוד של כל בינארי שיש לו את ה-setuid bit חייב להיות מאוד מאובטח, ובלי באגים.

      משתני סביבה "מסוכנים"

      כידוע, אפשר לשלוט על כל מיני התנהגויות של תוכנות באמצעות משתני סביבה. חלק ממשתנים אלו יכולים לגרום לתוכנה להריץ תהליך צאצא, או לטעון קוד בינארי לתוך התהליך ולהריץ אותו. דוגמה לזה הוא המשתנה LD_PRELOAD. משתנה זו אומרת למערכת ההפעלה לטעון קוד כלשהו לתוך מרחב הזכרון של התהליך ולהריץ אותה.

      כאשר אנחנו מריצים תוכנה עם ה-setuid bit אנחנו רוצים שליטה מלאה על הקוד שרץ, ולא רוצים להריץ קוד אקראי בצורה לא מבוקרת. לשם כך, לפני הרצת התוכנה, מערכת ההפעלה "מנקה" את משתני הסביבה של התהליך, ומאפשרת רק משתני סביבה "מאובטחים" ולא "מסוכנים".

      Polkit ופקודת pkexec

      לא ניכנס יותר מדי לפרטים מה זה בדיוק polkit, רק נאמר שזה מנגנון נוסף בדומה ל-sudo שמאפשר לתהליכים להסלים הרשאות עבור פעולות מסויימות בצורה מבוקרת.

      פקודת pkexec מגיע כחלק מחבילת Polkit. הפקודה עובדת בערך כמו sudo שהיא מקבלת מספר ארגומנטים לשלוט על כמה אופציות ובסוף כותבים שם של פקודה, התוכנה בודקת אם המשתמש מורשה לעשות פעולה זו, ובמידה וכן, היא מריצה את הפקודה עם הרשאות גבוהות.

      מכיון שהפקודה צריכה להסלים הראשות, יש לפקודה את ה-setuid bit.

      אם רק נמצא באג בבדיקות אלו, נוכל לקבל הרשאות רוט!

      נמשיך כעת לחולשה עצמה!

      (מכאן והלאה דרוש קצת הבנה בתכנות)

      החולשה

      argc & argv

      כידוע, פקודות שמורצים במערכת הפעלה יכולים לקבל פרמטרים ששולטים על פעולת הפקודה. זה עובד בצורה כזו שמי שמריץ את הפקודה (בד"כ ה-shell, אבל זה יכול להיות כל תהליך) מבקש ממערכת ההפעלה להריץ תהליך חדש (פונקציית execve). פוקנציה זו מקבלת שלוש ארגומנטים, הראשון הוא נתיב לקובץ ה-exe של הפקודה. השני זה מערך של מחרוזות כאשר האבר האחרון במערך זה הוא NULL pointer, כל אבר במערך זה מצביע על מחרוזת של פרמטר שאתה רוצה להעביר לפקודה. זה נקרא argv (כלומר arg vector כאשר vector זה שם נרדף למערך). השלישי זה מערך נוסף של מחרוזות שנקרא envp שמכילה את משתני הסביבה שאתה רוצה להגדיר עבור התהליך.

      המילים "מערך של מחרוזות" טעונים ביאור, כי מי שמשתמש בשפות "נורמליות" יבין את הדברים בצורה לא נכונה. ביוניקס, וכל API/ABI מבוססת שפות C/C++ הכוונה במילים אלו הוא כזה:

      קודם כל נקדים כמה מושגים בסיסיים:

      מצביע (pointer) = unsigned int (= מספר חיובי) בגודל של מספר הסיביות של המעבד, שמצביע על כתובת במרחב הזכרון של התהליך

      NULL pointer = מצביע עם הערך של 0, זה מסמן "משהו שלא קיים".

      מערך = זה פשוט "מצביע" (כנ"ל) שמצביע על איזור זיכרון שמאכסנת אובייקט אחד או יותר ברצף (כל האובייקטים הם מאותו סוג ובגודל זהה, האורך של המערך לא ידוע, כלומר זה לא מקודד איפשהו ב"מערך" דהיינו ה"מצביע", במקרה שלנו ה-NULL pointer בסוף הוא זה שמסמן את סוף המערך)

      מחרוזת = "מצביע" (כנ"ל) על איזור בזכרון שמאחסנת רצף של 0 או יותר תווים, ואחריהם NULL (בייט עם הערך 0) שזה מסמן את סוף המחרוזת

      ובכן מה זה "מערך של מחרוזות"?

      מתרגמים את זה ככה: תעביר מצביע שמצביע על רצף של מצביעים כאשר המצביע האחרון הוא NULL, וכל אחד ממצביעים אלו מצביעים על רצף של תווים שאחריהם מגיע תו 0.

      מערך הפרמטרים מקובל לקרוא לו argv (vector זה שם נרדף למערך) וזו הצורה להעביר ארגומנטים לתהליכים.

      מערכת ההפעלה לוקחת המערכים אלו ומעתיקה אותם למרחב הזכרון של התהליך החדש.

      פונקציית main

      בתהליך החדש, הפונקציה הראשית (שנקרא בד"כ main) מקבלת כארגומנטים שני פיסות מידע, א) argc - זה int שערכו הוא מספר הפרמטרים שבתוך argv ב) argv שזה כנ"ל מצביע על מערך של מצביעים למחרוזות.

      argv[0]

      מקובל שהמחרוזת הראשונה במערך argv זה תמיד שם הקובץ של ה-exe. וכן הוא באמת כאשר מריצים תהליך דרך ה-shell או בדרכים מקובלות אחרות. אבל חשוב להבין שזו רק מוסכמה. אפשר בהחלט להריץ תהליך כאשר המחרוזת הראשונה זה "foobar" או NULL. (במקרה של NULL, ה-argc יהיה 0, ו-argv יצביע על מערך עם אבר אחד שערכו הוא 0)

      הקוד הפגיע

      עכשיו נתקדם קצת להבין את הקוד הפגיע, והנה קטע הקוד שבו מסתתר הבאג:

      435 main (int argc, char *argv[])
      436 {
      ...
      534   for (n = 1; n < (guint) argc; n++)
      535     {
      ...
      568     }
      ...
      610   path = g_strdup (argv[n]);
      ...
      629   if (path[0] != '/')
      630     {
      ...
      632       s = g_find_program_in_path (path);
      ...
      639       argv[n] = path = s;
      640     }
      

      מה אנחנו רואים פה?

      נזכיר, הפקודה pkexec מקבלת מספר פרמטרים ששולטים על פעולתה (דגלים) ואח"כ מגיעה הפקודה עצמה שהיא אמורה להריץ עם הפרמטרים שלה.

      בשורה 435 יש הצהרה על פונקצית ה-main שמקבלת שני ארגומנטים (כנ"ל). מדלגים על כמה שורות לא קשורות, ובשורה 534 המתכנת רוצה לטפל בדגלים שמגיעים לפני הפקודה עצמה. אז הוא עובר בלולאה על הפרמטרים, בגוף הלולאה (לא מופיע פה) יש תנאי עצירה על הפרמטר הראשון שלא מתאים לשום דגל. מה שחשוב להבין הוא שכאשר יוצאים מהלולאה, הערך של n שווה לפרמטר הראשון שלא מתאים לשום דגל, כאשר זה יכול להיות גם ה-NULL שמסמן את סוף הפרמטרים. (כך חשב לעצמו המתכנת. האומנם זה נכון? נראה בהמשך...).

      שוב נדלג על כמה שורות לא מעניינות, ונגיע לשורה 610, ובו המתכנת מעתיק את המחרוזת שעליה מצביע argv[n] והוא מקבל חזרה מצביע שיצביע על המיקום של המחרוזת המועתקת. שוב מדלגים עד שורה 629 ובה אנחנו בודקים אם התו הראשון המחרוזת לא / (כלומר זה לא נתיב אבסוטלוטי, אלא נתיב יחסי או שם של פקודה בלי נתיב) ואז נצטרך לחפש ב-PATH אם קיימת פקודה עם שם זה. בשורה 632, המשתנה s מצביעה על מחרוזת חדשה שמכילה את הנתיב לפקודה ש-g_find_program_in_path מצאה. בשורה 639 (כנראה אחרי כמה בדיקות) המצביע s נכנסת ל-argv[n] במקום במצביע הקודם.

      בשורות הבאות כנראה התוכנה תבדוק אם להריץ או לא את הפקודה שמאוכסנת במחרוזת זו.

      הבאג

      איפה הבאג פה?

      תחשבו לעצמכם מה יקרה אם הערך של argc הוא אפס. הרי אפשר להריץ תוכנה עם מערך מחרוזות ריקה כנ"ל. מה יהיה הערך של n במקרה כזה? הוא יהיה 1. כי בתחילת הלולאה איתחלנו אותו ל-1, וגוף הלולאה לא הרצנו כי התנאי n < argc לא התקיים, אז n נשאר 1.

      על מה יצביע argv[n]? הוא יצביע על הערך שאחרי סוף המערך. כי הרי argv[0] יצביע על הערך היחיד שנמצא במערך שזה ה-NULL pointer ו-argv[1] יגלוש מחוץ למערך לערך הבא.

      ומה באמת נמצא שם? בד"כ מערכת ההפעלה שמה שם את המערך envp שנתקלנו בו למעלה בתיאור של פונקציית execve.

      אם נחשוב על זה, מה שהקוד יעשה במקרה כזה הוא שהוא יתרגם את משתנה הסביבה הראשונה כשם של פקודה, הוא יחפש את הפקודה ב-PATH ואז הוא יכניס את הנתיב לפקודה חזרה למשתני הסביבה.

      אם עקבת עד כאן, אז א) כל הכבוד! וב) הבנת איך קיבלנו את היכולת לשלוט על אחד ממשתני הסביבה של התהליך באמצעות באג זה.

      בפוסט הבא (בעז"ה אם יהיה כח) ננסה להסביר איך אפשר לנצל עובדה זו להריץ תוכנה אקראית כרוט.

      פורסם בתכנות
      yossiz
      yossiz
    • שיתוף: 🔖 סימניה להורדת תוסף כרום

      סימניה להורדת קבצי CRX מחנות כרום.
      מפעילים את הסימניה, מכניסים מזהה של תוסף (לדוגמה: aapbdbdomjkkjkaonfhkkikfgjllcleb) או כתובת של תוסף בחנות (לדוגמה: https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb) וזה מוריד את התוסף בשבילך.

      javascript:id = prompt("הכנס מזהה או כתובת התוסף"); (id = /[a-z]{32}/.exec(id)) ? window.open("https://update.googleapis.com/service/update2/crx?response=redirect&acceptformat=crx3&prodversion=38.0&testsource=download-crx&x=id%253D"+id[0]+"%2526installsource%253Dondemand%2526uc"): alert("מזהה או כתובת לא חוקי")
      
      פורסם באינטרנט
      yossiz
      yossiz
    • מדריך לשימוש בסיסי בתוכנת Procmon

      מה זה Procmon?

      Procmon ‏(Process Monitor) היא תוכנת ניטור שניתן לנטר באמצעותה אירועים במערכת ווינדוס.
      זה שימושי מאוד לדיבוג תקלות.
      איזה אירועים אפשר לנטר?

      • קבצים: פתיחה, סגירה, כתיבה, קריאה, מחיקה, ועוד
      • מפתחות רג'יסטרי: פתיחה, סגירה, כתיבה, קריאה, מחיקה, ועוד
      • רשת: אירועי רשת, חיבור, ניתוק, האזנה, שליחה, קבלה ועוד
      • תהליכים: הרצת תהליך, טעינת DLL, יצירת thread, סיום תהליך/thread ועוד

      כל אירוע מלווה בשלל מידע שימושי. מזהה תהליך, מזהה thread, צילום של ה-stack (מאוד שימושי!) ועוד.
      יש אפשרויות מתקדמות לסינון האירועים

      מאיפה מורידים?

      https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
      התוכנה היא קובץ אחד (שמכילה בתוכה: גירסת x64 של התוכנה, וכן גירסאות x68 ו-x64 של הדרייבר שהתוכנה צריכה. התוכנה חולצת מתוכה את הקבצים הנצרכים בזמן ריצה!). אין צורך בהתקנה.

      הרצה

      קליק כפול על קובץ התוכנה, אם נתבקש נאשר הרצה כמנהל - אי אפשר להריצו בלי הרשאות ניהול- וזהו, אנחנו בפנים!
      (בהרצה ראשונה צריך לאשר את תנאי השימוש).
      הערה: אם אתה מבין מה זה stack trace וברצונך לעשות בו שימוש כדאי שתגדיר גם debugging symbols בתפריט options ‏> ‏configure symbols...‎

      החלון הראשי

      כך נראה החלון הראשי בפתיחה הראשונה:
      bbe444e1-23f4-4534-92b9-48fbb6fb1c78-image.png
      נשים לב לאיזור העיקרי - זה מכיל רשימה של אירועים. הרשימה הולכת וגדלה כל שנייה בעוד אלפי אירועים!
      בשורת המצב כתוב מספר האירועים שהוקלטו, וכמה מתוכם מוצגים:
      3ec62d90-b746-4b1d-86d2-12850b2210ed-image.png
      אז דבר ראשון נפסיק את ההקלטה לפני שהמספר יגיע למאות מליונים!
      לחיצה על fdaed507-8ea4-4413-9963-e81676c76f2b-image.png מפסיק את ההקלטה. לחיצה נוספת יתחיל אותה שוב.

      עכשיו נסביר בקצרה על הרשימה.
      כל שורה מייצג אירוע אחד. בברירת מחדל העמודות שמופיעות הם:

      • Time of Day: זה "השעה:דקה:שנייה.מילי שנייה" של האירוע
      • Process Name: שם התהליך שגרם לאירוע
      • PID: מזהה התהליך (לפעמים יש כמה תהליכים עם אותו שם. אפשר להבחין ביניהם על ידי המזהה)
      • Operation: זה סוג האירוע. האייקון מצביע על הסוג הכללי (רג'יסטרי, קובץ, תהליך, או רשת). הטקסט מצביע על הסוג הפרטי, פתיחת קובץ קריאת קובץ וכו' וכו' (יש עשרות...)
      • Path: הנתיב של ה{קובץ, מפתח רג'יסטרי} או ה-IP + פורט + כיוון של תעבורת הרשת.
      • Result: תוצאת הפעולה. SUCCESS = הצלחה. אם לא הצליח, כתוב קוד השגיאה.
      • Detail: פרטים נוספים משתנים לפי סוג הפעולה.

      נעבור בקצרה על האייקונים בסרגל:

      • fa70531b-8bd8-4b86-9827-2b64cf7a9a23-image.png פתיחת הקלטה שנשמרה
      • 418e3be9-9ec0-405c-9771-c65b3f1274e6-image.png שמירת הקלטה
      • c24642be-40d6-43ce-af98-cc1be5940817-image.png התחל/עצור הקלטה
      • 0ff24ec4-aa92-46bb-a3c4-105567661c4f-image.png הפעל השבת גלילה אוטומטי של הרשימה
      • 1378f7ac-93a7-4cad-9b68-05e9fded0d24-image.png נקה רשימה
      • 1230f81b-c687-4699-ac65-a55ceb4fb8a3-image.png הגדרת סינון
      • b66923d5-159f-4163-9032-88cdd70619e4-image.png הגדרת סימון שורות לפי תנאים
      • c29520f6-77d1-4d74-b182-8ace382a5e8d-image.png אפשר לגרור את האייקון על גבי חלון של תוכנה וזה יוסיף את מזהה התוכנה ההוא לסנן הפעיל
      • e7e7ecf5-5f9b-4270-9eec-effdc341efc8-image.png פותח חלון עם רשימת התהליכים שהיו פעילים בעת ההקלטה
      • d0b3b632-b05a-451a-a986-ca6f39e2462c-image.png חיפוש תיבה ברשימה
      • 4ccf0ccb-095f-4def-b61c-cdfa3a2a4610-image.png פותח את הנתיב של השורה הנוכחי
      • 511884cc-9245-4262-aae3-5cd31fa526a2-image.png הפעלה/השבתה של סוגי אירועים: רג'יסטרי, קובץ, רשת, תהליך, profiling (לא נדבר על profiling בהדרכה זו)

      סינון

      עכשיו נגדיר מסנן. נלחץ על e77437b0-089a-4f4f-922b-e2d432942a99-image.png

      בברירת מחדל מוגדרים כבר כמה מסננים. מומלץ להשאיר אותם.
      לכל מסנן יש 4 שדות:
      10acba35-9e84-4a8c-9882-6d9bee6ec297-image.png

      1. הראשון הוא בחירת השדה לפיו נסנן. יש המון אופציות. העקריים הם

        • Process Name: לסנן לפי שם התהליך
        • PID: לפי מזהה תהליך במקרה שיש כמה תהליכים של אותו תוכנה
        • Operation: לסנן לפי אירוע
        • Path: סינון לפי נתיב קובץ/מפתח רג'יסטרי
      2. בחירת סוג תנאי לפיו נסנן:

        • is/is not: הערך המלא תואם/לא תואם לתנאי
        • less than/more than: על שדות של מספרים הערך שוה יותר/פחות מהערך של התנאי
        • begins with/ends with: הערך מתחיל ב/מסתיים בהערך של התנאי
        • includes/excludes: הערך של התנאי נמצא/לא נמצא איפשהו בערך של השדה
      3. פה נמלא את הערך של התנאי, כלומר שהתוכנה יבדוק את השדה שבחרנו ב-① מול מה שנכתוב כאן ולפיו יקבע אם התנאי מתקיים או לא. האופציות פה משתנות לפי מה שבחרנו בשדה ①. לדוגמה, אם ב-① בחרנו Operation, כאן נוכל למלאות אחד מהאירועים הזמינים, התפריט מתמלא עם הרשימה הזמינה של אירועים אפשריים. אם בחרנו בשדה ① Path, נמלא פה נתיב או חלק מנתיב (לפי מה שבחרנו בשדה ②)

      4. כאן נבחר אם קיום התנאי יגרום לשורה להופיע (include) או לא להופיע (exclude).

      הערה: אף פעם לא עמדתי על צורת ההרכבה של תנאים מרובים... האם זה OR או AND או האם אפשר לחבר חלק ב-OR וחלק ב-AND (לא נראה לי אפשרי, הלוואי...)... ניסוי וטעיה פשוט אמור להביא את התשובה... אם מישהו מתנדב לבדוק אשמח!

      דוגמה

      ועכשיו נעבור על דוגמה פשוטה.
      נגיד שאנחנו רוצים לראות איפה ההגדרות של רקע שולחן העבודה שמורות.

      • נפתח את הגדרות המערכת על הדף של רקע שולחן עבודה.
      • נפתח את procmon ונגדיר סינון כמו בתמונה:
        • לחיצה על reset כדי לאפס את הסינוןן לברירת המחדל
        • נגדיר סינון על שדה path שהנתיב יכלול את המילה "wallpaper" (טפט). סביר להניח שאם הגדרוות רקע שמורות ברג'יסטרי או בקובץ כלשהו שהנתיב יכלול את המילה הזאת.
        • אחרי הגדרת סינון צריך ללחוץ "add" להוסיף אותו לרשימה.
        • נעשה עוד סינון על אירוע שכול את המילה set או write. זה יכלול רק פעולות של כתיבה לקובץ (WriteFile) או למפתח רג'יסטרי (RegSetValue). זה יוריד אלפי אלפים של שורות של קריאה. אנחנו מעוניינים רק בכתיבה ולא בקריאה.
          54e39cfc-5b31-4a39-8b0d-09d47284b8e9-image.png
        • אישור
      • עכשיו מתחיל ההקלטה
      • נעבור לחלון ההגדרות ונשנה רקע שולחן העבודה. נפסיק את ההקלטה.
      • נסתכל על הרשימה - והנה הסוד מתגלה לעינינו...
        HKCU\Control Panel\Desktop\Wallpaper

      הערה: שימו לב שלא סיננתי לפי מזהה או שם התהליך של ההגדרות. אם הייתי עושה כן לא היה מתקבל שום תוצאה. הסיבה היא שתוכנת ההגדרות לא עושה את השינוי בעצמה אלא שולחת מסר לתהליך explorer.exe לבצע את השינוי.

      הערה: במדריך זה כסינו רק שימוש בסיסי בתוכנה. מומלץ מאוד לעבור על קובץ העזרה, וגם לקרוא בבלוג של יוצר התוכנה עוד דוגמאות לשימוש בתוכנה (בד"כ הדוגמאות נמצאים בפוסטים שהכותרת שלהם מתחיל במילים ‎"The case of..."‎).

      בהצלחה!

      פורסם במדריכים
      yossiz
      yossiz

    פוסטים אחרונים שנוצרו על ידי yossiz

    • RE: בעלי אתרי וורדפרס + אלמנטור פרו + woocommerce: עדכנו מיד!

      שימו לב: לא מספיק לעדכן גירסה, צריך לבדוק אם כבר נפרצת, אם כן, צריך לשנות את הגדרת "תפקיד ברירת מחדל למשתמשים חדשים" חזרה ל"מנוי" או מה שהיה מקודם
      וגם לבדוק אם כל משתמשים עם הרשאות מנהל הם לגיטימיים

      (אפשר לחשוש עוד יותר שהכניסו דלת אחורית לאתר, אם זה קרה, אין עצה חוץ מלשחזר מגיבוי או לבנות מחדש)

      אפשר לבדוק ההגדרה הנוכחית פה: הגדרות > כללי > תפקיד ברירת מחדל למשתמשים חדשים

      4b509e97-c511-4da9-8418-819da27b5dbd-CleanShot 2023-03-31 at 12.02.45.png

      פורסם באינטרנט
      yossiz
      yossiz
    • RE: בעלי אתרי וורדפרס + אלמנטור פרו + woocommerce: עדכנו מיד!

      @by6199 מגלי החולשה דיווחו לאלמנטור כבר לפני יותר מחודש והם מיהרו להוציא עדכון תוך כמה ימים, אבל לפני שלושה ימים הם פירסמו על קיום הפרצה ופרטי הפירצה ועכשיו כל פורץ טירון יכול להשתמש בו, יש המון בעלי אתרים שלא טורחים לעדכן, אז חשוב שהם ידעו

      פורסם באינטרנט
      yossiz
      yossiz
    • בעלי אתרי וורדפרס + אלמנטור פרו + woocommerce: עדכנו מיד!

      לכל בעלי אתרים שמשתמשים בוורדפרס + אלמנטור פרו + woocommerce חובה לעדכן מיד! את גירסת אלמנטור פרו
      יש באג באלמנטור פרו שבצירוף התקנה של woocommerce מאפשר למשתמש רגיל לשנות הגדרות האתר, אפשר להגדיר שכל משתמש חדש בברירת מחדל יקבל את הרשאות אדמין
      פרטים טכניים על הבאג פה
      הבאג קל למישוש, בדקתי בעצמי על אתר של חבר וזה עובד
      נתקלתי באתר גדול בארץ שמישהו כבר פרץ אליהם, עשיתי חשבון חדש וקיבלתי מיד הרשאות מנהל!

      נ.ב. חשבון המשתמש שלי בפרוג חסום (כי פעם העזתי להתלונן בצורה קצת חריפה על כמות פרסומות באתר, בכל מקרה,) מי שיש לו חשבון שם, אולי יהיה כדאי לעשות טובה לבעלי אתרים ולפרסם גם שם

      פורסם באינטרנט
      yossiz
      yossiz
    • RE: תו אופצונאלי בהחלפה בוורד

      @dovid כתב בתו אופצונאלי בהחלפה בוורד:

      @yossiz כתב בתו אופצונאלי בהחלפה בוורד:

      לדעתי להגיע לאפס פאשלות צריך AI

      אני סבור שאפשר לכתוב קוד מושלם לאפס טעויות.
      במובן יהיה מחיר לכיוון ההפוך, שיהיה רשימה שתמתין לבדיקה אנושית.

      טוב, אני מתקן,
      להגיע לאפס פאשלות עם מקסימום אוטומציה

      להגיע לאפס פאשלות יש לי כבר קוד מוכן:

      function getNumbers(text) {return [] }
      

      🙂

      אבל ברצינות, האם אתה בטוח שאפשר לשלול לגמרי כל שימוש אחר על מספיק מספרים שהקוד עדיין יהיה שימושי? לא בדקתי כמה כאלה יש
      ותמיד ייתכן תמיד שיש שימוש אחר שלא חשבת עליו

      (אלא אם כן, אחד מתוך עשרת אלפים נקרא אפס)

      אבל האמת שגם ב-AI גם על ההגדרה הכי שמרני עדיין אין הוכחה מתמטית שלא יהיו טעויות, (כמובן גם טעויות כאלו שבדיקת אנוש לא היה נכשל בהם, טעויות של שגם אדם היה נכשל בו לא נחשב)

      פורסם בתוכנה
      yossiz
      yossiz
    • RE: תו אופצונאלי בהחלפה בוורד

      @אוריי כתב בתו אופצונאלי בהחלפה בוורד:

      אכן זו בעיה שאני מתחבט בה יותר מחצי שנה

      https://tchumim.com/topic/13999 🙂

      לדעתי להגיע לאפס פאשלות צריך AI
      היום יותר מאי פעם זה בהישג יד...

      פורסם בתוכנה
      yossiz
      yossiz
    • RE: תו אופצונאלי בהחלפה בוורד

      @אוריי אתה צודק

      זה בעיה ידועה שאין בוורד אפשרות כזאת לתו אופציונלי

      פורסם בתוכנה
      yossiz
      yossiz
    • RE: תו אופצונאלי בהחלפה בוורד

      @אוריי במקום לחפש רווח תחפש קבוצה שמכילה רווח ו-ו
      [ ו]

      פורסם בתוכנה
      yossiz
      yossiz
    • RE: בקשה - טיפים לאבטחת שרת

      @dovid הרשאות sudo הכוונה לכאורה שנתן את האפשרות למשתמש להסלים את הרשאותיו לרמת רוט על ידי פקודת sudo.
      לכאורה זה בטיחותי כל עוד שיש למשתמש סיסמה חזקה ושלא מאפשרים sudo בלי סיסמת המשתמש
      @צדיק-תמים אם כבר נתת לו הרשאות sudo תוכל ליכנס ישר לחשבון שלו ולא צריך לעשות ssh למשתמש רוט אף פעם

      פורסם בתכנות
      yossiz
      yossiz
    • RE: יצירת קובץ pdf מ html בשרת

      @EMG הבקשה ברורה, אבל כללית מאוד
      בפוסט הראשון הבאת ספרייה שאמורה להביא פתרון אבל הסתבכת עם הפתרון, אבל לא ברור בדיוק איפה הסתבכת, צריך להביא את הקוד של הנסיון ומה הבעיה

      פורסם בתכנות
      yossiz
      yossiz
    • RE: יצירת קובץ pdf מ html בשרת

      @EMG נראה לי שלא קיבלת תשובה כי השאלה עמומה מדי

      פורסם בתכנות
      yossiz
      yossiz