Skip to the content.

BASH CHEATSHEET (中文速查表)

常用快捷键(默认使用 Emacs 键位)

CTRL+A              # 移动到行首,同 <Home>
CTRL+B              # 向后移动,同 <Left>
CTRL+C              # 结束当前命令
CTRL+D              # 删除光标前的字符,同 <Delete> ,或者没有内容时,退出会话
CTRL+E              # 移动到行末,同 <End>
CTRL+F              # 向前移动,同 <Right>
CTRL+G              # 退出当前编辑(比如正在 CTRL+R 搜索历史时)
CTRL+H              # 删除光标左边的字符,同 <Backspace>
CTRL+K              # 删除光标位置到行末的内容
CTRL+L              # 清屏并重新显示
CTRL+N              # 移动到命令历史的下一行,同 <Down>
CTRL+O              # 类似回车,但是会显示下一行历史
CTRL+P              # 移动到命令历史的上一行,同 <Up>
CTRL+R              # 历史命令反向搜索,使用 CTRL+G 退出搜索
CTRL+S              # 历史命令正向搜索,使用 CTRL+G 退出搜索
CTRL+T              # 交换前后两个字符
CTRL+U              # 删除字符到行首
CTRL+V              # 输入字符字面量,先按 CTRL+V 再按任意键
CTRL+W              # 删除光标左边的一个单词
CTRL+X              # 列出可能的补全
CTRL+Y              # 粘贴前面 CTRL+u/k/w 删除过的内容
CTRL+Z              # 暂停前台进程返回 bash,需要时可用 fg 将其切换回前台
CTRL+_              # 撤销(undo),有的终端将 CTRL+_ 映射为 CTRL+/ 或 CTRL+7

ALT+b               # 向后(左边)移动一个单词
ALT+d               # 删除光标后(右边)一个单词
ALT+f               # 向前(右边)移动一个单词
ALT+t               # 交换字符
ALT+BACKSPACE       # 删除光标前面一个单词,类似 CTRL+W,但不影响剪贴板

CTRL+X CTRL+X       # 连续按两次 CTRL+X,光标在当前位置和行首来回跳转 
CTRL+X CTRL+E       # 用你指定的编辑器,编辑当前命令

BASH 基本操作

exit                # 退出当前登陆
env                 # 显示环境变量
echo $SHELL         # 显示你在使用什么 SHELL

bash                # 使用 bash,用 exit 返回
which bash          # 搜索 $PATH,查找哪个程序对应命令 bash
whereis bash        # 搜索可执行,头文件和帮助信息的位置,使用系统内建数据库
whatis bash         # 查看某个命令的解释,一句话告诉你这是干什么的

clear               # 清初屏幕内容
reset               # 重置终端(当你不小心 cat 了一个二进制,终端状态乱掉时使用)

目录操作

cd                  # 返回自己 $HOME 目录
cd {dirname}        # 进入目录
pwd                 # 显示当前所在目录
mkdir {dirname}     # 创建目录
mkdir -p {dirname}  # 递归创建目录
pushd {dirname}     # 目录压栈并进入新目录
popd                # 弹出并进入栈顶的目录
dirs -v             # 列出当前目录栈
cd -                # 回到之前的目录
cd -{N}             # 切换到目录栈中的第 N个目录,比如 cd -2 将切换到第二个

diff

diff -uN {f1} {f2}           # 比较两个文件的内容
diff -aruN {d1} {d2}         # 比较两个目录的内容
diff -aruN -x .git {d1} {d2} # 比较两个目录的内容,排除.git中包含的内容

文件操作

