فصل ‎17‎- فرمان‌های سیستم و مدیریت

اسکریپت‌های شروع به کار و خاموشی سیستم در شاخه ‎/etc/rc.d‎، استفاده‌های (و سودمندی) بسیاری از این فرمان‌ها را روشن می‌سازند. این فرمان‌ها به طور معمول توسط root فراخوانی می‌گردند و برای نگهداری یا تعمیرات اضطراری سیستم‌فایل به کار می‌روند. با احتیاط به کار ببرید، چون ممکن است برخی از این فرمان‌ها در اثر استفاده نادرست، به سیستم شما آسیب برسانند.

کاربران و گروه‌ها

users

تمام کاربران متصل شده به سیستم را نمایش می‌دهد. این فرمان یک معادل تقریبی فرمان who -q است.

groups

کاربر جاری و تمام گروه‌هایی را که او به آنها تعلق دارد، لیست می‌کند. این فرمان مشابه متغیر داخلی ‎$GROUPS‎ است، اما به جای شماره گروه‌ها نام آنها را ارایه می‌دهد.

bash$ groups
bozita cdrom cdwriter audio xgrp

bash$ echo $GROUPS
501
chown‏، chgrp

فرمان chown مالکیت فایل یا فایل‌ها را تغییر می‌دهد. این فرمان روش مفیدی است که root می‌تواند برای تعویض مالکیت یک فایل از یک کاربر به کاربر دیگر، به کار ببرد. یک کاربر معمولی نمی‌تواند مالکیت فایل‌ها، حتی فایل‌های خودش، را تغییر بدهد. ‎[1]‎

root# chown bozo *.txt

فرمان chgrp‏ مالکیت گروه فایل یا فایل‌ها را تغییر می‌دهد. برای انجام این کار، شما باید مالک فایل(ها) و همچنین عضوی از گروه مقصد (یا کاربر ارشد) باشید.

chgrp --recursive dunderheads *.data
#                اکنون گروه ‎dunderheads‎ مالک تمام فایل‌های «‎*.data‎» است.
#+تا پایین‌ترین نقطه در درخت دایرکتوری ‎$PWD‎ (آنچه ‎recursive‎ معنی می‌دهد).

useradd‏، userdel

فرمان مدیریتی useradd یک حساب کاربری به سیستم اضافه می‌کند و یک دایرکتوری خانگی اگر مشخص شده باشد برای آن کاربر بخصوص ایجاد می‌نماید. فرمان متناظر userdel یک حساب کاربری و فایل‌های مربوطه را از سیستم حذف می‌کند.‎[2]‎


فرمان adduser یک مترادف برای useradd است و معمولا یک پیوند نمادین به آن است.

usermod

ویرایش یک حساب کاربری. تغییرات می‌تواند روی کلمه عبور، عضویت گروه، تاریخ منقضی شدن، و دیگر مشخصات یک حساب کاربری معین انجام بشود. با این فرمان، یک گذر واژه کاربری، می‌تواند قفل بشود که دارای اثر غیرفعال کردن حساب است.

groupmod

ویرایش یک گروه مفروض. نام و-یا شماره ‎ID‎ گروه می‌تواند با استفاده از این فرمان تعویض گردد.

id

فرمان id شماره‌های ‎ID‎ حقیقی و موثر کاربر و گروهِ مرتبط با پردازش جاری را لیست می‌کند. نظیر متغیرهای ‎$UID‎‏، ‎$EUID‎‏، و ‎$GROUPS‎ داخلی ‎Bash‎ است.

bash$ id
uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)

bash$ echo $UID
501

فرمان id شماره‌های ID موثر را فقط موقعی که با شماره‌های واقعی تفاوت داشته باشند، نشان می‌دهد.

همچنین مثال ‎9-5‎ را ببینید.

lid

فرمان lid ‎(list ID)‎ گروه یا گروه‌هایی را که یک کاربر معین به آن‌ها تعلق دارد، یا به طور جایگزین کاربران متعلق به یک گروه مفروض را نمایش می‌دهد. فقط توسط کاربر ارشد(root) می‌تواند به کار برود.

root# lid bozo
 bozo(gid=500)

root# lid daemon
 bin(gid=1)
 daemon(gid=2)
 adm(gid=4)
 lp(gid=7)

who

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

bash$ who
 bozo  tty1     Apr 27 17:45
 bozo  pts/0    Apr 27 17:46
 bozo  pts/1    Apr 27 17:47
 bozo  pts/2    Apr 27 17:49

گزینه ‎-m‎ فقط اطلاعاتی در باره کاربر جاری ارایه می‌کند. دادن دو شناسه به who معادل است با ‎who -m‎، همچون در ‎who am i‎ یا ‎who The Man‎.

bash$ who -m
localhost.localdomain!bozo  pts/2    Apr 27 17:49

whoami مشابه ‎who -m‎ است، اما فقط نام کاربر را لیست می‌کند.

bash$ whoami

bozo

w

تمام کاربران متصل به سیستم و پردازش‌های متعلق به آن‌ها را نشان می‌دهد. این یک نگارش توسعه‌یافته از فرمان who است. خروجی w می‌تواند جهت یافتن یک کاربر و-یا پردازش بخصوص به grep لوله‌کشی بشود.

bash$ w | grep startx

bozo  tty1     -                 4:22pm  6:41   4.47s  0.45s  startx
logname

نام لاگین کاربر جاری را (به طوریکه در ‎/var/run/utmp‎ یافته) نمایش می‌دهد. این فرمان یک معادل نزدیک برای whoami فوق است.

bash$ logname
bozo

bash$ whoami
bozo

در حالیکه . . .

bash$ su
Password: ......

bash# whoami
root
bash# logname
bozo


در حالیکه logname نامی را که کاربر با آن لاگین نموده است، نمایش می‌دهد whoami نام کاربری مربوط به پردازش جاری را ارایه می‌کند. به طوری که الساعه دیدیم، گاهی اوقات این دو نام یکسان نیستند.

su

یک برنامه یا اسکریپت را به عنوان یک ‎substitute user‎(کاربر جایگزین) اجرا می‌کند. ‎su rjones‎ به عنوان کاربر rjones یک پوسته راه‌اندازی می‌کند. پیش‌فرض یک su تنها و بدون شناسه، root است. مثال ‎A-14‎ را ببینید.

sudo

یک فرمان را به عنوان root (یا یک کاربر دیگر) اجرا می‌کند. این فرمان می‌تواند در یک اسکریپت به کار برود، به این طریق به یک کاربر عادی امکان اجرای اسکریپت را می‌دهد.

#!/bin/bash

# چند فرمان.
sudo cp /root/secretfile /home/bozo/secret
#چند فرمان دیگر.

فایل ‎‎/etc/sudoers‎ نام کاربران مجاز برای فراخوانی sudo را نگهداری می‌کند.

passwd

کلمه عبور یک کاربر را تنظیم، تعویض، یا مدیریت می‌کند.

فرمان passwd می‌تواند در یک اسکریپت به کار برود، اما شاید بهتر باشد استفاده نشود.

مثال ‎17-1‎. تنظیم یک کلمه عبور جدید

#!/bin/bash
#        ‎setnew-password.sh:‎ .فقط برای نمایش تجربی
#اجرای این اسکریپت به طور واقعی، ایده مناسبی نیست.
#        این اسکریپت باید به عنوان ‎root‎ اجرا گردد.

ROOT_UID=0           # Root دارای ‎$UID‎ برابر ‎0‎ است.
E_WRONG_USER=65      #                   root نیست؟

E_NOSUCHUSER=70
SUCCESS=0


if [ "$UID" -ne "$ROOT_UID" ]
then
  echo; echo "Only root can run this script."; echo
  exit $E_WRONG_USER
else
  echo
  echo "You should know better than to run this script, root."
  echo "Even root users get the blues... "
  echo
fi  


username=bozo
NEWPASSWORD=security_violation

#  کنترل وجود کاربر ‎bozo‎ 
grep -q "$username" /etc/passwd
if [ $? -ne $SUCCESS ]
then
  echo "User $username does not exist."
  echo "No password changed."
  exit $E_NOSUCHUSER
fi  

echo "$NEWPASSWORD" | passwd --stdin "$username"
# گزینه ‎--stdin‎ به ‎passwd‎ اجازه می‌دهد یک کلمه عبور
#+        جدید از ‎stdin‎ (یا یک لوله) دریافت نماید.

echo; echo "User $username's password changed!"

#به کار بردن فرمان ‎passwd‎ در یک اسکریپت خطرناک است.

exit 0

گزینه‌های ‎-l‎‏، ‎-u‎، و ‎-d‎ فرمان passwd، قفل کردن، باز کردن قفل، و حذف یک کلمه عبور کاربر را میسر می‌کنند. فقط کاربر ارشد می‌تواند این گزینه‌ها را به کار ببرد.

ac

زمان لاگین بودن کاربر را در نتیجه خواندن از فایل ‎/var/log/wtmp‎ نشان می‌دهد. این یکی از برنامه‌های سودمند گزارش گنو است.

bash$ ac

        total       68.08
last

آخرین کاربران متصل شده به سیستم را به طوری که از فایل ‎/var/log/wtmp‎ خوانده، لیست می‌کند. این فرمان اتصال‌های راه دور را هم می‌تواند نمایش بدهد.

برای مثال، برای نمایش چند مرتبه اخیری که سیستم راه‌اندازی مجدد(reboot) گردیده:

bash$ last reboot

 reboot   system boot  2.6.9-1.667      Fri Feb  4 18:18          (00:02)    
 reboot   system boot  2.6.9-1.667      Fri Feb  4 15:20          (01:27)    
 reboot   system boot  2.6.9-1.667      Fri Feb  4 12:56          (00:49)    
 reboot   system boot  2.6.9-1.667      Thu Feb  3 21:08          (02:17)    
 . . .

 wtmp begins Tue Feb  1 12:50:09 2005
newgrp

ID گروه کاربر را بدون قطع ارتباط(logout) کردن تغییر می‌دهد. این فرمان دستیابی به فایل‌های گروه جدید را مجاز می‌نماید. چون کاربران می‌توانند به طور همزمان عضو چند گروه باشند، این فرمان مورد استفاده محدودی دارد.


‎Kurt Glaesemann‎ اشاره می‌کند که فرمان newgrp می‌تواند در تنظیم مجوزهای قراردادی گروه فایل‌هایی که یک کاربر می‌نویسد مفید واقع شود. با این وجود، شاید فرمان chgrp برای این منظور، مناسب‌تر باشد.

ترمینال‌ها

tty

نام (نام‌فایل) ترمینال کاربر جاری را بازتاب می‌دهد. توجه نمایید که هر پنجره xterm جداگانه(مترجم: حتی برگه‌های مختلف یک پنجره) به عنوان یک ترمینال متمایز به شمار می‌رود.

bash$ tty
/dev/pts/1
stty

تنظیمات ترمینال را نمایش و-یا تغییر می‌دهد. این فرمان پیچیده، با به کار رفتن در یک اسکریپت می‌تواند رفتار ترمینال و نحوه نمایش خروجی را کنترل نماید. صفحه ‎info‎ را ببینید و به دقت مطالعه نمایید.

مثال ‎17-2‎. تنظیم یک کاراکتر پاک‌کن

#!/bin/bash
#کاربرد ‎stty‎ برای تنظیم یک کاراکتر پاک‌کن در هنگام خواندن ورودی. ‎erase.sh:‎ 

