Özet
nc [-46AcDCdhklnrtUuvz] [-b boundif] [-i interval] [-p source_port] [-s source_ip_address]
[-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [--apple-delegate-pid pid]
[--apple-delegate-uuid uuid] [--apple-ext-bk-idle] [--apple-nowakefromsleep n]
[--apple-ecn mode] [hostname] [port[s]]
Açıklama
nc (veya netcat) aracı, TCP veya UDP içeren akla gelebilecek hemen hemen her iş için kullanılır. TCP bağlantıları açabilir, UDP paketleri gönderebilir, keyfi TCP ve UDP portlarını dinleyebilir, port taraması yapabilir ve hem IPv4 hem de IPv6 ile çalışabilir. telnet(1) aracının aksine, nc betiklerde kolayca kullanılabilir ve telnet(1) aracının bazen yaptığı gibi hata mesajlarını standart çıktıya göndermek yerine standart hataya (stderr) ayırır.
Yaygın kullanım alanları şunlardır:
• basit TCP proxy'leri • betik tabanlı HTTP istemcileri ve sunucuları • ağ daemon programlarının test edilmesi • ssh(1) için bir SOCKS veya HTTP ProxyCommand kullanımı • ve çok, çok daha fazı
Seçenekler aşağıdaki gibidir:
-4: nc aracını yalnızca IPv4 adreslerini kullanmaya zorlar.-6: nc aracını yalnızca IPv6 adreslerini kullanmaya zorlar.-A: Soket üzerinde SO_RECV_ANYIF seçeneğini ayarlar.
-b boundif Soketin bağlanacağı (bind) arayüzü belirtir.
-c: Satır sonu olarak CRLF gönderir.-D: Soket üzerinde hata ayıklamayı (debugging) etkinleştirir.-C: nc aracını hücresel veri bağlamını (cellular data context) kullanmamaya zorlar.-d: Standart girdiden (stdin) okuma yapmaya çalışmaz.-h: nc yardım metnini yazdırır.
-i interval Gönderilen ve alınan metin satırları arasında bir gecikme süresi aralığı belirtir. Ayrıca birden fazla porta yapılan bağlantılar arasında da bir gecikme süresine neden olur.
-G conntimeout Saniye cinsinden TCP bağlantı zaman aşımı süresi.
-H keepidle Saniye cinsinden ilk TCP bağlantıda tutma (keep alive) zaman aşımı süresi.
-I keepintvl Saniye cinsinden TCP bağlantıda tutma zaman aşımı tekrarlama aralığı.
-J keepcnt TCP bağlantıda tutma paketlerinin kaç kez tekrarlanacağı.
-k: nc aracını, mevcut bağlantısı tamamlandıktan sonra başka bir bağlantıyı dinlemeye devam etmeye zorlar. Bu seçeneğin -l seçeneği olmadan kullanılması hatadır.-l: nc'nin uzak bir sunucuya bağlantı başlatmak yerine gelen bir bağlantıyı dinlemesi gerektiğini belirtmek için kullanılır. Bu seçeneğin-p, -s veya -z seçenekleri: ile birlikte kullanılması hatadır. Ek olarak, -w seçeneğiyle belirtilen tüm zaman aşımı değerleri yoksayılır.
-L num_probes Karşı tarafın erişilemez olduğunu beyan etmeden ve uyarlanabilir bir zaman aşımı okuma/yazma olayı üretmeden önce karşı tarafa gönderilecek sonda (probe) sayısı.
-n: Belirtilen herhangi bir adres, ana bilgisayar adı veya port üzerinde hiçbir DNS veya servis araması yapmaz.
-p source_port Ayrıcalık kısıtlamalarına ve kullanılabilirliğe bağlı olarak, nc'nin kullanması gereken kaynak portunu belirtir. Bu seçeneğin -l seçeneği ile birlikte kullanılması hatadır.
-r: Kaynak ve/veya hedef portlarının sıralı bir aralıkta veya sistemin bunları atadığı sırada değil, rastgele seçilmesi gerektiğini belirtir.
-s source_ip_address Paketleri göndermek için kullanılan arayüzün IP adresini belirtir. Bu seçeneğin -l seçeneği ile birlikte kullanılması hatadır.
-t: nc'nin RFC 854 DO ve WILL isteklerine sırasıyla RFC 854 DON'T ve WON'T yanıtları göndermesine neden olur. Bu, telnet oturumlarını betiklendirmek için nc kullanmayı mümkün kılar.-U: Unix Alan Dizin Soketlerinin (Unix Domain Sockets) kullanılacağını belirtir.-u: Varsayılan seçenek olan TCP yerine UDP kullanır.-v: nc'nin daha ayrıntılı çıktı (verbose) vermesini sağlar.
-w timeout Bir bağlantı ve standart girdi (stdin), timeout saniyesinden daha uzun süre boşta kalırsa, bağlantı sessizce kapatılır. -w bayrağının -l seçeneği üzerinde hiçbir etkisi yoktur, yani nc, -w bayrağı olsun veya olmasın sonsuza kadar bir bağlantıyı dinleyecektir. Varsayılan olarak zaman aşımı yoktur.
-X proxy_version nc'nin proxy sunucusuyla konuşurken belirtilen protokolü kullanmasını talep eder. Desteklenen protokoller “4” (SOCKS v.4), “5” (SOCKS v.5) ve “connect” (HTTPS proxy) protokolleridir. Protokol belirtilmezse SOCKS sürüm 5 kullanılır.
-x proxy_address[:port] nc'nin proxy_address ve port üzerindeki bir proxy'yi kullanarak ilgili ana bilgisayara bağlanmasını talep eder. Port belirtilmezse, proxy protokolü için bilinen port kullanılır (SOCKS için 1080, HTTPS için 3128).
-z: nc'nin onlara herhangi bir veri göndermeden, yalnızca dinleyen daemon programlarını taramasını belirtir. Bu seçeneğin -l seçeneği ile birlikte kullanılması hatadır.
--apple-delegate-pid nc'nin soketi belirtilen PID için devretmesini talep eder. Bu seçeneğin --apple-delegate-uuid seçeneği ile birlikte kullanılması hatadır.
--apple-delegate-uuid nc'nin soketi belirtilen UUID için devretmesini talep eder. Bu seçeneğin --apple-delegate-pid seçeneği ile birlikte kullanılması hatadır.
--apple-ext-bk-idle Süreç askıya alındığında nc'nin, soketini uzatılmış arka plan boşta kalma süresi (extended background idle time) için işaretlemesini talep eder.
--apple-nowakefromsleep n parametresi 0'dan büyük olduğunda, sistem uyku moduna geçtiğinde sürücüler tarafından sorgulanan açık portlar listesinden yerel portu hariç tutmak için nc'nin soketini işaretlemesini talep eder. n 1'den büyük olduğunda, soket kapatıldığında KEV_SOCKET_CLOSED çekirdek olayını (kernel event) üreten soket seçeneğini ayarlar.
--apple-ecn ECN modunu (varsayılan, etkinleştir, devre dışı bırak) ayarlamak üzere nc'nin TCP_ECN_MODE soket seçeneğini kullanacak şekilde işaretlemesini talep eder.
hostname sayısal bir IP adresi veya sembolik bir ana bilgisayar adı olabilir (-n seçeneği verilmediği sürece). Genel olarak, -l seçeneği verilmediği sürece (bu durumda yerel ana bilgisayar kullanılır) bir ana bilgisayar adı (hostname) belirtilmelidir.
port[s] tekil tam sayılar veya aralıklar olabilir. Aralıklar nn-mm biçimindedir. Genel olarak, -U seçeneği verilmediği sürece (bu durumda bir soket belirtilmelidir) bir hedef port belirtilmelidir.
İSTEMCİ/SUNUCU MODELİ nc kullanarak çok temel bir istemci/sunucu modeli oluşturmak oldukça basittir. Bir konsolda, nc'yi belirli bir portta bağlantı dinleyecek şekilde başlatın. Örneğin:
$ nc -l 1234
nc şu anda bağlantı için 1234 portunu dinlemektedir. İkinci bir konsolda (veya ikinci bir makinede), dinlenen makineye ve porta bağlanın:
$ nc 127.0.0.1 1234
Artık portlar arasında bir bağlantı kurulmuş olmalıdır. İkinci konsolda yazılan her şey birincisine eklenecek ve bunun tersi de geçerli olacaktır. Bağlantı kurulduktan sonra nc, hangi tarafın 'sunucu' olarak, hangi tarafın ise 'istemci' olarak kullanıldığını gerçekten önemsemez. Bağlantı bir EOF (‘^D’) kullanılarak sonlandırılabilir.
Veri Aktarımı
Önceki bölümdeki örnek, temel bir veri aktarım modeli oluşturmak üzere genişletilebilir. Bağlantının bir ucuna girilen her türlü bilgi diğer uca çıktı olarak verilecektir ve dosya aktarımını simüle etmek için girdi ve çıktı kolayca yakalanabilir.
Çıktıyı bir dosyaya kaydederek belirli bir portu dinlemesi için nc'yi başlatarak başlayın:
$ nc -l 1234 > filename.out
İkinci bir makine kullanarak, dinleyen nc sürecine bağlanın ve ona aktarılacak dosyayı besleyin:
$ nc host.example.com 1234 < filename.in
Dosya aktarıldıktan sonra bağlantı otomatik olarak kapanacaktır.
Sunucularla Konuşma
Bazen sunucularla bir kullanıcı arayüzü üzerinden değil de “elle” konuşmak yararlı olabilir. İstemci tarafından verilen komutlara yanıt olarak bir sunucunun hangi verileri gönderdiğini doğrulamak gerektiğinde sorun gidermeye yardımcı olabilir. Örneğin, bir web sitesinin ana sayfasını almak için:
$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
Bunun web sunucusu tarafından gönderilen başlıkları da (headers) görüntülediğine dikkat edin. Gerekirse, sed(1) gibi bir araç kullanılarak filtrelenebilirler.
Kullanıcı, sunucu tarafından talep edilen isteklerin formatını bildiğinde daha karmaşık örnekler oluşturulabilir. Diğer bir örnek olarak, bir SMTP sunucusuna şu şekilde bir e-posta gönderilebilir:
$ nc 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
Port Taraması
Hedef makinede hangi portların açık olduğunu ve servis çalıştırdığını bilmek yararlı olabilir. nc'ye bir bağlantı başlatmak yerine açık portları rapor etmesini söylemek için -z bayrağı kullanılabilir. Örneğin:
$ nc -z 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!
Aramayı 20 - 30 arasındaki portlarla sınırlamak için port aralığı belirtilmiştir.
Alternatif olarak, hangi sunucu yazılımının ve hangi sürümlerinin çalıştığını bilmek yararlı olabilir. Bu bilgi genellikle karşılama afişlerinde (greeting banners) yer alır. Bunları elde etmek için önce bir bağlantı kurmak, ardından afiş alındığında bağlantıyı kesmek gerekir. Bu, -w bayrağı ile küçük bir zaman aşımı süresi belirtilerek veya sunucuya bir "QUIT" komutu gönderilerek gerçekleştirilebilir:
$ 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
Örnekler
5 saniyelik bir zaman aşımı süresiyle, kaynak portu olarak 31337 portunu kullanarak host.example.com
adresinin 42 portuna bir TCP bağlantısı açın:
$ nc -p 31337 -w 5 host.example.com 42
host.example.com adresinin 53 portuna bir UDP bağlantısı açın:
$ nc -u host.example.com 53
Bağlantının yerel ucu için IP olarak 10.1.2.3 adresini kullanarak host.example.com adresinin 42 portuna
bir TCP bağlantısı açın:
$ nc -s 10.1.2.3 host.example.com 42
Bir Unix Alan Dizin Soketi (Unix Domain Socket) oluşturun ve dinleyin:
$ nc -lU /var/tmp/dsocket
10.2.3.4 adresindeki ve 8080 portundaki bir HTTP proxy aracılığıyla host.example.com adresinin 42 portuna
bağlanın. Bu örnek ssh(1) tarafından da kullanılabilir; daha fazla bilgi için ssh_config(5) içindeki
ProxyCommand yönergesine bakın.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
Ayrıca Bakınız
cat(1), ssh(1)
Yazarlar
Asıl uygulama Hobbit ⟨hobbit@avian.org⟩ tarafından yapılmıştır. IPv6 desteği eklenerek Eric Jackson ⟨ericj@monkey.org⟩ tarafından yeniden yazılmıştır.
Uyarılar (Caveats)
UDP port taramaları her zaman başarılı olacağından (yani portu açık olarak rapor edeceğinden), bayrakların -uz kombinasyonu nispeten yararsız kalmaktadır.
macOS 26.4 25 Haziran 2001 macOS 26.4