ls                  # 显示当前目录内容,后面可接目录名:ls {dir} 显示指定目录
ls -l               # 列表方式显示目录内容,包括文件日期,大小,权限等信息
ls -lt              # 列表方式显示目录内容,按修改时间排序,最新的文件在最前
ls -ltr             # 列表方式显示目录内容,按修改时间排序,最新的文件在最后
ls -1               # 列表方式显示目录内容,只显示文件名称,减号后面是数字 1
ls -a               # 显示所有文件和目录,包括隐藏文件(.开头的文件/目录名)
ln -s {fn} {link}   # 给指定文件创建一个软链接
cp {src} {dest}     # 拷贝文件,cp -r dir1 dir2 可以递归拷贝(目录)
rm {fn}             # 删除文件,rm -r 递归删除目录,rm -f 强制删除
mv {src} {dest}     # 移动文件,如果 dest 是目录,则移动,是文件名则覆盖
touch {fn}          # 创建或者更新一下制定文件
cat {fn}            # 输出文件原始内容
any_cmd > {fn}      # 执行任意命令并将标准输出重定向到指定文件
more {fn}           # 逐屏显示某文件内容,空格翻页,q 退出
less {fn}           # 更高级点的 more,更多操作,q 退出
head {fn}           # 显示文件头部数行,可用 head -3 abc.txt 显示头三行
tail {fn}           # 显示文件尾部数行,可用 tail -3 abc.txt 显示尾部三行
tail -f {fn}        # 持续显示文件尾部数据,可用于监控日志
nano {fn}           # 使用 nano 编辑器编辑文件
vim {fn}            # 使用 vim 编辑文件
wc {fn}             # 统计文件有多少行,多少个单词
chmod 644 {fn}      # 修改文件权限为 644,可以接 -R 对目录循环改权限
chgrp group {fn}    # 修改文件所属的用户组
chown user1 {fn}    # 修改文件所有人为 user1, chown user1:group1 fn 可以修改组
file {fn}           # 检测文件的类型和编码
basename {fn}       # 查看文件的名字(不包括路径)
dirname {fn}        # 查看文件的路径(不包括名字)
grep {pat} {fn}     # 在文件中查找出现过 pat 的内容
grep -r {pat} .     # 在当前目录下递归查找所有出现过 pat 的文件内容
stat {fn}           # 显示文件的详细信息

用户管理

whoami              # 显示我的用户名
who                 # 显示已登陆用户信息,w / who / users 内容略有不同
w                   # 显示已登陆用户信息,w / who / users 内容略有不同
users               # 显示已登陆用户信息,w / who / users 内容略有不同
passwd              # 修改密码,passwd {user} 可以用于 root 修改别人密码
finger {user}       # 显示某用户信息,包括 id, 名字, 登陆状态等
adduser {user}      # 添加用户
deluser {user}      # 删除用户
w                   # 查看谁在线
su                  # 切换到 root 用户
su -                # 切换到 root 用户并登陆(执行登陆脚本)
su {user}           # 切换到某用户
su -{user}          # 切换到某用户并登陆(执行登陆脚本)
id {user}           # 查看用户的 uid,gid 以及所属其他用户组
id -u {user}        # 打印用户 uid
id -g {user}        # 打印用户 gid
write {user}        # 向某用户发送一句消息
last                # 显示最近用户登陆列表
last {user}         # 显示登陆记录
lastb               # 显示失败登陆记录
lastlog             # 显示所有用户的最近登陆记录
sudo {command}      # 以 root 权限执行某命令

进程管理

ps                               # 查看当前会话进程
ps ax                            # 查看所有进程,类似 ps -e
ps aux                           # 查看所有进程详细信息,类似 ps -ef
ps auxww                         # 查看所有进程,并且显示进程的完整启动命令
ps -u {user}                     # 查看某用户进程
ps axjf                          # 列出进程树
ps xjf -u {user}                 # 列出某用户的进程树
ps -eo pid,user,command          # 按用户指定的格式查看进程
ps aux | grep httpd              # 查看名为 httpd 的所有进程
ps --ppid {pid}                  # 查看父进程为 pid 的所有进程
pstree                           # 树形列出所有进程,pstree 默认一般不带,需安装
pstree {user}                    # 进程树列出某用户的进程
pstree -u                        # 树形列出所有进程以及所属用户
pgrep {procname}                 # 搜索名字匹配的进程的 pid,比如 pgrep apache2
ps aux | sort -k4nr | head -n 1  # 查看使用内存最多的进程
ps aux | sort -k3nr | head -n 1  # 查看使用CPU最多的进程

kill {pid}                       # 结束进程
kill -9 {pid}                    # 强制结束进程,9/SIGKILL 是强制不可捕获结束信号
kill -9 `pgrep {procname}`       # 强制结束名字匹配的进程,适用于多个同名进程
kill -KILL {pid}                 # 强制执行进程,kill -9 的另外一种写法
kill -l                          # 查看所有信号
kill -l TERM                     # 查看 TERM 信号的编号
killall {procname}               # 按名称结束所有进程
pkill {procname}                 # 按名称结束进程,除名称外还可以有其他参数

