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

ساخت وبلاگ
چکیده : جولای 3, 2017 ما تا اینجا تعدادیفرمانیاد گرفتیم ولی گاهی اوقا شما نیاز دارید یک فایل را تغییردهید و... با عنوان : آموزش ویرایشگر VIM سرور مجازی بخوانید :

جولای 3, 2017


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

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

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

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

[N.pardis@lpi1 ~]$ vim

[N.pardis@Lpi1~]$man vim

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

File-namevim[N.pardis@Lpi1~]

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

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

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

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

[N.pardis@Lpi1~]$vim testl

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

کنیم.

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

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

[N.pardis@Lpi1~]$ test1

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

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

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

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

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

[N.pardis@Lpi1~]$./testl

Permission denied

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

[N.pardis@Lpi1~]$chmod 777 test1

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

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

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

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

[N.pardis@Lpi1~]$vim testn

echo “please Enter ur NAME:”

read N

echo $N |tail-c2

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

[n.pardis@lpi ~]$ testn

-bash: testn: command not found

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

[N.pardis@Lpi1~]$ ./testn

bash:./testn permission denied

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

اینست که

[N.pardis@Lpi1~]$chmod 777 test1

[N.pardis@Lpi1~]$ ./testn

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

 

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

[N.pardis@Lpi1~]$ cd dummy

[N.pardis@Lpi1~/dummy]$ ls ??

1a 1b sh 1j

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

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

[N.pardis@lpi1~/dummy]$ls [0-9]?

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

[N.pardis@lpi1~/dummy]$ ls *[0-9]

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

[N.pardis@lpi1~/dummy]$ ls *[aciou]

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

[N.pardis@lpi1~/dummy]$ ls [a-k] *

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

[N.pardis@lpi1~/dummy]$ ls [!a]*

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

:abbr p pardis

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

p space

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

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

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

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

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

[N.pardis@Lpi1~]$ 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 –استفاده میکنیم که

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

[N.pardis@Lpi1~]$ ping 192.168.100.1

[N.pardis@Lpi1~]$ 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 است؟؟؟ فرمانی که در اینجا مطرح می شود فرمانی است که نتیجه نهایی فرمان

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

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

[n.pardis@lpi1~]$ echo $?

0

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

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

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

[n.pardis@lpi1~]$ 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 می دهیم و آن را اجرا می کنیم:

[N.pardis@Lpi1~]$ chmod 700 test2

[N.pardis@Lpi1~]$ ./test2

ttp

25

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

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

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

[N.pardis@Lpi1~]$ X=`date`

[N.pardis@Lpi1~]$ echo $X

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

[N.pardis@Lpi1~]$ X=` date |cut-cl-3′

[N.pardis@Lpi1~]$ 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 [N.pardis@Lpi1~]$ bash-history

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

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

[N.pardis@Lpi1~]$ less .bash-history

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

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

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

echo “salam”

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

[N.pardis@Lpi1~]$ 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` | mail -s admin

exit

else

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

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

میکنیم.

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

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

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

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

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

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

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

[n.pardis@lpi1~]$ vi .bash-logout

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

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

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

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

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

Ignore 0

Default 3

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

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

[N.pardis@Lpi1~]$ kill -l

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

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

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

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

وقت

[n.pardis@lpi1~]$ trap ‘cal’ 2

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

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

[n.pardis@lpi1~]$ trap ” 2

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

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

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

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

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

[n.pardis@lpi1~]$

man -a signal

...
نویسنده : بازدید : 3 تاريخ : سه شنبه 13 تير 1396 ساعت: 22:47