NC(1) دستورات عمومی کاربر NC(1)

nc - برقراری و شنود اتصالات دلخواه TCP و UDP

nc [-46bCDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl] [-m minttl] [-O length] [-P proxy_username] [-p source_port] [-q seconds] [-s sourceaddr] [-T keyword] [-V rtable] [-W recvlimit] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]

ابزار nc (یا netcat) تقریباً برای هر کاری که شامل سوکت‌های TCP، UDP یا دامنه‌ی یونیکس (Unix-domain) باشد به کار می‌رود. این ابزار می‌تواند اتصالات TCP باز کند، بسته‌های UDP ارسال نماید، روی پورت‌های دلخواه TCP و UDP به شنود بپردازد، پویش پورت انجام دهد و با هر دو پروتکل IPv4 و IPv6 کار کند. برخلاف telnet(1)، ابزار nc به‌خوبی در اسکریپت‌ها قابل استفاده است و پیام‌های خطا را به جای ارسال به خروجی استاندارد (مانند رفتاری که در برخی موارد از telnet(1) دیده می‌شود)، به خطای استاندارد (stderr) تفکیک و هدایت می‌کند.

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

•
پروکسی‌های ساده TCP
•
کلاینت‌ها و سرورهای HTTP مبتنی بر اسکریپت شل
•
آزمایش و ارزیابی دیمن‌های شبکه
•
یک ProxyCommand مبتنی بر SOCKS یا HTTP برای ssh(1)
•
و بسیار کاربردهای دیگر

گزینه‌ها به شرح زیر هستند:

