انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => انجمن عمومی => نویسنده: احمد حقیقی در 17 بهمن 1395، 03:26 ب‌ظ

عنوان: دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root (حل شد)
ارسال شده توسط: احمد حقیقی در 17 بهمن 1395، 03:26 ب‌ظ
سلام دوستان
یه سوال (این مشکل رو خیلی وقت پیش هم بهش برخورده بودم،‌و امروز دوباره دیدمش و میخوام دلیلش رو بفهمم)

من بش اسکریپت نوشتم که توسط cron و با یوزر root اجرا میشه (با یوزر روت هم ساخته شده)
*/2 * * * * root sh /root/foo.sh
(خط فوق در etc/cron.d/foo/ نوشته شده و فایل پرمیشن +x داره)
منتهی بعضی از کامند های داخل اسکریپتم اجرا نمی شن
و نیاز داره قبلشون sudo بذارم. به عنوان مثال در بخشی از اسکریپت نیازه تا اینترفیس ی Up بشه، اگر بدون sudo مثلا بنویسم ifconfig eth1 up ، اینترفیس آپ نمیشه، مگر اینکه sudo بیاد جلوش

ولی بش اسکریپت دستی که اجرا میشه کار میکنه
با کران ک اجرا میشه (وقتی sudo نداره) کار نمی کنه
بیت های SUID و SGUID برا هیچ کدوم ست نشدن (نه اسکریپتم نه برنامه مورد نظر) و پرمیشن اسکریپتم ۷۵۵ هستش
هیچ لاگ خطا یا هشداری هم وجود نداره

کاربر سیستم root هستش و مالک اسکریپت نوشته :)ه است.

سپاس :)
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: nixoeen در 17 بهمن 1395، 06:45 ب‌ظ
از چه توزیعی استفاده می‌کنید؟
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: احمد حقیقی در 17 بهمن 1395، 07:07 ب‌ظ
از چه توزیعی استفاده می‌کنید؟

Debian 8.2
#uname -a
Linux XXXXX 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u4 (2015-09-19) x86_64 GNU/Linux
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: nixoeen در 17 بهمن 1395، 07:18 ب‌ظ
سعی کردید که فایل رو مستقیم بدون پیش‌دستور sh اجرا کنید؟
مسلما نیاز هست که خط اول فایلتون چنین چیزی داشته باشه:
#!/bin/bash
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: احمد حقیقی در 17 بهمن 1395، 07:35 ب‌ظ
سعی کردید که فایل رو مستقیم بدون پیش‌دستور sh اجرا کنید؟
مسلما نیاز هست که خط اول فایلتون چنین چیزی داشته باشه:
#!/usr/bin/bash
قبل هر چیز، ممنون از جواب هاتون

بله،‌این ها رو هم تست کردم قبلا.


shebang رو اینطوری نوشتم:
#!/bin/shو کران رو از
root sh /root/foo.shبه این تغییر دادم:
root /root/foo.shولی بازم هم کار نمیکنه
منتهی به صورت دستی که اسکریپت رو (حتی بدون sh و به صورت فراخوانی اسمش) اجرا میکنم،‌کار میکنه!


البته تا جایی که میدونم،‌وقتی با صراحت اسکریپت رو با sh یا bash یا کلا در هر زمینه ای (مثلا پایتون و ..) اجرا می کنیم. نیازی به shebang نیست. چون قبلش خودمون مفسر رو فراخوانی می کنیم
ولی بازم تست کردم و نشد.
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: nixoeen در 17 بهمن 1395، 08:15 ب‌ظ
با bash هم تست کردید؟ توی پستم مستقیما گفته بودم که از bash استفاده کنید :)
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: احمد حقیقی در 17 بهمن 1395، 09:13 ب‌ظ
با bash هم تست کردید؟ توی پستم مستقیما گفته بودم که از bash استفاده کنید :)

آره تست کردم
تو گروه تلگرام گفتم که توی سیستم من sh به bash اشاره میکنه و فرقی ندارن

ولی با این وجود هم، کران و اسکریپت رو عوض کردم و bash گذاشتم
باز هم کار نمی کنه
و همچنین دو حالت bash foo.sh  و اجرای مستقیم foo.sh (در کران) رو هم تست کردم.

