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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: moslem.b در 18 بهمن 1387، 09:44 ب‌ظ

عنوان: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 18 بهمن 1387، 09:44 ب‌ظ
من دارم یه اسکریپت مینویسم ولی به یه جایی رسیدم که بدجوری اعصابم رو به هم ریخته

یکی از دستورات یه چیزی تو مایه های sudo grub هستش که بعد از این دستور محیط ترمینال کاملا عوض میشه از اینجا به بعد چی کار کنم

اگه دستور بعدی رو بصورت عادی وارد کنم جواب نمیده فکر کنم احتیاج به یه فرمان خاصی داره

میدونم منظورمو متوجه نشدید  :)

آقا اینجوری بگم چجور میتونم تو اسکریپت جوری دستورات رو بنویسم که توی یه محیط دیگه اجرا بشه ؟

مثلا توی محیط گراب

عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 19 بهمن 1387، 02:40 ب‌ظ
بابا یکی راهنمایی کنه خو  ](*,)
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Behnam Golds در 19 بهمن 1387، 04:01 ب‌ظ
تنها چیزی که به فکرم میرسه استفاده از سوئیچ batch--  که البته تابه حال استفاده نکردم و آوردن پارامترها دقیقا بعد از دستور grub ، این لینک هم هست ولی ظاهرا مشکل حل نشده :
http://www.technologyquestions.com/technology/linux/166941-grub-bash-script.html

چرا  فایل menu.lst  رو ویرایش نمیکنی؟
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 19 بهمن 1387، 04:18 ب‌ظ
چرا  فایل menu.lst  رو ویرایش نمیکنی؟

