آموزش ویرایشگر VIM سرور مجازی

جولای 3, 2017

ویرایشگر vim

ما تا اینجا تعدادیفرمانیاد گرفتیم ولی گاهی اوقا شما نیاز دارید یک فایل را تغییردهید و یا تنظیماتی که مد نظرتان است را

اعمال کنید. بنابراین الزام است و می توان گفت ضروری است که یک لینوکس کار بتواند با یک editor کار کند.ویرایش گر یک ه

ما با آن کار می کنیم ویرایشگر vim می باشد.

در این جلسه ما به طور کامل ویرایشگر Vim را بررسی میکنیم.

[[email protected] ~]$ vim

[[email protected]~]$man vim

این فرمان جزوه ی کاملی هم دارد. برای اینکه یک فایل را ویرایش کنیم این فرمان را میزنیم

File-namevim[[email protected]~]

اگر فایلی را نتوانیم تغییردهیم vim در خط آخر اعتراض میکند و با خط قرمز اعتراضش را نشان میدهد.

Vim محدودیت ندارد و اگر باینری exe باشد میشود انجام داد و به طور کلی هر چیزی را آماده است ویرایش کند.

برنامهای بنویسید که یک اسم را بخواند و حرف اولش را چاپ کند: میخواهیم این برنامه را به صورت یک فرمان

در لینوکس در بیاوریم. شروع کار به صورت زیر است و فایلی با نام test1 سرور مجازی میسازد:

[[email protected]~]$vim testl

برای وارد کردن دستورا و یا ت ییرا در فایل کلید i در صفحه کلید را فشار می دهیم و تغییراتی را که می خواهیم اعمال می

کنیم.

برای ذخیره و خارج شدن از محیط ویرایشگر x+:+shift را میزنیم حال l –ls که بزنیم مشخصا فایل را میبینیم و اگر اسم

فایل را بزنیم اجرا میشود.

[[email protected]~]$ test1

میبینیم که اجرا نشد و به ما پی ام found not command را میدهد که این به این دلیل است که لینوکس به خاطر مسایل

امنیتیdirectory current را نمیگردد و از بیرون میخواهد بیاورد برخالف ویندوز مایکروسافت. مسایل امنیتی اینست که

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

formatیا delete را انجام دهد به همین دلیل است که از دایرکتوری جاری نمیخواند

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

[[email protected]~]$./testl

Permission denied

که حال اجرا میشود ولی ممکن است پی ام denied permission هم بگیرید.

[[email protected]~]$chmod 777 test1

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

باید حواسمان باشد که اسم متغیرها را با حروف بزرگ و بقیه را با حرف کوچک بنویسیم اگر اشتباه بنویسیم متنی است خطای

گرفته شود. که این error را error semantic میگویند و اگر دستورکلا اشتباه باشد error syntax میدهد.

برنامهای بنویسید که اسم را بگیرد سرور اختصاصی و حرف آخر آن را چاپ کند؟

[[email protected]~]$vim testn

echo “please Enter ur NAME:”

read N

echo $N |tail-c2

خروج از vim با x+:+shift

[[email protected] ~]$ testn

-bash: testn: command not found

بنابراین برای اجرا testn ./را به کار می گیریم:

[[email protected]~]$ ./testn

bash:./testn permission denied

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

اینست که

[[email protected]~]$chmod 777 test1

[[email protected]~]$ ./testn

حال میبینیم که اجرا میشود و از ما اسم میخواهد و حرف آخرش را نمایش میدهد.

 

میخواهیم وارد یک دایرکتوری به نام dummy شویم و فایلهایی که اسمشان 0 حرفی است را به ما نشان دهد:

[[email protected]~]$ cd dummy

[[email protected]~/dummy]$ ls ??

1a 1b sh 1j

دو تا ؟؟ یعنی 0 حرفی وفایل های دو حرفی را نمایش میدهد. هر ؟ یعنی یک حرف . فایلهای

دو حرفی که اوّلش عدد است را نمایش دهد؟

