یک سیستم فایل لینوکس یا یونیکس به طور معمول دارای دایرکتوریهای خاص منظوره /dev و /proc است.
شاخه /dev محتوی مدخلهایی برای دستگاههای فیزیکی است که میتوانند در سختافزار حاضر باشند یا نباشند. [1] این مدخلها به طور نسبتا مناسبی فایلهای دستگاه نامیده میشوند. به عنوان مثال، پارتیشنهای دیسک سخت شامل سیستمفایل(های) متصل شده(mounted) دارای مدخلهایی در /dev هستند، همچنانکه df نشان میدهد.
bash$ df Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda6 495876 222748 247527 48% / /dev/hda1 50755 3887 44248 9% /boot /dev/hda8 367013 13262 334803 4% /home /dev/hda5 1714416 1123624 503704 70% /usr
از جمله سایر موارد، شاخه /dev محتوی دستگاههای loopback، از قبیل /dev/loop0 است. دستگاه loopback شگردی است که اجازه میدهد یک فایل معمولی آنچنان دستیابی بشود که اگر یک دستگاه بلوکی بود، دستیابی میگردید. [2] این شگرد، سوار کردن یک سیستم فایل کامل را در یک فایل بزرگ منفرد میسر میسازد. مثال 17-8 و مثال 17-7 را ببینید.
برخی از شبه دستگاهها در /dev، همچون /dev/null، /dev/zero، /dev/urandom، /dev/sda1 (پارتیشن دیسک سخت)، /dev/udp (درگاه User Datagram Packet)، و /dev/tcp دارای استفادههای تعیین شده دیگری هستند.
به عنوان نمونه:
برای mount نمودن یک دیسک USB، سطر زیر را در فایل /etc/fstab درج کنید. [3]
/dev/sda1 /mnt/flashdrive auto noauto,user,noatime 0 0(همچنین مثال A-23 را ببینید.)
کنترل آنکه آیا دیسک در داخل گرداننده CD وجود دارد (متصل شده به /dev/hdc):
head -1 /dev/hdc # #(دیسک در درایو نیست.) # #(یک دیسک در درایو وجود دارد، اما نمیتواند خوانده شود، احتمالاً #+یک دیسک خالی CDR نوشته نشده است.) #ظاهر شدن جریانی از کاراکترها و حروف نامفهوم #(یک دیسک از قبل ضبط شده در درایو وجود دارد، و این خروجی خام است #+-- جریانی از دادههای اسکی و باینری.) #ما در اینجا حکمت استفاده از head برای محدود کردن خروجی به قسمتهای #+قابل کنترل، به جای استفاده از cat یا چیزی مانند آن را میبینیم. #اکنون، موضوع فقط کنترل و تجزیه خروجی و انجام عمل متناسب آن است.
هنگام اجرای یک فرمان روی فایل شبه دستگاه /dev/tcp/$host/$port، به وسیله Bash یک ارتباط TCP به socket مرتبط دایر میشود.
مثالهای زیر فرض میکنند یک ارتباط اینترنتی فعال وجود دارد.
به دست آوردن زمان از nist.gov:
bash$ cat </dev/tcp/time.nist.gov/13 53082 04-03-18 04:26:54 68 0 0 502.3 UTC(NIST) *
[این مثال اهدایی Mark است.]
تعمیم دادن مورد فوق در یک اسکریپت:
#!/bin/bash #این اسکریپت باید با اختیارات کاربر ارشد اجرا گردد. URL="time.nist.gov/13" Time=$(cat </dev/tcp/"$URL") UTC=$(echo "$Time" | awk '{print$3}') #فیلد سوم، زمان UTC (GMT) است #تمرین: این اسکریپت را برای مناطق ساعتی مختلف ویرایش کنید. echo "UTC Time = "$UTC""
bash$ exec 5<>/dev/tcp/www.net.cn/80 bash$ echo -e "GET / HTTP/1.0\n" >&5 bash$ cat <&5
[با تشکر از Mark و Mihai Maties.]
مثال 29-1. به کار بردن /dev/tcp برای عیبیابی
#!/bin/bash #تغییر مسیر /dev/tcp برای کنترل ارتباط اینترنتی. #اسکریپت نوشته Troy Engel است. #با مجوز استفاده گردیده است. TCP_HOST=news-15.net #یک ISP اسپم دوست معروف. TCP_PORT=80 #Port 80 is http #تلاش برای ارتباط. (تا حدودی مشابه با یک ping . . .) echo "HEAD / HTTP/1.0" >/dev/tcp/${TCP_HOST}/${TCP_PORT} MYEXIT=$? : <<EXPLANATION If bash was compiled with --enable-net-redirections, it has the capability of using a special character device for both TCP and UDP redirections. These redirections are used identically as STDIN/STDOUT/STDERR. The device entries are 30,36 for /dev/tcp: mknod /dev/tcp c 30 36 >From the bash reference: /dev/tcp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, Bash attempts to open a TCP connection to the corresponding socket. EXPLANATION if [ "X$MYEXIT" = "X0" ]; then echo "Connection successful. Exit code: $MYEXIT" else echo "Connection unsuccessful. Exit code: $MYEXIT" fi exit $MYEXIT
#!/bin/bash # #موزیک بدون فایلهای خارجی #مولف: Antonio Macchi #در این راهنما با مجوز به کار رفته است. # #+ duration=2000 # volume=$'\xc0' # mute=$'\x80' # function mknote () # { #+ for t in `seq 0 $duration` do test $(( $t % $1 )) = 0 && echo -n $volume || echo -n $mute done } e=`mknote 49` g=`mknote 41` a=`mknote 36` b=`mknote 32` c=`mknote 30` cis=`mknote 29` d=`mknote 27` e2=`mknote 24` n=`mknote 32767` # European notation. echo -n "$g$e2$d$c$d$c$a$g$n$g$e$n$g$e2$d$c$c$b$c$cis$n$cis$d \ $n$g$e2$d$c$d$c$a$g$n$g$e$n$g$a$d$c$b$a$b$c" > /dev/dsp #dsp = Digital Signal Processor exit #یک مثال جالب از یک اسکریپت پوسته زیبا! # مترجم: فایل دستگاه /dev/dsp بخشی از درایور OSS (Open Sound System) است که از # مدتها قبل ALSA جایگزین آن گردیده است. بنابراین برای اجرای اسکریپت فوق و شنیدن # خروجی آن، به احتمال بسیار با مشکل مواجه میشوید. برای رفع اشکال، به جای تغییر # مسیر دادهها به /dev/dsp میتوانید از لولهکشی دادهها به aplay استفاده کنید. # آخرین سطر echo را به این صورت تغییر دهید: # echo -n "$g$e2$d$c$d$c$a$g$n$g$e$n$g$e2$d$c$c$b$c$cis$n$cis$d \ $n$g$e2$d$c$d$c$a$g$n$g$e$n$g$a$d$c$b$a$b$c" | aplay چنانچه مایل باشید این قطعه را به صورت استریو بشنوید میتوانید aplay را با استفاده # از گزینه --channels به صورت aplay --channels=2 به کار ببرید. #
[1] | مدخلها در /dev محل اتصال برای دستگاههای فیزیکی و مجازی فراهم میسازند. این مدخلها فضای بسیار اندکی را استفاده میکنند. برخی دستگاهها، از قبیل /dev/null، /dev/zero، و /dev/urandom مجازی هستند. آنها دستگاههای فیزیکی واقعی نیستند و فقط در نرمافزار وجود دارند. |
[2] | در مقایسه با یک دستگاه کاراکتری که دادهها را در واحدهای کاراکتری دستیابی میکند، یک دستگاه بلوکی دادهها را به صورت قطعات یا بلوکها میخواند یا مینویسد. مثال دستگاههای بلوکی، درایوهای دیسک سخت، درایوهای CDROM، و فلش دیسکها هستند. نمونههای دستگاه کاراکتری، صفحه کلیدها، مودمها، کارتهای صدا هستند. |
[3] | البته، محل اتصال /mnt/flashdrive باید موجود باشد. اگر نباشد، آنوقت، به عنوان کاربر ارشد، mkdir /mnt/flashdrive را اجرا کنید. در حقیقت برای mount کردن درایو از این فرمان استفاده کنید: mount /mnt/flashdrive توزیعهای جدیدتر لینوکس درایوهای flash را بدون مداخله کاربر به طور خودکار در شاخه /media متصل میکنند. |