echo -n "What is your name? "
read name                      # ‎backspace‎ را برای پاک کردن کاراکترهای
                               #+                   ورودی امتحان کنید.
                               #                            مشکلی هست؟
echo "Your name is $name."

stty erase '#'                 #  تنظیم علامت #‎ به عنوان کاراکتر پاک‌کن.
echo -n "What is your name? "
read name                      #‎#‎ را برای حذف کاراکتر آخر امتحان کنید.
echo "Your name is $name."

exit 0

#           حتی پس از خروج اسکریپت، مقدار  کلید جدید تنظیم شده باقی می‌ماند.
#تمرین: چگونه می‌توانید کاراکتر پاک‌کن را دوباره به  مقدار پیش‌فرض تنظیم کنید؟

مثال ‎17-3‎. کلمه عبور مخفی: از کار انداختن بازتاب ترمینال

#!/bin/bash
#کلمه عبور مخفی ‎secret-pw.sh:‎

echo
echo -n "Enter password "
read passwd
echo "password is $passwd"
echo -n "If someone had been looking over your shoulder, "
echo "your password would have been compromised."

echo && echo  #          دو سطر جدید برای فاصله گذاری.


stty -echo          # بازتاب صفحه نمایش را خاموش می‌کند.
#     همچنین با ‎read -sp passwd‎ نیز می‌تواند انجام گردد.
# با سپاس فراوان از ‎Leigh James‎ برای اشاره به این مورد.

echo -n "Enter password again "
read passwd
echo
echo "password is $passwd"
echo

stty echo     #برگردانیدن بازتاب صفحه نمایش.

exit 0

#برای مطالعه بیشتر در باره این فرمان مفید اما دشوار، یک ‎info stty‎ انجام بدهید.

یک استفاده ابتکاری فرمان stty، شناسایی ضربه کلید کاربر (بدون زدن ENTER) است.

مثال ‎17-4‎. تشخیص ضربه کلید

#!/bin/bash

#تشخیص یک ضربه کلید کاربر («کلیدهای فوری»)‏.

echo

old_tty_settings=$(stty -g)   #     ذخیره تنظیمات قدیمی (چرا؟)‏.
stty -icanon
Keypress=$(head -c1)          # یادستور زیر در سیستم‌های غیر گنو
                              # ‎$(dd bs=1 count=1 2> /dev/null)‎
echo
echo "Key pressed was \""$Keypress"\"."
echo

stty "$old_tty_settings"      #          بازیابی تنظیمات قدیمی.

# با تشکر از ‎Stephane Chazelas‎

exit 0

همچنین مثال ‎9-3‎ و مثال ‎A-43‎ را ببینید.



setterm

تنظیم برخی خصوصیات ترمینال. این فرمان رشته‌ای را در خروجی استاندارد ترمینالش می‌نویسد که رفتار آن ترمینال را تغییر می‌دهد.

bash$ setterm -cursor off
bash$

فرمان setterm می‌تواند در داخل یک اسکریپت برای تغییر دادن ظاهر متن نوشته شده درstdout به کار برود، گرچه برای این منظور مسلماً ابزارهای بهتری در دسترس هستند.

setterm -bold on
echo bold hello

setterm -bold off
echo normal hello

tset

تنظیمات ترمینال را نشان داده یا مقداردهی می‌کند. این فرمان، نگارش کمتر کارآمد stty است.

bash$ tset -r
Terminal type is xterm-xfree86. Kill is control-U (^U). Interrupt is control-C (^C).

setserial

تنظیم یا نمایش پارامترهای درگاه سریال. این فرمان باید توسط root اجرا گردد و معمولاً در یک اسکریپت تنظیم سیستم یافت می‌شود.

# از اسکریپت ‎/etc/pcmcia/serial script‎

IRQ=`setserial /dev/$DEVICE | sed -e 's/.*IRQ: //'`
setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQ

getty‏، agetty

پردازش مقداردهی اولیه یک ترمینال، از فرمان getty یا agetty جهت تنظیم آن برای لاگین توسط یک کاربر استفاده می‌کند. این فرمان‌ها داخل اسکریپت‌های پوسته به کار نمی‌روند. همتای اسکریپت‌نویسی آن‌ها فرمان stty است.

mesg

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

tip

داشتن پیغامی در باره سفارش پیتزا که به طور ناگهانی در وسط فایل متنی که در حال ویرایش آن هستید ظاهر گردد، می‌تواند کاملاً آزار دهنده باشد. بنابراین شاید در یک شبکه چند کاربره، موقعی که نیازمند پرهیز از تعلیق‌ها هستید، بخواهید دسترسی نوشتن در ترمینال‌تان راغیر فعال نمایید.

wall

این فرمان یک مخفف برای «‎write all‎» است، یعنی فرستادن یک پیغام به تمام کاربران در هر ترمینال وارد شده به شبکه. در اصل یک ابزار مدیریت سیستم سودمند است، به عنوان مثال، موقع هشدار دادن به همه در مورد اینکه به واسطه یک مشکل، بزودی سیستم از کار انداخته می‌شود (مثال ‎19-1‎ را ببینید).

bash$ wall System going down for maintenance in 5 minutes!

 Broadcast message from bozo (pts/1) Sun Jul  8 13:53:27 2001... 

 System going down for maintenance in 5 minutes!


اگر دسترسی نوشتن ترمینال خاصی با فرمان mesg غیر فعال شده باشد، آنوقت wall نمی‌تواند پیغامی به آن ترمینال بفرستد.

آمار و اطلاعات

uname

مشخصات سیستم (سیستم عامل، نگارش کرنل، وغیره) را در stdout بیرون می‌دهد. فراخوانی با گزینه ‎-a‎ اطلاعات طولانی سیستم را ارایه می‌کند (مثال ‎16-5‎ را مشاهده نمایید). گزینه ‎-s‎ فقط نوع سیستم عامل را نشان می‌دهد.

bash$ uname
Linux

bash$ uname -s
Linux

bash$ uname -a
 Linux iron.bozo 2.6.15-1.2054_FC5 #1 Tue Mar 14 15:48:33 EST 2006
 i686 i686 i386 GNU/Linux
arch

نمایش معماری سیستم. معادل ‎uname -m‎ است. مثال ‎11-27‎ را ملاحظه نمایید.

bash$ arch
i686

bash$ uname -m
i686
lastcomm

اطلاعاتی در باره فرمان قبلی، به طوری که در فایل ‎/var/log/account/pacct‎ نگهداری شده، ارایه می‌کند. نام فرمان و نام کاربر می‌تواند به وسیله گزینه‌ها تعیین بشود. این یکی از برنامه‌های گزارش (accounting) گنو است.

lastlog

لیست زمان آخرین لاگین تمام کاربران سیستم. این فرمان به فایل ‎/var/log/lastlog‎ مراجعه می‌کند.

bash$ lastlog
 root          tty1                      Fri Dec  7 18:43:21 -0700 2001
 bin                                     **Never logged in**
 daemon                                  **Never logged in**
 ...
 bozo          tty1                      Sat Dec  8 21:14:29 -0700 2001

bash$ lastlog | grep root
 root          tty1                      Fri Dec  7 18:43:21 -0700 2001

Caution

اگر کاربر فراخوانی کننده دارای مجوز خواندن فایل ‎/var/log/lastlog‎ نباشد، این فرمان موفق نخواهد شد.


lsof

فهرست فایل‌های باز. این فرمان یک جدول تفصیلی از تمام فایل‌هایی که در حال حاضر باز هستند و اطلاعاتی در باره مالک، اندازه، پردازش‌های مرتبط با آنها، و موارد دیگر، ارایه می‌کند. البته، lsof می‌تواند برای تجزیه و تحلیل نتایجش به grep و/یا awk لوله‌کشی بشود.

bash$ lsof
 COMMAND    PID    USER   FD   TYPE     DEVICE    SIZE     NODE NAME
 init         1    root  mem    REG        3,5   30748    30303 /sbin/init
 init         1    root  mem    REG        3,5   73120     8069 /lib/ld-2.1.3.so
 init         1    root  mem    REG        3,5  931668     8075 /lib/libc-2.1.3.so
 cardmgr    213    root  mem    REG        3,5   36956    30357 /sbin/cardmgr
 ...

فرمان lsof یک ابزار سودمند اما پیچیده مدیریتی است. اگر شما قادر به پیاده کردن (dismount) یک سیستم‌فایل نیستید و پیغام خطایی دریافت می‌نمایید که هنوز در حال استفاده است، آنوقت اجرای lsof به تعیین آن که کدام فایل‌ها روی آن سیستم‌فایل هنوز باز هستند کمک می‌کند. گزینه ‎-i‎ فایل‌های socket باز شبکه را لیست می‌کند، و این می‌تواند به ردیابی سوءقصدهای نفوذ یا hack کمک نماید.

bash$ lsof -an -i tcp
 COMMAND  PID USER  FD  TYPE DEVICE SIZE NODE NAME
 firefox 2330 bozo  32u IPv4   9956       TCP 66.0.118.137:57596->67.112.7.104:http ...
 firefox 2330 bozo  38u IPv4  10535       TCP 66.0.118.137:57708->216.79.48.24:http ...

برای یک استفاده موثر از lsofمثال ‎30-2‎ را ببینید .

strace

‎System trace‎: ابزار تشخیص و اشکال‌زدایی جهت ردیابی سیگنال‌ها و فراخوان‌های سیستم. این فرمان و ltrace در ادامه، برای تشخیص دادن آن که چرا اجرای یک برنامه یا بسته ناموفق است . . . شاید ناشی از فقدان کتابخانه‌ها یا دلایل مرتبط ... مفید هستند.

bash$ strace df
 execve("/bin/df", ["df"], [/* 45 vars */]) = 0
 uname({sys="Linux", node="bozo.localdomain", ...}) = 0
 brk(0)                                  = 0x804f5e4

 ...

این یک معادل لینوکس برای فرمان truss سولاریس است.

ltrace

‎Library trace‎: ابزار تشخیص و اشکال‌زدایی که فراخوان‌های کتابخانه احضار شده به وسیله یک فرمان مفروض را ردیابی می‌کند.

bash$ ltrace df
__libc_start_main(0x804a910, 1, 0xbfb589a4, 0x804fb70, 0x804fb68 <unfinished ...>:
 setlocale(6, "")                                 = "en_US.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"
textdomain("coreutils")                          = "coreutils"
__cxa_atexit(0x804b650, 0, 0, 0x8052bf0, 0xbfb58908) = 0
getenv("DF_BLOCK_SIZE")                          = NULL

 ...

nc

برنامه سودمند nc ‎(netcat)‎ یک جعبه ابزار کامل برای ارتباط و گوش دادن به درگاه‌های TCP و UDP است. به عنوان یک ابزار تشخیص و بررسی و به عنوان یک جزء سازنده خادم و مخدوم‌های ساده HTTP بر پایه اسکریپت مفید است.

bash$ nc localhost.localdomain 25
 220 localhost.localdomain ESMTP Sendmail 8.13.1/8.13.1;
 Thu, 31 Mar 2005 15:41:35 -0700

یک مثال کاربردی راستین.

مثال ‎17-5‎. کنترل یک خادم راه‌دور برای identd

#! /bin/sh
## Duplicate DaveG's ident-scan thingie using netcat. Oooh, he'll be p*ssed.
## Args: target port [port port port ...]
## Hose stdout _and_ stderr together.
##
##  Advantages: runs slower than ident-scan, giving remote inetd less cause
##+ for alarm, and only hits the few known daemon ports you specify.
##  Disadvantages: requires numeric-only port args, the output sleazitude,
##+ and won't work for r-services when coming from high source ports.
# Script author: Hobbit <hobbit@avian.org>
# Used in ABS Guide with permission.

# ---------------------------------------------------
E_BADARGS=65       # Need at least two args.
TWO_WINKS=2        # How long to sleep.
THREE_WINKS=3
IDPORT=113         # Authentication "tap ident" port.
RAND1=999
RAND2=31337
TIMEOUT0=9
TIMEOUT1=8
TIMEOUT2=4
# ---------------------------------------------------

case "${2}" in
  "" ) echo "Need HOST and at least one PORT." ; exit $E_BADARGS ;;