[[email protected]~/dummy]$ls [0-9]?

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

[[email protected]~/dummy]$ ls *[0-9]

فایلهایی که آخرشان حرف صدادار دارد را نمایش دهد ؟

[[email protected]~/dummy]$ ls *[aciou]

فایلهایی که از a تا k شروع میشوند را نمایش دهد ؟

[[email protected]~/dummy]$ ls [a-k] *

فایلهایی که با a شروع نمیشوند را نمایش دهد ؟

[[email protected]~/dummy]$ ls [!a]*

ما در vim میتوانیم abbreviation تعریف کنیم به این صورت :

:abbr p pardis

با این تعریف به محظ اینکه حرف p را بزنیم و سپس کلید space را فشار دهیم pardis را مینویسد.

p + space

همچنین در vim میتوانید macro تعریف کنید که مثالً اگر 5+F1 را فشار دادیم. بالای نامه »به نام خدا « بنویسید و خیلی

امکانات دیگر هم در vim داریم.

برنامهای بنویسید که یک IP بگیرد و کامپیوتر مربوطه را کنترل کند و اگر سیستم down بود به Adminیک

ایمیل ارسال کند؟

چطور میشود فهمید که یک کامپیوتر up است یا down؟ فرمان ping را اجرا میکنیم.

[[email protected]~]$ Ping 192.168.100.1

ping با استفاده از پروتوکل ICMP. ،56 حرفکه عبارت است از حروف الفبا به اضافه character special میفرستد و اگر

دوباره برایش پس فرستاد میفهمیم که up است.

به معنی در تاریکی به دنبال چیزی گشتن Groper internet packet  Ping

ping بیشتر برای رفع اشکال بدرد میخورد.

ICMP internet control message protocol

اگر ما در این پروله ping کنیم مدام در حال پرسیدن و جواب گرفتن است و اگر . ماه بعد هم بیاییم باز هم همین کار را دارد

انجام میدهد. حال منوآل ping را بخوانید و بگویید چه کار کنیم که 1 بار بیشتر ping نکند؟ از آپشن c1 –استفاده میکنیم که

یک بار بیشتر نفرستد.

[[email protected]~]$ ping 192.168.100.1

[[email protected]~]$ vi test2

#!/bin/bash

با نوشتن این خط داریم میگوییم که این نرمافزار را چه کسی اجرا میکند و در این مثال bash آن را اجرا می کند.

این خط صفحه را پاک میکند.

clear

X=`date`

read -p “please Enter Ip:” IP

این خط پی امی را روی صفحه مینویسد و توقع دارد IP بدهیم.

Ping -c1 $IP>/dev/null 2>/dev/null

ttp

24

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

1 خروجی استاندارد

0 خروجی خطا

نرمافزاری که خروجیاش همیشه یک چیز درست و مشخصی است همیشه به output standard میفرستد و نرمافزار اعتراض

و پیامهای خطایش را به خروجی خطا میفرستد.

&> 0 یعنی 0 جایی برود که یک 1 میرود.

null/dev </1 یعنی ما نمیخواهیم خروجیا را ببینیم خروجیا را بریز دور.

null/dev </0 یعنی خروجی خطا را هم نمیخواهیم ببینیم و بریز دور.

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

تمام شود کدش صفر است و هر فرمانی اجرا نشود و error دهد و نتیجهای که خواستیم ندهد غیرصفر است.

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

که ping با موفقیت انجام شده و سیستم up است؟؟؟ فرمانی که در اینجا مطرح می شود فرمانی است که نتیجه نهایی فرمان

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

معنی عدم موفقیت فرمان قبلی می باشد.

[[email protected]~]$ echo $?

0

مقدار تابع date را میگیرد `date=`Xیکبار ping میکند.

اگر ping انجام شد ویا به هر دلیلی انجام نشد را از طریق ساختار شرطیif چک می کنیم که در زبانهای برنامه نویسی برای شرط

بود و شرطی را بیان میکرد :

