انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: Farhaad 1992 در 22 مهر 1396، 09:23 قظ
-
من این تاپیکو از چند ماه قبل درنظر داشتم که بزنم ولی متاسفانه تنبلی کردم تا اینکه امروز یک تاپیک در رابطه با مشکل مانت با دستور mount دیدم که دیگه دیدم وقتشه تاپیکو بزنم، اصلا کلام اینکه فرمان mount متعلق به دوران قدیم هستش و استفاده از اون در این زمان مخصوصن توسط تازه کارها خیلی خوشایند و ضروری نیست، وقتی شما از یک مدیر پرونده گرافیکی استفاده میکنید و یا حتی GNOME Disks و با استفاده از اون میخواید یک پارتیشن را مانت کنید به نظرتون داره از فرمان mount استفاده میکنه؟ نخیر! از udisks استفاده میکنند، udisks دارای یک دیمون و یک ابزار خط فرمان به نام udisksctl است، اپلیکیشن ها از دیمون یا کتابخانش استفاده میکنند، ولی در محیط خط فرمان مانند ترمینال میتوان از ابزار خط فرمانش به نام udisksctl استفاده کرد، حالا مزایای استفاده از اون نسبت به فرمان mount چیه؟
پاسخ:
1. نیازی به وارد کردن مسیر مقصد نیست، همانند مدیر پرونده گرافیکی پارتیشن را در مسیر تنظیم شده سسیستم مانت میکند:
/media/username/label
یا
/run/media/username/label
چون از مسیر و شیوه استاندارد استفاده میکند پارتیشن مانت شده توسط برنامه های گرافیکی شناسایی میشود.
2. عدم نیاز به تعیین نوع فایل سیستم، آیا وقتی با مدیر پرونده گرافیکی اقدام به مانت یک پارتیشن میکنید نوع فایل سیستمشو تعیین میکنید؟! نخیر، چرا؟ چون خودش هوشمنده و شناسایی میکنه، خوب ابزار خط فرمان اون برنامه هم همین توانایی رو داره!
3. BASH COMPLETION
udisksctl ships with a bash completion script to complete commands,
objects, block devices and some options.
چیزی که فرمان mount نداره!
4. عدم نیاز به دسترسی ریشه برای هر کاری، اگر بخواید با فرمان mount یک فایل ایزو را مانت و آنمانت کنید حتمن به دسترسی ریشه نیاز دارید ولی با udisksctl خیلی راحت:
1. udisksctl loop-setup /path/to/file
2. udisksctl ....
مرحله دوم فرمانش یادم نیست! بعدن یک چک میکنم و مینویسم
5. نیازی به su یا sudo نداره، وقتی بخواد چیزی رو مانت کنه همانند مدیر پرونده گرافیکی گذرواژه را از شما میگیره.
6. تعیین نوع پارتیشن/فایل سیستم با فرمان mount پتانسیل خطا کردن داره:
https://earlruby.org/2015/02/stop-mounting-iso-files-in-linux-with-t-iso9660/
7. استفاده از اون خیلی راحت تر از فرمان mount هستش، به دلیل داشتن BASH COMPLETION و راهنمای ساده تر
آیا این دلایل کافی نیست که استفاده از فرمان mount را کنار بگذاریم؟
-
جالبه مطلب بسیار مفیدی بود
پس لینوکس در کدهای خط فرمان هم پیشرفت داشته ما نمیدونستیم! ما فکر میکردیم کدهای خط فرمان وحی منزل هستند و تغییر ناپذیر!
اگر کدهای جدید و مفید دیگری هم میشناسید معرفی کنید تا استفاده کنیم
-
جالبه مطلب بسیار مفیدی بود
پس لینوکس در کدهای خط فرمان هم پیشرفت داشته ما نمیدونستیم! ما فکر میکردیم کدهای خط فرمان وحی منزل هستند و تغییر ناپذیر!
اگر کدهای جدید و مفید دگری هم میشناسید معرفی کنید تا استفاده کنیم
syntax error
هر برنامه ای بدون gui میره خط فرمان و این حتی به لینوکس هم ربطی نداره. حتی شل
کد های مشهور خط فرمان صرفا نرم افزار های کاربردی ای هستن که در نوع خودشون بهترین بودن و به این دلیل مشهور شدن.
غیر از این، شما خودتم میتونی دستور خط فرمان بسازی. برا هر برنامه ای که خودت نوشته باشی یا از قبل وجود داشته باشه
-
سلام
نمی خوام بگم اشتباه می کنی ولی همه دلایل ات درست نیست.
بزرگترین مشکل udiskctl این هست که به طور پیش فرض همه جا نصب نیست ولی mount همیشه همه جا نصب هست.
پاسخ:
1. نیازی به وارد کردن مسیر مقصد نیست، همانند مدیر پرونده گرافیکی پارتیشن را در مسیر تنظیم شده سسیستم مانت میکند:
کد: [انتخاب]
/media/username/label
یا
/run/media/username/label
چون از مسیر و شیوه استاندارد استفاده میکند پارتیشن مانت شده توسط برنامه های گرافیکی شناسایی میشود.
اگر پارتیشن توی fstab باشه اونوقت با دستور مونت هم مقصد نمی خواد
2. عدم نیاز به تعیین نوع فایل سیستم، آیا وقتی با مدیر پرونده گرافیکی اقدام به مانت یک پارتیشن میکنید نوع فایل سیستمشو تعیین میکنید؟! نخیر، چرا؟ چون خودش هوشمنده و شناسایی میکنه، خوب ابزار خط فرمان اون برنامه هم همین توانایی رو داره!
به طور معمول هم ما نیازی برای مشخص کردن فایل سیستم نداریم. خود مونت متوجه می شه.
3.
کد: [انتخاب]
BASH COMPLETION
udisksctl ships with a bash completion script to complete commands,
objects, block devices and some options.
چیزی که فرمان mount نداره!
به طور معمول اگر پارتیشن توی fstab باشه کامل کردن خودکار مونت کار می کنه. هرچند معمولا نیازی نیست چون فقط کافیه /dev/ و بعد تب رو برنی. و اینکه bash_completeion رو می شه خودت هم بنویسی
https://mknowles.com.au/wordpress/2012/09/22/how-to-stop-bash-from-completing-mount-dev-commands/
4. عدم نیاز به دسترسی ریشه برای هر کاری، اگر بخواید با فرمان mount یک فایل ایزو را مانت و آنمانت کنید حتمن به دسترسی ریشه نیاز دارید ولی با udisksctl خیلی راحت:
کد: [انتخاب]
1. udisksctl loop-setup /path/to/file
2. udisksctl ....
مرحله دوم فرمانش یادم نیست! بعدن یک چک میکنم و مینویسم
5. نیازی به su یا sudo نداره، وقتی بخواد چیزی رو مانت کنه همانند مدیر پرونده گرافیکی گذرواژه را از شما میگیره.
محیط گرافیکی درواقع دسترسی ریشه داره (برای همین هم می تونه کامپیوتر رو خاموش کنه). به هر حال وقتی قراره پسورد رو وارد کنیم چه فرقی می کنه با sudo باشه یا با گرافیکی.
6. تعیین نوع پارتیشن/فایل سیستم با فرمان mount پتانسیل خطا کردن داره:
https://earlruby.org/2015/02/stop-mounting-iso-files-in-linux-with-t-iso9660/
خب برای مونت ایزو می نویسیم -o loop همونطوری که دستور udiskctl آپشن نیاز داره.
نمی خوام بگم که udisk بی استفاده است ولی قدرت و سادگی mount رو نباید انکار کرد.
udisk به ۱۰۰ بسته پیشنیاز دارد. ولی util-linux فقط به ۴۲ بسته نیاز دارد.
-
محیط گرافیکی درواقع دسترسی ریشه داره (برای همین هم می تونه کامپیوتر رو خاموش کنه). به هر حال وقتی قراره پسورد رو وارد کنیم چه فرقی می کنه با sudo باشه یا با گرافیکی.
سلام
نه این حرف درست نیست ؛ محیط گرافیکی دسترسی به روت نداره مگه اینکه کاربرتون روت باشه یا نرم افزاری رو با دسترسی روت اجرا کنین
در مورد shutdown هم باید بگم گنو/لینوکس (و البته اکثر سیستم عامل های شبه یونیکس) اجازه ی خاموش کردن سیستم رو به کاربری که log in هستش بدون دسترسی روت می دن.
مثلاً شما تو خط فرمان می تونین خیلی راحت بنویسین :
systemctl poweroff
و سیستم رو بدون دسترسی روت خاموش کنین
ولی اگه شما همین دستور رو از طریق یه یه کاربر log in نشده و یا remote shell مثل ssh (البته اینو مطمئن نیستم) بزنین بهتون اجازه ی خاموش کردن سیستم رو بدون دسترسی روت نخواهد داد
در ضمن دستوری رو که خود رابط گرافیکی اوبونتو برای خاموش کردن سیستم استفاده می کنه این هستش :
برای نسخه های قدیمی:
dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
بری نسخه های جدید:
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
که هیش کدوم برای کاربر وارد شده دسترسی روت نمی خوان ...
پ.ن: اگه محیط گرافیکی دسترسی روت داشت برای نصب نرم افزار از طریق software center ازتون پسورد روت درخواست نمی شد.
-
مثلاً شما تو خط فرمان می تونین خیلی راحت بنویسین :
systemctl poweroff
poweroff خالی کار میکنه، نیاز به سیستم سی تی ال نیست، همینطور روت
محیط گرافیکی درواقع دسترسی ریشه داره (برای همین هم می تونه کامپیوتر رو خاموش کنه). به هر حال وقتی قراره پسورد رو وارد کنیم چه فرقی می کنه با sudo باشه یا با گرافیکی.
ما هیچ ما نگاه
https://forum.ubuntu-ir.org/index.php/topic,146797.0.html
این تاپیک هم از بیخ چرته لابد؟
-
بزرگترین مشکل udiskctl این هست که به طور پیش فرض همه جا نصب نیست ولی mount همیشه همه جا نصب هست.
هر توزیع لینوکس که systemd داشته باشه این ابزار رو هم داره، احتمالن BSD ها ندارند، من هم هیچ کاری به BSD ندارم.
اگر پارتیشن توی fstab باشه اونوقت با دستور مونت هم مقصد نمی خواد
به صورت پیش فرض همه پارتیشن ها توی fstab هستند؟ من اطلاعای ندارم ولی اگر نباشند یک امتیاز مثبت برای udisksctl
به طور معمول هم ما نیازی برای مشخص کردن فایل سیستم نداریم. خود مونت متوجه می شه.
نه، برای بعضی فایل سیستم ها لازمه مشخص بشه تا اون آپشن هایی که براش توصیه شده اعمال بشند.
به طور معمول اگر پارتیشن توی fstab باشه کامل کردن خودکار مونت کار می کنه. هرچند معمولا نیازی نیست چون فقط کافیه /dev/ و بعد تب رو برنی. و اینکه bash_completeion رو می شه خودت هم بنویسی
فرمان udisksctl برای همه چیز BASH COMPLETION داره، با واژه های ساده و قابل فهم
-
بحث جالبی شده...
در تایید صحبت کاربر "ali76" جان، باید بگم که جز خاموش کردن هم برای Reboot هم همین داستانه...
-
من الان بستههای نصبیم رو بررسیی کردم متوجه شدم udisks2 روی سیستمم بطور پیشفرض نصب هست...
udisks2/artful,now 2.6.5-2ubuntu1 amd64 [installed]
D-Bus service to access and manipulate storage devices
اوبونتو ۱۷.۱۰
-
poweroff خالی کار میکنه، نیاز به سیستم سی تی ال نیست، همینطور روت
بله خالی هم کار می کنه ولی چه شما با systemctl بزنین چه بدون اون ، اصولا با sytemctl اجراش می کنه برای اثبات حرفم کافیه به خروجی های زیر نیگاه کنین:
type poweroff
poweroff is /sbin/poweroff
حالا به خروجی زیر نیگاه کنین:
file /sbin/poweroff
/sbin/poweroff: symbolic link to /bin/systemctl
همون طور که می بینین دستور poweroff به دستور systemctl لینک شده و با زدن اون دستور هم ، همون دستوری رو که من دادم اجرا می شه.
بحث جالبی شده...
در تایید صحبت کاربر "ali76" جان، باید بگم که جز خاموش کردن هم برای Reboot هم همین داستانه...
بله سوشا جان کاملاً درسته ...
میشه با خط فرمان برای ریبوت کردن از دستور زیر استفاده کرد:
systemctl reboot
یا به قول دوستمون از دستور زیر (اینجا هم لینک شده) :
reboot
و خود اوبونتو هم از دستور زیر استفاده می کنه :
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.Reboot" boolean:true
که هیچ کدوم از اینا هم دسترسی روت نمی خواد.
-
ممنون علی جان اگه اینطوری که پس اشتباه می کردم. نمی دونم شاید systemd اینکار رو می کنه. چون به قول خودت محل /sbin/poweroff توی پوشه sbin هست که اگه دوباره اشتباه نکنم :) باید با روت اجرا بشه. من فایل sudoer ام مال خیلی وقت پیش هست (قبل از systemd توی آرچ ) و توی این فایل تنظیم کردم که poweroff بدون پسورد اجرا بشه. یادم نمی یاد ولی حتما یک دلیلی داشته که اینکار رو کردم.
هر توزیع لینوکس که systemd داشته باشه این ابزار رو هم داره، احتمالن BSD ها ندارند، من هم هیچ کاری به BSD ندارم.
نه اینطوری نیست (می تونی خودت هم تست کنی) udisk2 پیشنیاز systemd نیست.
نه این حرف درست نیست ؛ محیط گرافیکی دسترسی به روت نداره مگه اینکه کاربرتون روت باشه یا نرم افزاری رو با دسترسی روت اجرا کنین
راستش اگه اشتباه نکنم :) هر چیزی که توی بوت اجرا بشه با دسترسی روت اجرا می شه. مثلا شما یک سرویس درست که خروجی whoami رو توی یک فایل ذخیره کنه بعد این رو فعال کن (enable) حالا کامپیوتر رو ری استارت کن و خروجی رو اگر ببینی نوشته root.
-
راستش اگه اشتباه نکنم :) هر چیزی که توی بوت اجرا بشه با دسترسی روت اجرا می شه. مثلا شما یک سرویس درست که خروجی whoami رو توی یک فایل ذخیره کنه بعد این رو فعال کن (enable) حالا کامپیوتر رو ری استارت کن و خروجی رو اگر ببینی نوشته root.
نه وحید جان نیگاه کن ، الان ابزارهای خط فرمان هم با بوت بالا میان ولی دسترسی روت ندارن. در کل تو این مورد که در موردش صحبت می کنیم ، تفاوتی بین ابزارهای گرافیکی و غیرگرافیکی وجود نداره اگه ابزار گرافیکی برای یه کاری دسترسی روت نخواد پس میشه ابزارهای خط فرمانی رو پیدا و استفاده کرد که دسترسی روت نخوان ... (تخصیص منابع و مدیریتشون توی ابزارهای مختلف متفاوت هستش به خاطر همون هم هستش که یه کاری که تو ظاهراً یکسان انجام می شه ممکنه یه ابزار براش دسترسی روت لازم داشته باشه و یه ابزار دیگه ای نداشته باشه)
در مورد موضوع سرویسی هم که مطرح کردین بله به صورت پیش فرض ، systemd با کاربر روت کارا رو انجام می ده ، ولی فقط به صورت پیش فرض چون شما می تونین خیلی راحت تعریف کنین کاربری که می خواین کارا رو انجام بده کی باشه.
مثلا این فایل رو ایجاد کنین:
sudo nano /etc/systemd/system/whoami.service
بعدش این محتوی رو توش قرار بدین (البته به جای asus چه تو آدرس و چه تو کاربر و گروه باید کاربر و گروه خودتون رو قرار بدین):
[Unit]
Description=whoami testing
[Service]
PermissionsStartOnly=true
User=asus
Group=asus
ExecStart=/bin/bash -c 'echo $(whoami) >> /home/asus/Desktop/whoami.txt'
[Install]
WantedBy=multi-user.target
حالا سرویس رو فعال کنین و اجرا کنین:
sudo systemctl enable whoami
sudo systemctl restart whoami
حالا چه الان و چه بعد ری استارت محتوی اون فایل ساخته شده به این صورت هستش:
cat ~/Desktop/whoami.txt
asus
پس ما می تونیم کنترل کنیم که یک پروسه که تحت بوت اجرا می شه هم با کاربری غیر روت اجرا بشه و یا دسترسی غیر روت داشته باشه.
من فایل sudoer ام مال خیلی وقت پیش هست (قبل از systemd توی آرچ ) و توی این فایل تنظیم کردم که poweroff بدون پسورد اجرا بشه. یادم نمی یاد ولی حتما یک دلیلی داشته که اینکار رو کردم.
بله زمان upstart مدیریت منابع با systemd متفاوت بود و برای چیزی که شما می خواین ، باید این خط (یا یه چیزی شبیه این) رو توی فایل /etc/sudoers قرار می دادیم:
asus ALL=(ALL) NOPASSWD: /sbin/poweroff, /sbin/reboot
ولی systemd بدون نیاز به روت امکان استفاده از poweroff و reboot و ... فراهم کرده.
حالا ممکنه این سوال براتون پیش بیاد که مثلاً زمان ابونتو 14.04 که systemd نبود و Upstart استفاده می شد چرا رابط گرافیکی پسورد روت نمی خواست ولی مثلاً دستور poweroff دسترسی روت می خواست ؟
جواب این سوال رو من تو این قسمت داده بودمش:
در ضمن دستوری رو که خود رابط گرافیکی اوبونتو برای خاموش کردن سیستم استفاده می کنه این هستش :
برای نسخه های قدیمی:
dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
رابط گرافیکی چه زمان Upstart و چه الان که systemd اومده از دستورات poweroff یا reboot استفاده نمی کرد.
رابط گرافیکی اون زمان از دستور بالا برای خاموش کردن سیستم استفاده می کرد که این دستور هیچ نیازی به دسترسی روت نداشت و می شد خیلی راحت با زدن دستور بالا بدون دسترسی روت سیستم رو خاموش کرد که البته الان شکل اون دستور به این صورت تغییر پیدا کرده:
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
ممنون علی جان اگه اینطوری که پس اشتباه می کردم. نمی دونم شاید systemd اینکار رو می کنه. چون به قول خودت محل /sbin/poweroff توی پوشه sbin هست که اگه دوباره اشتباه نکنم :) باید با روت اجرا بشه.
در مورد دایرکتوی sbin/poweroff هم درسته که مالک این فایل و گروهش روت هستش ولی به این معنی نیست که باید با روت اجرا بشه.
برای توضیح بهتر این خروجی رو نیگاه کنین:
stat -c '%a %n' /sbin/poweroff
777 /sbin/poweroff
همون طور که می بینین پرمیشن این فایل 777 هستش پس همه می تونن این فایل رو اجرا کنین.
-
ممنون :)