esac

# Ping 'em once and see if they *are* running identd.
nc -z -w $TIMEOUT0 "$1" $IDPORT || \
{ echo "Oops, $1 isn't running identd." ; exit 0 ; }
#  -z scans for listening daemons.
#     -w $TIMEOUT = How long to try to connect.

# Generate a randomish base port.
RP=`expr $$ % $RAND1 + $RAND2`

TRG="$1"
shift

while test "$1" ; do
  nc -v -w $TIMEOUT1 -p ${RP} "$TRG" ${1} < /dev/null > /dev/null &
  PROC=$!
  sleep $THREE_WINKS
  echo "${1},${RP}" | nc -w $TIMEOUT2 -r "$TRG" $IDPORT 2>&1
  sleep $TWO_WINKS

# Does this look like a lamer script or what . . . ?
# ABS Guide author comments: "Ain't really all that bad . . .
#+                            kinda clever, actually."

  kill -HUP $PROC
  RP=`expr ${RP} + 1`
  shift
done

exit $?

#  Notes:
#  -----

#  Try commenting out line 30 and running this script
#+ with "localhost.localdomain 25" as arguments.

#  For more of Hobbit's 'nc' example scripts,
#+ look in the documentation:
#+ the /usr/share/doc/nc-X.XX/scripts directory.

و البته اسکریپت یک سطری معروف دکتر ‎‎Andrew Tridgell‎ در ‎BitKeeper Affair‎:

echo clone | nc thunk.org 5000 > e2fsprogs.dat

free

حافظه و cache مورد استفاده را در یک شکل جدولی نمایش می‌دهد. برای تجزیه خروجی این فرمان از grep‏، awk یا Perl استفاده می‌شود. فرمان procinfo تمام اطلاعاتی که free ارایه می‌دهد و خیلی بیشتر از آن را نشان می‌دهد.

bash$ free
                total       used       free     shared    buffers     cached
   Mem:         30504      28624       1880      15820       1608       16376
   -/+ buffers/cache:      10640      19864
   Swap:        68540       3128      65412

برای نمایش حافظه RAM استفاده نشده(آزاد):

bash$ free | grep Mem | awk '{ print $4 }'
1880
procinfo

اطلاعات و آمار را از سیستم‌فایل کاذب ‎/proc‎ استخراج و لیست می‌کند. این برنامه یک لیست بسیار گسترده و تفصیلی ارایه می‌کند.

bash$ procinfo | grep Bootup
Bootup: Wed Mar 21 15:15:50 2001    Load average: 0.04 0.21 0.34 3/47 6829
lsdev

لیست کردن دستگاه‌ها، یعنی نمایش سخت‌افزارهای نصب شده.

bash$ lsdev
 Device            DMA   IRQ  I/O Ports
 ------------------------------------------------
 cascade             4     2 
 dma                          0080-008f
 dma1                         0000-001f
 dma2                         00c0-00df
 fpu                          00f0-00ff
 ide0                     14  01f0-01f7 03f6-03f6
 ...

du

نمایش فضای مصرفی فایل(دیسک)‏، به طور بازگشتی. پیش‌فرض آن دایرکتوری کاری جاری است، مگر اینکه مورد دیگری تعیین شده باشد.

bash$ du -ach
 1.0k    ./wi.sh
 1.0k    ./tst.sh
 1.0k    ./random.file
 6.0k    .
 6.0k    total
df

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

bash$ df
 Filesystem           1k-blocks      Used Available Use% Mounted on
 /dev/hda5               273262     92607    166547  36% /
 /dev/hda8               222525    123951     87085  59% /home
 /dev/hda7              1408796   1075744    261488  80% /usr
dmesg

تمام پیغام‌های بالا آمدن سیستم را در خروجی استاندارد لیست می‌کند. برای اشکال‌زدایی و معلوم نمودن آن که کدام گرداننده‌های دستگاه نصب گردیده‌اند و کدام وقفه‌های سیستم در حال استفاده هستند، به کار می‌آید. البته خروجی dmesg می‌تواند از داخل یک اسکریپت با grep‏، sed، یا awk تجزیه شود.

bash$ dmesg | grep hda
 Kernel command line: ro root=/dev/hda2
 hda: IBM-DLGA-23080, ATA DISK drive
 hda: 6015744 sectors (3080 MB) w/96KiB Cache, CHS=746/128/63
 hda: hda1 hda2 hda3 < hda5 hda6 hda7 > hda4

stat

آمار مفصل و طولانی در مورد یک فایل معین (حتی یک دایرکتوری یا فایل دستگاه) یا گروهی از فایلها ارایه می‌دهد.

bash$ stat test.cru
   File: "test.cru"
   Size: 49970        Allocated Blocks: 100          Filetype: Regular File
   Mode: (0664/-rw-rw-r--)         Uid: (  501/ bozo)  Gid: (  501/ bozo)
 Device:  3,8   Inode: 18185     Links: 1    
 Access: Sat Jun  2 16:40:24 2001
 Modify: Sat Jun  2 16:40:24 2001
 Change: Sat Jun  2 16:40:24 2001

اگر فایل هدف موجود نباشد، stat یک پیغام خطا برگشت می‌دهد.

bash$ stat nonexistent-file
nonexistent-file: No such file or directory

در یک اسکریپت، می‌توانید از stat برای بیرون کشیدن اطلاعات فایل‌ها (و سیستم‌فایل) و تنظیم متغیرهای متناسب آن استفاده کنید.

#!/bin/bash
# fileinfo2.sh

#                             طبق پیشنهاد ‎Joël Bourquard‎ و . . .
#http://www.linuxquestions.org/questions/showthread.php?t=410766‎

FILENAME=testfile.txt
file_name=$(stat -c%n "$FILENAME")   #    البته همانند ‎$FILENAME‎
file_owner=$(stat -c%U "$FILENAME")
file_size=$(stat -c%s "$FILENAME")
# مسلماً آسان‌تر از کاربرد ‎ls -l $FILENAME‎ و سپس تجزیه با sed است
file_inode=$(stat -c%i "$FILENAME")
file_type=$(stat -c%F "$FILENAME")
file_access_rights=$(stat -c%A "$FILENAME")

echo "File name:          $file_name"
echo "File owner:         $file_owner"
echo "File size:          $file_size"
echo "File inode:         $file_inode"
echo "File type:          $file_type"
echo "File access rights: $file_access_rights"

exit 0
bash$ sh fileinfo2.sh
File name:          testfile.txt
File owner:         bozo
File size:          418
File inode:         1730378
File type:          regular file
File access rights: -rw-rw-r--

vmstat

نمایش آمار حافظه مجازی.

bash$ vmstat
   procs                      memory    swap          io system         cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy id
 0  0  0      0  11040   2636  38952   0   0    33     7  271    88   8   3 89

uptime

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

bash$ uptime
10:28pm  up  1:57,  3 users,  load average: 0.17, 0.34, 0.27

یک ‎load average‎ برابر یا کمتر از ‎1‎ بیانگر آن است که سیستم پردازش‌ها را بی‌درنگ اداره می‌کند. یک ‎میانگین بار(load average‎) بزرگتر از ‎1‎ به معنی آن است که پردازش‌ها در صف قرار داده می‌شوند. وقتی میانگین بار بیشتر از ‎3‎ (روی پردازشگر یک هسته‌ای) بشود، آنوقت کارایی سیستم به طور چشمگیری کاهش یافته است.


hostname

نام میزبان سیستم را لیست می‌کند. این فرمان نام میزبان را در یک اسکریپت برپاسازی (‎/etc/rc.d/rc.sysinit‎ یا مشابه آن) در ‎/etc/rc.d‎ تنظیم می‌کند. معادل با ‎uname -n‎، و همتای متغیر داخلی ‎$HOSTNAME‎ است.

bash$ hostname
localhost.localdomain

bash$ echo $HOSTNAME
localhost.localdomain

مشابه فرمان hostname، فرمان‌های domainname‏، dnsdomainname‏، nisdomainname، و ypdomainname هستند. از این فرمان‌ها برای نمایش یا تنظیم DNS سیستم یا ‎NIS/YP‎ نام قلمرو استفاده کنید. گزینه‌های متنوع hostname نیز این کارها را انجام می‌دهند.

hostid

یک شناسه عددی هگزادسیمال ‎32‎ بیتی برای ماشین میزبان بازتاب می‌دهد.

bash$ hostid
7f0100


ظاهراً این فرمان یک شماره سریال «منحصر به فرد» برای یک سیستم خاص واکشی می‌کند. برخی روال‌های نام‌نویسی محصول، این عدد را برای نشانه‌گذاری پروانه یک کاربر خاص به کار می‌برند. متاسفانه، hostid فقط آدرس شبکه ماشین بر حسب هگزادسیمال را که جفت بایت‌های آن جابه جا شده‌اند، برگشت می‌دهد.

آدرس شبکه یک ماشین لینوکس غیر شبکه‌ای نوعی، در ‎/etc/hosts‎ یافت می‌شود.

bash$ cat /etc/hosts
127.0.0.1               localhost.localdomain localhost

همچنانکه معلوم است، با پس و پیش کردن جفت بایت‌های ‎127.0.0.1‎،ما به آدرس ‎0.127.1.0‎ می‌رسیم، که معادل آن در هگزادسیمال 007f0100 است، دقیقاً همان چیزی که hostid فوق برگشت می‌دهد. فقط چند میلیون ماشین لینوکس دیگر با این hostid یکسان وجود دارد.


sar

فراخوانی sar (برگرفته از ‎System Activity Reporter‎) آمار خیلی مشروحی از کار سیستم ارایه می‌کند. پایگاه سانتاکروز ( SCO قدیم) در ژوئن ‎1999‎ برنامه sar را به صورت منبع باز منتشر نمود.

این فرمان، قسمتی از توزیع لینوکس نیست، اما می‌تواند به عنوان بخشی از بسته ‎sysstat‎ نوشته شده به وسیله ‎Sebastien Godard‎ تهیه گردد.

bash$ sar
Linux 2.4.9 (brooks.seringas.fr) 	09/26/03

10:30:00          CPU     %user     %nice   %system   %iowait     %idle
10:40:00          all      2.21     10.90     65.48      0.00     21.41
10:50:00          all      3.36      0.00     72.36      0.00     24.28
11:00:00          all      1.12      0.00     80.77      0.00     18.11
Average:          all      2.23      3.63     72.87      0.00     21.27

14:32:30          LINUX RESTART

15:00:00          CPU     %user     %nice   %system   %iowait     %idle
15:10:00          all      8.59      2.40     17.47      0.00     71.54
15:20:00          all      4.07      1.00     11.95      0.00     82.98
15:30:00          all      0.79      2.94      7.56      0.00     88.71
Average:          all      6.33      1.70     14.71      0.00     77.26
readelf