[[email protected]~]$ type if

if is a shell keyword

If [$? !=0]; then

به Admin ایمیل میکند.

echo $Ip $X |mail -s “server is down…” Admin

else

echo “server is up”

fi

بنابراین پروژه ما به اتمام رسید به این صورت :

#!/bin/bash

clear

X=`date`

read -p “please Enter Ip:” Ip

ping -c1 $Ip>/dev/null 2>/dev/null

If [$?!= 0] then

echo $Ip $X | mail -s “server is down…” Admin

else

echo “server is up”

fi

از vim خارج می شویم و permission می دهیم و آن را اجرا می کنیم:

[[email protected]~]$ chmod 700 test2

[[email protected]~]$ ./test2

ttp

25

برای اینکه زمان و ساعت را نگه داریم آن را در یک متغیربا حرف بزرگ به نام X میریزیم و این نکته را هم به

خاطر داشته باشید وقتی می خواهید نتیجه ی اجراییک فرمان را در یک متغیرنگه دارید از` استفاده می کنیم و

فرمان را درون آن قرار می دهیم.

[[email protected]~]$ X=`date`

[[email protected]~]$ echo $X

اگر بخواهیم فقط روز را نگه داریم در X به این صورت عمل میکنیم:

[[email protected]~]$ X=` date |cut-cl-3′

[[email protected]~]$ echo $X

در تمرین 15 که در قسمت قبل حل کردیم این مشکل وجود دارد که اگر هیچ Ip ای هم وارد نکنیم و Enter بزنیم جلوی ما را

نمیگیرد میخواهیم کاری کنیم که اگر هیچip ای وارد نکردیم جلوی ما را بگیرد. برای این ک ار ping را دس ت نم یزن یم و در

بالای برنامه یک if میگذاریم میگوییم:

if [$Ip=’ ‘]

then

echo “U Must Enter Ip…”

exit

fi

اگر در دو طرف Ipیک حرف نگذاریم با یک Enter میشود شکستیعنی اگر enter بزنیم و بخواهیم خالی رد کنیم قبول می کند

و error نمیدهد چون enter را هم به عنوان ورودی می گیرد و فکر میکند خالی نیست.

این باز هم درست کار نمیکند.چرا؟

if مثل کفه ی ترازوهای قدیمی است که اگر یک طرف یک وزنه یک کیلویی باشد و آن طرف هم جنس هر دو طرف مثالً یک

وزنه ی خیلی کوچک قرار میدهند تا مساوی شوند. ما هم در if همین کار را میکنیم و هر دو طرف ifیک حرف مثالx قرار می

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

رد کنیم. اکثر script shell ها به این صورت است. چون هر دو طرف فقط یک x داریم و x ها مساوی هستند معلوم م یش ود

که ما Enter زدیم.

:میخواهیم پسورد دوّم را برایid user ایجاد کنیم و اگر پسورد دوّم غلط بود یک ایمیل برا یAdmin و صاحب

userid برود.

برای اینکه بتوانیم این تمرین را حل کنیم باید بدانیم که موقعی که ما login میکنیم چه اتفاقی میافتد.

اگر a-ls را بزنید تمام فایلهایی را که وجود دارد میبینید. وقتی شما در لینوکس userid میسازید فرد هر کاری که انجام ده د

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

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

less [[email protected]~]$ bash-history

عبارت است از یک فایلی که تمام history ها را به شما نشان میدهد.

برای اینکه history خود را ببینید این فرمان را بزنید:

[[email protected]~]$ less .bash-history

ما 1 تا فایل داریم که با bash .شروع میشود. فایل بعدیprofile-bash .است که معادل bash.Autoexec در ویندوز اس ت

که به مح اینکه loginکنید این فایل اجرا میشود. که میتوانیم در این فایل ت ییراتی هم ایجاد کنیم ک ه م ثالً بع د از ا ینک ه

login کردیم یک پی ام مثالً salam بنویسید.

echo “salam”

