linux nc 详解

功能说明:功能强大的网络工具

netcat(nc)是一个简单而有用的工具,不仅可以通过使用TCP或UDP协议的网络连接读写数据,同时还是一个功能强大的网络调试和探测工具,能够建立你需要的几乎所有类型的网络连接

安装:

[email protected]/0 # yum -y install nc

帮助:

[email protected]/0 # nc -h
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
          [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
          [-x proxy_address[:port]] [hostname] [port[s]]
        Command Summary:
                -4              Use IPv4
                -6              Use IPv6
                -D              Enable the debug socket option
                -d              Detach from stdin
                -h              This help text
                -i secs         Delay interval for lines sent, ports scanned
                -k              Keep inbound sockets open for multiple  connects
                -l              Listen mode, for inbound connects
                -n              Suppress name/port resolutions
                -p port         Specify local port for remote connects
                -r              Randomize remote ports
                -S              Enable the TCP MD5 signature option
                -s addr         Local source address
                -T ToS          Set IP Type of Service
                -C              Send CRLF as line-ending
                -t              Answer TELNET negotiation
                -U              Use UNIX domain socket
                -u              UDP mode
                -v              Verbose
                -w secs         Timeout for connects and final net reads
                -X proto        Proxy protocol: "4", "5" (SOCKS) or "connect"
                -x addr[:port]  Specify proxy address and port
                -z              Zero-I/O mode [used for scanning]
        Port numbers can be individual or ranges: lo-hi [inclusive]

man 手册翻译:

NAME
     nc — 一个任意的TCP和UDP连接和监听工具

SYNOPSIS
     nc [-46bCDdhklnrStUuvZz] [-I length] [-i interval] [-O length] [-P proxy_username] [-p source_port] [-q seconds] [-s source]
        [-T toskeyword] [-V rtable] [-w timeout]
        [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]

DESCRIPTION
     nc (或 netcat) 实用工具用于任何涉及到TCP, UDP, 或 UNIX-domain sockets的场景[不怎么会翻译这个,按大致意思来了
        原文:The nc (or netcat) utility is used for just about anything under the sun involving TCP, UDP, or UNIX-domain sockets.].
        它可以打开TCP 连接, 发送UDP数据包,监听任意的TCP和UDP端口, 实现端口扫描, 和同时处理IPV4和IPV6.
        不同于telnet(1), nc脚本很nice, 并且输出错误信息到标准错误,而不是标准输出, as telnet(1) does with some.

     常见用法包括:

           ·   简易 TCP 代理
           ·   基于HTTP客户端和服务端的shell脚本
           ·   网络守护进程测试
           ·   一个用于ssh(1)的 SOCKS 或 HTTP 代理命令行
           ·   还有很多,很多

     有以下选项可用:

     -4      强制nc只使用IPv4地址。

     -6      强制nc只使用IPV6地址.

     -b      允许广播.

     -C      发送CRLF作为换行符.

     -D      开启debugging 在 socket.

     -d      不尝试从stdin读取数据.

     -h      打印nc帮助信息.

     -I length
             指定TCP接收缓冲区大小.

     -i interval
             指定文本行发送和接收的延时时间.  也可以制造连接到多端口的延时.

     -k     强制nc持续监听另一个连接直到它的连接完成.  没有 -l 选项是错误的.

     -l      用于指定nc应该监听一个传入的连接,而不是连接到远程主机.  该选项不能与以下选项联合使用
             -p, -s, 或 -z 选项.  此外, 任何用-w选项指定的超时会被忽略.

     -n      任何指定的地址,主机名或端口都不做任何DNS或服务解析.

     -O length
             指定TCP发送缓冲区的大小.

     -P proxy_username
             指定一个用户名到代理服务器用于请求认证。如果没有指定用户名那么将不会尝试认证。 代理认证功能目前只支持HTTP CONNECT代理.

     -p source_port
             指定nc使用的源端口,受到权限和可用性的限制.

     -q seconds
             在stdin EOF之后, 等待指定秒数之后再退出. 如果秒数是负数, 永久等待.

     -r      指定源和/或目标端口随机选择而不是一个范围序列或系统分配的顺序.

     -S      开启RFC 2385 TCP MD5签名选项.

     -s source
             指定IP的接口用于发送数据包.  对于UNIX-domain 数据报 sockets, 指定创建和使用本地临时socket文件
             这样可以使数据报可以被接收。不可同时使用-l选项.

     -T toskeyword
             改变IPv4 TOS值.  toskeyword may be one of critical, inetcontrol, lowcost, lowdelay,
             netcontrol, throughput, reliability, or one of the DiffServ Code Points: ef, af11
             ... af43, cs0 ... cs7(这句不会翻译); 或者一个十六进制或十进制数. 

     -t      引发nc发送RFC 854 DON‘The WON‘T响应给RFC 854 DO和WILL请求。这使得使用nc脚本化telnet会话成为可能。

     -U     限定使用 UNIX-domain sockets.

     -u      使用UDP代替默认的TCP选项。对于UNIX-domain sockets,使用一个数据报 socket 代替一个 stream socket.
             如果使用UNIX-domain socket, 除非给定-s标记,否则会在/tmp创建一个临时的receiving socket。

     -V rtable
             设置要使用的路由表. 默认是 0.

     -v     使nc给出更详细的输出.

     -w timeout
             无法建立的或者闲置的连接在指定秒数之后超时.
             -w标记不会影响到-l选项, 例如. nc 将会不间断的监听一个连接, 无论有没有-w标记.  默认都是不超时的.

     -X proxy_protocol
             要求nc使用指定协议连接到代理服务器.  支持的协议有 “4” (SOCKS v.4),
             “5” (SOCKS v.5) and “connect” (HTTPS proxy).
             如果不指定协议, SOCKS version 5将会使用.

     -x proxy_address[:port]
             要求nc使用指定代理地址和端口连接到目标。如果不指定端口, 使用默认的代理协议端口 (1080 for SOCKS, 3128 for HTTPS).

     -Z      DCCP mode(数据报拥塞控制协议).

     -z      指定nc只是扫描正在监听的守护进程,不发送任何数据.  不可和-l选项同时使用。

     目标可以是一个数字IP地址或字符主机名(除过指定-n选项外).
     一般来说, 必须指定目标, 除非给出-l选项 (在这种情况下使用本地主机).
     对于 UNIX-domain sockets, 一个目标是必要的,并且是一个socket路径被用于连接(或监听,如果-l选项被给定的话)。

     端口可以是一个整数或者一个范围的端口号.  端口范围使用这种格式指定nn-mm. 一般来说, 一个目标端口必须被指定, 除非-U选项被给出.

客户端/服务器模式
     使用nc建立一个非常基本的客户端/服务器模式是非常简单的。在一个控制台上,开启nc监听一个指定的端口等待连接。范例:

           $ nc -l 1234

     nc现在正在监听1234端口等待连接。在第二个控制台上(或第二台机器), 连接到正在监听的主机端口上:

           $ nc 127.0.0.1 1234

     现在应该在端口之间建立了连接。在第二个控制台上的任何键入内容将会串发到第一个控制台上,反之亦然.  在连接建立之后,
     nc不真正关心哪一方用于‘服务端’,哪一方用于‘客户端’. 连接可以用EOF中断 (‘^D’).

     在这个netcat没有-c或-e选项, 但是你仍然可以在连接建立之后执行一个命令通过文件描述符重定向的形式。
     这里务必小心,因为开放一个端口让任何人连接并执行任意的命令在你的站点上是非常危险的。
     如果你真的想这么做,这里是一个范例:

     在‘服务器’端:

           $ 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的1234端口,
     当一个‘客户端’建立连接成功到那个端口,/bin/sh在‘服务器’端执行并且给‘客户端’shell提示符。

     当连接终止时,nc同样也会退出。如果你想持续监听,使用-k, 但是命令退出时这个选项将不会重启它或保持nc运行(这句翻译好别扭,
     贴出原文参考:but if the command quits this option won‘t restart it or keep nc running.)
     同样别忘了删掉文件描述符当你不再需要它的时候:

           $ rm -f /tmp/f

数据传输
     前一个区域的范例可以扩展为构建一个基本的数据传输模式. 任何信息输入的一端将会通过连接输出到另一端,
     并且输入和输出可以轻松捕获用于文件传输。

     首先使用nc监听一个指定端口,并且捕获输出到一个文件:

           $ nc -l 1234 > filename.out

     使用第二个机器,连接到nc进程监听的这个端口上,喂给它要传输的文件:

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

     在文件完成传输之后,连接会自动关闭。

和服务器交谈
     有时“手工”和服务器交谈比通过一个用户接口更有用。这可以帮助解决故障,当需要验证由客户端发起的请求,
     服务器发送的什么数据响应到命令行时是有必要的。举个例子,检测网站主页:

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

     注意这同样显示了web服务器发送的headers.  他们可以使用例如sed(1)之类的工具过滤,如果有必要的话.

     更多复杂的范例同样可以构建当用户知道服务器需要的请求格式时。再比如,一个email可以使用以下方式提交到一个SMTP服务端:

           $ nc [-C] localhost 25 << EOF
           HELO host.example.com
           MAIL FROM:<[email protected]>
           RCPT TO:<[email protected]>
           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!

     端口范围限定扫描20 - 30,通过升序.

     你同样可以指定一个要扫描的端口列表,例如:

           $ nc -zv host.example.com 80 20 22
           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!

     端口扫描顺序由你给定的次序决定.

     亦或者,对于知道哪个服务端软件正在运行,是哪个版本可能有用。这些信息通常包含在 greeting banners 。
     为了获取这些信息,有必要首先制造一个连接,然后当banner获取到的时候破坏掉连接。
     这可以通过用-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的42端口,使用31337作为源端口,并且设置5秒超时:

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

     打开一个UDP连接到host.example.com的53端口:

           $ nc -u host.example.com 53

     打开一个TCP连接到host.example.com的42端口,使用10.1.2.3作为本地端IP用于连接:

           $ nc -s 10.1.2.3 host.example.com 42

     创建和监听一个UNIX-domain stream socket:

           $ nc -lU /var/tmp/dsocket

     连接到host.example.com的42端口,通过10.2.3.4上的8080端口的HTTP代理连接。
     这个范例同样可以使用ssh(1)实现; 更多信息请参考ssh_config(5)中的ProxyCommand directive。

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

     同样的范例,这次使用“ruser”用户名开启代理认证,如果代理需要认证的话:

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

SEE ALSO
     cat(1), ssh(1)

AUTHORS
     Original implementation by *Hobbit* [email protected]?.
     Rewritten with IPv6 support by Eric Jackson <[email protected]>.
     Modified for Debian port by Aron Xu [email protected]?.

CAVEATS
     UDP port scans using the -uz combination of flags will always report success irrespective of the target machine‘s state.
     However, in conjunction with a traffic sniffer either on
     the target machine or an intermediary device, the -uz combination could be useful for communications diagnostics.
     Note that the amount of UDP traffic generated may be limited
     either due to hardware resources and/or configuration settings.

再来一个进阶点的实用小例子

nc -l 1234 |tar -xvf - #目标机上执行
tar -cvf - 目录 |nc 目标机IP 1234 #在被迁移机上执行
#能实现块级别的压缩迁移 。速度是最快的。遇到大量零碎小文件要同步的时候很有用。

原文地址:http://blog.51cto.com/chaichuan/2095844

时间: 2024-10-05 18:37:11

linux nc 详解的相关文章

Linux 目录详解 树状目录结构图

1.树状目录结构图 2./目录 目录 描述 / 第一层次结构的根.整个文件系统层次结构的根目录. /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如:cat.ls.cp,和/usr/bin类似. /boot/ 引导程序文件,例如:kernel.initrd:时常是一个单独的分区[6] /dev/ 必要设备, 例如:, /dev/null. /etc/ 特定主机,系统范围内的配置文件. 关于这个名称目前有争议.在贝尔实验室关于UNIX实现文档的早期版本中,/etc 被称为

Linux信号详解

Linux信号详解 一 信号的种类 可靠信号与不可靠信号, 实时信号与非实时信号 可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号 不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于 SIGRTMIN的都是非可靠信号. 非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信 号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值 位于 [SIGRTM

linux awk详解与应用

文章来自于本人个人博客: linux awk详解与应用 1.awk awk是一个强大的文本分析工具,它可以通过分析文本来生成一个数据报告.它的原理就是读取每行的输入,然后按照分隔符切分(默认是空格),再进行定制计算. awk '{print $1}' /etc/passwd   #打印出passwd文件的所有行的第一列 这是awk的基础语法,在awk中$n代表列数,即$1--第一列,$2---第二列....,但是$0代表整行 接下来我们按照指定的分隔符打印数据: awk -F ':' '{pri

Gentoo Linux安装详解--根据官方WiKi整理

1. 前期准备 远程登录: 开启ssh服务: /etc/init.d/sshd start 设置密码: passwd 以便使用putty.ssh client远程登录上传stage等(有时在线下载很慢,而局域网上传很快) 准备磁盘: 分区: fdisk /dev/sda /dev/sda1 : /boot 100M(32-100M) 设启动笔记-a/dev/sda2 : / 20G/dev/sda3 : /home 20G/dev/sda5 : /swap 1G (内存< 512 MB,分区分配

linux命令详解

一.cat主要有三大功能: 1.一次显示整个文件.$ cat filename2.从键盘创建一个文件.$ cat > filename (只能创建新文件,不能编辑已有文件)3.将几个文件合并为一个文件: $cat file1 file2 > file 参数:-n 或 --number 由 1 开始对所有输出的行数编号-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行-v

PXE的概述及Linux使用详解

PXE的概述及使用详解 现在企业采购的很多计算机都是没光驱的,怎么安装系统呢?另外,如何能快速大规模安装Linux服务器操作系统呢,有什么好办法吗? 答案是有的,那就是本文要说的:PXE PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial filet

Gentoo Linux安装详解

1. 前期准备 远程登录: 开启ssh服务: /etc/init.d/sshd start 设置密码: passwd 以便使用putty.ssh client远程登录上传stage等(有时在线下载很慢,而局域网上传很快) 准备磁盘: 分区: fdisk /dev/sda /dev/sda1 : /boot 100M(32-100M) 设启动笔记-a/dev/sda2 : / 20G/dev/sda3 : /home 20G/dev/sda5 : /swap 1G (内存< 512 MB,分区分配

Linux指令详解useradd groupadd passwd chpasswd chage 密码修改

创建用户.设置密码.修改用户.删除用户: useradd testuser 创建用户testuser passwd testuser 给创建的用户testuser设置密码 说明:新创建的用户会在/home下创建一个用户目录testuser usermod --help 修改用户这个命令的相关参数 userdel testuser 删除用户testuser rm -rf testuser 删除用户testuser所在目录 上面的几个命令只有root账号才可以使用,如果你不知道自己的系统上面的命令在

Linux权限详解,多用户多组各种权限配置原理

网上有太多关于Linux权限详解,这里不啰嗦那些.主要解释下这些权限是杂用的,否则知道了什么用户.组之类的权限也配不好. 一.权限分类 r:读取权限,数字代号为"4". w:写入权限,数字代号为"2". x:执行或切换权限,数字代号为"1". -:不具任何权限,数字代号为"0". linux内每一段为r+w+x的值,最大777,见下图 二.权限在何时使用 目录写权限:可以增删目录内所有内容,改文件和目录名. 目录读权限:可以l