top                              # 查看最活跃的进程
top -u {user}                    # 查看某用户最活跃的进程

any_command &                    # 在后台运行某命令,也可用 CTRL+Z 将当前进程挂到后台
jobs                             # 查看所有后台进程(jobs)
bg                               # 查看后台进程,并切换过去
fg                               # 切换后台进程到前台
fg {job}                         # 切换特定后台进程到前台

trap cmd sig1 sig2               # 在脚本中设置信号处理命令
trap "" sig1 sig2                # 在脚本中屏蔽某信号
trap - sig1 sig2                 # 恢复默认信号处理行为

nohup {command}                  # 长期运行某程序,在你退出登陆都保持它运行
nohup {command} &                # 在后台长期运行某程序
disown {PID|JID}                 # 将进程从后台任务列表(jobs)移除

wait                             # 等待所有后台进程任务结束

常用命令:SSH / 系统信息 / 网络

ssh user@host             # 以用户 user 登陆到远程主机 host
ssh -p {port} user@host   # 指定端口登陆主机
ssh-copy-id user@host     # 拷贝你的 ssh key 到远程主机,避免重复输入密码
scp {fn} user@host:path   # 拷贝文件到远程主机
scp user@host:path dest   # 从远程主机拷贝文件回来
scp -P {port} ...         # 指定端口远程拷贝文件

uname -a                  # 查看内核版本等信息
man {help}                # 查看帮助
man -k {keyword}          # 查看哪些帮助文档里包含了该关键字
info {help}               # 查看 info pages,比 man 更强的帮助系统
uptime                    # 查看系统启动时间
date                      # 显示日期
date +%Y-%m-%d %H:%M:%S   # 以"yy-mm-dd hh:mm:ss"的形式显示日期
date +%s.%N               # 显示从'1970-01-01 00:00 UTC'至今的时间:'secs.nano_secs'
cal                       # 显示日历
vmstat                    # 显示内存和 CPU 使用情况
vmstat 10                 # 每 10 秒打印一行内存和 CPU情况,CTRL+C 退出
free                      # 显示内存和交换区使用情况
df                        # 显示磁盘使用情况
du                        # 显示当前目录占用,du . --max-depth=2 可以指定深度
uname                     # 显示系统版本号
hostname                  # 显示主机名称
showkey -a                # 查看终端发送的按键编码

ping {host}               # ping 远程主机并显示结果,CTRL+C 退出
ping -c N {host}          # ping 远程主机 N 次
traceroute {host}         # 侦测路由连通情况
mtr {host}                # 高级版本 traceroute
host {domain}             # DNS 查询,{domain} 前面可加 -a 查看详细信息
whois {domain}            # 取得域名 whois 信息
dig {domain}              # 取得域名 dns 信息
route -n                  # 查看路由表
netstat -a                # 列出所有端口
netstat -an               # 查看所有连接信息,不解析域名
netstat -anp              # 查看所有连接信息,包含进程信息(需要 sudo)
netstat -l                # 查看所有监听的端口
netstat -t                # 查看所有 TCP 链接
netstat -lntu             # 显示所有正在监听的 TCP 和 UDP 信息
netstat -lntup            # 显示所有正在监听的 socket 及进程信息
netstat -i                # 显示网卡信息
netstat -rn               # 显示当前系统路由表,同 route -n
ss -an                    # 比 netstat -an 更快速更详细
ss -s                     # 统计 TCP 的 established, wait 等

wget {url}                # 下载文件,可加 --no-check-certificate 忽略 ssl 验证
wget -qO- {url}           # 下载文件并输出到标准输出(不保存)
curl -sL {url}            # 同 wget -qO- {url} 没有 wget 的时候使用

sz {file}                 # 发送文件到终端,zmodem 协议
rz                        # 接收终端发送过来的文件

变量操作

varname=value             # 定义变量
varname=value command     # 定义子进程变量并执行子进程
echo $varname             # 查看变量内容
echo $$                   # 查看当前 shell 的进程号
echo $!                   # 查看最近调用的后台任务进程号
echo $?                   # 查看最近一条命令的返回码
export VARNAME=value      # 设置环境变量(将会影响到子进程)

array[0]=valA             # 定义数组
array[1]=valB
array[2]=valC
array=([0]=valA [1]=valB [2]=valC)   # 另一种方式
array=(valA valB valC)               # 另一种方式