اینجوری دیگه اسکریپت نمیشه  :(
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Behnam Golds در 19 بهمن 1387، 04:48 ب‌ظ
چرا نشه؟! توی اسکریپت این  کارو بکن.
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 19 بهمن 1387، 04:56 ب‌ظ
مثلا" این دستور find /boot/grub/stage1 رو چجوری انجام بدم ؟
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Behnam Golds در 19 بهمن 1387، 06:50 ب‌ظ
کاربرد حالت batch-- یه چیزی مثل اینه :

#!/bin/bash
grub --batch  <<EOF
find /boot/grub/stage1
quit
EOF   

با sudo باید اجراش کنی.
راهنما :
http://jbakshi.50webs.com/Linux_tutorial/GRUB/GNU%20GRUB%20simplified.html

یکم روش کار کنی به نتیجه میرسی.
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 08:05 ق‌ظ
کاربرد حالت batch-- یه چیزی مثل اینه :

#!/bin/bash
grub --batch  <<EOF
find /boot/grub/stage1
quit
EOF  

با sudo باید اجراش کنی.
راهنما :
http://jbakshi.50webs.com/Linux_tutorial/GRUB/GNU%20GRUB%20simplified.html

یکم روش کار کنی به نتیجه میرسی.


بهنام جان این دستور کار نکرد ولی با یکمی تغییرات درست  شد دست گلت درد نکنه
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Behnam Golds در 20 بهمن 1387، 08:10 ق‌ظ
این رو باید توی یه فایل بنویسی و به عنوان یک اسکریپت با sudo  اجرا کنی در نهایت میتونی خروجی رو فیلتر کنی تا دقیقا (hdx,x) رو بهت بده ...
حالا چیکار کردی بگو ما هم یاد بگیریم.


ویرایش :
خروجی برای من اینطوریه :

 behnam@ubuntu:~/Desktop$ sudo ./55
Probing devices to guess BIOS drives. This may take a long time.

       [ Minimal BASH-like line editing is supported.   For
         the   first   word,  TAB  lists  possible  command
         completions.  Anywhere else TAB lists the possible
         completions of a device/filename. ]
grub> find /boot/grub/stage1
 (hd0,4)
grub> quit
behnam@ubuntu:~/Desktop$

محتویات فایل 55 هم همون دستورات بالاست.
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 08:24 ق‌ظ
اونو میدونم که باید بهش حالت اجرایی بدم ولی خود دستورات رو یکم تغییر دادم درست شد و خروجی (hdx,x) رو بهم داد

نقل‌قول
#!/bin/bash
sudo grub --batch  <<EOF
find /boot/grub/stage1
quit 
EOF

اینم از خروجی

نقل‌قول
mse@mse-desktop:~/Desktop$ ./test.sh
Probing devices to guess BIOS drives. This may take a long time.

       [ Minimal BASH-like line editing is supported.   For
         the   first   word,  TAB  lists  possible  command
         completions.  Anywhere else TAB lists the possible
         completions of a device/filename. ]
grub> find /boot/grub/stage1
 (hd0,8)
grub> quit

خوب یه فکر دیگه زد به سرم من اسکریپت رو واسه یه چیز دیگه میخواستم ولی با دو تا دستور دیگه میشه تعمیر گراب رو به عهده ی یه اسکریپت سپرد :D

خوب بهنام جان ما دو تا دستور دیگه نیاز داریم

اولین دستور باید مقدار خروجی رو قبلش یه root اضافه کنه و انجامش بده  (root (hdx,y





عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسک&
ارسال شده توسط: Behnam Golds در 20 بهمن 1387، 09:40 ق‌ظ
خوب میتونیم از خروجی قبلی (hdx,y)  رو با دستور grep  جدا کنیم و توی یه متغیر مثلا به اسم sysdev  ذخیره کنیم  و بعد این متغیر رو توی یه بلوک جدید بدیم به root  :

#!/bin/bash
 set `{
grub --batch  <<EOF |grep  \(hd[0-9],[0-9]\)
find /boot/grub/stage1
quit
EOF
}`
sysdev=$1
echo $sysdev

تا اینجا فقط (hdx,y) رو گذاشتیم توی متغیر sysdev و بعد توی خروجی نمایش دادیم . البته این خط هم توی خروجی نمایش داده میشه ولی توی sysdev  ذخیره نمیشه اگر خط آخر یعنی echo رو حذف کنی متوجه میشی که  بازم خط زیر نمایش داده میشه که نمیدونم چطور حذفش کنم :
Probing devices to guess BIOS drives. This may take a long time.البته مهم نیست مشکلی ایجاد نمیکنه .
حالا اگر اسکریپت رو گسترش بدیم یه چیزی تو این مایه ها خواهیم داشت :

#!/bin/bash
 set `{
grub --batch  <<EOF |grep  \(hd[0-9],[0-9]\)
find /boot/grub/stage1
quit
EOF
}`
sysdev=$1

{
grub --batch  <<EOF
root $sysdev
quit
EOF
}

دیگه چیکار باید بکنیم ؟

ویرایش :
ضمنا اون sudo  رو از اسکریپت بیار بیرون اینطوری برای بلوک های بعدی هم باید sudo بذاری :
sudo ScriptName
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 10:01 ق‌ظ
ایول داریم به جاهای حساس میرسیم

دستور بعدی باید از خروجی که گرفتیم (  (root (hdx,y  ‌) یه قسمتش حذف بشه و یه دستور دیگه قبلش بیاد اینجوری (setup (hdx

خوب اون sudo رو هم حذف میکنیم  :)

نقل‌قول
Probing devices to guess BIOS drives. This may take a long time.

این خط رو منم هر کاری کردم نتونستم پاکش کنم  :o
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Behnam Golds در 20 بهمن 1387، 10:47 ق‌ظ
فکر کنم این دیگه آخریش باشه البته یکم اسم متغیر هارو تغییر دادم :

#!/bin/bash
 set `{
grub --batch  <<EOF |grep  \(hd[0-9],[0-9]\)
find /boot/grub/stage1
quit
EOF
}`

syspart=$1
set `expr substr $syspart 2 3`
sysdev=$1

{
grub --batch  <<EOF
root $syspart
setup ($sysdev)
quit
EOF
}

عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 11:26 ق‌ظ
بهنام این واسه من ارور میده خروجیش واسه تو چی میشه ؟
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسک&
ارسال شده توسط: Behnam Golds در 20 بهمن 1387، 11:32 ق‌ظ
من که مشکلی ندارم :

behnam@ubuntu:~/Desktop$ sudo ./test
[sudo] password for behnam:
Probing devices to guess BIOS drives. This may take a long time.
Probing devices to guess BIOS drives. This may take a long time.

       [ Minimal BASH-like line editing is supported.   For
         the   first   word,  TAB  lists  possible  command
         completions.  Anywhere else TAB lists the possible
         completions of a device/filename. ]
grub> root (hd0,4)
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,4)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub> quit

خروجی برای تو چیه ؟


ویرایش :

چند خط به اولش اضافه کردم که بدون دسترسی root  پیغام مناسب بده و از اسکریپت خارج بشه.

#!/bin/bash
set `whoami`

if [ "$1" != "root" ];
then
echo "Permission denied: You must be root"
exit
fi


 set `{
grub --batch  <<EOF |grep  \(hd[0-9],[0-9]\)
find /boot/grub/stage1
quit
EOF
}`

syspart=$1
set `expr substr $syspart 2 3`
sysdev=$1

{
grub --batch  <<EOF
root $syspart
setup ($sysdev)
quit
EOF
}

exit
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 12:04 ب‌ظ
خوب درست شد من یه تیکشو جا انداخته بودم

اولی فکر کنم بهتر باشه چون وقتی با لایو سی دی بالا میایم یوزر معمولیه روت نیست واسه یه تازه کارم مشکله بهش بگی بیا برو روت شو بعد انجامش بده فکر کنم همین که بهش بگیم با sudo اجراش کن راحت تر باشه

اینم خروجی من

نقل‌قول
mse@mse-desktop:~/Desktop$ sudo ./test.sh
Probing devices to guess BIOS drives. This may take a long time.
Probing devices to guess BIOS drives. This may take a long time.

       [ Minimal BASH-like line editing is supported.   For
         the   first   word,  TAB  lists  possible  command
         completions.  Anywhere else TAB lists the possible
         completions of a device/filename. ]
grub> root (hd0,8)
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  16 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,8)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub> quit
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Behnam Golds در 20 بهمن 1387، 12:12 ب‌ظ
خوب توی cd live  هم باید sudo بزنی ولی پسورد نمیخواد ازت . شما وقتی sudo میزنی در واقع داری به صورت موقت سوئیچ میکنی به کاربر root ، خروجی این دوتا دستور رو توی ترمینال بزن قضیه روشن میشه :

whoami
و

sudo whoami
ضمنا سورش بازه هرطور خواستی عوضش کن. تحت مجوز GPL v3  و احتمالا نسخه های بعدی   ;)
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 12:13 ب‌ظ
یه فرمان آخرش اضافه کردم واسه محکم کاری  ;D

نقل‌قول
#!/bin/bash
 set `{
grub --batch  <<EOF |grep  \(hd[0-9],[0-9]\)
find /boot/grub/stage1
quit
EOF
}`

syspart=$1
set `expr substr $syspart 2 3`
sysdev=$1

{
grub --batch  <<EOF
root $syspart
setup ($sysdev)
quit
EOF
}
update-grub

به نظرت چیزی کم نداره ؟
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 12:15 ب‌ظ
ضمنا سورش بازه هرطور خواستی عوضش کن. تحت مجوز GPL v3  و احتمالا نسخه های بعدی   ;)

با نسخه های بعدی موافقم  :D
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Behnam Golds در 20 بهمن 1387، 12:20 ب‌ظ
فکر نکنم چیزی کم داشته باشه فقط اگر میتونستیم اون  خط اول رو از خروجی حذف کنیم خوب می‌شد.
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 12:24 ب‌ظ
خوب کاملتر شد یه reboot now هم اضافه کردم

نقل‌قول
#!/bin/bash
 set `{
grub --batch  <<EOF |grep  \(hd[0-9],[0-9]\)
find /boot/grub/stage1
quit
EOF
}`

syspart=$1
set `expr substr $syspart 2 3`
sysdev=$1

{
grub --batch  <<EOF
root $syspart
setup ($sysdev)
quit
EOF
}
update-grub
reboot now

اون خطه رو هم نمیدونم باش ور میرم بینم میشه کاریش کرد یا نه
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: deprecated در 20 بهمن 1387، 12:54 ب‌ظ
نقل‌قول از: Behnam Golds
اگر خط آخر یعنی echo رو حذف کنی متوجه میشی که  بازم خط زیر نمایش داده میشه که نمیدونم چطور حذفش کنم :
کد:

Probing devices to guess BIOS drives. This may take a long time.

البته مهم نیست مشکلی ایجاد نمیکنه .
بسیار مطالب خوب و سودمندی بود :)
خواستم بگم که برای خطی که نباید نمایش بده، چون به خروجی استاندارد خطا میره پس باید خروجی استاندارد خطا رو به null بفرستیم. و یک سوال؟ چرا خروجی دستور grub رو مستقیم تو متغیر نمیریزی؟ واسه این دو حالت کد اول این شکلی میشه:
#!/bin/bash

sysdev=`{
grub --batch  <<EOF |grep  \(hd[0-9],[0-9]\)
find /boot/grub/stage1
quit
EOF
} 2> /dev/null`
echo $sysdev
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسک&
ارسال شده توسط: Behnam Golds در 20 بهمن 1387، 12:56 ب‌ظ
خوبه reboot  بشه ولی اینجوری کاربر می‌ترسه فکر میکنه کامپیوترش سوخته  :D  بهتر نیست قبلش از کاربر بپرسه که میخواد اینکارو بکنه یا نه؟
میتونی به جای reboot now  این چند خط رو بذاری :

echo ""
echo "Changes will take effect after reboot"
echo "Do you want to reboot now?<y/n>"
read -n 1 answer
echo ""
if [ "$answer" = "y" ] || [ "$answer" = "Y" ] || [ "$answer" = "" ];
then
reboot now
fi
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسک&
ارسال شده توسط: Behnam Golds در 20 بهمن 1387، 01:00 ب‌ظ
PC2st.ir  جان دستت درد نکنه ، چند بار این <2  رو امتحان کردم ولی بعد از grep گذاشته بودم دستت درد نکنه .

#!/bin/bash
set `whoami`

if [ "$1" != "root" ];
then
echo "Permission denied: You must be root"
exit
fi

syspart=`{
grub --batch  <<EOF |grep  \(hd[0-9],[0-9]\)
find /boot/grub/stage1
quit
EOF
} 2> /dev/null`

set `expr substr $syspart 2 3`
sysdev=$1

{
grub --batch  <<EOF
root $syspart
setup ($sysdev)
quit
EOF
} 2> /dev/null

echo ""
echo "Changes will take effect after reboot"
echo "Do you want to reboot now?<y/n>"
read -n 1 answer
echo ""
if [ "$answer" = "y" ] || [ "$answer" = "Y" ] || [ "$answer" = "" ];
then
reboot now
fi

exit
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 02:52 ب‌ظ
عجب اسکریپتی شد  :D

ایول آقا خیلی خوب شده بازم ادامش بدیم هنوزم کار داره ها

بینم با فرمان cut -n نمیشه همه ی متن رو پاک کرد که خروجی رو صفحه نشون نده ؟
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Freeman در 20 بهمن 1387، 04:05 ب‌ظ
مسلم و بهنام عزیز فوق العاده تاپیک مفیدی ایجاد کردین کارتون بسیار زیباست 1+++  زیبایی فرهنگ اوپن سورس رو میشه بخوبی اینجا دید تشکر

موفق باشین
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: moslem.b در 20 بهمن 1387، 04:13 ب‌ظ
مسلم و بهنام عزیز فوق العاده تاپیک مفیدی ایجاد کردین کارتون بسیار زیباست 1+++  زیبایی فرهنگ اوپن سورس رو میشه بخوبی اینجا دید تشکر

موفق باشین

قربونت داداش حسن  ;)

