آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۸۷

پرسش و پاسخ شماره ۸۷

بدون استفاده از تفکیک خروجی ‎ ls -l‎ از چه طریق می‌توانم مجوزها(یا سایراطلاعات) یک فایل را دریافت کنم؟

تعدادی روش اختیاری وجود دارد، اکثر آنها اختصاصی سیستم هستند. همچنین دقیقاً بستگی به آن دارند که چرا اطلاعات را می‌خواهید، در اکثر حالت‌ها، روشهای دیگری برای انجام هدف واقعی شما وجود دارد. شما نیاز ندارید خروجی ls را تفکیک نمایید در صورتیکه برای اجتناب از انجام آن، یک روش امکان پذیر موجود باشد.

بسیاری از موقعیت‌هایی که در آنها شاید شما جویای مجوزها بشوید -- از قبیل من می‌خواهم هر فایلی که بیت setuid زیرنویس 1 آن تنظیم شده را پیدا کنم -- می‌توانند با فرمان ‎find(1)‎ مدیریت بشوند.

برای برخی پرسش‌ها، از قبیل می‌خواهم مطمئن شوم این فایل مجوز 0644 دارد، حقیقتاً شما نیاز به بررسی آن که مجوزها کدامند، ندارید. شما می‌توانید فقط از ‎chmod 0644 myfile‎ استفاده کنید و آنها را به طور مستقیم تنظیم کنید. و اگر واقعا به جای مجبور کردن آنها به مجوز مورد نظر، نیاز به بررسی مجوزها دارید، آنوقت می‌توانید از گزینه ‎-perm‎ فرمان ‎find استفاده کنید‎.

اگر می‌خواهید ببینید آیا می‌توانید فایلی را بخوانید، بنویسید، یا اجرا کنید، ‎test -r‎ , ‎-x‎ , ‎-w‎ موجود می‌باشند.

اگر می‌خواهید ببینید آیا اندازه یک فایل صفر است یا خیر، نیازی به خواندن اندازه فایل در یک متغیر ندارید. به جای آن می‌توانید فقط ‎test -s‎ را به کار ببرید.

اگر می‌خواهید زمان ویرایش یک فایل را به دیگری کپی کنید، می‌توانید ‎touch -r‎ را به کار ببرید. فرمان chown در بعضی سیستم‌های گنو-لینوکس دارای گزینه ‎--reference‎ می‌باشد که به همان طریق کار می‌کند، به شما اجازه می‌دهد مالک، و گروه را از یک فایل به دیگری کپی نمایید.

اگر نیازهای شما مطابق با یکی از آنها نیست، و واقعاً احساس می‌کنید باید فوق داده‌های یک فایل را استخراج و در یک متغیر قرار بدهید، آنوقت ما می‌توانیم چند جایگزین را در نظر بگیریم:

  • در سیستم‌های گنو-لینوکس، ‎*BSD‎ و احتمالاً دیگران، فرمانی به نام ‎stat(1)‎ وجود دارد. در سیستم‌های قدیمی‌تر گنو-لینوکس، این فرمان گزینه‌ای نمی‌گیرد -- فقط نام فایل -- و شما باید خروجی آن را تفکیک نمایید.

     $ stat /
       File: "/"
       Size: 1024         Filetype: Directory
       Mode: (0755/drwxr-xr-x)         Uid: (    0/    root)  Gid: (    0/    root)
     Device:  8,0   Inode: 2         Links: 25   
     Access: Wed Oct 17 14:58:02 2007(00000.00:00:01)
     Modify: Wed Feb 28 15:42:14 2007(00230.22:15:49)
     Change: Wed Feb 28 15:42:14 2007(00230.22:15:49)

    در این وضعیت، شخص می‌توانست 0755 را از سطر ‎Mode:‎، با استفاده از awk یا فرمانهای مشابهی استخراج کند.

  • در سیستم‌های گنو-لینوکس جدیدتر:

     $ stat -c %a /
     755

    به طور آشکاری برای تجزیه خیلی آسانتر است. ترکیب دستوری با BSDها (NetBSD و OpenBSD و FreeBSD و مشتقات آنها مانند ‎Apple OS/X‎)، متفاوت است و لازم است شما مجوزها را از روی mode استخراج کنید:

     mode=$(stat -f %p -- "$filename")
     perm=$(printf %o "$((mode & 07777))")
  • در سیستم‌های شامل ‎perl 5‎، می‌توانید از این استفاده کنید:
     perl -e 'printf "%o\n", 07777 & (stat $ARGV[0])[2]' "$filename"

    این کد همان رشته اُکتال مثال ‎stat -c %a‎ را باز می‌گرداند، اما خیلی بیشتر قابل حمل است. (و آهسته‌تر).

  • فرمان find گنو دارای یک گزینه ‎-printf‎ است که می‌تواند هر فوق‌داده‌ای از یک فایل را به خروجی ارسال کند:

     find "$filename" -prune -printf '%m\n'
    فرمان find بیش از یک دهه قدیمی‌تر از stat گنو است و همچنین می‌تواند فوق‌داده چندین فایل در یک دایرکتوری را ارائه کند. به هر حال مراقب باشید که برای فایلی به نام ‎-print‎ و ‎(‎ و ‎!...‎ یا هر گزاره دیگر find، لازم است اطمینان حاصل کنید که نام فایل به صورت ‎./-print‎, ‎./(‎, ! یا سایر مسیرهای نسبی یا مطلقِ فایل عبور داده شود، که find سر در گم نگردد.
  • اگر bash شما با loadable builtin support کامپایل گردیده، می‌توانید یک فایل finfo داخلی بسازید(در شاخه ‎examples/loadables/‎ دایرکتوری فرعی درخت فایلهای منبع bash خودتان، تایپ کنید ‎make)، آنرا enable کنید، و سپس کد زیر را به کار ببرید:

     $ finfo -o .bashrc
     644

    آگاه باشید که ‎finfo.c‎ توزیع شده با bash تا نگارش ‎4.0‎ حداقل شامل یک باگ است(درگزینه ‎-s‎ )، بنابراین آشکارا کد زیاد بررسی نگردیده است. اکثر بسته‌های از پیش کامپایل شده bash شامل مثالهای کامپایل شده نیستند، از این جهت شاید این حایگزین برای اکثر کاربران دشوار باشد.


    CategoryShell

پرسش و پاسخ 87 (آخرین ویرایش ‎2013-07-25 13:37:13‎ توسط StephaneChazelas)


  1. مترجم: برنامه‌هایی که بیت SUID آنها تنظیم(برقرار) شده است آنهایی هستند که بتوانند توسط کاربر اجرا شوند اما امتیازات root را داشته باشند. این برنامه‌ها عبور از کنترلهای امنیتی را ارث می‌برند، مثال نمونه آن فرمان passwd می‌باشد که یک کاربر به منظور تغییر کلمه عبور خود آن را اجرا می‌کند، این برنامه باید setuid باشد چون فایلهایی را تغییر می‌دهدکه فقط root به آنها دسترسی دارد. مدیر یک سیستم به منظور بالا بردن امنیت سیستم خود باید تمام برنامه‌های setuid غیر ضروری را از سیستم پاک کند. (بازگشت)