-4
تنها از آدرس‌های IPv4 استفاده می‌کند.
-6
تنها از آدرس‌های IPv6 استفاده می‌کند.
اجازه ارسال همگانی (broadcast) را می‌دهد.
ارسال CRLF به عنوان پایان خط. هر نویسه انتهای خط (LF) از داده‌های ورودی پیش از نوشته شدن در سوکت، به CR+LF تبدیل می‌شود. نویسه‌های انتهای خط که از قبل با یک بازگشت مکان‌نما (CR) همراه باشند تبدیل نمی‌شوند. داده‌های دریافتی تحت تأثیر قرار نمی‌گیرند.
فعال‌سازی اشکال‌زدایی (debugging) روی سوکت.
از ورودی استاندارد (stdin) تلاشی برای خواندن انجام نمی‌دهد.
اولین سوکت متصل‌شده را با استفاده از sendmsg(2) به خروجی استاندارد (stdout) ارسال کرده و خارج می‌شود. این ویژگی در ترکیب با گزینه -X مفید است تا nc راه‌اندازی اتصال به پروکسی را انجام دهد، اما ادامه ارتباط را به برنامه دیگری واگذار نماید (مانند ssh(1) با استفاده از گزینه ProxyUseFdpass در ssh_config(5)). این گزینه را نمی‌توان همراه با -U به کار برد.
متن راهنمای nc را چاپ کرده و خارج می‌شود.
اندازه بافر دریافت TCP را مشخص می‌کند.
به مدت interval ثانیه میان خطوط متنی ارسالی و دریافتی توقف ایجاد می‌کند. همچنین باعث ایجاد تاخیر زمانی میان اتصالات به چندین پورت می‌شود.
هنگامی که یک اتصال پایان یافت، برای اتصال بعدی به شنود ادامه می‌دهد. نیازمند گزینه -l است. هنگامی که همراه با گزینه -u استفاده شود، سوکت سرور در حالت متصل قرار نمی‌گیرد و می‌تواند دیتاگرام‌های UDP را از چندین میزبان مختلف دریافت کند.
به جای آغاز یک اتصال به میزبان راه دور، برای یک اتصال ورودی به شنود می‌نشیند. destination و port مورد نظر برای شنود را می‌توان به صورت آرگومان‌های غیراختیاری، یا به ترتیب با گزینه‌های -s و -p مشخص کرد. نمی‌توان این گزینه را همراه با -x یا -z استفاده کرد. علاوه بر این، هرگونه مهلت زمانی تعیین‌شده با گزینه -w نادیده گرفته می‌شود.
مقدار TTL یا محدودیت پرش (hop limit) بسته‌های خروجی را تنظیم می‌کند.
از هسته درخواست می‌کند بسته‌های ورودی را که مقدار TTL یا محدودیت پرش آن‌ها کمتر از minttl است دور بیندازد (drop کند).
پس از مواجهه با EOF (پایان فایل) در ورودی، سوکت شبکه را با فراخوانی shutdown(2) می‌بندد. برخی سرورها برای پایان کار خود به این عملکرد نیاز دارند.
تفکیک نام دامنه (DNS) را انجام نمی‌دهد. اگر نامی بدون DNS قابل تفکیک نباشد، خطا گزارش می‌شود.
اندازه بافر ارسال TCP را مشخص می‌کند.
نام کاربری مورد نظر را برای ارائه به یک سرور پروکسی که نیازمند احراز هویت است مشخص می‌کند. اگر نام کاربری تعیین نشود، احراز هویت انجام نخواهد شد. احراز هویت پروکسی در حال حاضر تنها برای پروکسی‌های HTTP CONNECT پشتیبانی می‌شود.
پورت مبدئی را که nc باید استفاده کند مشخص می‌کند؛ این مقدار تابع محدودیت‌های مجوز دسترسی و آزاد بودن پورت است.
پس از مواجهه با EOF در ورودی استاندارد (stdin)، به مدت seconds ثانیه منتظر مانده و سپس خارج می‌شود. اگر seconds منفی باشد، تا ابد منتظر می‌ماند (حالت پیش‌فرض). تعیین یک مقدار نامنفی برای seconds به منزله فعال بودن گزینه -N است.
پورت‌های مبدأ یا مقصد را به جای انتخاب ترتیبی در یک بازه یا بر اساس ترتیب تخصیص سیستم، به صورت تصادفی برمی‌گزیند.
گزینه امضای دیجیتال TCP MD5 طبق استاندارد RFC 2385 را فعال می‌کند.
آدرس مبدأ برای ارسال بسته‌ها را تعیین می‌کند که در سیستم‌های دارای چند رابط شبکه (interface) بسیار مفید است. برای سوکت‌های دیتاگرام دامنه‌ی یونیکس، فایل سوکت موقت محلی را مشخص می‌کند تا ایجاد شده و جهت دریافت دیتاگرام‌ها به کار رود. نمی‌توان همراه با -x استفاده کرد.
مقدار TOS در IPv4 یا رده ترافیک (traffic class) در IPv6 را تغییر می‌دهد. مقدار keyword می‌تواند یکی از موارد critical، inetcontrol، lowcost، lowdelay، netcontrol، throughput، reliability، یا یکی از کدهای DiffServ: ef، af11 تا af43، cs0 تا cs7، یا یک عدد در مبنای هگزادسیمال یا ده‌دهی باشد.
پاسخ‌های DON'T و WON'T استاندارد RFC 854 را در برابر درخواست‌های DO و WILL ارسال می‌کند. این ویژگی امکان استفاده از nc را در اسکریپت‌نویسی نشست‌های telnet فراهم می‌سازد.
از سوکت‌های دامنه‌ی یونیکس (Unix-domain) استفاده می‌کند. نمی‌توان همراه با گزینه‌های -F یا -x استفاده کرد. در لینوکس، اگر نام با علامت اتساین (`@') آغاز شود، به عنوان یک سوکت فضای نام انتزاعی (abstract namespace) تفسیر می‌شود: علامت `@' ابتدایی پیش از بایند شدن یا اتصال، با یک بایت NUL جایگزین می‌گردد. برای جزئیات بیشتر، به unix(7) مراجعه کنید.
به جای TCP از UDP استفاده می‌کند. نمی‌توان همراه با -x استفاده کرد. برای سوکت‌های دامنه‌ی یونیکس، به جای سوکت جریانی (stream) از سوکت دیتاگرام استفاده می‌کند. اگر از یک سوکت دامنه‌ی یونیکس استفاده شود، یک سوکت موقت دریافت در مسیر /tmp ایجاد می‌شود مگر آنکه پرچم -s داده شده باشد.
جدول مسیریابی مورد استفاده را تنظیم می‌کند.
خروجی مشروح‌تر و پرجزئیات‌تری تولید می‌کند.
پس از دریافت recvlimit بسته از شبکه خاتمه می‌یابد.
اتصالاتی که برقرار نمی‌شوند یا غیرفعال و بی‌کار هستند پس از timeout ثانیه منقضی می‌شوند. پرچم -w هیچ تاثیری بر گزینه -l ندارد؛ به این معنی که nc با یا بدون پرچم -w همواره برای یک اتصال منتظر شنود خواهد ماند. حالت پیش‌فرض بدون مهلت زمانی است.
هنگام ارتباط با سرور پروکسی از proxy_protocol استفاده می‌کند. پروتکل‌های پشتیبانی‌شده عبارتند از 4 (پروتکل SOCKS نسخه ۴)، 4A (پروتکل SOCKS نسخه ۴A)، 5 (پروتکل SOCKS نسخه ۵) و connect (پروکسی HTTPS). در صورت مشخص نشدن پروتکل، از SOCKS نسخه ۵ استفاده می‌شود. توجه داشته باشید که پروتکل SOCKS v.4 بسیار محدود است و تنها زمانی قابل استفاده است که نام میزبان مقصد به یک آدرس IPv4 قابل تفکیک باشد. سایر پروتکل‌ها مقصد را به صورت یک رشته به پروکسی راه دور منتقل می‌کنند تا توسط آن تفسیر شود و چنین محدودیتی ندارند.
با استفاده از پروکسی در proxy_address و port به destination متصل می‌شود. در صورتی که port مشخص نشده باشد، پورت استاندارد مربوط به پروتکل پروکسی استفاده خواهد شد (۱۰۸۰ برای SOCKS و ۳۱۲۸ برای HTTPS). آدرس IPv6 را می‌توان با محصور کردن proxy_address درون براکت به شکلی صریح و بدون ابهام تعیین کرد. پروکسی را نمی‌توان همراه با هیچ‌یک از گزینه‌های -lsuU به کار برد.
حالت DCCP.
تنها دیمن‌های شنودکننده را پویش می‌کند، بدون آنکه داده‌ای برای آن‌ها ارسال نماید. نمی‌توان همراه با -l استفاده کرد.

مقدار destination می‌تواند یک آدرس IP عددی یا نام نمادین یک میزبان باشد (مگر اینکه گزینه -n داده شده باشد). به طور کلی، مقصد باید مشخص شود، مگر آنکه گزینه -l ارائه گردد (که در این حالت از میزبان محلی استفاده می‌شود). برای سوکت‌های دامنه‌ی یونیکس، تعیین مقصد الزامی است و مسیر سوکتی است که باید به آن متصل شد (یا در صورت ارائه گزینه -l، روی آن شنود انجام گیرد).

مقدار port می‌تواند به عنوان یک شماره پورت عددی یا نام یک سرویس مشخص شود. بازه‌های پورت را می‌توان با شماره پورت‌های عددی به فرم nn-mm تعیین کرد. به طور کلی، پورت مقصد باید مشخص شود مگر اینکه گزینه -U داده شده باشد. برای برخی گزینه‌ها، مقدار 0 درخواست می‌کند که سیستم یک شماره پورت را انتخاب کند.

ساخت یک مدل کلاینت/سرور بسیار ساده با استفاده از nc بسیار آسان است. در یک کنسول، nc را در حال شنود روی یک پورت خاص برای دریافت اتصال اجرا کنید. برای مثال:

$ nc -l 1234

اکنون nc روی پورت ۱۲۳۴ در انتظار اتصال است. در کنسول دوم (یا روی یک دستگاه دیگر)، به ماشین و پورتی که روی آن شنود می‌شود متصل شوید:

$ nc -N 127.0.0.1 1234

اکنون باید اتصالی بین پورت‌ها برقرار شده باشد. هر چیزی که در کنسول دوم تایپ شود به اولی متصل و منتقل می‌شود و برعکس. پس از برقراری اتصال، برای nc تفاوتی ندارد که کدام طرف به عنوان «سرور» و کدام طرف به عنوان «کلاینت» استفاده می‌شود. از آنجا که پرچم -N تعیین شده است، اتصال را می‌توان با استفاده از EOF (کلیدهای ^D) خاتمه داد.

در این نسخه از netcat گزینه‌های -c یا -e وجود ندارند، اما همچنان می‌توانید با تغییر مسیر توصیف‌کننده‌های فایل (file descriptors)، پس از برقراری اتصال یک دستور را اجرا کنید. در اینجا بسیار محتاط باشید زیرا باز کردن یک پورت و اجازه دادن به هر فرد متصل‌شده برای اجرای دستورات دلخواه روی سیستم شما بسیار **خطرناک** است. اگر واقعاً به انجام این کار نیاز دارید، در اینجا یک نمونه آورده شده است:

در سمت سرور:

$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

در سمت کلاینت:

$ nc host.example.com 1234
$ (shell prompt from host.example.com)

با انجام این کار، شما یک fifo در مسیر /tmp/f ایجاد می‌کنید و کاری می‌کنید که nc روی پورت ۱۲۳۴ از آدرس 127.0.0.1 در سمت سرور شنود کند؛ هنگامی که یک کلاینت با موفقیت به آن پورت متصل شود، /bin/sh در سمت سرور اجرا شده و خط اعلان شل به سمت کلاینت داده می‌شود.

هنگامی که اتصال خاتمه یابد، nc نیز خارج می‌شود. اگر می‌خواهید شنود ادامه یابد از گزینه -k استفاده کنید، اما در صورتی که دستور متوقف شود این گزینه آن را مجدداً راه‌اندازی نمی‌کند یا nc را در حال اجرا نگه نمی‌دارد. همچنین فراموش نکنید که پس از پایان کار، توصیف‌کننده فایل را حذف نمایید:

$ rm -f /tmp/f

مثال بخش قبل را می‌توان برای ساخت یک الگوی پایه انتقال داده گسترش داد. هر اطلاعاتی که به یک سرِ اتصال وارد شود در سر دیگر خارج خواهد شد، و ورودی و خروجی را می‌توان به‌سادگی دریافت و ذخیره کرد تا فرآیند انتقال فایل شبیه‌سازی گردد.

کار را با استفاده از nc جهت شنود روی یک پورت معین آغاز کنید، به طوری که خروجی درون یک فایل ذخیره شود:

$ nc -l 1234 > filename.out

با استفاده از دستگاه دوم، به فرآیند شنودکننده nc متصل شوید و فایلی را که قرار است منتقل شود به آن بفرستید:

$ nc -N host.example.com 1234 < filename.in

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

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

$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80

توجه داشته باشید که این کار هدرهای ارسالی توسط وب‌سرور را نیز نمایش می‌دهد. در صورت لزوم، می‌توان آن‌ها را با استفاده از ابزاری مانند sed(1) فیلتر کرد.

هنگامی که کاربر فرمت درخواست‌های مورد نیاز سرور را بداند، می‌تواند مثال‌های پیچیده‌تری بسازد. به عنوان نمونه‌ای دیگر، می‌توان یک ایمیل را به صورت زیر به سرور SMTP تحویل داد:

$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM:<user@host.example.com>
RCPT TO:<user2@host.example.com>
DATA
Body of email.
.
QUIT
EOF

دانستن اینکه چه پورت‌هایی روی ماشین هدف باز هستند و سرویس‌هایی روی آن‌ها اجرا می‌شوند می‌تواند مفید باشد. می‌توان از پرچم -z استفاده کرد تا به nc اعلام شود به جای آغاز اتصال، پورت‌های باز را گزارش دهد. معمولاً سودمند است که با استفاده از این گزینه در ترکیب با گزینه -v، خروجی مشروح روی خطای استاندارد (stderr) فعال شود.

برای مثال:

$ nc -zv host.example.com 20-30
Connection to host.example.com 22 port [tcp/ssh] succeeded!
Connection to host.example.com 25 port [tcp/smtp] succeeded!

بازه پورت برای محدود کردن جستجو به پورت‌های ۲۰ تا ۳۰ مشخص شده است و به ترتیب افزایشی پویش می‌شود (مگر اینکه پرچم -r تنظیم شده باشد).

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

$ nc -zv host.example.com http 20 22-23
nc: connect to host.example.com 80 (tcp) failed: Connection refused
nc: connect to host.example.com 20 (tcp) failed: Connection refused
Connection to host.example.com port [tcp/ssh] succeeded!
nc: connect to host.example.com 23 (tcp) failed: Connection refused

پورت‌ها بر اساس ترتیبی که ارائه داده‌اید پویش می‌شوند (مگر اینکه پرچم -r تنظیم شده باشد).

علاوه بر این، شاید مفید باشد بدانید چه نرم‌افزار سروری در حال اجراست و از چه نسخه‌ای استفاده می‌کند. این اطلاعات معمولاً در بنرهای خوشامدگویی سرورها موجود است. برای به دست آوردن این بنرها، لازم است ابتدا اتصال برقرار شود و سپس بلافاصله پس از دریافت بنر، اتصال قطع گردد. این کار را می‌توان با تعیین یک مهلت زمانی اندک به کمک پرچم -w، یا با ارسال یک دستور "QUIT" به سرور انجام داد:

$ echo "QUIT" | nc host.example.com 20-30
SSH-1.99-OpenSSH_3.6.1p2
Protocol mismatch.
220 host.example.com IMS SMTP Receiver Version 0.84 Ready

برقراری یک اتصال TCP به پورت ۴۲ از میزبان host.example.com با استفاده از پورت ۳۱۳۳۷ به عنوان پورت مبدأ و با مهلت زمانی ۵ ثانیه:

$ nc -p 31337 -w 5 host.example.com 42

برقراری یک اتصال UDP به پورت ۵۳ از host.example.com:

$ nc -u host.example.com 53

برقراری یک اتصال TCP به پورت ۴۲ از میزبان host.example.com با استفاده از 10.1.2.3 به عنوان آدرس IP انتهای محلی اتصال:

$ nc -s 10.1.2.3 host.example.com 42

ایجاد و شنود روی یک سوکت جریانی دامنه‌ی یونیکس:

$ nc -lU /var/tmp/dsocket

اتصال به پورت ۴۲ از میزبان host.example.com از طریق یک پروکسی HTTP در 10.2.3.4 روی پورت ۸۰۸۰. این مثال می‌تواند توسط ssh(1) نیز استفاده شود؛ برای اطلاعات بیشتر دستورالعمل ProxyCommand در ssh_config(5) را ببینید:

$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42

تکرار مثال پیشین، این بار با فعال‌سازی احراز هویت در پروکسی با استفاده از نام کاربری «ruser» در صورتی که پروکسی نیازمند آن باشد:

$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42

cat(1), ssh(1)

پیاده‌سازی اولیه توسط *Hobbit* <hobbit@avian.org>.
بازنویسی با پشتیبانی از IPv6 توسط Eric Jackson <ericj@monkey.org>.
اصلاح‌شده برای نسخه دبیان توسط Aron Xu <aron@debian.org>.

پویش پورت‌های UDP با استفاده از ترکیب پرچم‌های -uz صرف‌نظر از وضعیت واقعی ماشین هدف، همیشه موفقیت‌آمیز بودن را گزارش می‌دهد. با این حال، در ترکیب با یک شنودگر ترافیک (traffic sniffer) روی ماشین هدف یا یک دستگاه واسط، ترکیب -uz می‌تواند برای تشخیص وضعیت ارتباطات مفید واقع شود. توجه داشته باشید که حجم ترافیک UDP تولیدشده ممکن است به دلیل محدودیت منابع سخت‌افزاری یا تنظیمات پیکربندی محدود گردد.

2025-06-24 OpenBSD