حال تمرین را حل میکنیم:

[[email protected]~]$ vi .bash-profile

trap “echo enter second password” 2

read –s-p “PLZ ENTER SECOND PASS:” pass

iF [ P$pass != pardisp ] then

echo $USER on `date` hacked | mail -s hacked admin

exit

else

حواسمان باشد در if اگر پسورد غلط بود قبل از elseیک exit هم باید بگذاریم.

اولین مشکل اینست که پسورد دیده شد باید کاری کنیم که دیده نشود میآییم بنابراین آپشن s –را ب ه read اض افه

میکنیم.

مشکل دوّم اینست که میخواهیم Enter زدیم prompt نگیرد.

فرمانsu را که بزنیم به معنیuser switch میباشد یعنی از یک id user به id user دیگر رفتن و اگر dash –جلوی

آن بگذاریم به معنیfull میباشد و به root میرود.

.bash-logout فایل

بنابراین ما متوجه شدیم که 1 فایل نقطه داریم. فایل بعدی که بررسی میکن یم logout-bash .است و وقتی شما out log

میکنید این نرم افزار اجرا میشود.

میخواهیم برنامهای بنویسید که وقتی میخواهید out log کنید از شما بپرسد مطمئن ی و اگر yes گفتید out log

کند و اگر No گفتید prompt را برای شما بیاورد؟

[[email protected]~]$ vi .bash-logout

بررسی سیگنال ها

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

کشد c+ctrl است. در محیط گرافیکال cut که وقتی به یک نرمافزار میرسد آن را از بین میبرد و میکشد.

به همین دلیل است که وقتیpass second را میخواهد c+ctrl میزنیم که میکشد آن را و وارد م یش ود. ب ه c+ctrl م ی

گوییم سیگنال. ما سیگنالهای مختلفی داریم. که سه تا عکسالعمل میتوانیم در مقابل هر سیگنال داشته باشیم:

1 عکسالعمل نشان دادن Action

Ignore 0

Default 3

دو سیگنال معروفی که داریم یکیc+ctrl و دیگریup Hang شماره 1 ارتباط مخاطب با پروسس قطع شده است است.

حال این فرمان را میزنیم تا ببینیم چند تا سیگنال داریم.

[[email protected]~]$ kill -l

1 .سیگنال ما داریم که لینوکس همه را support میکند. که یکی از آنها Hangup است و interrupt شماره 0 همان

c+ctrl است. Vim را نمیتوان با c+ctrl کشت. هر سیگنال یک کد دارد. ما به وسیلهیtrapیعنی فرمانtrap برای سیگنال می

توانیم تله بگذاریم و جلوی اجرا شدنش را بگیریم. trapیکی از فرمانهای داخلیbash است میتوان به وسیله آن عکس العمل

مناسب را در مقابل سیگنال اتخاذ نمود و توصیه میشود دستور trap را در ابتدایscript گذاشت. با این فرمان میگو ییم هر

وقت

[[email protected]~]$ trap ‘cal’ 2

سیگنال شماره 0 یعنیc+ctrl آمد تقویم را اجرا کن. یعنی سیگنال 0 را اجرا نمیکند و تقویم را اجرا میکند.

اگر فرمان زیر را وارد کنیم دوباره c+ctrl کار می کند.

[[email protected]~]$ trap ” 2

حال اگر دو تا کوتیشن را به هم بچسبانیم و بعد c+ctrl را بزنیم م یبینیم که اجرا نمیش ود. وقت یspace بینشان باشند

یعنیc+ctrl را بگیرد ولی هیچ کاری نکند.

و اگر دو تا کوتیشن به هم چسبیده باشندیعنیignore میکند c+ctrl را. در بین دو کوتیشن میتوانیم هر چی بگذاریم echo

salamیا اجراییک نرمافزار. اگر خواستیم دوباره برگردانیم به حالت پیشفرض بین دو تا کوتیشن یک blank میگذاریم.

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

[[email protected]~]$ man -a signal