اطلاعات و آماری در باره یک فایل باینری elf مشخص شده نمایش می‌دهد. این فرمان بخشی از بسته binutils است.

bash$ readelf -h /bin/bash
 ELF Header:
   Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
   Class:                             ELF32
   Data:                              2's complement, little endian
   Version:                           1 (current)
   OS/ABI:                            UNIX - System V
   ABI Version:                       0
   Type:                              EXEC (Executable file)
   . . .
size

فرمان ‎size [/path/to/binary]‎ اندازه سگمنت یک فایل باینری قابل اجرا یا فایل بایگانی را ارایه می‌دهد. این فرمان، بیشتر مورد استفاده برنامه‌نویسان است.

bash$ size /bin/bash
  text    data     bss     dec     hex filename
  495971   22496   17392  535859   82d33 /bin/bash

گزارش وقایع سیستم

logger

یک پیغام تولیدشده کاربر را به فایل ثبت رخداد سیستم ‎(/var/log/messages)‎ (مترجم: یا فایل ‎/var/log/syslog‎) پیوست می‌کند. برای فراخوانی logger لازم نیست شما root باشید.

logger Experiencing instability in network connection at 23:10, 05/21.
#اکنون یک ‎tail /var/log/messages‎ اجرا کنید.

با جاسازی یک فرمان logger در اسکریپت، نوشتن اطلاعات اشکالزدایی در فایل ‎/var/log/messages‎ امکان‌پذیر می‌شود.

logger -t $0 -i Logging at line "$LINENO". 
#گزینه ‎-t علامت برای ورودی ‎logger‎ را مشخص می‌کند.
#        گزینه ‎-i‎ شماره ‎ID‎ پردازش را ثبت می‌کند.
bash$ tail /var/log/message
 ...
 Jul  7 20:48:58 localhost ./test.sh[1712]: Logging at line 3.

logrotate

این برنامه سودمند فایل‌های ثبت رخداد سیستم را مدیریت می‌کند، به طور مقتضی آن‌ها را نوبتی می‌کند، فشرده می‌سازد، حذف می‌کند، و-یا ایمیل می‌کند. این فرمان از شلوغ شدن ‎/var/log‎ با فایل‌های لاگ قدیمی پیش‌گیری می‌کند. معمولاً cron به طور روزانه logrotate را اجرا می‌کند.

افزودن یک مدخل مناسب به ‎/etc/logrotate.conf‎ مدیریت فایل‌های ثبت رخداد شخصی را علاوه بر فایل‌های کل سیستم، میسر می‌سازد.


‎Stefano Falsetto‎ برنامه rottlog را تولید کرده است، که در نظر داشته نگارش بهبودیافته‌ای از logrotate باشد.

کنترل Job

ps

‎Process Statistics‎ (آمار پردازش‌ها): پردازش‌های در حال اجرای جاری را با مالک و ‎PID‎ ‏(ID پردازش) آنها لیست می‌کند. این فرمان به طور معمول با گزینه‌های ax یا aux فراخوانده می‌شود و ممکن است برای جستجوی یک پردازش خاص به grep یا sed لوله‌کشی بشود ( مثال ‎15-14‎ و مثال ‎29-3‎ را ببینید).

bash$  ps ax | grep sendmail
295 ?	   S	  0:00 sendmail: accepting connections on port 25

برای نمایش پردازش‌های سیستم در قالب «درخت» گرافیکی: ‎ps afjx‎ یا ‎ps ax --forest‎.

pgrep‏، pkill

تلفیق فرمان ps با grep یا kill.

bash$ ps a | grep mingetty
 2212 tty2     Ss+    0:00 /sbin/mingetty tty2
 2213 tty3     Ss+    0:00 /sbin/mingetty tty3
 2214 tty4     Ss+    0:00 /sbin/mingetty tty4
 2215 tty5     Ss+    0:00 /sbin/mingetty tty5
 2216 tty6     Ss+    0:00 /sbin/mingetty tty6
 4849 pts/2    S+     0:00 grep mingetty

bash$ pgrep mingetty
 2212 mingetty
 2213 mingetty
 2214 mingetty
 2215 mingetty
 2216 mingetty

رفتار pkill را با killall قیاس کنید.

pstree

پردازش‌های در حال اجرای جاری را در قالب «درختی» لیست می‌کند. گزینه ‎-p‎ علاوه بر نام پردازش‌ها، PIDها را نیز نشان می‌دهد.

top

نمایش مرتباً به هنگام شونده پردازش‌هایی که دارای بیشترین مصرف cpu هستند. گزینه ‎-b‎ در وضعیت متنی نمایش می‌دهد، به طوری که خروجی می‌تواند از یک اسکریپت دستیابی یا تجزیه بشود.

bash$ top -b
  8:30pm  up 3 min,  3 users,  load average: 0.49, 0.32, 0.13
 45 processes: 44 sleeping, 1 running, 0 zombie, 0 stopped
 CPU states: 13.6% user,  7.3% system,  0.0% nice, 78.9% idle
 Mem:    78396K av,   65468K used,   12928K free,       0K shrd,    2352K buff
 Swap:  157208K av,       0K used,  157208K free                   37244K cached

   PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
   848 bozo      17   0   996  996   800 R     5.6  1.2   0:00 top
     1 root       8   0   512  512   444 S     0.0  0.6   0:04 init
     2 root       9   0     0    0     0 SW    0.0  0.0   0:00 keventd
   ...

nice

اجرای یک job پس‌زمینه با یک اولویت تغییر یافته. اولویت‌ها از ‎19‎ (پایین‌ترین) تا ‎-20‎ (بالاترین) تغییر می‌کنند. فقط کاربر ارشد می‌تواند اولویت‌های منفی (بالاتر) را تنظیم نماید. فرمان‌های مرتبط، renice و snice هستند که اولویت پردازش یا پردازش‌های در حال اجرا را تغییر می‌دهند، و skill که یک سیگنال kill به پردازش یا پردازش‌ها می‌فرستد.

nohup

یک فرمان را حتی بعد از قطع اتصال (log off)کاربر، در حال اجرا نگاه می‌دارد. فرمان به عنوان یک پردازش پیش‌زمینه اجرا می‌گردد، مگر اینکه با & دنبال بشود. اگر شما از nohup داخل یک اسکریپت استفاده می‌کنید، همراه کردن آن را با wait، به منظور پیش‌گیری از ایجاد یک پردازش یتیم یا زامبی در نظر داشته باشید.

pidof

ID پردازش ‎(PID)‎ یک job در حال اجرا را شناسایی می‌کند. چون فرمان‌های کنترل job از قبیل kill و renice روی PID یک پردازش (نه نام آن) عمل می‌کنند، گاهی اوقات مشخص کردن آن PID لازم است. فرمان pidof معادل تقریبی متغیر داخلی ‎$PPID‎ است.

bash$ pidof xclock
880

مثال ‎17-6‎. ‏pidof به کشتن یک پردازش کمک می‌کند

#!/bin/bash
#‎kill-process.sh‎

NOPROCESS=2

process=xxxyyyzzz       #         استفاده از پردازش ناموجود.
#                            فقط به منظور یک نمونه نمایشی...
# ... در عمل یک پردازش واقعی را با این اسکریپت از بین نبرید.
#
#   اگر، برای مثال، می‌خواستید این اسکریپت را برای قطع ارتباط
#                     اینترنت به کار ببرید:     ‎process=pppd‎

t=`pidof $process`      #پیدا کردن ‎pid‎ ‏(id پردازشِ) ‎$process‎.
# ‎pid‎ برای ‎kill‎ لازم می‌شود (با نام برنامه نمی‌تواند ‎kill‎ شود)‏.

if [ -z "$t" ]          #اگر پردازش موجود نباشد ‎pidof‎ هیچ را برگشت می‌دهد.
then
  echo "Process $process was not running."
  echo "Nothing killed."
  exit $NOPROCESS
fi  

kill $t                 #     برای پردازش سمج، ممکن است ‎kill -9‎ لازم باشد.

# در اینجا یک کنترل برای دیدن آنکه پردازش، مجاز به کشتن خود باشد لازم است.
#                              شاید یک ‎" t=`pidof $process` "‎ دیگر یا ...


#   تمام این اسکریپت می‌توانست با
#  ‎kill $(pidof -x process_name)‎
#               یا
#‎killall process_name‎ تعویض بشود
#   اما، نمی‌توانست آموزنده باشد.

exit 0

fuser

پردازش‌هایی (با PID) را که در حال دستیابی به یک فایل معین، مجموعه‌ای از فایل‌ها، یا یک دایرکتوری هستند، مشخص می‌کند. همچنین ممکن است با گزینه ‎-k‎ فراخوانی گردد، که آن پردازش‌ها را kill می‌کند. این دارای پیامدهای جالبی برای امنیت سیستم است، مخصوصاً در اسکریپت‌ها از دستیابی کاربران غیر مجاز به سرویس‌های سیستم پیش‌گیری می‌کند.

bash$ fuser -u /usr/bin/vim
/usr/bin/vim:         3207e(bozo)

bash$ fuser -u /dev/null
/dev/null:            3009(bozo)  3010(bozo)  3197(bozo)  3199(bozo)

یک کاربرد با اهمیت برای fuser هنگام وصل کردن یا جداسازی فیزیکی رسانه‌های ذخیره، از قبیل دیسک‌های ‎CD ROM‎ یا ‎USB‎ است. گاهی اوقات تلاش برای umount با یک پیغام «‎device is busy‎» با شکست مواجه می‌گردد. این به معنای آن است که کاربر(ان) معینی و/یا پردازش‌(ها) در حال دستیابی آن دستگاه هستند. یک ‎fuser -um /dev/device_name‎ معما را فاش خواهد نمود، به طوریکه شما می‌توانید هر پردازش مرتبط را kill نمایید.

bash$ umount /mnt/usbdrive
umount: /mnt/usbdrive: device is busy

bash$ fuser -um /dev/usbdrive
/mnt/usbdrive:        1772c(bozo)

bash$ kill -9 1772
bash$ umount /mnt/usbdrive

فرمان fuser که با گزینه ‎-n‎ فراخوانی شده، پردازش در حال دسترسی به یک port را شناسایی می‌کند. این مخصوصاً در ترکیب با nmap سودمند است.

root# nmap localhost.localdomain
 PORT     STATE SERVICE
 25/tcp   open  smtp

root# fuser -un tcp 25
25/tcp:               2095(root)

root# ps ax | grep 2095 | grep -v grep
2095 ?        Ss     0:00 sendmail: accepting connections

cron

برنامه مدیریتی زمانبندی، وظایفی از قبیل پاکسازی و حذف فایل‌های ثبت رخداد سیستم و به هنگام‌سازی بانک اطلاعات slocate را انجام می‌دهد. این فرمان، نگارش کاربر ارشد فرمان at است (اگر چه، هر کاربر ممکن است دارای فایل crontab خودش باشد که می‌تواند با فرمان crontab تغییر داده شود). این فرمان به صورت یک daemon راه‌اندازی می‌شود و مدخل‌های زمان‌بندی شده را از فایل ‎/etc/crontab‎ اجرا می‌کند.


برخی گونه‌های لینوکس، crond، نگارش ‎Matthew Dillon‎ از crontab را اجرا می‌کنند.


کنترل پردازش و راه‌اندازی

init

