انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: moslem.b در 18 بهمن 1387، 09:44 بظ
-
من دارم یه اسکریپت مینویسم ولی به یه جایی رسیدم که بدجوری اعصابم رو به هم ریخته
یکی از دستورات یه چیزی تو مایه های sudo grub هستش که بعد از این دستور محیط ترمینال کاملا عوض میشه از اینجا به بعد چی کار کنم
اگه دستور بعدی رو بصورت عادی وارد کنم جواب نمیده فکر کنم احتیاج به یه فرمان خاصی داره
میدونم منظورمو متوجه نشدید :)
آقا اینجوری بگم چجور میتونم تو اسکریپت جوری دستورات رو بنویسم که توی یه محیط دیگه اجرا بشه ؟
مثلا توی محیط گراب
-
بابا یکی راهنمایی کنه خو ](*,)
-
تنها چیزی که به فکرم میرسه استفاده از سوئیچ batch-- که البته تابه حال استفاده نکردم و آوردن پارامترها دقیقا بعد از دستور grub ، این لینک هم هست ولی ظاهرا مشکل حل نشده :
http://www.technologyquestions.com/technology/linux/166941-grub-bash-script.html
چرا فایل menu.lst رو ویرایش نمیکنی؟
-
چرا فایل menu.lst رو ویرایش نمیکنی؟
اینجوری دیگه اسکریپت نمیشه :(
-
چرا نشه؟! توی اسکریپت این کارو بکن.
-
مثلا" این دستور find /boot/grub/stage1 رو چجوری انجام بدم ؟
-
کاربرد حالت batch-- یه چیزی مثل اینه :
#!/bin/bash
grub --batch <<EOF
find /boot/grub/stage1
quit
EOF
با sudo باید اجراش کنی.
راهنما :
http://jbakshi.50webs.com/Linux_tutorial/GRUB/GNU%20GRUB%20simplified.html
یکم روش کار کنی به نتیجه میرسی.
-
کاربرد حالت batch-- یه چیزی مثل اینه :
#!/bin/bash
grub --batch <<EOF
find /boot/grub/stage1
quit
EOF
با sudo باید اجراش کنی.
راهنما :
http://jbakshi.50webs.com/Linux_tutorial/GRUB/GNU%20GRUB%20simplified.html
یکم روش کار کنی به نتیجه میرسی.
بهنام جان این دستور کار نکرد ولی با یکمی تغییرات درست شد دست گلت درد نکنه
-
این رو باید توی یه فایل بنویسی و به عنوان یک اسکریپت با 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 هم همون دستورات بالاست.
-
اونو میدونم که باید بهش حالت اجرایی بدم ولی خود دستورات رو یکم تغییر دادم درست شد و خروجی (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
-
خوب میتونیم از خروجی قبلی (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
-
ایول داریم به جاهای حساس میرسیم
دستور بعدی باید از خروجی که گرفتیم ( (root (hdx,y ) یه قسمتش حذف بشه و یه دستور دیگه قبلش بیاد اینجوری (setup (hdx
خوب اون sudo رو هم حذف میکنیم :)
Probing devices to guess BIOS drives. This may take a long time.
این خط رو منم هر کاری کردم نتونستم پاکش کنم :o
-
فکر کنم این دیگه آخریش باشه البته یکم اسم متغیر هارو تغییر دادم :
#!/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
}
-
بهنام این واسه من ارور میده خروجیش واسه تو چی میشه ؟
-
من که مشکلی ندارم :
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
-
خوب درست شد من یه تیکشو جا انداخته بودم
اولی فکر کنم بهتر باشه چون وقتی با لایو سی دی بالا میایم یوزر معمولیه روت نیست واسه یه تازه کارم مشکله بهش بگی بیا برو روت شو بعد انجامش بده فکر کنم همین که بهش بگیم با 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
-
خوب توی cd live هم باید sudo بزنی ولی پسورد نمیخواد ازت . شما وقتی sudo میزنی در واقع داری به صورت موقت سوئیچ میکنی به کاربر root ، خروجی این دوتا دستور رو توی ترمینال بزن قضیه روشن میشه :
whoami
و
sudo whoami
ضمنا سورش بازه هرطور خواستی عوضش کن. تحت مجوز GPL v3 و احتمالا نسخه های بعدی ;)
-
یه فرمان آخرش اضافه کردم واسه محکم کاری ;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
به نظرت چیزی کم نداره ؟
-
ضمنا سورش بازه هرطور خواستی عوضش کن. تحت مجوز GPL v3 و احتمالا نسخه های بعدی ;)
با نسخه های بعدی موافقم :D
-
فکر نکنم چیزی کم داشته باشه فقط اگر میتونستیم اون خط اول رو از خروجی حذف کنیم خوب میشد.
-
خوب کاملتر شد یه 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
اون خطه رو هم نمیدونم باش ور میرم بینم میشه کاریش کرد یا نه
-
اگر خط آخر یعنی 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
-
خوبه 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
-
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
-
عجب اسکریپتی شد :D
ایول آقا خیلی خوب شده بازم ادامش بدیم هنوزم کار داره ها
بینم با فرمان cut -n نمیشه همه ی متن رو پاک کرد که خروجی رو صفحه نشون نده ؟
-
مسلم و بهنام عزیز فوق العاده تاپیک مفیدی ایجاد کردین کارتون بسیار زیباست 1+++ زیبایی فرهنگ اوپن سورس رو میشه بخوبی اینجا دید تشکر
موفق باشین
-
مسلم و بهنام عزیز فوق العاده تاپیک مفیدی ایجاد کردین کارتون بسیار زیباست 1+++ زیبایی فرهنگ اوپن سورس رو میشه بخوبی اینجا دید تشکر
موفق باشین
قربونت داداش حسن ;)
PC2st.ir هم کمک خوبی کرد دستش درد نکنه
آقا هر کی ایده ایی پیشنهادی واسه کاملتر کردنش داره بده
-
مسلم و بهنام عزیز فوق العاده تاپیک مفیدی ایجاد کردین کارتون بسیار زیباست 1+++ زیبایی فرهنگ اوپن سورس رو میشه بخوبی اینجا دید تشکر
موفق باشین
قربونت داداش حسن ;)
PC2st.ir هم کمک خوبی کرد دستش درد نکنه
آقا هر کی ایده ایی پیشنهادی واسه کاملتر کردنش داره بده
دورد
بهنام جان رو سفیدم کردی :D هی به مسلم میگم برو تاپیک بزن تو انجمن...
ببخشید که پیوستگی مطلبتون رو بهم ریختم ادامه بدید ما هم داریم استفاده می کنیم. ممنونم از همتون ;)
-
لطف دارین همتون مرسی... من هم کلی حال کردم ، البته تا یه اسکریپت واقعی خیلی فاصله داره ولی همین حس و حال اپن سورسی پشتش خیلی لذت بخش بود. ;D