و در تمامی سناریو ها، وقتی sudo میذارم،‌کار میکنه و بدون sudo  کار نمی کنه.
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: nixoeen در 19 بهمن 1395، 01:11 ق‌ظ
آیا آدرس کامل برنامه‌ها رو برای اجرای اون‌ها نوشتید؟
برای مثال اگر نیاز به ifconfig دارید، باید بنویسید:
/sbin/ifconfig
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: احمد حقیقی در 19 بهمن 1395، 08:45 ق‌ظ
آیا آدرس کامل برنامه‌ها رو برای اجرای اون‌ها نوشتید؟
برای مثال اگر نیاز به ifconfig دارید، باید بنویسید:
/sbin/ifconfig

خیلی ممنون :)
آره،‌با گذاشتن sbin درست شد!
دلیلش چی میتونه باشه؟
به خاطر working directory اسکریپت؟


از کامند های دیگه ای مثل grep, ps, echo استفاده میکنم،‌منتهی این ها کار میکنن و مشکلی ندارن.
و البته هیچ کدوم این ها (grep, ps, echo, ...) برای کار کردن دسترسی روت نیاز ندارن!!  :-k
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: nixoeen در 19 بهمن 1395، 05:01 ب‌ظ
دلیلش متغیر محیطی PATH هستش که آدرس‌هایی مثل /sbin/ رو نداره.
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: احمد حقیقی در 19 بهمن 1395، 08:41 ب‌ظ
دلیلش متغیر محیطی PATH هستش که آدرس‌هایی مثل /sbin/ رو نداره.


آره
درسته!!
تو سیستم خودم (PC) همه ی این ها توی /usr/bin/ هستن، اما تو دبیان ifconfig توی /sbin/ هست و ps, grep, echo توی /bin/ هستند

ممنون  :)

عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: احمد حقیقی در 19 بهمن 1395، 08:42 ب‌ظ
دلیلش متغیر محیطی PATH هستش که آدرس‌هایی مثل /sbin/ رو نداره.


مثل این که دلیلش این نیست
توی $PATH من sbin/ رو دارم!
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/rvm/bin
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: M!lad در 19 بهمن 1395، 10:35 ب‌ظ
تو اسکریپتی که توسط cron اجرا میکنی از PATH یک echo بگیر redirect کن به یه فایل.
تو مورد شما ظاهرا cron داره در یک environment مجزا/متفاوت اسکریپت رو اجرا میکنه.

این‌ها رو هم بخونید:

https://superuser.com/questions/871704/why-does-root-cron-job-script-need-sudo-to-run-properly/1046126#1046126https://stackoverflow.com/questions/10129381/crontab-path-and-user/14694543#14694543https://stackoverflow.com/questions/10129381/crontab-path-and-user/10129701#10129701
عنوان: پاسخ : دلیل استفاده از sudo در اسکریپتی متعلق به کاربر root
ارسال شده توسط: احمد حقیقی در 19 بهمن 1395، 10:58 ب‌ظ
تو اسکریپتی که توسط cron اجرا میکنی از PATH یک echo بگیر redirect کن به یه فایل.
تو مورد شما ظاهرا cron داره در یک environment مجزا/متفاوت اسکریپت رو اجرا میکنه.

این‌ها رو هم بخونید:

https://superuser.com/questions/871704/why-does-root-cron-job-script-need-sudo-to-run-properly/1046126#1046126https://stackoverflow.com/questions/10129381/crontab-path-and-user/14694543#14694543https://stackoverflow.com/questions/10129381/crontab-path-and-user/10129701#10129701

ممنون بابت پاسخ و لینک ها
آره مشکل همین بود که گفتین

کران یک شل جدا از شل کاربر و همچنین روت داره و به متغیر PATH دسترسی نداره  و برای اسکریپت من متغیر PATH فقط شامل مسیر های زیر بود:
/usr/bin:/bin
برای رفعش هم میشه sudo گذاشت، میشه مسیر دقیق برنامه ها رو داد و همچنین میشه متغیر های محیطی رو توی crontab ست کرد.
(لینک ها بسیار مفید هستند)