فرمان init پدر تمام پردازش‌ها است. در آخرین مرحله بوت شدن فراخوانده می‌شود، init سطح اجرایی سیستم را از ‎/etc/inittab‎ تعیین می‌کند. با مستعارش telinit، و فقط توسط root فراخوانی می‌گردد.

telinit

یک پیوند نمادین به init، این وسیله‌ای برای تعویض سطح اجرایی سیستم است، کاری که معمولاً برای نگهداری سیستم یا تعمیر اضطراری سیستم‌فایل انجام می‌شود. فقط به وسیله root فراخوانی می‌شود. این فرمان می‌تواند خطرناک باشد -- قبل از به کار بردن آن مطمئن شوید که آن را خوب می‌فهمید!

runlevel

سطح اجرایی جاری و قبلی را نشان می‌دهد، یعنی آیا سیستم متوقف شده (سطح اجرایی ‎0‎)، در وضعیت یک کاربری (‎1‎)، در وضعیت چند کاربری (‎2‎ یا ‎3‎)، در وضعیت گرافیکی ‎X Windows (‎5‎)‎، یا در حال راه‌اندازی مجدد (‎6‎) است. این فرمان فایل ‎/var/run/utmp‎ را دستیابی می‌کند.

halt‏، shutdown‏، reboot

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

WARNINGدر بعضی توزیع‌های لینوکس، فرمان halt‏ دارای مجوزهای ‎755‎ است، بنابراین می‌تواند به وسیله کاربری غیر از root نیز فراخوانی گردد. یک halt‏ بی‌دقت در ترمینال یا در یک اسکریپت ممکن است سیستم را خاموش کند!


‏service

یک service در سیستم را شروع یا متوقف می‌کند. اسکریپت‌های راه‌اندازی در شاخه ‎/etc/init.d‎ و ‎/etc/rc.d‎ برای شروع سرویس‌ها در هنگام بالا آمدن سیستم، از این فرمان استفاده می‌کنند.

root# /sbin/service iptables stop
 Flushing firewall rules:                                   [  OK  ]
 Setting chains to policy ACCEPT: filter                    [  OK  ]
 Unloading iptables modules:                                [  OK  ]

شبکه

‏nmap

ترسیم کننده شبکه (Network mapper) و پوینده درگاه. این فرمان یک سرویس‌دهنده را برای تعیین کردن درگاه‌های باز و سرویس‌های مرتبط با آن درگاه‌ها تجسس می‌کند. همچنین می‌تواند اطلاعاتی در باره فیلترهای packet و دیواره‌های‌آتش گزارش نماید. این یک ابزار امنیتی مهم برای محافظت یک شبکه در مقابل تلاش‌های دستیابی غیر مجاز است.

#!/bin/bash

SERVER=$HOST               #قلمرو محلی روی میزبان محلی ‎(127.0.0.1)‎
PORT_NUMBER=25                         #                درگاه SMTP

nmap $SERVER | grep -w "$PORT_NUMBER"  # آیا آن درگاه خاص باز است؟
#‎grep -w‎ فقط کلمات را به طور کامل مطابقت می‌دهد، بنابراین، به عنوان
#+                         مثال، با درگاه ‎1025‎ مطابقت نخواهد نمود.

exit 0

# 25/tcp     open        smtp

‏ifconfig

پیکربندی واسط‎ شبکه و برنامه سودمند میزان‌سازی.

bash$ ifconfig -a
lo        Link encap:Local Loopback
           inet addr:127.0.0.1  Mask:255.0.0.0
           UP LOOPBACK RUNNING  MTU:16436  Metric:1
           RX packets:10 errors:0 dropped:0 overruns:0 frame:0
           TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:700 (700.0 b)  TX bytes:700 (700.0 b)

فرمان ‏ifconfig اکثر اوقات برای تنظیم واسط‌ها در زمان بالا آمدن سیستم، یا برای از کارانداختن آنها هنگام راه‌اندازی مجدد (rebooting) به کار می‌رود.

# قطعه کد جداشده از ‎/etc/rc.d/init.d/network‎

# ...

#کنترل اینکه شبکه فعال است.
[ ${NETWORKING} = "no" ] && exit 0

[ -x /sbin/ifconfig ] || exit 0

# ...

for i in $interfaces ; do
  if ifconfig $i 2>/dev/null | grep -q "UP" >/dev/null 2>&1 ; then
    action "Shutting down interface $i: " ./ifdown $i boot
  fi
#گزینه ‎-q‎ ویژه گنو برای grep به معنی quiet، یعنی بدون ارایه خروجی است.
#   بنابراین تغییر مسیر دادن خروجی به ‎/dev/null‎ به طور صریح، لازم نیست.
       
# ...
echo "Currently active devices:"
echo `/sbin/ifconfig | grep ^[a-z] | awk '{print $1}'`
#                            ^^^^^ 
#           برای پرهیز از ‎globbing‎ باید نقل‌قولی بشود.
#                           موارد زیر نیز کار می‌کنند.
# ‎echo $(/sbin/ifconfig | awk '/^[a-z]/ { print $1 })'‎
# echo $(/sbin/ifconfig | sed -e 's/ .*//')
#                با تشکر از ‎S.C.‎ برای توضیحات افزوده.

همچنین مثال ‎32-6‎ را ببینید.

netstat

نمایش آمار و اطلاعات شبکه جاری، مانند جدول‌های مسیریابی و اتصال‌های فعال. این برنامه سودمند اطلاعات داخل ‎/proc/net‎ را دستیابی می‌کند (فصل ‎29‎). مثال ‎29-4‎ را ببینید.

‎netstat -r‎ معادلی برای route است.

