简介:《Kali Linux 常用命令大全》面向刚接触Kali与Linux安全测试的学习者,也适合需要随手查阅基础命令的从业者,用于缓解命令多、用法散、排错时难以快速定位的问题。压缩包内仅含1个docx文档,体积约1.96MB,便于离线阅读与按目录检索;内容以命令手册形式组织,覆盖文件与目录操作、系统信息查看、文本处理等日常操作,并延伸到帮助查询、登录记录、用户切换、电源管理及路径操作等场景。每个条目围绕命令用途、常见参数和典型示例展开,目录层级清晰,可帮助读者从基础文件管理逐步熟悉Kali环境中的系统查看、文本筛选与权限切换思路。已有633人学习,适合作为入门阶段的速查清单和练习索引,也可在安全测试准备中用于补齐Linux命令基础、提升终端操作效率。
1. 一份 DOCX 顶半个手册:Kali 常用命令该按什么顺序啃
刚装完 Kali Linux 的人,十个里有八个会在第一周把终端敲成一团乱麻:ls出来的结果看不懂权限位,rm一不小心删掉了刚配好的目录,man查出来满屏英文直接劝退。这份《Kali 常用命令大全》解决的正是这个阶段的问题——它不是一本讲原理的操作系统教材,而是一张按命令逐条拆开的速查表,覆盖目录查看、帮助查询、登录审计、电源管理、路径切换、文件增删改查、文本查看与打包压缩这几条主线。它适合两类人:一类是刚接触 Kali、要在授权范围内做安全评估环境熟悉的新手,需要一份能对照敲的命令清单;另一类是日常在 Linux 上做运维或 web 渗透前置准备的老手,想补几个平时用得少、关键时刻又要查的参数,比如last -R、tar的参数顺序、su与sudo的环境差异。下面按命令族拆开讲,参数怎么设、哪里会翻车,一并说清。
2. 文件与路径操作:ls 到 rm 九个命令的参数边界
文件系统操作是整套命令里调用频率最高的一块,也是误操作代价最大的一块。DOCX 里从ls、pwd、cd一路讲到touch、mkdir、cp、mv、rm、ln,逻辑是按“看清楚 → 建出来 → 搬走 → 删掉”的顺序排的。照着这个顺序练一遍,比零散记参数有效得多,因为每个命令的输出都会成为下一个命令的输入。
2.1 ls 的四种组合,先把目录看明白
ls默认按文件名排序输出当前目录的非隐藏内容,真正有用的是参数组合。-a把以.开头的隐藏项放出来,-l转成长格式(权限、属主、大小、时间),-t按修改时间倒序,-R递归展开子目录,-h把字节数换成人能读的 K/M/G。要注意-h单独用几乎没有意义,它只对-l的长格式生效,这是新手最常见的困惑之一。
# 只看当前目录非隐藏内容 ls # 长格式,最常用的一条 ls -l # Kali 默认给 root 配了别名,ll 等价于 ls -l ll # 全部内容,含 . 开头的隐藏文件与目录 ls -a # 全部内容 + 长格式,排查配置文件时用得最多 ls -al # 长格式 + 人类可读大小 + 按时间倒序,找最近改过的文件 ls -lhtll这个别名来自 shell 的配置文件,Kali 默认 shell 是 zsh,别名写在~/.zshrc里,换到 bash 环境(比如某些脚本或sh -c)就不生效,脚本里一律写全ls -l,别偷懒。ls -lht是排查“哪个文件刚被改过”的快捷方式,输出第一行之后按时间从新到旧排,配合head截前几行就能定位。
-R在目录树很深的时候输出会失控,几十万行刷屏是常事。我一般只在明确知道子目录层级不超过两层的场景用它,深度不确定就换find . -maxdepth 2,可控性更好。
2.2 pwd 与 cd:符号链接下的两个视角
pwd打印当前工作目录的绝对路径,默认-L打印的是环境变量$PWD的值,如果当前路径是符号链接,输出的就是链接路径;-P打印的是物理位置,会一路解析到真实目录。cd的两个参数与之对应:-L跟随符号链接进入链接目录,-P直接跳到链接指向的物理目录。日常用不出差别,但在做目录挂载、软链转发、容器卷映射时,pwd -P和pwd -L输出不一样,脚本里取路径一定用-P,否则后续拼接出来的路径可能指向错误位置。
# 默认视角,可能是软链接路径 pwd # 物理路径,解析掉所有符号链接 pwd -P # 回到上一个工作目录,靠环境变量 OLDPWD 实现 cd -cd -是省事的好东西,它读取OLDPWD并切换过去,同时把当前目录写进OLDPWD,形成来回切换。cd不带参数则回到$HOME。这两个行为在写交互式脚本时有用,但在非交互脚本里不要依赖OLDPWD,子 shell 之间不共享。
2.3 touch 与 mkdir:时间戳和递归创建
touch承担两个职责:文件不存在时创建空文件,存在时更新访问时间 atime、修改时间 mtime、状态变更时间 ctime 为当前时间。-a只改 at 和 ct,-m只改 mt 和 ct,-t可以指定时间,格式是[[CC]YY]MMDDhhmm[.ss]。
# 建三个空文件 touch a.txt b.txt c.txt # 只更新访问时间 touch -a a.txt # 把 mtime 改成指定时间,格式 年月日时分 touch -t 202401150930 a.txt # 用参考文件的时间戳覆盖目标文件 touch -r a.txt b.txttouch -t在复现日志时间线、构造测试数据时很实用,比如要造一批“看起来是三天前生成”的文件,直接touch -t比改系统时间安全得多。
mkdir的关键参数只有两个:-p递归创建多级目录且已存在不报错,-m建目录的同时指定权限(八进制,直接生效,不受 umask 影响)。
# 一次性建三级目录,中间层不存在也不报错 mkdir -p /tmp/lab/recon/notes # 建目录并指定权限为 700 mkdir -m 700 /tmp/lab/private-m和“先mkdir再chmod”的区别在于中间态:mkdir -m 700创建出来的目录从第一刻就是 700,不存在短暂的默认权限窗口。涉及敏感目录时这个差别有意义。
2.4 cp、mv、rm、ln:四个高风险命令的参数取舍
cp复制,-R/-r递归处理目录,-p保留源文件的权限、属主、时间戳,-d复制符号链接本身而不是它指向的内容,-a等价于-dpR三者叠加,是归档式复制。日常备份目录直接用-a,比手拼三个参数稳。
# 递归复制目录并保留属性 cp -a /etc/nginx /backup/nginx-$(date +%F) # 只复制链接本身,不跟进目标 cp -d link1 link2 # 交互式覆盖,目标存在时先问 cp -i report.txt /tmp/mv兼具移动和重命名两种语义,同一父目录内移动就是改名。-i覆盖前询问,-f强制覆盖不询问,-b覆盖前先备份成目标名~,-u只在源比目标新时才覆盖。
# 覆盖前自动备份,后悔药就在这 mv -b config.yaml config.yaml.new # 只在源较新时更新,做增量同步的土办法 mv -u build/* /var/www/rm是这套命令里唯一没有回收站的,-f强制、-i询问、-r/-R递归、-v显示过程。注意 root 用户的rm通常没有配-i别名,敲下去就是直接删。
# 递归删除并打印每个被删项,删之前先看清楚 rm -rv /tmp/lab/old # 删除前逐项确认,处理不确定目录时用 rm -ri /tmp/lab/maybeln建链接,-s建软链接(符号链接)。区别要记牢:硬链接指向同一个 inode,删掉任一链接文件数据仍在,不能跨文件系统,不能给目录建;软链接是一个独立的小文件,存的是目标路径字符串,目标被删就变成死链,可以跨文件系统,可以指向目录。DOCX 里强调软链接的源要写绝对路径,原因是相对路径的软链接在移动位置后会解析失败,除非你精确控制链接与目标的相对层级。
# 软链接,源写绝对路径 ln -s /opt/tools/bin/scanner /usr/local/bin/scanner # 硬链接,两个名字共享同一份数据 ln /data/original.bin /data/hardlink.bin3. 帮助体系与身份电源:查不到 man 时的四级回退
命令记不住是常态,把帮助查询的路径理顺,比背参数划算。DOCX 把帮助命令单列一章,顺序是whatis→help→man→info,这个顺序实际上就是一条从“一句话”到“一本书”的回退链。后面接登录审计和电源管理,是因为这三块都属于“系统级操作”,权限要求和风险等级都比文件操作高一档。
3.1 四级查询顺序与各自的失效场景
whatis查命令的一句话描述,靠的是预建的手册索引数据库,不是实时解析。速度极快,但数据库没建或者新装的软件没入库时会返回nothing appropriate。
# 一句话描述 whatis ls # 查不到时重建索引,再查一次 sudo mandb whatis lshelp是 shell 内建命令,只对 bash/zsh 内置的命令有效,比如cd、echo、alias、export。对外部可执行文件(ls、find)用help ls会直接报错。判断一个命令是内建还是外部,用type。
# 判断命令类型 type cd # cd is a shell builtin type ls # ls is aliased to `ls --color=auto` type find # find is /usr/bin/find # 内建命令用 help help cd # 外部命令用 --help 拿简要参数表 ls --helpman是主力,手册页按分区组织,1 是用户命令,5 是配置文件格式,8 是系统管理命令。同一个名字在不同分区可能是完全不同的东西,比如man 5 passwd看的是文件格式,man 1 passwd看的是改密码命令。
# 默认按分区顺序找第一个匹配 man ls # 指定分区 man 5 passwd # 按关键词反查手册,忘记命令名时用 man -k passwordinfo是 GNU 项目的文档格式,比 man 多超链接和节点跳转,但 Kali 默认不装,需要手动补。
sudo apt-get install -y info info coreutils四级回退的实际用法是:先whatis拿一句话,判断是不是你要的命令;是内建就help;外部命令用命令 --help快速看参数;参数含义说不清再man;GNU 工具的行为细节(比如tar的边界情况)去info翻。
3.2 中文 man 的安装与别名落点
英文手册页对新手是硬门槛。DOCX 给的方案是装中文 man 包再配别名,思路没问题,但有个细节要注意:man -M指定的是手册搜索路径,别名要写进当前 shell 的配置文件,Kali 默认是~/.zshrc,如果你切到 bash 就要写~/.bashrc,两边都写也不冲突。
# 更新索引并安装中文手册包 sudo apt update sudo apt install manpages-zh # 写入 zsh 别名,用 cman 调中文手册 echo 'alias cman="man -M /usr/share/man/zh_CN"' >> ~/.zshrc source ~/.zshrc # 验证 cman lsman -M后面跟的是目录,man 会去该目录下按man1、man5、man8的层级找对应文件。中文包覆盖不全,缺失的条目会自动回落到英文,这属于正常现象,不是安装失败。
3.3 su 与 sudo:环境变量才是分水岭
su切用户,-表示重新开启一个登录 shell(同时加载目标用户的环境变量和家目录),-m保留当前环境变量,-c只执行一条命令后恢复原身份,-s指定 shell。
# 切换到 root 并加载 root 的环境 su - # 保留当前环境变量切换 su -m # 以 root 执行单条命令后回到原用户 su -c "systemctl restart ssh"关键差异在这里:su不带-时,切换后$PATH、$HOME仍然是原用户的,你会遇到“明明切到 root 了,which却找不到/sbin下的命令”。su -才是完整的登录切换。sudo则是以另一个用户身份执行单条命令,默认不切换 shell 环境,权限按/etc/sudoers配置走,比共享 root 密码更可控。
# 以 root 身份执行单条命令 sudo systemctl status ssh # 拿到一个 root 的登录 shell sudo -i # 以指定用户身份执行 sudo -u www-data idsudo -i和su -效果接近,区别在于sudo -i走的是 sudoers 授权,不需要知道 root 密码,且会记录审计日志。生产环境优先用 sudo,su -留着做应急。
3.4 shutdown、halt、reboot:三种关机不是一回事
shutdown是安全的关机方式,会先通知所有登录用户、冻结新的登录、逐项停止服务再断电。-h关机,-r重启,-c取消已排期的关机,-k只发通知不真关,-f重启时跳过 fsck,-F强制 fsck。时间可以写成+5(五分钟后)或now。
# 五分钟后关机并广播通知,注意 + 和数字之间不能有空格 shutdown -h +5 "System will shut down after 5 minutes" # 立即重启 shutdown -r now # 取消已排期的关机 shutdown -c # 只广播不关机,做演练 shutdown -k +10 "Maintenance drill"halt直接执行硬件停机,不逐项关闭服务;shutdown会先停服务再调halt。reboot重启,参数与halt基本一致:-w只写 wtmp 记录不真操作,-n关机前不做 sync 同步(危险),-d不写 wtmp,-i关机前关闭所有网络接口,-p关机时调用 poweroff。
halt -n和reboot -n跳过 sync,意味着内存里未落盘的数据直接丢。这两个参数出现在文档里是为了完整性,实际操作中除非磁盘已经挂死、正常 sync 会卡住,否则不要碰。直接拔电源关机在 Linux 上的风险不在于“会不会坏”,而在于后台进程的写入缓冲,shutdown存在的意义就是把这段时间留出来。
4. 查看、检索与打包:cat 到 tar 的组合用法
文本查看和文件检索是排查问题的两支主力。DOCX 覆盖了cat、more、less、head、tail、find、locate、which、gzip、tar,这些命令单独看都简单,组合起来才有威力,而组合的坑往往出在参数位置和输出格式上。
4.1 cat、more、less:三个层级的查看器
cat全量输出,适合短文件。三个功能:显示内容、拼接多个文件、显示不可见字符。-n给所有行编号,-b只给非空行编号,-A显示不可打印字符(行尾$,制表符^I)。
# 看短文件并编号 cat -n /etc/hosts # 显示不可见字符,排查 Windows 换行符和尾部空格 cat -A config.ini # 拼接多个文件输出到新文件 cat part1.txt part2.txt > full.txtcat -A是排查配置文件“看起来一样但就是不生效”的常用手段,Windows 的\r\n会显示成^M$,多余的空格和制表符一目了然。
more全屏分页,只能向前翻,快捷键 Space 翻页、Enter 翻行、b回退、q退出。+n从第 n 行开始,+/pattern从匹配行前两行开始,-c先清屏再显示。less是more的增强版,支持前后翻页和搜索:/字符串向下搜,?字符串向上搜,n跳到下一个匹配,q退出。
# 从第 50 行开始看 more +50 /var/log/syslog # less 打开后直接定位到 error less +/error /var/log/syslog日志动辄几百兆,用cat打开就是自找麻烦。less是懒加载的,打开大文件几乎不耗时,而cat会一次性读进管道,内存和终端都会被拖死。这个差别在排查线上问题时很实际。
4.2 head 与 tail:日志场景的两个方向
head看头部,默认 10 行,-n指定行数,-c按字符数,-v显示文件名,-q不显示文件名。tail看尾部,参数一致,另外还有一个文档里没写但日志场景离不开的-f,用于持续跟踪文件追加内容。
# 看配置文件的头 20 行 head -n 20 /etc/ssh/sshd_config # 只看前 200 个字符 head -c 200 access.log # 看日志最后 50 行 tail -n 50 /var/log/auth.log # 持续跟踪,Ctrl+C 退出 tail -f /var/log/auth.logtail -f是排查服务启动失败的标配,先开一个窗口跟踪日志,再在另一个窗口重启服务,报错会实时滚出来。比反复cat高效得多,也不用记时间点。head -c在处理二进制文件头(判断文件类型、校验魔数)时比head -n更精确,因为二进制没有“行”的概念。
4.3 find 与 locate:两套完全不同的模型
find实时遍历文件系统,条件可以任意组合:-name按名字(区分大小写),-iname忽略大小写,-user/-group按属主属组,-size按大小(+n大于,-n小于,单位c字节、kKB、GGB),-type按类型(f普通文件、d目录、l软链接),-perm按权限,-path匹配完整路径。
# 当前目录下所有 .conf 文件 find . -name "*.conf" # 忽略大小写 find /etc -iname "*.CONF" # 找大于 100M 的普通文件 find / -type f -size +100M 2>/dev/null # 按权限精确匹配 644 find . -type f -perm 644 # 找到后批量删除,-exec 结尾的 \; 不能少 find /tmp/lab -type f -name "*.tmp" -exec rm -f {} \;-exec后面跟命令,{}代表找到的文件,\;是命令结束符,必须转义,否则被 shell 吃掉。这个位置漏掉分号是最常见的语法错误,报错信息还不直观。
locate查的是预建索引数据库,速度比find快一个数量级,但结果可能过期。-i忽略大小写,-n限制输出行数。索引由updatedb维护,新装的文件不updatedb就查不到。
# 先刷新索引,再查 sudo updatedb locate -i nmap # 只输出前 10 条 locate -n 10 "*.conf"两者的选择很明确:知道大概位置、要精确条件、要求结果实时,用find;只记得文件名片段、要快速扫全盘,用locate再拿结果去find验证。find /在大盘上跑几分钟很正常,locate是毫秒级,但代价是索引可能滞后,做安全排查时不能只信locate。
which查命令的绝对路径,原理是遍历$PATH里的目录找第一个同名可执行文件。它回答的是“我敲的这个命令,实际执行的是哪个文件”,在排查同名命令冲突、确认工具是否装成功时最直接。
which python3 which -a python3 # 列出 PATH 中所有匹配项which -a比which更有用,特别是环境里装了多个版本的时候,能看到全部候选和优先级顺序。
4.4 gzip 与 tar:压缩和打包是两件事
gzip只压缩单个文件,压缩后原文件变成.gz,原文件消失。-d解压,-f强制,-r递归处理目录下所有文件(注意是逐个压缩,不是打包),-l列出压缩信息,-v显示过程。
# 压缩,原文件变成 access.log.gz gzip access.log # 解压 gzip -d access.log.gz # 查看压缩比 gzip -l access.log.gztar才是打包,把多个文件和目录合成一个归档,再可选地用 gzip 压缩。参数含义:-c创建,-x提取,-z用 gzip 压缩/解压,-v显示过程,-f指定归档文件名。
# 打包并压缩,-f 后面必须紧跟文件名 tar -czvf backup-$(date +%F).tar.gz /var/www/html # 解包到指定目录 tar -xzvf backup-20240115.tar.gz -C /tmp/restore # 只看包内文件列表,不解压 tar -tzvf backup-20240115.tar.gz参数顺序是这块最容易翻车的地方。-f后面必须紧跟归档文件名,tar -czvf和tar -cfvz看起来差不多,后者会把v当成文件名去创建,然后报错或生成一个奇怪的档案。老式写法tar czvf(不带横杠)能工作,但一旦混用带横杠和不带横杠的形式就容易出错,统一用带横杠的-czvf更稳。-C指定解压目标目录,位置放在归档名之后,写在前面会被当成文件名的一部分。
5. 避坑与排查:五条让命令翻车的现场记录
参数记不住可以查,习惯错了会反复踩。下面五条是这套命令在实际使用里出现频率最高的翻车场景,每条按现象、原因、解决三段说。
5.1 rm -rf 后面的通配符被 shell 提前展开
现象:执行rm -rf $DIR/*,变量拼错或者目录为空时,命令变成了rm -rf /*,系统目录被清空。
原因:$DIR未定义时展开为空字符串,/*保留,shell 把/下的所有内容作为参数传给rm。同理,路径里有空格没加引号,会被拆成多个参数。
解决:变量一律加引号并做空值判断,删除前先打印。
# 危险写法 rm -rf $DIR/* # 安全写法:判断非空 + 引号 + 先确认路径 [ -n "$DIR" ] && [ -d "$DIR" ] || { echo "DIR invalid"; exit 1; } echo "target: ${DIR:?}/*" rm -rf -- "${DIR:?}"/*${DIR:?}在变量为空时报错并中止,--告诉rm后面不再解析选项,防止目录名以-开头被当成参数。
5.2 cp -a 复制过去后权限和属主全变了
现象:用cp -r复制网站目录到新位置,文件权限变成默认 644/755,属主变成当前用户,服务起不来。
原因:-r只递归,不带属性保留。默认行为会按 umask 重新计算权限,属主变成执行者。-p保权限和时间戳,-d处理软链接,-a是三者合并。
解决:归档式复制统一用cp -a,跨主机传输先tar再解包,tar天然保留属主和时间戳。
# 保留属性复制目录 cp -a /var/www/html /backup/html-$(date +%F) # 跨机迁移更稳的方式 tar -czf - -C /var/www html | ssh user@host "tar -xzf - -C /var/www"5.3 tar 参数顺序写反导致归档文件异常
现象:tar -cfvz backup.tar.gz dir/执行后没报错,但生成的包解不开,或者包名变成了v。
原因:-f必须紧跟归档文件名,-cfvz里f后面接的是v,tar把v当成目标文件名,z和dir被当成待打包内容。
解决:固定写成-czvf,把f放在最后一位、紧跟文件名,形成肌肉记忆。
# 正确:f 最后,紧跟包名 tar -czvf backup.tar.gz /path/to/dir # 解包同理 tar -xzvf backup.tar.gz -C /target5.4 whatis 返回 nothing appropriate
现象:刚装完一个工具,whatis 工具名提示nothing appropriate,但man 工具名正常。
原因:whatis查的是手册索引数据库,apt安装后索引未必同步更新,尤其在离线装包或手动拷贝 man 文件的场景下。
解决:重建索引再查,仍然查不到就说明该命令没有登记手册条目,直接命令 --help。
sudo mandb whatis tar # 索引重建后仍为空,走 --help tar --help | head -n 205.5 halt -n 之后文件系统报错
现象:为了快速关机用了halt -n,重启后出现文件系统需要 fsck 的提示,个别日志文件内容截断。
原因:-n跳过 sync,页缓存里没落盘的写操作直接丢失,元数据和数据不一致。
解决:正常关机走shutdown -h now,它会先停服务再 sync 再断电。确实要跳过 fsck 用shutdown -h -f,而不是halt -n。任何情况下都不建议在数据盘有写入时用-n。
# 正确关机流程 sudo sync sudo shutdown -h now6. 进阶:把散命令串成一条可复用的核查链
单个命令用熟之后,真正拉开效率差距的是把它们串成固定流程。我处理一台陌生授权环境的 Kali 时,第一轮不碰任何工具,只跑一遍下面这条核查链,五分钟内就能把“系统是什么、谁登过、有没有异常大文件、日志在哪”摸清楚。
#!/bin/bash # quick-check.sh —— 环境初查,只读操作,不做任何修改 set -u echo "===== 1. 系统与内核 =====" uname -a cat /etc/os-release | head -n 3 echo "===== 2. 谁登录过 =====" last -n 10 -R echo "===== 3. 当前登录会话 =====" who echo "===== 4. 大于 500M 的文件 =====" find / -xdev -type f -size +500M 2>/dev/null | head -n 20 echo "===== 5. 最近 24 小时改动的配置 =====" find /etc -type f -mtime -1 2>/dev/null | head -n 30 echo "===== 6. 关键日志尾部 =====" tail -n 20 /var/log/auth.log 2>/dev/null逐条说明参数意图:last -n 10 -R只取最近 10 条登录记录,-R去掉主机名和 IP 列,输出更干净,适合快速扫;find / -xdev里的-xdev是限制不跨文件系统,避免扫到挂载的网络盘和临时盘把时间拖长;-mtime -1是 24 小时内修改,比-mmin的粗粒度更适合做“最近动过什么”的初筛;tail前面加2>/dev/null是因为部分发行版日志路径不同,文件不存在时不该中断脚本。
验证这条链是否有效,有个简单办法:故意在/etc下建一个测试文件,touch /etc/_test_probe,然后重跑第 5 段,看它是否出现在输出里。出现了说明时间条件写对了;再rm /etc/_test_probe,重跑一遍确认消失。这个“先注入再验证”的习惯,比看文档猜参数可靠得多。
血泪经验是:这类脚本一律只读,绝不在第一轮里带rm、mv、>重定向。初查阶段的信息量已经足够定位方向,动手改是第二轮的事。我早年在一台客户机上把find的结果直接管道给xargs rm,结果文件名里带空格被拆成两段,删错了一个正在用的配置文件,从那以后凡是删除类操作,我都强制先echo一遍目标列表,人眼过一遍再执行。工具再熟,这一步也不省。希望帮到你。
本文还有配套的精品资源,点击获取