چگونه تست کنیم هاردمان خرابی سخت افزاری دارد؟
sudo dd if=/dev/hda of=/dev/null conv=noerror
سرعت هارد هم مشخص خواهد شد. در هاردهای ساتا و اسکازی :
sudo dd if=/dev/sda of=/dev/null conv=noerror
Printable View
چگونه تست کنیم هاردمان خرابی سخت افزاری دارد؟
sudo dd if=/dev/hda of=/dev/null conv=noerror
سرعت هارد هم مشخص خواهد شد. در هاردهای ساتا و اسکازی :
sudo dd if=/dev/sda of=/dev/null conv=noerror
وقتی wine رو نصب کردید و وقتی پارتیشن های ویندوز رو که پر از exe و dll و ... هستند مانت کردید و همچنین از KDE استفاده می کنید ممکنه با مشکلی که من چند وقت پیش تجربه کردم مواجه بشید.
وقتی سعی می کنید یکی از برنامه های KDE رو اجرا کنید با پیغام زیر مواجه میشین:
cannot find mime type applications/octet-stream
در اینصورت باید در Control Center و قسمت File Associations گره Application رو باز کنید و نوع جدیدی با نام octet-stream بسازید. سپس پسوند های زیر رو به این MimeType اضافه کنید:
*.bin
*.class
*.dms
*.exe
*.lha
*.lzh
آیا VFAT کاملا ایمن در لینوکس باز میشود؟
دیشب با یک فایل سیستم vfat در لینوکس کار میکردم دیدم که directory را به صورت file نشان می دهد!
خلاصه هر چی کلنجار رفتم نشد!
رفتم توی ویندوز ۹۸ دیدم درسته و ...
برای اجرای یک برنامه در صورتیکه run نشده باشد مثلا kppp و اگر شده شماره PID
#!/bin/bash
ProgName=pppd
get_proc=`ps -e -o pid,command | grep $ProgName`
get_it=`echo $get_proc | awk '{ print $1 }'`
if [ $get_it -gt 0 ] ; then
gdialog --yesno "$get_it" 10 10
else
kppp -c d &
fi
gdialog اگر نصب شده باشد در آن می توانید برخی از عناصر گرافیکی را نشان دهید.
باز هم فرمان dd:
دیروز به دی وی دی تصویری خراب داشتم که اول آن فقط خراب بود آنرا با این فرمان به روی هارد ریختم البته skip را برای ۲۰۰۰۰ بلوک اول زدم که از اول فایل پرش کند!
جالب بود این فرمان dd هم شده اینروزها صدر فرمانهای من.
فرمان شماره ۵۴ در یک مورد به درستی کار نخواهد کرد:
pid که به هر Process در لینوکس داده می شود ۳۲۰۰۰ است اگر بیشتر از این شود دوباره دور می زند و ps بر اساس شماره پروسس مرتب میکند اگر kppp شماره بزرگتر از ps داشته باشد فرمان درست کار نخواهد کرد!
بحثهای خیلی خوبی شده بود و از همه بحثها من که بهره زیادی بردم
من هم یه چندتا چیز که حتما خیلی از دوستان بلدن رو یاد گرفتم که به کارم خیلی اومده
یکی اینکه شاید بعضی از شما دوستان اینقدر این ubuntu (من فقط با این توزیع کار کردم و کار می کنم) رو دستکاری کرده باشید که خراب شد دیگه واقعا به هیچ صراطی مستقیم نمیشه.
آخرش دیگه می خواید یکی جدید نصب کنید یا اینکه مثلا دسترسی به اینترنت ندارید و یکی از دوستانتون دسترسی به اینترنت داشته و هر کدوم از بسته ها رو که خواسته دانلود کرده و نصب کرده.
حلاا شما هم می خوایید این بسته ها رو داشته باشید و داخل cashe مربوط به apt-get که توی چند پست قبلی گفته شده بود آدرسش کجاست روی یک سی دی داشته باشید اون وقت می تونید از aptoncd استفاده کنید.
یه چیز دیگه هم که خیلی به کار من اومد چون روی سررورها ما تعداد زیادی رنج ip دارید و هر وقت می خوام یک آیپی جدید اضافه کنم می خوام در یک رنج خاص Ping کنم ببینم کدومش فعاله کدومیش نیست بعد از یه جستجو فهمیدم که باید از fping استفاده کنم مثلا
fping -g 83.98.147.1 83.98.147.100
یه چیز دیگه که همیشه کفرم در می اومد این بود که هر کاری می خواستم بکنم هی باید می نوشتم sudo آخرش فهمیدم اول بنویسم sudo -s همیشه با روت لاگین هستم :لبخند:
کامپیوتر کی روشن شده است؟
sudo ps -eF | head
ستون STIME تاریخ یا زمان را نشان میدهد.
همچنین برای اینکه بفهمید که یک برنامه اجرا شده است مثلا میخواهم بدانم کی firefox اجرا شده است؟ یا pppd کی اجرا شده است؟
sudo ps -eF | grep pppd
sudo ps -eF | grep firefox
یک سی دی دیسک زنده به دستتون رسیده. می خواهید ببینید چه نرم افزار هایی داره. یا حتی در محیط ترمینال باهاش کار کنید. اما بدون بوت یعنی مستقیماً از لینوکس موجود خودتون!
برای مثال knoppix:
حالا می تونید در محیط این لینوکس جدید به گردش بپردازید و هر وقت خسته شدید با استفاده از دستور exit خارج بشید. حتی می تونید با استفاده از dpkg و apt بسته های توزیع رو تغییر بدید و توزیع مخصوص خودتون رو ایجاد کنید.
mkdir /tmp/knoppix-live
extract_compressed_fs /media/cdrom/KNOPPIX/KNOPPIX /tmp/knoppix-live
mkdir /tmp/knoppix-tree
tar -C /tmp/knoppix-live -cf - . | tar -C /tmp/knoppix-tree -xvpf
mount -t proc none /tmp/knoppix-tree/proc
cp /etc/resolv.conf /tmp/knoppix-tree/resolv.conf
chroot /tmp/knoppix-tree /bin/sh
ضمناً به cloop نیاز خواهید داشت
سلام
برای ارتباط با ADSL کارهای زیر را انجام دهید:
۱ - اگر بسته pppoeconf نصب نیست آنرا نصب کنید.
۲ - از متصل بودن کارت شبکه به مودم ADSL مطمئن شده و همچنین تمام سخت افزار باید بدرستی کار کند. در خط فرمان تایپ کنید pppoeconf و سپس مراحل را یکی یکی ادامه دهید.
۳ - خودش در انتها به طور اتوماتیک وصل خواهد شد اما برای قط poff و برای وصل مجدد pon dsl-provider و برای بررسی plog فرمانهایی است که به شما کمک میکند.
۴ - در واقع dsl-provider یک فایل است در مسیر /etc/pppp/peer/ که مشخصات اتصال در آن ذخیره شده است.
۵ - این فایل برای اتصال pppd مهیا شده است.
۶ - می توانید آنرا خودتان تنظیم کنید.
۷ - مثلا فرض کنید IP-Static دارید در آن :
x.x.x.x:y.y.y.y
که برای X آی پی کلاینت و y آی پی سرور تنظیم می شود.
اگر در خط فرمان اولین کاراکتر فرمان با فاصله شروع شود فرمان درhistory نخواهد آمد!!
خیلی ممنون. تاپیک خیلی خوب و جالبی شد.
به این تاپیک اوبونتو-ایران هم سر بزنید جالبه: نکته های خط فرمان
اسم اون کاراکتر back quote هست. backtick و grave accent که جناب oxygenws فرمودن رو نشنیده بودم، ولی ظاهراً چند تا اسم داره!:چشمک:نقل قول:
نوشته شده توسط rezaTavak
http://www.computerhope.com/jargon/b/backquot.htm
برای استفاده از خروجی یک دستور بعنوان یک متغیر، غیر از back quote میشه از دالرساین و پرانتز هم استفاده کرد. یعنی این دو دستور معادلند:
LISTFILES="`ls -1`"LISTFILES="$(ls -1)"در ضمن موقع ریختن خروجی اون دستور توی متغیر، کارکترهای سرخط با فاصله جایگزین میشن. پس گذاشتن اوپشن 1- برای دستور ls هیچ اثری نداره. پس اون دو دستور معادل با این هست:
LISTFILES="`ls`"اما برای ریختن توی فایل بهتره اوپشن 1- بیاد تا اسم فایلها در خطوط جدا ذخیره بشن.
ls -1 > listfiles.txtولی وقتی محتویات اون فایل رو در متغیر میریزید:
LISTFILES="`cat listfiles.txt`"بازم کاراکتر سرخط با فاصله جایگزین میشه.
پس اگه اسم بعضی فایلها شامل فاصله باشه، ذخیرهٔ لیست فایلها در یک متغیر کار خوبی نیست. اما چه راه بهتری پیشنهاد میشه؟
اگه میخواید توی یک حلقه، کار خاصی روی مسیر فایلها انجام بدید، پیشنهاد من استفاده از پایپ(pipe) و دستور read هست. مثلا این اسکریپ کوچیک، مسیر فایلهای دایرکتوری جاری رو به همراه شماره(اندیس) چاپ میکنه:
N=1(که میتونید توی بدنهٔ while هر کاری با متغیر LINE انجام بدید که همون اسم فایل هست.)
ls -1 | while read LINE ; do
echo "File $N: $LINE"
N=$[N+1]
done
یا در سادهترین حالت(بدون شماره):
ls -1 | while read LINE ; doهمینطور میتونید لیست فایلها رو از یک فایل بخونید. فقط بجای ls از cat استفاده میکنید:
echo "File: $LINE" ; done
N=1یا با استفاده از redirect کردن. به این صورت:
cat listfiles.txt | while read LINE ; do
echo "File $N: $LINE"
N=$[N+1]
done
N=1
while read LINE ; do
echo "File $N: $LINE"
N=$[N+1]
done < listfiles.txt
راستی چرا تگ liinux گذاشتید بجای linux ؟!:چشمک:
جالبه دستور mplayer -vo aa
پخش برنامه بصورت aa انجام میشه!
برای اجرای یک فایل exe تحت mono بدون استفاده از دستور mono کامند زیر کمک خوبیه.
از این پس میشه یه فایل exe رو به صورت :
echo ':CLR:M::MZ::/usr/bin/mono:' > /proc/sys/fs/binfmt_misc/register
اجرا کرد!
./MyApp.exe
یه کاربردش هم برای دوستانیه که قصد دارن برای asterisk یه AGI تحت mono بنویسن که در حالت معمول asterisk قادر نیست AGI شما رو با فرمت mono myagi.exe اجرا کنه.
موفق باشید
سلام
اگر با برنامه نویسی kdelib آشنا باشید مفهوم kxmlgui را می دانید. این بخش از kdelib به برنامه نویس این امکان را می دهد تا ظاهر برنامه را در یک فایل xml ذخیره و بازیابی کند، و احتمالاً گزینه Shortcut Settings یا Toolbars Settings را در منوی settings که به طور اتوماتیک توسط kxmlgui ایجاد می شوند دیده اید. توسط این گزینه ها می توانید میانبر ها یا کلید های نوار (های) ابزار را تغییر دهید. اما در حالت عادی نمی توانید گزینه های منو را تغییر دهید. اما می توانید برای تغییر در گزینه های منو فایل xml را (که ذکر گشت) ویرایش کنید.
بدین منظور ابتدا فایل را در مسیر زیر پیدا کنید
~/.kde/share/apps/appname/appnameui.rc
توجه : appname نام برنامه مورد نظر شماست.
در داخل این فایل گره ای به نام MenuBar وجود دارد که فقط یک بار در فایل تعریف شده است که نمایانگر نوار منو است. این گره فرزند هایی با نام Menu دارد که به گزینه های منو (مانند File و Edit و...) اشاره دارد. با جابجایی یک کلید Action از یک Menu به یک Menu ی دیگر می توانید چیدمان برنامه را به دلخواه تغییر دهید.
نکته : این تغییرات فقط برای کاربر جاری خواهد بود، فایل پیش فرض تنطیمات در مسیر /usr/bin/ قرار دارد.
نکته 2 : هر Action توسط برنامه نویس در برنامه و از کلاس KAction تعریف می شود.
نکته 3 : شما در این فایل گزینه های عمومی (مانند Save, Cut, Copy و ...) را نمی بینید. اما می توانید آنها را به یک منوی دیگر اضافه کنید. برای مثال کلید زیر را تحت گره Menu ی Edit اضافه کنید تا گزینه Save به منوی Edit اضافه شود.
<Action name="file_save" />
فرض کنید فرمانی را به مقادیر زیادی از پارامتر ها اجرا کرده اید. حالا می خواهید همان فرمان را با همان پارامتر ها اجرا کنید.
راه اول : با کلید Up به دنبال آن بگردید.
راه جالبتر : علامت ! را قبل از نام فرمان و بدون پارامتر ها صادر کنید.
مثال :
!echo
فرمان زیر را در نظر بگیرید:
$ echo {"one ","two ", "three "}linux
خروجی آن به این شکل خواهد بود:
one linux two linux threelinux
حالا حدس بزنید فرمان زیر چه کاری انجام خواهد داد
cp /etc/fstab{,.bak}
:چشمک:
بدون شرح!
apt-get install hibernate
دسترسی به پارتیشن LVM در UBUNTU :
- sudo apt-get install lvm2
- sudo modprobe dm-mod
- sudo vgscan
- sudo vgchange -ay VolGroup00
- sudo lvs
- sudo mkdir /mnt/fcroot
- sudo mount /dev/VolGroup00/LogVol00 /mnt/fcroot -o ro,user
- ls /mnt/fcroot
شاید شما هم مثل من در برخی سایتهای مفتضح ایرانی مثل سیستم سما (انتخاب واحد دانشگاه) و امثالهم مشکل داشته باشید و مجبور شوید از IE استفاده کنید.
خب اینکار بسادگی با نصب IE4Linux ممکن میشود.
اما نکته اینجاست که این سایتها بر روی VBScript کار می کنند و مشکل شما را حل نخواهند کرد.
پس لازمست فایلهای مورد نیاز ویژوال بیسیک اسکریپت در دسترس wine باشند.
ابتدا msvbvm60.dll را در دایرکتوری
~/.wine/drvice_c/windows/system32
کپی کنید و آنرا رجیستر کنید یعنی :
wine regsvr32.exe .wine/drive_c/windows/system32/MSVBVM60.dll
حال بقیه فایلهای مورد را نیز کپی کنید (در ویندوز شاخه سیستم dir vb*.dll بگیرد و مانند فایل بالا عمل کنید.)
همچنین wscript.exe را در شاخه اشاره شده کپی کنید.
از اینجا به بعد IE شما VB را هم پشتیبانی خواهد کرد!
من هیجی نفهمیدم کسی کمک می کنه؟
به عنوان یک پیشنهاد موسسه آنیسا نماینده انحصاری lpi داره سه دوره ال پی آی رو برگزار می کنه که اگر واقعا دید لینوکس دارید بهتره این سه دوره رو اینجا بگذرونید تا متخصص کامل بشید . البته فعلا دوره اول و دوم برگزار میشه و دوره سوم نیز هنوز آغاز نشده
dmidecodeیکی از دستورات جالبی که تا به امروز دیدم. تمام اطلاعات ریز mainboard رو که تا حالا ندیده بودم میده! از ساپورت رم تا اورکلاک و ...
اطلاعات مربوطه رو از /dev/mem میخونه
چند روز پیش یاد پلیر های قدیمیه خط فرمان افتادم. گشتم ببینم چه برنامه ای روی لینوکس پیدا میکنم. اول به aplay که مربوط به خود alsa هست برخوردم اما فقط موسیقی های wave رو پخش میکرد!
بعد از کمی جستجو به پلیر قدرتمند mgp123 رسیدم که فایل های mp3 و دسته جمعی هم پخش میکرد.
mpg123 [ options ] fileاگر میخواین همهی فایل های یک پوشه رو براتون اجرا کنه کافیه:
mpg123 pathaddress/*.*
شاید الان که انواع و اقسام پلیرهای گرافیکی هست کسی بهش نیاز پیدا نکنه. اما با رم کمی که استفاده میکنه و اینکه بدون محیط گرافیکی هم میشه ازش استفاده کرد و همینطور زنده کردن خاطرات گذشته مفید باشه.
شاید مثل الانه من نیاز پیدا کنید که معادل hexdecimal حروف و ... بدونین.
echo abcd > t
hexdump t
خط اول حروف abcd رو به متغیر t نسبت میدهد. در خط بعدی برنامهی hexdump -که تقریبا در اکثر توزیع های لینوکس پیش فرض نصب هست- میاد معادل hex حروف رو بهمون میده.
از این برنامه برای کارهای دیگه هم استفاده میشه -برای دیباگ برنامه و مشخص کردن آدرس hex برنامه-
ایراد :
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified
برای رفع ای ایراد میباست از دستور زیر استفاده کرد.
xhost local:user
که در اینجا user همان نام کاربری است که برنامه تحت آن اجرا میشود.
و یا میتوانید از دستور زیر برای تمام user ها استفاده کنید.
xhost local:*
موفق باشید
برای اجرای یک دستوردر bash با شمارهای خاص (این شماره را میتوان با دستور history بدست آورد) علامت تعجب ! و سپس شماره خط دستور:
!123
مثلا دستور بالا خط ۱۲۳ تاریخچه را اجرا میکند.
خیلی عالی بود ، لطفا ادامه بدید.
پیدا کردن مدل cpu
grep "model name" /proc/cpuinfo
برای اینکه تمام پروسس های متعلق به خودتون رو ببندید :
kill -9 -1بعد از این کار تمام پروسس ها ( که محیط گرافیکی هم شاملش میشه) بسته میشن و به صفحهی لوگین میرید.
دوستانی که با Terminal در لینوکس زیاد کار میکنن و همیشه چندتا صفحهٔ Terminal رو باز دارن پیشنهاد میکنم حتما از برنامهٔ زیر استفاده کنن:
Terminator
http://www.tenshu.net/terminator/
installation in ubuntu
=============
sudo apt-get install terminator
تازگیا به برنامه نویسی داخل لینوکس علاقه پیدا کردم که ببینم چطور میشه باهاش کار کرد. همیشه دنبال توضیحات lib ها و چیزای دیگه زبان C و خود لینوکس بودم تا ببینم چطور میشه دیدشون. بعد فهمیدم اینطوری باید عمل کرد:
man stdio
کافیه بعد از کلمه man اسم فایل کتابخونهای رو که میخواین بنویسید تا منپیجش رو کامل داخل ترمینال ببینید. اطلاعات جالبی بهتون میده که چه تابعی داخل این کتابخونست و کارش چیه. البته برای هر تابع هم میتونین از من استفاده کنید که شکل کلی و توضیحاتش رو میده مثل:
man printf
بعد هم کتابخونه libc کار گنو هست که توابع زبان سی رو در خودش داره و نیازه. اینطوری میشه بهش دسترسی داشت:
info libc
با اینها نزدیک به ۶۰ تا ۷۰٪ نیازها رفع میشه.
برای دونستن استانداردهای کدنویسی GNU دربارهی سوئیچ های خط فرمان و اطلاعاتی راجع به نوشتن برنامه در خط فرمان و استانداردهایی که بقیه رعایت کردن رو هم با تایپ این دستور در خط فرمان ببینید:
info "(standards)user interfaces"
اختصاص IP به کاربر های مختلف در لینوکس.
در بعضی شرایط نیاز پیدا میشه که هر User در لینوکس از یک IP برای Application های خود استفاده کنه که این امکان را میشه با دستور زیر ایجاد کرد.
iptables -t nat -A POSTROUTING -m owner --uid-owner user1 -j SNAT --to x.x.x.1
بعد از تنظیمات Firewall هر Application که تحت user1 اجرا شود از x.x.x.1 خروجی خواهد داشت.
موفق باشید
یک برنامه جالب هم برای کارکردن با ترمینال توی محیط KDE برنامه yakuake است که یک کنسول مانند کنسول بازی quake در اختیار می گزارد که خیلی مفید است.
چند تا دستور جالب هم که امروز یاد گرفتم برای تکرار دستورات قبلی:
تکرار آخرین دستور:
!!
تکرار آخرین دستور command با همان آرگومنت ها:
!command
اجرای nامین دستور در history:
!n
اجرای nامین دستور از آخر:
!-n
و در آخر هم اجرای دستور با استفاده از آرگومنتهایی که در دستور آخر استفاده کرده اید:
command !*
موفق باشید.
دستور dict رو من تازه امروز دیدم:خجالت: و واقعا حال کردم:
dict کلمه
توی ۷-۸ تا دیکشنری آنلاین سرچ می کنه و معنای کلمه رو پیدا می کنه.
فقط ایکاش به فارسی هم داشت.:ناراحت:
یک rule ساده برای iptable برای مقابل با حملات Bruteforce SSH:
# SSH Brute Force Protection
iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
این script رو به فایل etc/rc.local/ اضافه کنید که هربار موقهٔ boot شدن اجرا بشه;
بجای eth1 اسم device رو بذارین که connection هاتون با اون بر قراره مثلا eth0 یا wlan0 و ....
من یه اسکریپت دارم که به صورت cronjob هرچند روز یکبار تعدادی از صفحات یه وبسایت رو میگیره و اطلاعات خاصی رو از اون استخراج میکنه.یک نمونه از نمایش صفحات این سایت روی مرورگر :
Last update IP address Port Country Speed Connection time Type Anonymity
31 secs 54.251.150.200 80 flag United States HTTP Low
2 minutes 173.213.113.111 3128 flag United States HTTPS High +KA
2 minutes 94.209.12.29 80 flag Netherlands HTTP High +KA
3 minutes 89.32.230.98 8080 flag Moldova, Republic of HTTPS High +KA
4 minutes 118.96.127.10 3128 flag Indonesia HTTP Low
4 minutes 125.39.68.130 80 flag China HTTPS High +KA
5 minutes 115.127.29.178 3128 flag Bangladesh HTTPS High +KA
5 minutes 218.29.154.54 8000 flag China HTTPS High +KA
اسکریپت ۴ فیلد رو استخراج و پردازش میکنه.فیلد ip مربوط اولین رکورد(54.251.150.200) در فایل html
به صورت زیر است :
.xn4v{display:none}
.CHZv{display:inline}
.WJIS{display:none}
.R1oQ{display:inline}
.Qp8o{display:none}
.KEYK{display:inline}
.R_Ad{display:none}
.XUdT{display:inline}
</style><span class="XUdT">54</span><span style="display:none">61</span><div style="display:none">61</div><div style="display:none">131</div><span style="display:none">177</span><span class="R_Ad">177</span><span></span><div style="display:none">214</div><span></span><span class="XUdT">.</span><span class="R_Ad">18</span><div style="display:none">18</div><span class="xn4v">125</span><span class="R_Ad">136</span><div style="display:none">136</div><span style="display:none">180</span><div style="display:none">180</div><span style="display:none">209</span><span class="xn4v">209</span><div style="display:none">209</div><span style="display:none">218</span><span class="WJIS">218</span><div style="display:none">218</div><span style="display: inline">251</span><span class="27">.</span><span class="Qp8o">6</span><span style="display:none">25</span><span style="display:none">40</span><span class="WJIS">40</span><span class="Qp8o">54</span><div style="display:none">54</div><span class="Qp8o">57</span><span style="display:none">71</span><span class="WJIS">71</span><div style="display:none">71</div><span style="display:none">80</span><span style="display:none">114</span><span class="WJIS">114</span><div style="display:none">114</div><span style="display:none">130</span><div style="display:none">130</div><div style="display:none">134</div><span class="143">150</span><div style="display:none">175</div><span style="display:none">188</span><div style="display:none">188</div><span></span><span></span><span class="122">.</span><span class="WJIS">3</span><span></span><div style="display:none">9</div><span class="Qp8o">152</span><div style="display:none">152</div><span class="30">200</span></span></td>
البته سایر فیلدهای ip دارای الگوهای متغیر دیگری هستند و این کار را کمی مشکل میکند ولی وقتی مرورگر میتواند به راحتی صفحه را رندر کند پس من هم میتوانم.یک تابع کوچک ۴ فیلد مورد نظر من را استخراج میکند(ip-port-country-type) :
function parse_ip_port()
{
maingrepstr="((span|div|style|class=\"[0-9]+\"|display:[ ]?inline\")>\.?[0-9]+\.?[0-9]*<)"
grepstr="$maingrepstr"
unset temparray
temparray=(`grep -En '^\..*' $rand_file_name | cut -d ':' -f 1`)
for i in `seq 0 $((${#temparray[@]}-2))`;
do
unset tempstr
linenum="${temparray[$i]}"
tempstr="`sed -n "${linenum}p" "$rand_file_name" | grep '{display:inline}' | grep -Eo '^\.[^{]+' | cut -c 2- | tr -d '\n'`"
if [ -n "$tempstr" ];then
grepstr="$grepstr|(class=\"$tempstr\">\.?[0-9]+\.?[0-9]*<)"
fi
if [ "${linenum}" -eq "$((${temparray[$i+1]}-1))" ];then
continue
else
offset=$((${temparray[$i+1]}-1))
echo "`sed -n "${linenum},${offset}p" "$rand_file_name" | grep -Eo "$grepstr"| grep -Eo '(^\.?[0-9]+\.?[0-9]*)|(>[\.]?[0-9]+[\.]?[0-9]*<)' | grep -Eo '[0-9]+' | tr '\n' '.' | sed 's/\.$//'`:`sed -n "${linenum},${offset}p" "$rand_file_name" | grep -Eo '^[0-9]+' | head -n 1`:`sed -n "${linenum},${offset}p" "$rand_file_name" | grep -Eo '>.*</span>' | grep -Eo '> .*<' | grep -Eo '[^>].*[^<]' | cut -c 2-`:`sed -n "${linenum},${offset}p" "$rand_file_name" |grep -Eio '<td>(HTTP|HTTPS|socks.*)</td>' | grep -Eo '>[^<]+' | cut -c 2-`" >>$rand_file_pages
grepstr="$maingrepstr"
fi
done
lastindex="$((${#temparray[@]}-1))"
tempstr="`sed -n "${temparray[$lastindex]}p" "$rand_file_name" | grep '{display:inline}' | grep -Eo '^\.[^{]+' | cut -c 2- | tr -d '\n'`"
if [ -n "$tempstr" ];then
grepstr="$grepstr|(class=\"$tempstr\">\.?[0-9]+\.?[0-9]*<)"
fi
echo "`sed -n "${temparray[$lastindex]},$((${temparray[$lastindex]}+25))p" "$rand_file_name" | grep -Eo "$grepstr"| grep -Eo '(^\.?[0-9]+\.?[0-9]*)|(>[\.]?[0-9]+[\.]?[0-9]*<)' | grep -Eo '[0-9]+' | tr '\n' '.' | sed 's/\.$//'`:`sed -n "${temparray[$lastindex]},$((${temparray[$lastindex]}+25))p" "$rand_file_name" | grep -Eo '^[0-9]+' | head -n 1`:`sed -n "${temparray[$lastindex]},$((${temparray[$lastindex]}+25))p" "$rand_file_name" | grep -Eo '>.*</span>' | grep -Eo '> .*<' | grep -Eo '[^>].*[^<]' | cut -c 2-`:`sed -n "${temparray[$lastindex]},$((${temparray[$lastindex]}+25))p" "$rand_file_name" | grep -Eio '<td>(HTTP|HTTPS|socks.*)</td>' | grep -Eo '>[^<]+' | cut -c 2-`" >>$rand_file_pages
return
}
متغیر $rand_file_name فایل html دانلود شده است که باید پردازش شود.نتایج حاصل از پردازش در $rand_file_pages قرار میگیرند.برای امتحان صفحه http://www.hidemyass.com/proxy-list/1 را از طریق قند شکن دانلود کنید و با انتساب ۲ فایل ورودی و خروجی به ۲ متغیر ذکر شده این تابع را آزمایش کنید.
آشنایی با sed,grep و سینتکس regex و چندین خاصیت مهم bash میتواند حاصل این تمرین باشد.میتوانید از awk به جای sed و grep استفاده کنید.در برخی دیگر از صفحات web متغیرهای جاوا اسکریپت جایگزین تعریف استایلهای نظیر
.xn4v{display:none}
میشوند اما پردازش آن نیز ساده است.
میدانم که کد بالا یک کد اسپاگتی است.اما بسیار کوتاه است و معنی و مفهوم آن برای کسی که از regex سر در بیاورد راحت است.
کد هر سایتی به مرور زمان ممکن است تغیییر کند که ممکن است نیاز به تغییراتی در تابع باشد.
من اسکریپتی دارم به صورت یه cronjob با مجوز ریشه اجرا میشه اما لاگین من به صورت یه کاربر معمولیه.میخوام این اسکریپت log فایل خودشو در دسکتاپ کاربر لاگین کرده قرار بده و نه کاربر ریشه.طبیعتا نمیتونم از مقدار متغیرهایی نظیر USER یا USERNAME یا LOGNAME استفاده کنم.راه حل استفاده از دستور who هست.نمیدونم سینتکس دستور درسته یا نه ولی در همه حالاتی که در دو لینوکس فدورا و دبیان 7 امتحان کردم چه با لاگین کاربر عادی یا ریشه درست جواب داده.
current_logged_user="`who | grep -v root | head -n 1 | cut -d " " -f1 | tr -d '\n'`" #${MAIL##*/}
[[ -z "${current_logged_user}" ]] && current_logged_user="$USER"
به جای grep -v root میشه از
grep ' :0 '
استفاده کرد به شرط آنکه کاربر فقط از طریق دسکتاپ لاگین کنه و از محیط ترمینال برای اجرای اسکریپت استفاده نکنه.تمام تلاش من اینه که هر اسکریپتی مینویسم تا حد امکان پرتابل باشه.به خاطر اینه که گاهی به نظر میرسه لقمه رو دور سر میچرخونم.
اگر کسی سینتکس بهتر یا دستور دیگه ای سراغ داره لطفا راهنمایی کنه.
به جای `` بهتر هست که از $() استفاده کنید.خطا موقع نوشتن کمتره.
دنیای نرم افزارهای آزاد تا حالا نتونسته دانلود منیجری به قدرتمندی IDM ویندوز بوجود بیاره.
در محیط گرافیکی flareget رقیبی نداره.jdownloader با وجود قدیمی بودنش خیلی خوبه.
در محیط متنی wget بابابزرگ حساب میشه و curl یه دانلود منیجر بسیار حرفه ای تر به شمار میاد اما سریعترین دانلود منیجر بی شک axel هست.
اما تمام این دانلود منیجرها باید بزنن بغل وقتی aria2 میاد وسط.aria2 سریعترین نیست ولی منعطفترین و قدرتمندترین دانلود منیجر تحت خط فرمان هست.از پروتوکولهای مرسوم دانلود پشتیبانی میکنه و چند بندیه و ...
فقط ۲ تا مشکل هست.خیلی از سایتهای دانلودی(http)از مکانیزم کوکی یا ارجاع استفاده میکنند و اگر دانلودری نتونه این دو مکانیزم رو ساپورت کنه نمیتونه از یه سری سایتها دانلود کنه.
برای اولی aria2 آپشن load-cookies رو داره که به صورت عمومی اعمال میشه.برای دومی هم آپشن referer رو داره که البته باید با آپشن parameterized-uri توامان باشه.
من از یه لیست دانلودی استفاده میکنم که کلیه URL ها به همراه آپشن ارجاع و در صورت وجود سایر URI های اون لینک دانلود در اون قرار داره با دستور زیر :
/usr/local/bin/aria2c --input-file=/home/ahmad/Desktop/downlist.txt --log=/home/ahmad/Desktop/aria2.log --log-level=notice --retry-wait=1 --max-tries=0 --max-concurrent-downloads=2 --split=4 --max-connection-per-server=1 --connect-timeout=600 --enable-dht --stop=$((28500-((`date +"%H"`*60*60)+(`date +"%M"`*60)))) --file-allocation=prealloc --parameterized-uri=true --check-certificate=false --check-integrity=true --dir=/big-download --load-cookies=`{ \cp -f $(find "$HOME" -name "cookies.sqlite" 2> /dev/null | grep "mozilla") /tmp;echo /tmp/cookies.sqlite; }`
نکات مربوط به دستور بالا:
آپشن ارجاع در فایل downlist.txt مربوط به هر لینک دانلود قرار داره و آپشن عمومی نیست.
همزمان ۲ فایل دانلود میشن اما در زمان واحد صرفا یک کانکشن به یک سرور خاص مجازه و کانکشنها حداکثر از ۴ بند استفاده میکنند.
من معمولا از یه cronjob برای دانلود استفاده میکنم که در ساعت 1:02 بامداد شروع میشه.زمان پایان دانلود رو خود دانلود منیجر تعیین میکنه.(در آپشن stop).قبلا مقدار این آپشن به صورت ثابت بود اما حالا اون رو متغیر کردم.چون گاهی دانلود به صورت cronjob اجرا نمیشه و با تاخیر به صورت فرمان مستقیم اجرا میشه.در هر حال در ساعت 7:55 باید دانلود قطع بشه.
--stop=$((28500-((`date +"%H"`*60*60)+(`date +"%M"`*60))))
دستور بالا تعداد ثانیه های باقیمانده تا 7:55 دقیقه رو به آپشن stop میفرسته.
من از مرورگر Mozilla FireFox استفاده میکنم.دستور
--load-cookies=`{ \cp -f $(find "$HOME" -name "cookies.sqlite" 2> /dev/null | grep "mozilla") /tmp;echo /tmp/cookies.sqlite; }`
فایل دیتابیس کوکیهای فایرفاکس رو به پوشه /tmp کپی و مسیر فایل رو به آپشن load-cookies میفرسته.
حالا چرا کپی کنیم و از خود فایل استفاده نکنیم؟چون اگر فایرفاکس در حال اجرا باشه فایلهای دیتابیسش رو قفل میکنه
من دو لینوکس پس از ویندوز روی سیستم حقیقی نصب کردم.ابتدا فدورا که سیستم عامل اصلی کامپیوتر من است و سپس دبیان ۷.به محض بوت ویندوز با مشکل به هم ریختن ساعت سیستم مواجه میشدم و در سوییچ کردنهای بعدی بین لینوکس و ویندوز تکرار میشد.راه حل عمومی آن به صورت زیر است:
با دستور tzselect ناحیه زمانی مناسب را انتخاب کنید(در صورتیکه قبلا انتخاب نکرده باشید)
ابتدا با اتصال به سرور ntp ساعت سیستم را تنظیم کنید.از دستور ntpdate استفاده کنید.
دستور زیر را اجرا کنید :
hwclock --systohc
در فایل etc/adjtime/ عبارت UTC را به LOCAL تغییر دهید.
از آپشنهای عمومی و قدیمی تر به جای آپشنهای اختصاصی و جدیدتر استفاده کنید.از آپشنهای deprecated استفاده نکنید.ورژنهای مختلفی از یک بسته ممکن است در سیستمهای متفاوت نصب باشند.به عنوان یک مثال برای خاموش کردن سیستم در فدورا 18 من از دستور
/usr/sbin/shutdown -P now
استفاده میکردم.اما در دبیان ۷ این دستور جواب نداد و به جای آپشن P از h استفاده کردم که در هر دو سیستم جواب میداد.
اغلب اوقات از مسیر کامل دستور مورد نظر استفاده کنید.مثلا به جای shutdown از usr/sbin/shutdown/ استفاده کنید.زیرا به هر دلیل ممکن است متغیر PATH به درستی تنظیم نشده باشد.به عنوان مثالی دیگر من نرم افزار wxHexEditor را کامپایل و نصب کرده ام.اگر نام آن را به تنهایی در خط فرمان بنویسم اجرا میشود و نیازی به ذکر مسیر نیست ولی در دستور sudo ننوشتن مسیر باعث شکست در اجرای این دستور میشود.
همیشه وجود فاصله در مسیر یا حاصل عبارات را در نظر بگیرید.این مورد میتواند بسیار جدی باشد.
در حاصل عبارات که مورد مقایسه قرار میگیرد یا به یک متغیر منتسب میشود کاراکتر احتمالی نوسطر را با دستور
tr -d '\n'
حذف کنید.وجود این کاراکتر باعث رفتار غیر منتظره اسکریپت میشود.
تا حد امکان از متغیرها به جای ثوابت استفاده کنید.مثلا من در اسکریتی که برای مدیریت کانکشن اینترنتی استفاده میکنم به جای نوشتن ۲ انتساب زیر :
con_uuid=977c7b23-d2de-41c5-9275-12c713964393
my_con_str=802-3-ethernet
که برای اجرای اسکریپت نیاز دارم این دو متغیر را به طریق زیر محاسبه میکنم :
my_real_connection_type=`nmcli -t -f TYPE con 2>/dev/null | grep -Ei "ppp[a-z]*" | head -n 1 | tr -d '\n'`
if [ -z "${my_real_connection_type}" ];then
my_real_connection_type=`nmcli -t -f TYPE con 2>/dev/null | grep -Ei "ppp*" | head -n 1 | tr -d '\n'`
fi
my_con_str=`nmcli -t -f TYPE dev | head -n 1 | tr -d '\n'`
if [ -z "$my_con_str" ];then
echo -e "`date +"%A %d %B %Y %R"`\tFATAL ERROR. variable 'my_con_str' not set correctly" | tee -a "$logfile" 2> /dev/null
exit 3
fi
con_uuid=`nmcli -t -f TYPE,UUID con | grep "${my_real_connection_type:-${my_con_str}}" | head -n 1 | cut -d ':' -f 2 | tr -d '\n'`
if [ -z "$con_uuid" ];then
echo -e "`date +"%A %d %B %Y %R"`\tFATAL ERROR. variable 'con_uuid' not set correctly" | tee -a "$logfile" 2> /dev/null
exit 3
fi
fi
کلیه خطاهای ممکن احتمالی را برسی کنید به خصوص زمانی که به فایل یا منبع خارجی نیاز دارید.من اسکریپتی دارم که کد اصلیش 60-70خطی بیشتر نیست ولی با مکانیزمهایی که گفتم میشه حدود 800 خط !!! اما پرتابل و متحمل خطا میشه.حتما exit code مناسب با خطا رو ست کنید و یه پیغام مناسب رو به خروجی مورد نظر بفرسته.
اگر یه اسکریپت مفصل یا با احتمال خطای زیاد مینویسید تلاش کنید لاگ نویسی رو در اسکریپت تدارک ببینید.
من عادت مستند کردن ندارم.ولی شما حتما خودتون عادت بدید.!!!عیب یابی یه کد حجیم یا پیچیده جوون رو پیر میکنه.(این نکات مربوط به برنامه نویسیه که با یه درجه تخفیف در مورد اسکریپتهای bash کاربرد داره)
تا حد امکان از ویژگیهای درونی Bash بهره بگیرید.مثلا من میخوام نام کاربر رو از متغیر MAIL استخراج کنم:
MAIL=/var/spool/mail/ahmad
میتونم از دستورات خارجی نظیر cut بهره بگیرم یا از یوتیلیتی basename به صورتuser=$(basename $MAIL)
اما استفاده از دستورات خارجی بار پردازشی داره میتونم از خاصیت بسط پارامتر bash بهره بگیریم :user=${MAIL##*/}
از دستورات عمومی تر استفاده کنید مثلا به جای awk از sed و grep استفاده کنید.
در عبارات شرطی و مقایسه ای تدابیری اتخاذ کنید تا نوع عملوندها با عملگر متناسب باشد.مثلا عملگر eq- انتظار دارد دو عملوندش عدد صحیح باشند.حالا اگر یک عبارت را به جای یکی از عملوندها مینویسید و انتظار دارید خروجی عدد صحیح داشته باشد ممکن است خروجی یک رشته خطا باشد.در این حالت عملکرد اسکریپت نامشخص است.
این چیزایی بود که به نظرم اومد.
بلاخره یک چیز جدید پیدا کردم.نقل قول:
user=${MAIL##*/}
ممکنه توضیح بدید این خط چکار میکنه؟
مرسی.
اگر شما مستندات bash رو باز کنید یه سرفصل داره به نام Parameter Expansion
ذیل اون :
${parameter#word}
${parameter##word}
Remove matching prefix pattern. The word is expanded to produce a pattern just as in pathname
expansion. If the pattern matches the beginning of the value of parameter, then the result of the
expansion is the expanded value of parameter with the shortest matching pattern (the ``#'' case) or
the longest matching pattern (the ``##'' case) deleted. If parameter is @ or *, the pattern removal
operation is applied to each positional parameter in turn, and the expansion is the resultant list.
If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied
to each member of the array in turn, and the expansion is the resultant list.