bash$ netstat
 Active Internet connections (w/o servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State      
 Active UNIX domain sockets (w/o servers)
 Proto RefCnt Flags       Type       State         I-Node Path
 unix  11     [ ]         DGRAM                    906    /dev/log
 unix  3      [ ]         STREAM     CONNECTED     4514   /tmp/.X11-unix/X0
 unix  3      [ ]         STREAM     CONNECTED     4513
 . . .

یک ‎netstat -lptu‎ سوکت‌هایی را که در حال گوش دادن به درگاه‌ها هستند و پردازش‌های مربوط را نمایش می‌دهد. این فرمان می‌تواند برای تعیین اینکه آیا یک کامپیوتر در خطر افتاده یا هک گردیده است مفید باشد.


iwconfig

این یک مجموعه فرمان برای پیکربندی یک شبکه بیسیم است. معادل بیسیم ifconfig فوق است.

ip

برنامه سودمند چندمنظوره برای تنظیم کردن، تعویض نمودن، و تحلیل کردن IP ‏(‎Internet Protocol‎) شبکه‌ها و دستگاه‌های متصل شده است. این فرمان بخشی از بسته iproute2 است.

bash$ ip link show
 1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue 
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast qlen 1000
     link/ether 00:d0:59:ce:af:da brd ff:ff:ff:ff:ff:ff
 3: sit0: <NOARP> mtu 1480 qdisc noop 
     link/sit 0.0.0.0 brd 0.0.0.0

bash$ ip route list
169.254.0.0/16 dev lo  scope link

یا در یک اسکریپت:

#!/bin/bash
#اسکریپت توسط ‎Juan Nicolas Ruiz‎ نوشته شده
#    استفاده شده با اجازه محبت‌آمیز ایشان.

#      تنظیم (و متوقف کردن) یک ‎GRE tunnel‎


# --- ‎tunnel.sh شروع‎ ---

LOCAL_IP="192.168.1.17"
REMOTE_IP="10.0.5.33"
OTHER_IFACE="192.168.0.100"
REMOTE_NET="192.168.3.0/24"

/sbin/ip tunnel add netb mode gre remote $REMOTE_IP \
  local $LOCAL_IP ttl 255
/sbin/ip addr add $OTHER_IFACE dev netb
/sbin/ip link set netb up
/sbin/ip route add $REMOTE_NET dev netb

exit 0  #############################################

# --- ‎tunnel.sh توقف‎ ---

REMOTE_NET="192.168.3.0/24"

/sbin/ip route del $REMOTE_NET dev netb
/sbin/ip link set netb down
/sbin/ip tunnel del netb

exit 0

route

نمایش اطلاعات در باره جدول مسیریابی کرنل یا ایجاد تغییرات در آن(مترجم: اگر با گزینه‌های add یا del به کار برود، جدول‌های مسیریابی را ویرایش می‌کند، اما بدون این گزینه‌ها، محتویات جدول‌های مسیریابی جاری را نمایش می‌دهد).

bash$ route
 Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
 pm3-67.bozosisp *               255.255.255.255 UH       40 0          0 ppp0
 127.0.0.0       *               255.0.0.0       U        40 0          0 lo
 default         pm3-67.bozosisp 0.0.0.0         UG       40 0          0 ppp0

iptables

مجموعه فرمان iptables یک ابزار فیلتر کردن بسته است که بیشتر برای مقاصد امنیتی مانند تنظیم دیواره‌های آتش شبکه به کار می‌رود. این یک ابزار پیچیده است، و توضیح مشروح کاربرد آن فراتر از حوزه این راهنما است. راهنمای آموزشی Oskar Andreasson نقطه شروع قابل‌قبولی است.

همچنین متوقف کردن iptables و مثال ‎30-2‎ را ببینید.

chkconfig

کنترل پیکربندی شبکه و سیستم. این فرمان سرویس‌های شبکه و سیستم را که در زمان بالاآمدن سیستم در دایرکتوری ‎/etc/rc?.d‎ شروع شده‌اند، لیست و مدیریت می‌کند.

در اصل از IRIX به لینوکس ‎Red Hat‎ منتقل گردیده است، chkconfig ممکن است بخشی از نصب اولیه برخی توزیع‌های لینوکس نباشد.

bash$ chkconfig --list
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
 rwhod           0:off   1:off   2:off   3:off   4:off   5:off   6:off
 ...

tcpdump

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

رونوشت برداری مخابره ‎ip packet‎ میان میزبان‌های bozoville و caduceus:

bash$ tcpdump ip host bozoville and caduceus

البته، خروجی tcpdump می‌تواند با برخی برنامه‌های پردازش متن که قبلاً بحث شده، تجزیه بشود.

سیستم‌فایل

mount

سوار کردن یک سیستم فایل، معمولاً روی یک دستگاه خارجی، از قبیل یک فلاپی یا ‎CDROM‎. فایل ‎/etc/fstab‎ فهرست قابل استفاده‌ای از سیستم‌فایل‌ها، پارتیشن‌ها، و دستگاه‌های در دسترس، به انضمام گزینه‌ها، که می‌توانند به طور خودکار یا دستی سوار بشوند ارایه می‌کند. فایل ‎/etc/mtab‎ پارتیشن‌ها و سیستم‌فایل‌هایی را که در حال حاضر سوار شده‌اند، (شامل سیستم‌فایل‌های مجازی از قبیل ‎/proc‎) نشان می‌دهد.

‎mount -a‎ تمام سیستم‌فایل‌ها و پارتیشن‌های لیست شده در ‎/etc/fstab‎، غیر از آن‌ها که با گزینه noauto همراه هستند، سوار می‌کند. در زمان بالا آمدن سیستم، یک اسکریپت راه‌اندازی در ‎/etc/rc.d‎ ‏(‎rc.sysinit‎ یا چیزی مشابه آن) برای سوار کردن همه سیستم فایلهایی که باید متصل بشوند، این فرمان را فراخوانی می‌کند.

mount -t iso9660 /dev/cdrom /mnt/cdrom
#‎CD ROM‎ را سوار می‌کند. ‎ISO 9660‎ یک سیستم‌فایل استاندارد برای ‎CD ROM‎ است.
mount /mnt/cdrom
#              راه میانبر، در صورتیکه ‎/mnt/cdrom‎ در ‎/etc/fstab‎ لیست شود.

فرمان فراگیر mount حتی می‌تواند یک فایل معمولی را روی یک دستگاه بلوکی سوار کند، و فایل همانطور که اگر یک سیستم‌فایل بود، عمل می‌کند. mount این کار را به وسیله مرتبط کردن فایل با یک دستگاه loopback device به انجام می‌رساند. یک کاربرد این مورد برای سوار کردن و آزمایش یک image سیستم‌فایل ISO9660 قبل از نوشتن آن روی یک CDR است. [3]

مثال ‎17-7‎. بازبینی یک ‎CD image‎

#به عنوان root...

mkdir /mnt/cdtest  #آماده کردن محل سوار کردن، در صورتیکه از قبل موجود نباشد.

mount -r -t iso9660 -o loop cd-image.iso /mnt/cdtest    #   سوار کردن image.
#                        گزینه ‎-o loop‎ معادل است با فرمان ‎losetup /dev/loop0‎
cd /mnt/cdtest                          #                اکنون، بررسی image.
ls -alR                                 #لیست فایل‌ها در درخت دایرکتوری آنجا.

umount

پیاده کردن یک سیستم‌فایل سوار شده جاری. قبل از جداکردن فیزیکی دیسک CDROM یا فلاپی قبلاً سوار شده، دستگاه باید umount بشود، وگرنه ممکن است سیستم فایل خراب بشود.

umount /mnt/cdrom
#اکنون می‌توانید دکمه eject را بزنید و بدون خطر دیسک را جدا کنید .


برنامه سودمند automount، اگر به طور صحیح نصب شده باشد، می‌تواند دیسک‌های فلاپی یا CDROM را همچنانکه دستیابی می‌گردند یا جدا می‌شوند، mount یا umount نماید. اما در لپ‌تاپ‌های «multispindle» دارای درایو‌های با قابلیت تعویض حالت بین فلاپی یا دیسک نوری، این برنامه می‌تواند باعث مشکلاتی بشود.

sync

نوشتن فوری تمام داده‌های به هنگام شده از بافرها به دیسک سخت را اجباری می‌کند(هماهنگ‌سازی درایو با بافرها). در حالیکه به طور سخت‌گیرانه ضروری نیست، اما یک sync به مدیر سیستم یا کاربر اطمینان می‌دهد که داده‌های الساعه تغییر داده شده، در یک خاموشی ناگهانی ار بین نمی‌روند. در زمان‌های قبل، یک sync; sync (دوبار، فقط برای اطمینان کامل) قبل از reboot سیستم یک اقدام پیش‌گیرانه احتیاطی بود.

گاه گاهی، ممکن است شما بخواهید یک تخلیه فوری بافر را الزامی کنید، مانند موقع حدف یک فایل به طور مطمئن (مثال ‎16-61‎ را ببینید) یا وقتی لامپ‌ها شروع به سوسو زدن می‌کنند.

losetup

دستگاه‌های loopback را تنظیم یا پیکربندی می‌کند.

مثال ‎17-8‎. ایجاد یک سیستم‌فایل در یک فایل

SIZE=1000000  #  1 meg

head -c $SIZE < /dev/zero > file     #    تنظیم فایل به اندازه مشخص شده.
#‎dd if=/dev/zero of=file count=2048‎   مترجم: یا با استفاده از این دستور
losetup /dev/loop0 file              # تنظیم آن به عنوان ‎loopback device‎
mke2fs /dev/loop0                    #                  ایجاد سیستم‌فایل.
mount -o loop /dev/loop0 /mnt        #                     سوار کردن آن.

# با تشکر از ‎S.C.‎

mkswap

ایجاد یک فایل یا پارتیشن swap. پس از آن، ناحیه ‎swap‎ باید با swapon فعال گردد.

swapon‏، swapoff

فعال و غیر فعال کردن پارتیشن یا فایل ‎swap‎. این فرمان‌ها معمولاً در زمان بالا آمدن و خاموش شدن سیستم اجرا می‌شوند.

mke2fs

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

مثال ‎17-9‎. اضافه کردن یک دیسک سخت جدید

#!/bin/bash

#                              اضافه نمودن یک دیسک سخت دوم به سیستم.
#     پیکربندی نرم‌افزاری. فرض می‌کند که سخت‌افزار از قبل ‎mount‎ گردیده.
#                            از یک گفتار مولف راهنمای ‎ABS‎ (این سند).
#   در شماره ‎38‎ نشریه ‎_Linux Gazette_‎ در ‎http://www.linuxgazette.com‎

ROOT_UID=0           #این اسکریپت باید به عنوان کاربر ارشد اجرا شود.
E_NOTROOT=67         #                   خطای خروج کاربر ارشد نبودن.

if [ "$UID" -ne "$ROOT_UID" ]
then
  echo "Must be root to run this script."
  exit $E_NOTROOT
fi  


#                                      با نهایت دقت استفاده نمایید!
#اگر اشتباهی رخ بدهد، ممکن است شما سیستم فایل جاری را از دست بدهید.


NEWDISK=/dev/hdb          #فرض می‌کند ‎/dev/hdb‎ آزاد است. کنترل کنید!
MOUNTPOINT=/mnt/newdisk   #      یا یک نقطه اتصال دیگر انتخاب کنید.


fdisk $NEWDISK
mke2fs -cv $NEWDISK1      #کنترل برای بلوک‌های نامناسب (خروجی مفصل).
#                  ^               توجه:   ‎/dev/hdb1‎، *نه* ‎/dev/hdb‎
mkdir $MOUNTPOINT
chmod 777 $MOUNTPOINT     # ایجاد دسترسی همه کاربران به درایو جدید.


#                             اکنون، بررسی ...
#         mount -t ext2 /dev/hdb1 /mnt/newdisk
#           ایجاد یک دایرکتوری را امتحان کنید.
# اگر عمل کرد، آن را umount کنید، و پیش بروید.

#                                مرحله پایانی:
#    سطر زیر را به فایل ‎/etc/fstab‎ اضافه کنید.
# /dev/hdb1  /mnt/newdisk  ext2  defaults  1 1

exit

همچنین مثال ‎17-8‎ و مثال ‎31-3‎ را ببینید.

mkdosfs

ایجاد یک سیستم‌فایل FAT داس.

tune2fs

تنظیم سیستم‌فایل ext2. می‌تواند برای تغییر دادن پارامترهای سیستم‌فایل، از قبیل حداکثر تعداد mount استفاده گردد. این فرمان باید به عنوان کاربر ارشد فراخوانی شود.

WARNING

این یک فرمان بینهایت خطرناک است. با مسئولیت خودتان از آن استفاده کنید، چون ممکن است به طور ناخواسته سیستم‌فایل‌تان را تخریب نمایید.


dumpe2fs

رونوشت (لیست کردن به stdout) خیلی طولانی اطلاعات سیستم‌فایل. این فرمان باید به عنوان root فراخوانی بشود.

root# dumpe2fs /dev/hda7 | grep 'ount count'
 dumpe2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09
 Mount count:              6
 Maximum mount count:      20
hdparm

لیست کردن یا تغییر دادن پارامترهای دیسک. این فرمان باید به عنوان root فراخوانده شود، و اگر به طور نامناسب استفاده شود، می‌تواند خطرناک باشد.

fdisk

ایجاد یا تغییر جدول پارتیشن روی یک دستگاه ذخیره‌سازی، به طور معمول یک دیسک سخت. این فرمان بایستی به عنوان root فراخوانی گردد.

WARNING

این فرمان را با دقت فراوان به کار ببرید. اگر اشتباهی صورت بگیرد، ممکن است شما سیستم‌فایل موجود را نابود کنید.


fsck‏، e2fsck‏، debugfs

مجموعه فرمان کنترل، تعمیر، و اشکالزدایی سیستم‌فایل.

fsck: نرم‌افزاری برای کنترل یک سیستم‌فایل یونیکس (ممکن است سایر برنامه‌ها را فراخوانی نماید). به طور معمول پیش‌فرض آن برای نوع سیستم‌فایل واقعی، ext2 است.

e2fsck: کنترل کننده سیستم‌فایل ext2.

debugfs: اشکال‌یاب سیستم‌فایل ext2. یکی از موارد استفاده این فرمان چندکاره اما خطرناک، (تلاش برای) بازیابی فایل‌های حذف شده است. فقط برای کاربران پیشرفته!

Caution

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


badblocks

یک دستگاه ذخیره را برای بلوک‌های بد (نقص فیزیکی) بررسی می‌کند. این فرمان هنگام فرمت کردن یک دیسک سخت تازه نصب شده، یا آزمایش صحت یک رسانه پشتیبان مورد استفاده می‌یابد. ‎[4]‎ به عنوان یک مثال، ‎badblocks /dev/fd0‎ یک دیسک فلاپی را بررسی می‌کند.

فرمان badblocks می‌تواند به طور مخرب (رونویسی تمام داده‌ها) یا در وضعیت فقط خواندنی غیر مخرب فراخوانی بشود. اگر کاربر ارشد مالک دستگاه مورد بررسی باشد، که به طور معمول این حالت است، آنوقت root باید این فرمان را فراخوانی نماید.

lsusb‏، usbmodules

فرمان lsusb تمام گذرگاه‌های ‎USB (Universal Serial Bus)‎ و دستگاه‌های وصل شده به آن‌ها را لیست می‌کند.

فرمان usbmodules اطلاعاتی در باره درایور دستگاه‌های USB متصل شده را بیرون می‌دهد.

bash$ usbmodules
 Bus 001 Device 001: ID 0000:0000  
 Device Descriptor:
   bLength                18
   bDescriptorType         1
   bcdUSB               1.00
   bDeviceClass            9 Hub
   bDeviceSubClass         0 
   bDeviceProtocol         0 
   bMaxPacketSize0         8
   idVendor           0x0000 
   idProduct          0x0000

   . . .

lspci

گذرگاه‌های pci موجود را لیست می‌کند.

bash$ lspci
 00:00.0 Host bridge: Intel Corporation 82845 845
 (Brookdale) Chipset Host Bridge (rev 04)
 00:01.0 PCI bridge: Intel Corporation 82845 845
 (Brookdale) Chipset AGP Bridge (rev 04)
 00:1d.0 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #1) (rev 02)
 00:1d.1 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #2) (rev 02)
 00:1d.2 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #3) (rev 02)
 00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 42)

   . . .

mkbootdisk

یک فلاپی بوت ایجاد می‌کند که اگر به عنوان مثال، ‎MBR (master boot record)‎ خراب بشود، می‌تواند برای بالا آوردن سیستم به کار برود. گزینه مخصوصاً جالب، گزینه ‎--iso‎ است که mkisofs را برای ایجاد یک image سیستم‌فایل ISO9660 که مناسب تهیه یک CDR قابل بوت است، به کار می‌برد.

فرمان mkbootdisk در حقیقت یک اسکریپت Bash در دایرکتوری ‎/sbin‎ است که به وسیله ‎Erik Troan‎ نوشته شده است.

mkisofs

یک سیستم‌فایل ISO9660 مناسب برای یک ‎CDR image‎ ایجاد می‌کند.

chroot

