اطلاعیه

Collapse
No announcement yet.

linux shell programming

Collapse
This is a sticky topic.
X
X
 
  • Filter
  • زمان
  • Show
Clear All
new posts

  • #16
    سلام به همه بچه های عزیز.
    یک کتاب داشتم در مورد این زمینه. که مرجع کاملی هستش در مورد شل پراگرمینگ در لینوکس.
    نام کتاب : Linux Mastering Unix Shell ******ing
    تعداد صفحات: 704
    انتشارات: Wiley
    نام نویسنده:Randal K.Michael
    لینک دانلود: کلیک کنید
    انقدر نشد چشمه از پاسخ سنگ سرد، به رفتن در اسِتاد و اِبرام کرد
    بسی کَند و کاوید و کوشش نمود، کز آن سنگ خارا رهی برگشود
    ملک الشعرای بهار
    My Blog : c3phalex1n.blogspot.com

    سایت جنبش مصاف، علی اکبر رائفی پور : http://masaf.ir
    خدا خیرش بده واقعا، تا حالا ندیده بودم کسی اینقدر برای جوُنا زحمت بکشه.

    Comment


    • #17
      سلام
      sssd
      نه مشکل این نیست ... خیلی ساده هست ...یه کمی لوجیکه ...البته کار می کنه اما ...
      اگر شما یه نگاه به اسکریپت بندازی میبنی نیازی به sort نیست !

      دوست عزیزی که لطف کردی کتاب گذاشتی :
      منهم از این دست کتابها کم ندارم.اما چیزهایی که یادگرفتم رو یاد میدم ..چیزی تو چنته داری بسم ا ... وگرنه من هم دارم .
      بهر حال مرسی
      Last edited by t4z3v4r3d; 11-01-2011, 05:04 PM.

      برای یافتن مروارید دریاهارا جستجو مکن شاید در گردنت باشد ............................................
      شیرین شیرینم شیرین شمام ..ساتیگ نبینم ...خاوام خرابه


      FreeBSD t4yt4n 6.3-RELEASE-p2 FreeBSD 6.3-RELEASE-p2 #0:
      Sun May 11 20:03:31 IRDT 2008 root@t4yt4n:/usr/obj/usr/src/sys/H1 i386
      نه برای فخر فروشی برای یاد آوری آنچه نمی دانم

      Comment


      • #18
        سلام

        ببخشید کمی دیر به دیر میام ...


        برنامه نویسی در شل

        در ادامه یک اسکریپت کاربردی دیگر را با هم بررسی میکنیم .
        یکی از حملاتی که این روزها گریبانگیر بسیاری از ماشینهای ما - مخصوصا خودم شده حملات بروت فورس هست. ابزاری را در اینجا برای بررسی و امارگیری این حملات با هم مینویسیم.

        خب
        گام یکم :
        بررسی نیازهایی که برای انها نیازمند اسکریپت هستیم .
        ۱) خواندن و بیرون کشیدن داده ها
        ۲ ) دسته بندی داده های خام و ویرایش یا گرفتن اطلاعات جدید
        ۳ ) مرتب کردن داده های انالی شده و خوانا کردن آنها


        گام دوم :
        چه زبانی - زبانهایی - نیاز مار براورده میسازد ؟
        ازا نجا که برای بسیاری از سرورها کامپایل یک بسته نرم افزرای در روال اداری گیر خواهد کرد ،
        گزینه مناسب شاید زبانهای اسکریپتی باشد - بزودی بجز bash زبانهای دیگری را با هم شروع میکنیم -

        گام سوم :
        گزینش بهترین و کوتاه ترین روشهای برنامه نویسی برای انجام کار

        فرض میکنیم داده های ما به چیزی مانند این است :
        کد:
        Nov 21 12:04:12 t4yt4n5 sshd[3133]: Invalid user Ionut from 60.28.199.166
        Nov 21 12:04:14 t4yt4n5 sshd[3133]: error: PAM: authentication error for illegal user Ionut from 60.28.199.166
        پرسشی که در اینجا پیش می اید این است :
        چه داده هایی برای بررسی نیاز است ؟
        پرسش بستگی به دید شما دارد . من درخواستهای داده شده را می خواهم شما میتوانید نام کاربرانی را هم که بکار رفته همراه با زمان درخواست بررسی کنید .
        اما من چه چیزی بدست می اورم ؟
        کد:
        root@ :: t4yt4n5 :: /home/t4z3v4r3d  grep Failed /var/log/auth.log   | head -n 1 
        Nov 21 12:04:14 t4yt4n5 sshd[3133]: Failed keyboard-interactive/pam for invalid user Ionut from 60.28.199.166 port 42959 ssh2
        
        
        raw log
        ----------------------
        
        root@ :: t4yt4n5 :: /home/t4z3v4r3d  grep Failed /var/log/auth.log | awk {' print $13,$11,$1,$2,$3  '}  | head -n 1 
        60.28.199.166 Ionut Nov 21 12:04:14
        خب داده هایی که بدست امده را بر پایه نشانی هکر ! گرامی ، نام کاربری که بکار برده ، زمان درخواست مرتب میکنیم .

        و پس از بدست آوردن داده هایی که نیاز داریم از داده های خام - /var/log/auth.log-
        کاربر گرامی - هکر گرامی - را دنبال میکنیم .
        کد:
        root@ :: t4yt4n5 :: /home/t4z3v4r3d  attacker=`grep Failed /var/log/auth.log | awk {' print $13 '}  | head -n 1`            
        root@ :: t4yt4n5 :: /home/t4z3v4r3d  whois -l $attacker
        
        
        inetnum:        60.28.199.0 - 60.28.199.255
        netname:        CHINA-21ViaNet-Inc
        country:        CN
        descr:          21ViaNet(China),Inc.
        admin-c:        HZ19-AP
        tech-c:         HZ19-AP
        status:         ASSIGNED NON-PORTABLE
        changed:        [email protected] 20070520
        mnt-by:         MAINT-CNCGROUP-TJ
        mnt-irt:        IRT-CNCGROUP-TJ
        source:         APNIC

        خب تا اینجای کار می دانیم چکاری باید انجام داد. پس از این باید همه داده ها را با هم بررسی کنیم . مانند اسکریپتهای گذشته داریم :

        کد:
        #!/usr/local/bin/bash
        [COLOR="Lime"]log[/COLOR]=[B]/var/log/auth.log[/B]
        [COLOR="Magenta"]clear[/COLOR]
        
        [COLOR="Lime"]ip_ar=()[/COLOR]
        [B]for[/B] line [B]in[/B] `[COLOR="Magenta"]grep[/COLOR] Failed [COLOR="Lime"]$log[/COLOR] |  [COLOR="Magenta"]awk[/COLOR] {' [COLOR="Red"]print $13[/COLOR] '}| [COLOR="Magenta"]grep[/COLOR] "[COLOR="Red"]\.[/COLOR]" |[COLOR="Magenta"]sort[/COLOR]  |[COLOR="Magenta"]uniq[/COLOR] ` ;do
            let "[COLOR="Red"]i++[/COLOR]"
        [COLOR="Lime"]    ip_ar[$i]=$line  [/COLOR]
        [B]done[/B]
        [B]for[/B] ((n=1 ; n<= "[COLOR="lime"]$i[/COLOR]";n++));[B]do[/B]
             [COLOR="lime"]nom_array[$n][/COLOR]="[COLOR="lime"]$([/COLOR][COLOR="Magenta"]grep [/COLOR][COLOR="Lime"]${ip_ar[$n]}[/COLOR] [COLOR="lime"]$log[/COLOR]| [COLOR="Magenta"]grep[/COLOR] -c Failed[COLOR="lime"])[/COLOR]"
             [COLOR="lime"]w[$n][/COLOR]=[COLOR="lime"]$(whois[/COLOR] -l [COLOR="lime"]${ip_ar[$n]}[/COLOR] | [COLOR="Magenta"]grep[/COLOR] -m1 country | [COLOR="Magenta"]awk[/COLOR] {' [COLOR="Red"]print $2[/COLOR] '} )
              [B]if[/B] [ ! "[COLOR="Lime"]${w[$n]}[/COLOR]" ];[B]then[/B]
                [COLOR="lime"]w[$n]=[/COLOR]"NO Whois record"
              [B]fi[/B]
        
            [COLOR="Magenta"]echo[/COLOR] -e "[COLOR="Red"]\033[0;37m\033[[/COLOR][COLOR="Lime"]$n[/COLOR];[COLOR="Red"]1f[/COLOR][COLOR="lime"]${ip_ar[$n]}[/COLOR]  [COLOR="Red"]\033[1;31m\033[[/COLOR][COLOR="Lime"]$n[/COLOR];[COLOR="Red"]25f\t for[/COLOR] [COLOR="lime"] ${nom_array[$n]}[/COLOR] [COLOR="Red"]times\033[1;34m\033[[/COLOR] [COLOR="Lime"]$n[/COLOR];[COLOR="red"]54f==>[/COLOR] [COLOR="Lime"]${w[$n]}[/COLOR]"
        [B]done[/B]
        ---
        خب حالا ببنیم چی داریم :
        برای بدست اوردن دادهای خام و پردازش انها از یک حلقه سود جستیم تا خط به خط همه داده ها را بخوانیم ، اما پیش از خواندن این داده ها :
        نشانی هکر گرامی را بدست میاوریم ==> پس از کنار گذاشتن داده های تکراری انها را در یک ارایه نگهداری میکنیم - یه کم پیشرفته بشه بد نیست -

        شمار هر نشانی را در l/var/log/auth.logبدست می اوریم
        نشانیهای بدست امده را whois می کنیم و نام کشور را در یک ارایه دیگر نگه می داریم
        اگر whois پاسخ نداد ، یک پیاام به کاربر باز میگردد - که نشد دیگه گیر نده -

        انچه نمایش داده میشود راهم میتوانید خودتان ببینید
        Last edited by t4z3v4r3d; 11-21-2011, 12:49 AM.

        برای یافتن مروارید دریاهارا جستجو مکن شاید در گردنت باشد ............................................
        شیرین شیرینم شیرین شمام ..ساتیگ نبینم ...خاوام خرابه


        FreeBSD t4yt4n 6.3-RELEASE-p2 FreeBSD 6.3-RELEASE-p2 #0:
        Sun May 11 20:03:31 IRDT 2008 root@t4yt4n:/usr/obj/usr/src/sys/H1 i386
        نه برای فخر فروشی برای یاد آوری آنچه نمی دانم

        Comment


        • #19
          برنامه نویسی در شل

          ابزاری برای کشتن !

          حتما برای شما پیش امده که یکی از دستورات/برنامه های اجرایی در سیستم به هر دلیل باید از بین برود .
          برای نمونه ممکن است firefox در حین اجرای یک وب پیج با محتوای فلش منابع بسیاری از سیستم را درگیر کند - خیلی خود ff خوبه کنارش ادوبی فلش هم بیاد چی میشه حدا قل باید اتیشی به سی پی یو بزنه-
          در این صورت نیاز داریم تا همه پروسه هایی که درگیر هستند از بین بروند.
          ###من اینجا تنها دارم روشهای ساده و ابتدایی رو میگم..ممکنه خیلی روشهای دیگه هم باشه اما من اینجا دارم از تقریبا صفر اموزش میدم

          خب اما دستوری که اینجا نیاز داریم KILL است . این دستور سیگنالی را به پروسه مربوط میفرستد تا پروسه بنا به سیگنال مورد نظر از مودبانه ترین تا خشن ترین حالت خاموش شود.
          این دستور نیاز به نام پروسه (killall) ویا pid : شماره پروسه مورد نظر دارد:

          کد:
          t4z3v4r3d@ :: t4yt4n5 :: ~ $ killall -9 htop
          
          in the same console that executed [B][I]htop[/I][/B] we have : 
          
          Killed: 9
          اگر پروسه چند نام/نام طولانی داشته باشد - من که حوصله ام نمیگیره همشو تایپ کنم- :


          کد:
          t4z3v4r3d@ :: t4yt4n5 :: ~ $ ps aux | grep -e  flash 
          t4z3v4r3d  21243  1.5  0.6 243276 26416  ??  S    10:06AM   0:42.81 /usr/local/lib/opera//operapluginwrapper.linux 64 86 /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so
          t4z3v4r3d  21249  0.0  0.6 243276 26416  ??  I    10:06AM   0:00.00 /usr/local/lib/opera//operapluginwrapper.linux 64 86 /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so
          t4z3v4r3d  21250  0.0  0.6 243276 26416  ??  I    10:06AM   0:00.00 /usr/local/lib/opera//operapluginwrapper.linux 64 86 /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so
          t4z3v4r3d  21285  0.0  0.6 243276 26416  ??  S    10:16AM   0:00.06 /usr/local/lib/opera//operapluginwrapper.linux 64 86 /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so
          
          t4z3v4r3d@ :: t4yt4n5 :: ~ $ killall -9 flash 
          No matching processes belonging to you were found
          t4z3v4r3d@ :: t4yt4n5 :: ~ $
          خب در اینجا می توان PID مربوط به این پروسس خاص را پیدا کرد و بنا به نیاز سیگنال موردنیاز را فرستاد . در خیلی از موارد، اطلاعات بیشتری از ps بدست میاوریم که شاید مورد نیاز نیست » پس :

          مانند نمونه اسکریپت قبلی داده های مورد نیاز را جدا میکنیم :

          کد:
          t4z3v4r3d@ :: t4yt4n5 :: ~ $ ps aux | grep -e  flash | awk {' print $2 '}
          21243
          21249
          21250
          21285
          21644
          به کمک awk میتوان pid های مورد نیاز را جدا کرد
          وباز هم مانند اسکریپت قبلی میتوانیم خط به خط داده ها را بخوانیم :
          کد:
          t4z3v4r3d@ :: t4yt4n5 :: ~ $ ps aux | grep -e  flash | awk {' print $2 '}| while read pid; do echo "PID for flash :$pid" ;done
          PID for flash :21243
          PID for flash :21249
          PID for flash :21250
          PID for flash :21285
          PID for flash :21659
          و در پایان میتوان تک تک پروسه ها را با سیگنال مورد نظر خاموش کرد :


          کد:
          t4z3v4r3d@ :: t4yt4n5 :: ~ $ ps aux | grep -e  flash | awk {' print $2 '}| while read pid; do echo "PID for flash :$pid"; kill -9 $pid 2>/dev/null ;done
          PID for flash :21243
          PID for flash :21249
          PID for flash :21250
          PID for flash :21285
          PID for flash :21665
          و حالا همه این دستورات را یک جا و در قالب یک اسکریپت داریم :


          کد:
          #!/usr/bin/env bash
          p=$1
          echo -en "killing "
          ps aux | grep $p 2>/dev/null | awk {' print $2 '} | while read pid ;do 
          echo -en "... $pid" 
          sleep .05
          kill -9 $pid 2>/dev/null
          done
          echo
          --سیگنال *9 شاید خشنترین سیگنالی باشد که که یک به یک پروسه میدهیم ... کشتن پروسه بدون اینکه رمانی برای پاین کار به پروسه بدهیم .
          ###این روزا کلا حالم خوب نیست ببخشید اگر کمی سطح اموزشها پایین میاد . خوش باشین
          Last edited by t4z3v4r3d; 12-09-2011, 03:59 AM.

          برای یافتن مروارید دریاهارا جستجو مکن شاید در گردنت باشد ............................................
          شیرین شیرینم شیرین شمام ..ساتیگ نبینم ...خاوام خرابه


          FreeBSD t4yt4n 6.3-RELEASE-p2 FreeBSD 6.3-RELEASE-p2 #0:
          Sun May 11 20:03:31 IRDT 2008 root@t4yt4n:/usr/obj/usr/src/sys/H1 i386
          نه برای فخر فروشی برای یاد آوری آنچه نمی دانم

          Comment


          • #20
            برنامه نویسی در شل

            #خب فکر میکنم این اخرین پست من اینجا باشه تا پیش از اینکه دکترا تیکه پارم کنند
            خیلی پیش میاد که در صورتی که یک کامند - ابزار- اسکرپیت - شما اجرا نشد به هر دلیلی یک کار جایگزینش انجام بدید. امروز شبیه این وضعیت رو با هم بررسی میکنیم.

            فرض میکنیم یک دستور صادر شده و لی به هر دلیل خطا بازگشته ، و حلا باید این خطا درست بشه .
            کد:
            if [ "some statement " ];then 
            doing some job 
            else
            do something else
            fi
            این کار به نحوی جبران خطای از پیش تعیین شده است. اما راههای دیگری وجود ندارد ؟
            برای نمونه حالتی را در نطر بگرید که تعداد زیادی دستور را باید اجرا کنید ایا میتوان برای هرکدام یک شرط if برقرار کرد ؟

            کد:
            ssh root@somehost do something || echo "Command execution failed"
            در دستور بالا به یک میزبان ssh انجام شده و در صورتی برقراری ارتباط ، یک دستور اجرا میگرد و سپس پایان ارتباط اما اگر این کار انجام نشد یک پیام خطا نمایش داده میشود.
            یک نمونه عملی از این کاررا با هم بررسی میکینم :


            کد:
            #!/usr/local/bin/env bash
            clear
            in=2
            E_BADARGS=65
            
            if [ $# -ne $in ];then
              echo "Usage: `basename $0` HOTSNAME USER"
              exit $E_BADARGS
            fi
            
            if [ ! -d ~/.ssh ];then                                                     
            mkdir ~/.ssh                                                                
            fi   
            
            cat <<EOF
            #################################
            # SSH KEY NO PASS by rsa keys   #
            #################################
            EOF
            HOST=$1
            U=$2
            
            if [ ! "`ping -t 1 $HOST 2>/dev/null`" ];then
              echo "Can not find target $HOST to login "
              exit
            fi
            
            
            if [ ! -f ~/.ssh/id_rsa.pub ];then 
               echo "id_rsa.pub not found !"
               ssh-keygen -t rsa
            else
            
                    echo -e "\033[1;33m Do you want to generate new keys (y/n) ?\033[0m"
                    read resp
            
                    if [ $resp = "y" ];then
                         echo -e "\033[1;33m GENERATING SSH KEY \033[0m"
                         ssh-keygen -t rsa
                    else
                         echo -e "\033[1;32m Using old keys\033[0m"
                    fi
            fi
            
            echo -e "\033[1;33m MAKING KEYS ON HOST B \033[0m"
            scp ~/.ssh/id_rsa.pub $U@$HOST:.ssh/authorized_keys && exit || echo "Enter your ip and user address to upload key"; read SERVER U; ssh $U@$HOST wget -q $SERVER/dl/id_rsa.pub -O .ssh/authorized_keys
            echo -e "\033[1;32m CHECKING THE PROCES \033[0m"
            ssh $U@$HOST
            در بسیاری از لینوسهای معمولا scp وجوددارد اگر نبود از ابزارهای دیگری میتوان سود برد.
            در اینجا اگر موفق به انتقال کلیدها با scp نشدیم میتوان به وسیلها ابزار دیگری مانند wget کلیدها را منتقل کرد

            -- ببخشید زمانم برای استفاده از لپ تاپم کمه و با این لباس و دستکش و .. نمیشه راحت تایپ کرد ....
            Last edited by t4z3v4r3d; 10-25-2013, 05:54 AM. دلیل: ****** edited

            برای یافتن مروارید دریاهارا جستجو مکن شاید در گردنت باشد ............................................
            شیرین شیرینم شیرین شمام ..ساتیگ نبینم ...خاوام خرابه


            FreeBSD t4yt4n 6.3-RELEASE-p2 FreeBSD 6.3-RELEASE-p2 #0:
            Sun May 11 20:03:31 IRDT 2008 root@t4yt4n:/usr/obj/usr/src/sys/H1 i386
            نه برای فخر فروشی برای یاد آوری آنچه نمی دانم

            Comment


            • #21
              برنامه نویسی در شل

              تایپ کردن password شاید برای یک یا دوبار چندان سخت نباشد اما، اگر مجبور باشید هرروز چندین بار به یک سرور ssh کنید و بنا به هردلیلی پس از انجام کارتان logout کنید چطور ؟
              معمولا برای انجام این کار یک فایل را بعنوان کلید در سرور موردنظر قرار میدهیم تا بجای تایپ کردن Password از آن استفاده کرده و ورود و خروج به سرور اسانتر انجام شود.
              برای اینکار نیاز داریم تا مراحل زیر را انجام دهیم :
              یک کلید نوع rsa بسازیم و در پوشه ی ~/.ssh در سرور در فایلی بنام "authorized_keys" ذخیره کنیم.
              این یک کلید عمومی است و کلید خصوی ان در سیستم شما.

              کد:
                    ssh-keygen -t rsa
              scp ~/.ssh/id_rsa.pub USER@HOST:~/.ssh/authorized_keys

              اسکریپت زیر این کار را انجام میدهد که با هم بررسی میکنیم
              گرفتن ورودیها
              کد:
              #!/usr/bin/env bash
              clear
              HOST=$1
              U=$2
              کد:
              in=2
              E_BADARGS=65
              
              cat <<EOF
              #################################
              # SSH KEY NO PASS by t4z3v4r3d  #
              #################################
              EOF
              بررسی ارگومانهای ورودی و خروج از برنامه در صورتی که تعداد انها برابر ۲ نباشد
              کد:
              [ $# -ne $in ]&&  echo "Usage: `basename $0` HOTSNAME USER" &&  exit $E_BADARGS
              بررسی وجود دایرکتوری موردنیاز برای نگهداری کلیدها در ماشین کلاینت
              کد:
              [ ! -d ~/.ssh ] && mkdir ~/.ssh
              بررسی انلاین بودن سرور
              کد:
              [ ! "`ping -t 1 $HOST 2>/dev/null`" ]&& echo -e "\033[5;1;31m PING 		$HOST is failed \033[0m"
              بررسی امکام برقراری یک نشست
              کد:
              [ ! "`ssh $U@$HOST 2>/dev/null`" ]&& echo -e "\033[5;1;31m SSH to 	$HOST is failed \033[0m" && exit
              ممکن است روی سرور دایرکتوری مورد نیاز ما
              "~./ssh "
              وجود نداشته باشد که با این تابع انرا میسازیم
              نکته ای که در اینجامطرح است اینکه ممکن است سرور ما، مانند سرورهای مبتنی بر ردهت به صورت پیشفرض دارای scp نباشند و خطای بازگشتی با ایجاد این دایرکتوری هم رفع نشود
              اگر کسی تمایل به بررسی این امر داشته باشد هم به همین روش میتوان انرا انجام داد.
              کد:
              mkd(){
                echo "Creating $U/.ssh On Host $HOST"
                ssh $U@$HOST "mkdir ~/.ssh"  
                scp ~/.ssh/id_rsa.pub $U@$HOST:~/.ssh/authorized_keys.tmp && echo "DONE"
              }
              همانطور که گفته شد، ممکن است ماشین سرور دارای scp نباشد و ما اینجا از راه وب کلید های مورد نظر را به سرور منتقل میکنیم
              کد:
              web(){
                echo "Enter your ip and user address to upload key"
                read SERVER U_
                ssh $U_@$HOST wget -q $SERVER/dl/id_rsa.pub -O .ssh/authorized_keys.tmp
              }
              در صورت تمایل میتوانید کلید های قدیمی خود را بروز کنید اما ! برای سایر ماشینهایی که با این کلید ها کار میکنند نیز بایدکلیدهای نو را جایگزین کنید
              کد:
              if [ ! -f ~/.ssh/id_rsa.pub ];then 
                 echo "id_rsa.pub not found !"
                 ssh-keygen -t rsa
              else
                 echo -e "\033[1;33m Do you want to generate new keys (y/n) ?\033[0m"
                 read resp
              
                 if [ $resp = "y" ];then
                    echo -e "\033[1;33m GENERATING SSH KEY \033[0m"
                    ssh-keygen -t rsa
                 else
                    echo -e "\033[1;32m Using old keys\033[0m"
                 fi
              fi
              کپی کردن کلیدها و تست مراحل انجام شده
              کد:
              echo -e "\033[1;33m ...MAKING KEYS ON HOST $HOST for USER =$U 		\033[0m"
              scp ~/.ssh/id_rsa.pub $U@$HOST:~/.ssh/authorized_keys.tmp && echo "DONE" || mkd
              echo -e "\033[1;33m -------------------------------\033[0m"
              ssh $U@$HOST "cat ~/.ssh/authorized_keys.tmp >> ~/.ssh/authorized_keys"
              
              echo -e "\033[1;32m CHECKING THE PROCESS \033[0m"
              ssh $U@$HOST
              Last edited by t4z3v4r3d; 10-25-2013, 06:11 AM.

              برای یافتن مروارید دریاهارا جستجو مکن شاید در گردنت باشد ............................................
              شیرین شیرینم شیرین شمام ..ساتیگ نبینم ...خاوام خرابه


              FreeBSD t4yt4n 6.3-RELEASE-p2 FreeBSD 6.3-RELEASE-p2 #0:
              Sun May 11 20:03:31 IRDT 2008 root@t4yt4n:/usr/obj/usr/src/sys/H1 i386
              نه برای فخر فروشی برای یاد آوری آنچه نمی دانم

              Comment

              Working...
              X