امکانات خط فرمان bash

امکانات خط فرمان bash

در این مقاله میخواهم شما را با قابلیت های خط فرمان لینوکس و استفاده از

امکاناتی که bash در اختیارمان قرار میدهد مطالبی بنویسم.

۱- استفاده از کلید TAB در خط فرمان

زمانهایی هست که میخواهیم یک فرمان را روی خط فرمان تایپ کنیم اما تمام کلمات آنرا بخاطر

نداریم یا اصلا نمیدانیم دقیقا چه کلماتی دارد.

یا مثلا میخواهیم دستورات مرتبط با یک کلمه یا رشته حرفی خاص برای ما نمایش داده شود تا

بتوانیم از میان لیست داده شده نام مورد نظر را انتخاب نماییم ،در این زمانها استفاده از کلید TAB

بسیار موثر خواهد بود .

مثلا فرض کنید در روی خط فرمان کلمه host را تایپ کرده و بعد از آن کلید TAB  را دو بار فشار دهید

اتفاقی که می افتد این است که لیست اسامی فایل ها یا دستوراتی را که با کلمه host شروع شده

باشند روی صفحه می بینیم که میتوانیم با تایپ ادامه کلمه مورد نظر آنرا انتخاب نماییم.

$host[Tab][Tab] 

 $ host host hostid hostname 

 $ hostn[Tab][Enter]

$ hostname

Mislinux.ir

 $

در مثال زیر اکر دو حرف yp را با دوبارزدن کلید TAB بزنید مثلا کلمه ypdomain روی خط ظاهر

میشود که مثلا مقدار پوچ برگردانده است .

$ yp[TAB][ENTER] 

 $ ypdomainname

(none)

$

از ترکیب کلید TAB به همراه نام و یا قسمتی از نام یک فایل که استفاده کنیم نام فایل یا دایرکتوری

را برای ما نمایش میدهد .

مثلا در مثال زیر دستور cat f[tab] اگر فایلی با حرف f شروع شده باشد را برای ما نمایش میدهد

# cat f[Tab] 

 $ cat file

# cat f[Tab][Tab][Tab] 

 $ cat file file1.txt  file2.txt

#  cat f[Tab] 2[Tab][Enter] 

$ cat file2.txt

This is file2!!!

$

یا مثلا با دستور ls   -d   D* یعنی کلیه دایرکتوریهایی که با حرف D شروع میشوند را نمایش بده

که میتوانیم این دستور را با ترکیب tab بصورت زیر نمایش دهیم :

$ls  -d D*

Desktop  Documents   Downloads

# cd   D[TAB][TAB] 

$cd   D

Desktop/   Documents/   Downloads

#to autocomplete “Desktop”    type       “cd De[TAB][ENTER]”

$ cd Desktop/

۲- رفتن به مسیری که قبلا در آن قرار داشتیم

یکی از راههای راحت برای رفتن به مسیر دایرکتوری قبلی استفاده از دستور “cd –”  است .

مسیر دایرکتوری ای که قبلا در آن قرار داشتید در یک متغیر محیطی بنام  OLDPWD

ذخیره میگردد . فرمان “cd  -”   با فرمان  “cd $OLDPWD” یکی می باشند

فرض کنید که به یک مسیری می روید که نوشتن آن طولانی است و از این مسیر به مسیری

دیگر می روید و دوباره میخواهید به این مسیر برگردید دراین زمان استفاده از فرمان “cd –” باعث

میشود که دیگر نیازی به نوشتن مسیر طولانی قبلی نبوده و بسیار راحت به مسیر قبلی وارد میشویم

با مثال زیر استفاده از قابلیت “cd  -”  را در نحوه تغییرات در پیکربندی فایلهای apache  توضیح داده ایم :

$ cd /etc/apache2/sites-available/

$ sudo   vi  wordpress

$ sudo  service apache2 restart

$ cd /var/log/apache2/

$ ls

Access.log   error.log

$ sudo   tail error.log

$ cd  –

/etc/apache2/sites-available

$ sudo vi wordpress

۳- استفاده از item دستور قبلی در دستور بعدی

خیلی وقتها پیش می آید که مثلا نام یک فایل یا نام یک دایرکتوری را میخواهیم به تکرار در دستورات بعدی استفاده نماییم . بدین منظور با استفاده از

علامت   “$!” از نام itemی که در دستور قبلی داده ایم استفاده کنیم . به جهت فهم مطلب مثال زیر را در نظر بگیرید

که دایرکتوری با نام restore ایجاد میکنیم و میخواهیم داخل آن برویم کافی است که از دستورات زیر استفاده نماییم

$ mkdir   restore

$ cd   !$

cd  restore

$ unzipt   backup.zip