تعویض دایرکتوری ریشه. معمولاً فرمان‌ها از ‎$PATH‎ نسبت به /، دایرکتوری ریشه پیش‌فرض، واکشی می‌گردند. این فرمان دایرکتوری ریشه را با یک دایرکتوری متفاوت تعویض می‌کند (و همچنین دایرکتوری کاری را به آنجا تغییر می‌دهد). این کار برای مقاصد امنیتی مفید است، برای نمونه وقتی مدیر سیستم می‌خواهد برخی کاربران را، از قبیل آنهایی که از طریق telnet وارد می‌شوند، به یک بخش حفاظت شده از سیستم‌فایل محدود نماید (گاهی اوقات این کار به عنوان محدود کردن یک کاربر مهمان در یک «زندان chroot» قلمداد می‌گردد)، از آن استفاده می‌شود. توجه نمایید که بعد از یک chroot، مسیر اجرا برای فایل‌های باینری سیستم دیگر معتبر نیست.
(مترجم: در واقع به علت اینکه دایرکتوری دیگری به عنوان ریشه معرفی گردیده است، آن بخش از سیستم فایل اصلی که در ساختار درختی واقعی، قبل از این دایرکتوری ریشه کاذب قرار دارد، از دسترس خارج می‌شود و پس از این، یک ساختار درختی جدید که از این دایرکتوری(ریشه) آغاز می‌شود، قابل مشاهده خواهد بود و بنابراین هیچ فایلی از آن بخش قبلی، یعنی فایل‌های خارج از این زندان chroot، قابل دستیابی نیست.)

یک ‎chroot /opt‎ باعث خواهد گردید که ارجاع‌ها به ‎/usr/bin‎ به صورت ارجاع به ‎/opt/usr/bin‎ ترجمه بشوند. به همچنین، chroot /aaa/bbb /bin/ls در موارد بعدی اجرای فرمان ls، به جای دایرکتوری / که در حالت عادی ریشه است، ‎/aaa/bbb‎ را به عنوان دایرکتوری ریشه در نظر می‌گیرد. یک ‎alias XX 'chroot /aaa/bbb ls'‎ در فایل ‎~/.bashrc‎ یک کاربر، به طور موثر بخشی از سیستم‌فایل را که آن کاربر می‌تواند فرمان «XX» را در آن اجرا نماید، مرزبندی می‌کند.

فرمان chroot همچنین موقع اجرا از یک فلاپی بوت اضطراری (chroot به ‎/dev/fd0‎)، یا به عنوان یک گزینه برای lilo هنگام بازیابی یک سیستم از کار افتاده، سودمند است. سایر استفاده‌ها شامل نصب از یک سیستم‌فایل متفاوت (یک گزینه rpm) یا اجرای یک سیستم‌فایل فقط‌ خواندنی از یک ‎CD ROM‎ می‌شود. فقط به عنوان root فراخوانی کنید، و با دقت به کار ببرید.

Caution

شاید کپی برخی فایل‌های سیستم به یک دایرکتوری chroot شده لازم باشد، چون ‎$PATH‎ عادی دیگر نمی‌تواند مورد استناد باشد.


lockfile

این برنامه سودمند، بخشی از بسته procmail ‏(‎www.procmail.org‎) است. یک lock file تولید می‌کند، یک semaphore که دستیابی به یک فایل، دستگاه، یا منبع را کنترل می‌کند.

فایل قفل (lock file) به عنوان علامتی که این فایل، دستگاه، یا منبع بخصوص به وسیله یک پردازش در دست استفاده است (و بنابراین «اشغال» است) به کار می‌رود. حضور یک فایل قفل فقط دستیابی محدود (یا هیچ دسترسی) را برای سایر پردازش‌ها مجاز می‌کند.

lockfile /home/bozo/lockfiles/$0.lock
#یک فایل قفل با نام اسکریپت که در برابر نوشتن محافظت شده، تولید می‌کند.