PC2st.ir هم کمک خوبی کرد دستش درد نکنه

آقا هر کی ایده ایی پیشنهادی واسه کاملتر کردنش داره بده
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Farshid در 20 بهمن 1387، 07:54 ب‌ظ
مسلم و بهنام عزیز فوق العاده تاپیک مفیدی ایجاد کردین کارتون بسیار زیباست 1+++  زیبایی فرهنگ اوپن سورس رو میشه بخوبی اینجا دید تشکر

موفق باشین

قربونت داداش حسن  ;)

PC2st.ir هم کمک خوبی کرد دستش درد نکنه

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

بهنام جان رو سفیدم کردی :D هی به مسلم می‌گم برو تاپیک بزن تو انجمن...

ببخشید که پیوستگی مطلبتون رو بهم ریختم ادامه بدید ما هم داریم استفاده می کنیم. ممنونم از همتون ;)
عنوان: پاسخ به: درخواست راهنمایی واسه نوشتن یه اسکریپت
ارسال شده توسط: Behnam Golds در 21 بهمن 1387، 02:25 ق‌ظ
لطف دارین همتون مرسی... من هم کلی حال کردم ، البته تا یه اسکریپت واقعی خیلی فاصله داره ولی همین حس و حال اپن سورسی پشتش خیلی لذت بخش بود.  ;D