${array[i]}               # 取得数组中的元素
${#array[@]}              # 取得数组的长度
${#array[i]}              # 取得数组中某个变量的长度

declare -a                # 查看所有数组
declare -f                # 查看所有函数
declare -F                # 查看所有函数,仅显示函数名
declare -i                # 查看所有整数
declare -r                # 查看所有只读变量
declare -x                # 查看所有被导出成环境变量的东西
declare -p varname        # 输出变量是怎么定义的(类型+值)

${varname:-word}          # 如果变量不为空则返回变量,否则返回 word
${varname:=word}          # 如果变量不为空则返回变量,否则赋值成 word 并返回
${varname:?message}       # 如果变量不为空则返回变量,否则打印错误信息并退出
${varname:+word}          # 如果变量不为空则返回 word,否则返回 null
${varname:offset:len}     # 取得字符串的子字符串

${variable#pattern}       # 如果变量头部匹配 pattern,则删除最小匹配部分返回剩下的
${variable##pattern}      # 如果变量头部匹配 pattern,则删除最大匹配部分返回剩下的
${variable%pattern}       # 如果变量尾部匹配 pattern,则删除最小匹配部分返回剩下的
${variable%%pattern}      # 如果变量尾部匹配 pattern,则删除最大匹配部分返回剩下的
${variable/pattern/str}   # 将变量中第一个匹配 pattern 的替换成 str,并返回
${variable//pattern/str}  # 将变量中所有匹配 pattern 的地方替换成 str 并返回

${#varname}               # 返回字符串长度

*(patternlist)            # 零次或者多次匹配
+(patternlist)            # 一次或者多次匹配
?(patternlist)            # 零次或者一次匹配
@(patternlist)            # 单词匹配
!(patternlist)            # 不匹配

array=($text)             # 按空格分隔 text 成数组,并赋值给变量
IFS="/" array=($text)     # 按斜杆分隔字符串 text 成数组,并赋值给变量
text="${array[*]}"        # 用空格链接数组并赋值给变量
text=$(IFS=/; echo "${array[*]}")  # 用斜杠链接数组并赋值给变量

A=( foo bar "a  b c" 42 ) # 数组定义
B=("${A[@]:1:2}")         # 数组切片:B=( bar "a  b c" )
C=("${A[@]:1}")           # 数组切片:C=( bar "a  b c" 42 )
echo "${B[@]}"            # bar a  b c
echo "${B[1]}"            # a  b c
echo "${C[@]}"            # bar a  b c 42
echo "${C[@]: -2:2}"      # a  b c 42  减号前的空格是必须的

$(UNIX command)           # 运行命令,并将标准输出内容捕获并返回
varname=$(id -u user)     # 将用户名为 user 的 uid 赋值给 varname 变量

num=$(expr 1 + 2)         # 兼容 posix sh 的计算,使用 expr 命令计算结果
num=$(expr $num + 1)      # 数字自增
expr 2 \* \( 2 + 3 \)     # 兼容 posix sh 的复杂计算,输出 10

num=$((1 + 2))            # 计算 1+2 赋值给 num,使用 bash 独有的 $((..)) 计算
num=$(($num + 1))         # 变量递增
num=$((num + 1))          # 变量递增,双括号内的 $ 可以省略
num=$((1 + (2 + 3) * 2))  # 复杂计算

事件指示符

!!                  # 上一条命令
!^                  # 上一条命令的第一个单词
!:n                 # 上一条命令的第n个单词
!:n-$               # 上一条命令的第n个单词到最后一个单词
!$                  # 上一条命令的最后一个单词
!-n:$               # 上n条命令的最后一个单词
!string             # 最近一条包含string的命令
!^string1^string2   # 最近一条包含string1的命令, 快速替换string1为string2
!#                  # 本条命令之前所有的输入内容
!#:n                # 本条命令之前的第n个单词, 快速备份cp /etc/passwd !#:1.bak

函数

# 定义一个新函数
function myfunc() {
    # $1 代表第一个参数,$N 代表第 N 个参数
    # $# 代表参数个数
    # $0 代表被调用者自身的名字
    # $@ 代表所有参数,类型是个数组,想传递所有参数给其他命令用 cmd "$@" 
    # $* 空格链接起来的所有参数,类型是字符串
    {shell commands ...}
}

myfunc                    # 调用函数 myfunc 
myfunc arg1 arg2 arg3     # 带参数的函数调用
myfunc "$@"               # 将所有参数传递给函数
myfunc "${array[@]}"      # 将一个数组当作多个参数传递给函数
shift                     # 参数左移

unset -f myfunc           # 删除函数
declare -f                # 列出函数定义

条件判断(兼容 posix sh 的条件判断):man test

statement1 && statement2  # and 操作符
statement1 || statement2  # or 操作符

exp1 -a exp2              # exp1 和 exp2 同时为真时返回真(POSIX XSI扩展)
exp1 -o exp2              # exp1 和 exp2 有一个为真就返回真(POSIX XSI扩展)
( expression )            # 如果 expression 为真时返回真,输入注意括号前反斜杆
! expression              # 如果 expression 为假那返回真

str1 = str2               # 判断字符串相等,如 [ "$x" = "$y" ] && echo yes
str1 != str2              # 判断字符串不等,如 [ "$x" != "$y" ] && echo yes
str1 < str2               # 字符串小于,如 [ "$x" \< "$y" ] && echo yes
str2 > str2               # 字符串大于,注意 < 或 > 是字面量,输入时要加反斜杆
-n str1                   # 判断字符串不为空(长度大于零)
-z str1                   # 判断字符串为空(长度等于零)

-a file                   # 判断文件存在,如 [ -a /tmp/abc ] && echo "exists"
-d file                   # 判断文件存在,且该文件是一个目录
-e file                   # 判断文件存在,和 -a 等价
-f file                   # 判断文件存在,且该文件是一个普通文件(非目录等)
-r file                   # 判断文件存在,且可读
-s file                   # 判断文件存在,且尺寸大于0
-w file                   # 判断文件存在,且可写
-x file                   # 判断文件存在,且执行
-N file                   # 文件上次修改过后还没有读取过
-O file                   # 文件存在且属于当前用户
-G file                   # 文件存在且匹配你的用户组
file1 -nt file2           # 文件1 比 文件2 新
file1 -ot file2           # 文件1 比 文件2 旧

num1 -eq num2             # 数字判断:num1 == num2
num1 -ne num2             # 数字判断:num1 != num2
num1 -lt num2             # 数字判断:num1 < num2
num1 -le num2             # 数字判断:num1 <= num2
num1 -gt num2             # 数字判断:num1 > num2
num1 -ge num2             # 数字判断:num1 >= num2

分支控制:if 和经典 test,兼容 posix sh 的条件判断语句

test {expression}         # 判断条件为真的话 test 程序返回0 否则非零
[ expression ]            # 判断条件为真的话返回0 否则非零

test "abc" = "def"        # 查看返回值 echo $? 显示 1,因为条件为假
test "abc" != "def"       # 查看返回值 echo $? 显示 0,因为条件为真

test -a /tmp; echo $?     # 调用 test 判断 /tmp 是否存在,并打印 test 的返回值
[ -a /tmp ]; echo $?      # 和上面完全等价,/tmp 肯定是存在的,所以输出是 0

test cond && cmd1         # 判断条件为真时执行 cmd1
[ cond ] && cmd1          # 和上面完全等价
[ cond ] && cmd1 || cmd2  # 条件为真执行 cmd1 否则执行 cmd2

输出/输入 重定向

cmd1 | cmd2                        # 管道,cmd1 的标准输出接到 cmd2 的标准输入
< file                             # 将文件内容重定向为命令的标准输入
> file                             # 将命令的标准输出重定向到文件,会覆盖文件
>> file                            # 将命令的标准输出重定向到文件,追加不覆盖
>| file                            # 强制输出到文件,即便设置过:set -o noclobber
n>| file                           # 强制将文件描述符 n的输出重定向到文件
<> file                            # 同时使用该文件作为标准输入和标准输出
n<> file                           # 同时使用文件作为文件描述符 n 的输出和输入
n> file                            # 重定向文件描述符 n 的输出到文件
n< file                            # 重定向文件描述符 n 的输入为文件内容
n>&                                # 将标准输出 dup/合并 到文件描述符 n
n<&                                # 将标准输入 dump/合并 定向为描述符 n
n>&m                               # 文件描述符 n 被作为描述符 m 的副本,输出用
n<&m                               # 文件描述符 n 被作为描述符 m 的副本,输入用
&>file                             # 将标准输出和标准错误重定向到文件
<&-                                # 关闭标准输入
>&-                                # 关闭标准输出
n>&-                               # 关闭作为输出的文件描述符 n
n<&-                               # 关闭作为输入的文件描述符 n
diff <(cmd1) <(cmd2)               # 比较两个命令的输出

文本处理 - cut

cut -c 1-16                        # 截取每行头16个字符
cut -c 1-16 file                   # 截取指定文件中每行头 16个字符
cut -c3-                           # 截取每行从第三个字符开始到行末的内容
cut -d':' -f5                      # 截取用冒号分隔的第五列内容
cut -d';' -f2,10                   # 截取用分号分隔的第二和第十列内容
cut -d' ' -f3-7                    # 截取空格分隔的三到七列
echo "hello" | cut -c1-3           # 显示 hel
echo "hello sir" | cut -d' ' -f2   # 显示 sir
ps | tr -s " " | cut -d " " -f 2,3,4  # cut 搭配 tr 压缩字符

文本处理 - sed

sed 's/find/replace/' file         # 替换文件中首次出现的字符串并输出结果 
sed '10s/find/replace/' file       # 替换文件第 10 行内容
sed '10,20s/find/replace/' file    # 替换文件中 10-20 行内容
sed -r 's/regex/replace/g' file    # 替换文件中所有出现的字符串
sed -i 's/find/replace/g' file     # 替换文件中所有出现的字符并且覆盖文件
sed -i '/find/i\newline' file      # 在文件的匹配文本前插入行
sed -i '/find/a\newline' file      # 在文件的匹配文本后插入行
sed '/line/s/find/replace/' file   # 先搜索行特征再执行替换
sed -e 's/f/r/' -e 's/f/r' file    # 执行多次替换
sed 's#find#replace#' file         # 使用 # 替换 / 来避免 pattern 中有斜杆
sed '1d' file                      # 删除文件第1行
sed '1,3d' file                    # 删除文件第1-3行
sed '/^$/d' file                   # 删除文件空行并打印
sed -i -r 's/^\s+//g' file         # 删除文件每行头部空格
sed -i 's/\s\+$//' file            # 删除文件每行末尾多余空格
sed -n '2p' file                   # 打印文件第二行
sed -n '2,5p' file                 # 打印文件第二到第五行

排序 - sort

sort file                          # 排序文件
sort -r file                       # 反向排序(降序)
sort -n file                       # 使用数字而不是字符串进行比较
sort -t: -k 3n /etc/passwd         # 按 passwd 文件的第三列进行排序
sort -u file                       # 去重排序

网络管理:ip / ifconfig / nmap …

ip a                               # 显示所有网络地址,同 ip address
ip a show eth1                     # 显示网卡 IP 地址
ip a add 172.16.1.23/24 dev eth1   # 添加网卡 IP 地址
ip a del 172.16.1.23/24 dev eth1   # 删除网卡 IP 地址
ip link show dev eth0              # 显示网卡设备属性
ip link set eth1 up                # 激活网卡
ip link set eth1 down              # 关闭网卡
ip link set eth1 address {mac}     # 修改 MAC 地址
ip neighbour                       # 查看 ARP 缓存
ip route                           # 查看路由表
ip route add 10.1.0.0/24 via 10.0.0.253 dev eth0    # 添加静态路由
ip route del 10.1.0.0/24           # 删除静态路由

ifconfig                           # 显示所有网卡和接口信息
ifconfig -a                        # 显示所有网卡(包括开机没启动的)信息
ifconfig eth0                      # 指定设备显示信息
ifconfig eth0 up                   # 激活网卡
ifconfig eth0 down                 # 关闭网卡
ifconfig eth0 192.168.120.56       # 给网卡配置 IP 地址
ifconfig eth0 10.0.0.8 netmask 255.255.255.0 up     # 配置 IP 并启动
ifconfig eth0 hw ether 00:aa:bb:cc:dd:ee            # 修改 MAC 地址

nmap 10.0.0.12                     # 扫描主机 1-1000 端口
nmap -p 1024-65535 10.0.0.12       # 扫描给定端口
nmap 10.0.0.0/24                   # 给定网段扫描局域网内所有主机
nmap -O -sV 10.0.0.12              # 探测主机服务和操作系统版本