$rm  !$

rm backup.zip

همانگونه که در دستورات بالا مشاهده میکنید علامت “$!” به معنی itme ی می باشد

که در دستور قبلی استفاده کرده ایم .

یا مثالی دیگر اینکه فرض کنیددمیخواهیم کاربری با نام amir بسازیم که بعد از ساخت نام

کاربری میخواهیم به آن پسورد بدهیم  و یادستوراتی در رابطه با این نام کاربری اجرا کنیم که

با استفاده از علامت “$!” میتوانیم به روش زیر عمل کنیم :

# useradd   amir

# passwd !$

#chage -M 60 !$

۴- اجرای دوباره یک دستور که با یک رشته حرفی خاص شروع شده باشد 

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

آن داریم و نمیخواهیم همه دستور را دوباره در خط فرمان تایپ کنیم

در این صورت استفاده از   علامت  !  به همراه ابتدای رشته حرفی ای که دستور ما با آن

شروع شده باشد باعث اجرا آخرین دستوری که با آن رشته حرفی اجرا شده است میشود .

به مثال زیر توجه بفرمایید :

$  df    -hT   

$ cp  backup.zip /data

$ !d

$ df  -hT

در مثال بالا فرمان df  -hT اجرا شده است و زمانیکه در خط فرمان دستور d!

را استفاده میکنیم درواقع آخرین فرمانی که با حرف d شروع شده بود اجرا میگردد

حالا دستورات زیر را در نظر بگیرید

$ cd /u01

$mkdir  oracle

$ chown  oracle:oinstall oracle

$ chmod  ۷۵۵ oracle

$ cd /u02

$!m

mkdir  oracle

$ !cho

chown oracle:oinstall oracle

$!chm

chmod 755  oracle

در مثال بالا در دایرکتوری u01/ یک دایرکتوری بنام oracle ساختیم و با دستور

chown , chmod  مالک  و گروه فایل و اجازه های دسترسی به آن را داده ایم .

حالا به مسیر u02/ رفته ایم و میخواهیم دایرکتوری بنام oracle  با همان ویژگی هایی که

در u01  بود را نیز در u02 h ایجاد کنیم که کافی است فقط با علامت !  به همراه نام رشته

حرفی دستورات مثل بالا این کار را انجام دهیم .

یا مثلا

systemctl restart    httpd

 !sys

در مثلا بالا با زدن sys! آخرین دستوری که با رشته حرفی sys شروع میشود اجرا میگردد .

۵- استفاده از خروجی یک فرمان بعنوان ورودی فرمان دیگر 

 در خط فرمان لینوکس این قابلیت را داریم که بتوانیم خروجی اجرای یک دستور را بعنوان

ورودی یک دستور دیگر استفاده نماییم که با ترکیب آنها می توانیم

نتایج جالبی را بدست آوریم .

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

از علامت ()$ یا علامت “ back quote استفاده نماییم

مثلا میخواهیم فایلی را با نام خود فایل به همراه پسوندی از تاریخ سیستم کپی نماییم

در این صورت با استفاده از دستور زیر میتوانیم این دستور را اجرا کنیم

$  cp  backup.zip   backup.zip.$(date  +%F)

اجرای این دستور باعث میشود که فایل backup.zip با نام backup.zip.2017-06-15 ذخیره گردد . در واقع  (date +%F)$ یعنی دستور date را با

گزینه F% اجرا گردد که نتیجه آن نمایش تاریخ سیستم می باشد که بعنوان پسوند اضافه شده به نام فایل بکار میرود

میتوانیم خروچی اجرا شده یک دستور را به یک متغیر نسبت داده و

مقدار متغیر را در دستورات دیگر مورد استفاده قرار دهیم :

مثال زیز را در نظر بگیرید:

 ENVIRONMENT=PRODUCTION

 DIRECTORY=$(echo $ENVIRONMENT | tr [:upper:][:lower:])

 echo $ENVIRONMENT | sudo tee -a /etc/motd

 tail -1 /etc/motd PRODUCTION

 sudo mkdir /var/www/$DIRECTORY

 sudo tar zxf wwwfiles.tgz -C /var/www/$DIRECTORY

۶- استفاده از حلقه for در خط فرمان

 for VARIABLE in LIST

   do 

   use $VARIABLE

  done

از حلقه for  برای انجام کارهای تکراری نیز میتوانید استفاده کنید مثلا فرض کنید لیستی از

اسامی کاربران دارید که میخواهید پسورد آنها را قفل کنید .

با استفاده از for loop میتوانید  این کار را بصورت زیر انجام دهید

 for USERS in user1 user2 user3

   do

    passwd  -l $USERS

    logger   -t compromised-user $USERS

   done