lockfile /home/bozo/lockfiles/${0##*/}.lock
#      یک نگارش بی‌خطرتر آن، همچنانکه توسط ‎E. Choroba‎ اشاره گردیده است.

فایل‌های قفل در برنامه‌های کاربردی برای مواردی از قبیل محافظت پوشه‌های mail سیستم در برابر تغییر یافتن همزمان توسط چند کاربر، مشخص کردن آنکه یک درگاه مودم در حال دستیابی است، و نشان دادن آنکه یک نمونه از «Firefox» در حال استفاده از cache آن است، به کار می‌روند. اسکریپت‌ها می‌توانند جهت تعیین اینکه یک پردازش در حال اجرا هست، وجود یک فایل قفل ایجاد شده توسط آن پردازش معین را بررسی کنند. توجه نمایید که اگر اسکریپت سعی در ایجاد یک فایل قفل از قبل موجود بنماید، احتمالا اسکریپت هنگ خواهد کرد.

به طور عادی، برنامه‌های کاربردی فایل‌های قفل را در دایرکتوری ‎/var/lock‎ ایجاد و بررسی می‌کنند. ‎[5]‎ یک اسکریپت می‌تواند وجود یک فایل قفل را با موردی مانند نمونه زیر، بررسی کند.

appname=xyzip
#  برنامه ‎"xyzip"‎ فایل قفل ‎"/var/lock/xyzip.lock"‎ را ایجاد کرده.

if [ -e "/var/lock/$appname.lock" ]
then      #+جلوگیری کردن از دسترسی سایر برنامه‌ها و اسکریپت‌ها به
          #        فایل‌ها یا منابع مورد استفاده به وسیله ‎xyzip‎.
  ...

flock

فرمان flockبسیار کمتر از lockfile مفید است. این فرمان یک قفل «مشورتی» روی یک فایل ایجاد می‌کند و سپس در حالیکه قفل برقرار است یک فرمان را اجرا می‌کند. این به منظور آن است که تا موقع تکمیل آن فرمان مشخص شده، از تنظیم یک قفل توسط هر پردازش دیگری بر روی آن فایل جلوگیری بشود.

flock $0 cat $0 > lockfile__$0
#روی اسکریپتی که سطر فوق در آن ظاهر می‌شود، در مدتی‌که اسکریپت
#+       در حال لیست شدن در stdout است، یک قفل برقرار می‌کند.


بر خلاف lockfile، فرمان flock به طور خودکار فایل قفل ایجاد نمی‌کند.

mknod

فایل‌های دستگاه کاراکتری یا بلوکی ایجاد می‌کند (شاید هنگام نصب کردن سخت‌افزار جدید روی سیستم لازم باشد). برنامه سودمند MAKEDEV تقریبا دارای تمام توانایی‌های mknod هست و استفاده از آن آسان‌تر است.

MAKEDEV

برنامه سودمند برای ایجاد فایل‌های دستگاه. باید به عنوان root و در دایرکتوری ‎/dev‎ اجرا گردد. این فرمان نوعی نگارش پیشرفته mknod است.

tmpwatch

فایل‌هایی را که در یک دوره زمانی مشخص شده دستیابی نگردیده‌اند به طور خودکار حذف می‌کند. معمولا به وسیله cron برای حذف فایل‌های ثبت رخداد کهنه فراخوانی می‌گردد.


منابع سیستم

ulimit

حد فوقانی استفاده از منابع سیستم را تنظیم می‌کند. معمولاً با گزینه ‎-f‎ که حدی برای اندازه فایل تنظیم می‌کند، فراخوانی می‌گردد (‎ulimit -f 1000 فایل‌ها را به حداکثر ‎1 meg‎ محدود می‌کند) ‎[7]‎. گزینه ‎-c‎ اندازه روگرفت حافظه (coredump) را محدود می‌کند (ulimit -c 0 روگرفت‌ها را از قلم می‌اندازد). به طور عادی، مقدار ulimit در ‎/etc/profile‎ و-یا ‎~/.bash_profile‎ تنظیم خواهد گردید (پیوست H را ببینید).


important

استفاده با درایت از ulimit می‌تواند سیستم را در مقابل بمب خوشه‌ای ترسناک محافظت نماید.

#!/bin/bash
#                   این اسکریپت فقط برای اهداف روشنگرانه است.
# با مسئولیت خودتان اجرا کنید -- سیستم شما را فلج خواهد نمود.

while true  #                                   حلقه بی‌پایان.
do
  $0 &      #        این اسکریپت خودش را فراخوانی می‌کند . . .
            #+           به دفعات نامحدودی انشعاب می‌کند . . .
            #+تا سیستم به علت تحلیل رفتن تمام منابع فلج گردد.
done        #           این سناریوی بدنام «شاگرد جادوگر» است.
exit 0      #اینجا خارج نمی‌شود، زیرا این اسکریپت هرگز خاتمه نمی‌یابد.

یک ‎ulimit -Hu XX‎ (که در آن XX حد پردازش کاربر است) در ‎/etc/profile‎ وقتی این اسکریپت از حد تعیین شده تجاوز نماید، آن را از کار خواهد انداخت.


quota

نمایش سهمیه‌های دیسک کاربر یا گروه.

setquota

تنظیم سهمیه‌های دیسک کاربر یا گروه از طریق خط فرمان.

umask

ایجاد mask مجوزهای فایل کاربر. صفات پیش‌فرض فایل برای یک کاربر بخصوص را محدود می‌کند. تمام فایل‌های ایجاد شده به وسیله آن کاربر، صفت‌های تعیین شده به وسیله umask را می‌گیرند. مقدار (اکتال) داده شده به umask مجوزهای فایل غیرفعال شده را تعیین می‌کند. برای مثال، umask 022 تضمین می‌کند که فایل‌های جدید حداکثر دارای مجوزهای ‎755‎ (‎777 NAND 022‎)‎ ‎[8]‎ خواهند بود. البته، ممکن است کاربر بعداً صفت‌های فایل‌های خاصی را با فرمان chmod تغییر بدهد. روال معمول، تنظیم مقدار umask در ‎/etc/profile‎ و-یا ‎~/.bash_profile‎ است ( پیوست H را ببینید).

مثال ‎17-10‎. کاربرد umask برای پنهان کردن یک فایل خروجی از چشمان نامحرم

#!/bin/bash
#‎rot13a.sh‎: همانند اسکریپت ‎rot13.sh‎، اما خروجی را در یک فایل «امن» می‌نویسد.

#            کاربرد:   ‎./rot13a.sh filename‎
#              یا     ‎./rot13a.sh <filename‎
#یا  ‎./rot13a.sh  و تامین ورودی از صفحه‌کلید

umask 177               #  ایجاد mask فایل.
#         فایل‌های ایجاد شده به وسیله این اسکریپ دارای مجوزهای ‎600‎ خواهند بود

OUTFILE=decrypted.txt   #خروجی در فایل ‎decrypted.txt‎ حاصل می‌شود، که فقط توسط
                        #+    فراخواننده (یا root)می‌تواند خوانده یا نوشته شود.

cat "$@" | tr 'a-zA-Z' 'n-za-mN-ZA-M' > $OUTFILE 
#    ‎^^‎ ورودی از stdin یا یک فایل.    ‎^^^^^^^^^^‎    خروجی به فایل هدایت شده. 

exit 0

rdev

دریافت اطلاعات یا ایجاد تغییرات در دستگاه اصلی، فضای swap، یا وضعیت تصویری. توانایی‌های rdev به طور کلی به وسیله lilo به عهده گرفته شده، اما rdev برای تنظیم یک ‎ram disk‎ سودمند باقی مانده. در صورت استفاده نادرست، فرمانی خطرناک است.


پشتیبانی

dump‏، restore

فرمان dump یک برنامه سودمند استادانه پشتیبانی از سیستم‌فایل است، به طور کلی، در تاسیسات بزرگتر و شبکه‌ها استفاده می‌شود. ‎[6]‎ پارتیشن‌های دیسک را به طور خام می‌خواند و یک فایل پشتیبان در قالب باینری می‌نویسد. فایل‌هایی که باید پشتیبان‌گیری شوند می‌توانند در رسانه‌های ذخیره متنوع، از جمله دیسک‌ها و نوارهای مغناطیسی، قرار داشته باشند. فرمان restore پشتیبان‌های تهیه شده به وسیله dump را بازیابی می‌کند.

fdformat

یک فرمت سطح پایین روی دیسک نرم (‎/dev/fd0*‎) انجام می‌دهد.


Modules

lsmod

لیست کردن moduleهای کرنل نصب‌شده.

bash$ lsmod
 Module                  Size  Used by
 autofs                  9456   2 (autoclean)
 opl3                   11376   0
 serial_cs               5456   0 (unused)
 sb                     34752   0
 uart401                 6384   0 [sb]
 sound                  58368   0 [opl3 sb uart401]
 soundlow                 464   0 [sound]
 soundcore               2800   6 [sb sound]
 ds                      6448   2 [serial_cs]
 i82365                 22928   2
 pcmcia_core            45984   0 [serial_cs ds i82365]


انجام یک ‎cat /proc/modules‎ همان اطلاعات را ارایه می‌کند.


insmod

اجبار به نصب یک module کرنل (در صورت امکان modprobe را به جای آن به کار ببرید). باید به عنوان root فراخوانی گردد.

rmmod

اجبار به تخلیه یک module کرنل. باید به عنوان root فراخوانی گردد.

modprobe

بارکننده module که معمولاً به طور خودکار در یک اسکریپت راه‌اندازی فراخوانی می‌شود. باید به عنوان root فراخوانی شود.

depmod

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

modinfo

بیرون دادن اطلاعات در باره یک module قابل بارگذاری.

bash$ modinfo hid
 filename:    /lib/modules/2.4.20-6/kernel/drivers/usb/hid.o
 description: "USB HID support drivers"
 author:      "Andreas Gal, Vojtech Pavlik <vojtech@suse.cz>"
 license:     "GPL"

متفرقه

env

یک برنامه یا اسکریپت را با مجموعه متغیرهای محیطی معین یا تغییر یافته (بدون تغییر محیط کلی سیستم) اجرا می‌کند. عبارت ‎[varname=xxx]‎ تغییر متغیر محیطی varname را برای مدت اجرای اسکریپت مجاز می‌سازد. کاربرد این فرمان بدون مشخص نمودن گزینه‌، تمام تنظیمات متغیرهای محیطی را لیست می‌کند. ‎[9]‎


هنگامی که مسیر پوسته یا مفسر ناشناخته است، در سطر نخست یک اسکریپت (سطر «شبانگ») می‌تواند از env استفاده شود.

#! /usr/bin/env perl

print "This Perl script will run,\n";
print "even when I don't know where to find Perl.\n";

#مناسب برای اسکریپت‌های قابل حمل چندسکویی، در جایی که
#فایل باینری‌ Perl می‌تواند در مکان مورد انتظار نباشد.
#                                    با تشکر از ‎S.C.‎

یا حتی ...

#!/usr/bin/env bash
#متغیر محیطی ‎$PATH‎ را برای محل استقرار bash بازجویی می‌کند.
#بنابراین در جاییکه Bash در محل معمولی خودش یعنی ‎/bin‎ قرار
#                        ندارد، این اسکریپت اجرا خواهد شد.
...

ldd

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

bash$ ldd /bin/ls
libc.so.6 => /lib/libc.so.6 (0x4000c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
watch

اجرای تکراری یک فرمان در فاصله‌های زمانی تعیین شده.

پیش‌فرض آن فاصله‌های دو ثانیه‌ای است، اما می‌تواند با گزینه ‎-n‎ تغییر داده شود.

watch -n 5 tail /var/log/messages
# قسمت انتهای لاگ سیستم ‎/var/log/messages‎ را هر پنج ثانیه یکبار نمایش می‌دهد.


متاسفانه، لوله‌کشی خروجی فرمان watch به grep کار نمی‌کند.


strip

مرجع‌های نمادین اشکالزدایی را از یک فایل باینری قابل اجرا حذف می‌کند. این کار اندازه فایل را کاهش می‌دهد، اما اشکالزدایی آن را غیرممکن می‌سازد.

این فرمان بیشتر اوقات در یک Makefile، اما به ندرت در یک اسکریپت پوسته یافت می‌شود.

nm

لیست کردن نمادهای یک باینری کامپایل شده strip نشده.

xrandr

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

مثال ‎17-11‎.‏ Backlight: روشنایی پس‌زمینه صفحه نمایش (laptop) را تغییر می‌دهد

#!/bin/bash

# backlight.sh
#تاریخ انتشار دوم دسامبر ‎2011‎

#   یک باگ در ‎Fedora Core 16/17‎ کنترل‌های صفحه‌کلیدی نور پس‌زمینه را مغشوش می‌کند.
#      این اسکریپت یک راهکار سرهم‌بندی شده است، در اصل یک اسکریپت پوسته ‎wrapper‎
#+برای ‎xrandr‎. کنترلی بیش از نوار لغزنده و ویجت‌های روی صفحه نمایش ارایه می‌کند.

OUTPUT=$(xrandr | grep LV | awk '{print $1}')      # به دست آوردن نام نمایشگر!
INCR=.05       #      برای کنترل ریز دانه‌تر، ‎INCR‎ را به ‎.03‎ یا ‎.02‎ تنظیم کنید.

old_brightness=$(xrandr --verbose | grep rightness | awk '{ print $2 }')


if [ -z "$1" ]
then
  bright=1     #اگر شناسه خط فرمان وجود ندارد، تنظیم روشنایی به ‎1.0‎ (پیش‌فرض).

else
  if [ "$1" = "+" ]
  then
    bright=$(echo "scale=2; $old_brightness + $INCR" | bc)           #  +.05

  else
    if [ "$1" = "-" ]
    then
      bright=$(echo "scale=2; $old_brightness - $INCR" | bc)         #  -.05

    else
      if [ "$1" = "#" ]   # روشنایی فعلی را بازتاب می‌دهد، آن را تغییر نمی‌دهد.
      then
        bright=$old_brightness

      else
        if [[ "$1" = "h" || "$1" = "H" ]]
        then
          echo
          echo "Usage:"
          echo "$0 [No args]    Sets/resets brightness to default (1.0)."
          echo "$0 +            Increments brightness by 0.5."
          echo "$0 -            Decrements brightness by 0.5."
          echo "$0 #            Echoes current brightness without changing it."
          echo "$0 N (number)   Sets brightness to N (useful range .7 - 1.2)."
          echo "$0 h [H]        Echoes this help message."
          echo "$0 any-other    Gives xrandr usage message."

          bright=$old_brightness

        else
          bright="$1"

        fi
      fi
    fi
  fi
fi


xrandr --output "$OUTPUT" --brightness "$bright"   #صفحه ‎man xrandr‎ را ببینید.
                                                 
E_CHANGE0=$?
echo "Current brightness = $bright"

exit $E_CHANGE0


# =========== یا به طور جایگزین . . . ==================== #

#!/bin/bash
# backlight2.sh
#تاریخ انتشار ‎20‎ ژوئن ‎2012‎

#یک باگ در ‎Fedora Core 16/17‎ کنترل‌های صفحه‌کلیدی نور پس‌زمینه را مغشوش می‌کند.
#            این یک راهکار سرهم بندی شده، یک جایگزین برای ‎backlight.sh‎ است.

target_dir=\
/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/backlight/acpi_video0
                                                #       دایرکتوری سخت‌افزار.

actual_brightness=$(cat $target_dir/actual_brightness)
max_brightness=$(cat $target_dir/max_brightness)
Brightness=$target_dir/brightness

let "req_brightness = actual_brightness"        #    روشنایی مورد درخواست.

if [ "$1" = "-" ]
then                                            #    یک درجه کاهش روشنایی.
  let "req_brightness = $actual_brightness - 1"
else
  if [ "$1" = "+" ]
  then                                          #  یک درجه افزایش روشنایی.
    let "req_brightness = $actual_brightness + 1"
   fi
fi

if [ $req_brightness -gt $max_brightness ]
then
  req_brightness=$max_brightness
fi                       #  از حداکثر روشنایی طراحی سخت‌افزار تجاور نمی‌شود.

echo

echo "Old brightness = $actual_brightness"
echo "Max brightness = $max_brightness"
echo "Requested brightness = $req_brightness"
echo

# =========================================
echo $req_brightness > $Brightness
#برای اینکه این عملی گردد، باید root باشد.
E_CHANGE1=$?        #        آیا موفق است؟
# =========================================

if [ "$?" -eq 0 ]
then
  echo "Changed brightness!"
else
  echo "Failed to change brightness!"
fi

act_brightness=$(cat $Brightness)
echo "Actual brightness = $act_brightness"

scale0=2
sf=100   # Scale factor.
pct=$(echo "scale=$scale0; $act_brightness / $max_brightness * $sf" | bc)
echo "Percentage brightness = $pct%"

exit $E_CHANGE1

rdist

سرویس‌گیرنده توزیع راه دور: هماهنگ‌سازی، تولیدمثل، یا تهیه پشتیبان یک سیستم‌فایل روی یک سرویس‌دهنده راه دور.

یادداشت‌ها

‎[1]‎

این حالتی روی یک ماشین لینوکس یا سیستم یونیکس با سهمیه‌های دیسک است.

‎[2]‎

اگر کاربری که حذف می‌شود هنوز در حال لاگین باشد، فرمان userdel ناموفق خواهد شد.

‎[3]‎

برای توضیح مفصل در باره سوزاندن CDRها، گفتار ‎Alex Withers‎، ایجاد CDها در شماره اکتبر ‎1999‎ نشریه Linux Journal را ببینید.

‎[4]‎

گزینه ‎-c‎ با mke2fs نیز یک بررسی برای بلوک‌های نامناسب را فراخوانی می‌کند.

‎[5]‎

چون فقط root دارای مجوز نوشتن در دایرکتوری ‎/var/lock‎ است، یک اسکریپت کاربر نمی‌تواند فایل قفل در آنجا قرار بدهد.

‎[6]‎

به طور کلی، متصدیان سیستم‌های لینوکس تک‌کاربره مورد ساده‌تری برای تهیه پشتیبان، از قبیل tarرا ترجیح می‌دهند.

‎[7]‎

از به روز رسانی نگارش ‎4‎ در ‎Bash‎، گزینه‌های ‎-f‎ و ‎-c‎ وقتی پوسته در وضعیت POSIX باشد، از اندازه بلوک ‎512‎ پیروی می‌کنند. به طور اضافه، دو گزینه جدید وجود دارد: ‎-b‎ برای اندازه بافر socket، و ‎-T‎ برای محدودیت تعداد threadها.

‎[8]‎

NAND عملگر منطقی not-and است. تاثیر آن تا اندازه‌ای مشابه تفریق است.

‎[9]‎

در ‎Bash‎ و سایر پوسته‌های ریشه گرفته از پوسته Bourne، تنظیم متغیرها در محیط یک فرمان منفرد امکان‌پذیر است.

var1=value1 var2=value2 commandXXX
# ‎$var1‎ و ‎$var2‎ فقط در محیط فرمان ‎commandXXX‎ برقرار می‌شوند.