یا مثلا فرض کنید میخواهیم به ازاء تمام لیست کاربرانی که در سیستم وجود دارد گروههایی

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

بصورت زیر عمل میکنیم :

 for  USER in $(cut -d: -f1 /etc/passwd); groups $USER; done

۷- انجام دستور قبلی توسط root

 فرض کنید که با کاربر معمولی سیستم دستوری را اجرا کردیم که نیاز به اجازه root

دارد بدین منظور با مثال زیر مطلب را توضیح میدهم:

$  useradd  oracle

useradd: Permission deined

زمانیکه دستور useradd را با کاربر غیر root  انجام میدهیم به کاربر اجازه این کار داده نمیشود .

حالا میخواهیم همین دستور را با استفاده از قدرت sudo انجام دهیم

 sudo  -c “!!”

دستور بالا به شرط اینکه کاربر مورد نظر در فایل sudoers آمده باشد اجازه میدهد

که دستور useradd را اجرا کند . در واقع علامت !! یعنی اجرای فرمان قبلی که با گزینه c-  باعث

میشود که دستور اجرا گردد .

۸- اجرای دستور قبلی با جایگزینی رشته حرفی جدید بجای رشته حرفی قبلی

فرض کنید دستوری زیر را اجرا کرده اید

  ps   -ef | grep nginx | awk ‘{print $2}’

حالا فرض کنید که همین دستور را بجای nginx میخواهید برای apache استفاده کنید

کافی است که دستور زیر را اجرا نمایید

 ^nginx^apache^

اجرای دستور بالا باعث میشود که در واقع دستور زیر اجرا گردد

 ps   -ef |grep apache| awk ‘{print $2}’

دستور بالا اولین رخداد رشته حرفی nginx را با apache جابجا میکند .

اگر بخواهید هر جا رشته حرفی nginx را دید با رشته حرفی apache جابجا کند

بصورت زیر عمل میکنیم :

 grep canon /etc/passwd ; ls -ld /home/canon

ls: cannot access /home/canon: No such file or directory

 ^canon^cannon^:&

در دستور بالا از علامت &: استفاده کردیم که باعث میشود هرجایی

کلمه canon را دید با کلمه cannon جابجا کند .

یعنی به ازاء هر تعداد رخداد این تغییر انجام می شود .

grep cannon /etc/passwd ; ls -ld /home/cannon

cannon:x:1001:1001::/home/cannon:/bin/sh

drwxr-xr-x 2 cannon ball 4096 Apr 7 00:22 /home/cannon

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

جابجا کنیم بصورت زیر عمل میکنیم

$ cat  errors.log

cat : errors.log No such file or directory

 اجرای دستور بالا بدنبال فایلی با نام errors.log میگردد که پیدا نمیکند . بخاطر اینکه نام فایل errors.log

نیست بلکه error است یعنی حرف s  زیادی است که بصورت زیر تصحیح میکنیم

 ^s^

با اجرای فرمان بالا میگوییم که بجای حرف s  جای خالی قرار دهد .

۹- استفاده از یک کلمه در همان خط فرمان برای بار دوم

دستور زیر را در نظر بگیرید

$ sudo cp  nsswitch.conf nsswitch.conf.back

در واقع با دستور بالا یک کپی از فایلی بنام nsswitch.conf با نام  nsswitch.conf.back ایجاد میکنیم

حالا همین دستور بالا را میتوانیم با استفاده از علامت #! بصورت زیر انجام دهیم :

$ sudo   cp  nsswitch.conf !#2.back

علامت #! در خط فرمان به منظور استفاده مجدد یک کلمه از همان خط بکار میرود .

اما شکل استفاده از این علامت به این صورت است که همراه یک مقدار عددی بکار میرود

تا مشخص کند که کدام کلمه است که باید تکرار گردد

در خط فرمان اولین کلمه که در واقع خود دستور می باشد دارای مقدار عددی صفر ۰

می باشد و به همین ترتیب اولین آرگومان مقدار ۱ و بعدی مقدار ۲ و تا به آخر

در فرمان بالا چون مقدار عددی ۲ بعد از علامت #! آمده است یعنی کلمه بعد از فرمان

cp یا همان nsswitch.conf که انتهای آنرا با back. پر کرده است یعنی همان نام nsswitch.conf به اضافه

back. تکرار گردد .

یا مثلا دستور زیر را ببینید

$   cp   report  $(date +%F)!#1-report

دستور بالا معادل دستور زیر می باشد

$  cp  report   $(date +%F)-report

یعنی فایلی بنام report داریم که از آن یک کپی میسازیم که ابتدای آن تاریخ سیسم به همراه علامت –  و بعد نام فایل report باشد

 

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *