第三章 bash shell 基础命令
3.3 与bash手册交互
man
使用 man <命令名>
查找某命令的手册页,作为快速参考
空格翻页,enter逐行查看,q键退出
3.4 浏览文件系统
3.5 列出文件和目录
ls
-F:区分目录和文件 /为目录 *为可执行文件 -a:显示隐藏文件 -R:递归列出当前目录与子目录中的文件 -l:显示文件详细信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
┌──(beeee㉿kali)-[/] └─$ ls -F bin@ etc/ initrd.img.old@ libx32@ mnt/ proc/ sbin@ tmp/ vmlinuz@ boot/ home/ lib@ lost+found/ OpenVPN/ root/ srv/ usr/ vmlinuz.old@ dev/ initrd.img@ lib64@ media/ opt/ run/ sys/ var/ ┌──(beeee㉿kali)-[/] └─$ ls -a . boot etc initrd.img.old libx32 mnt proc sbin tmp vmlinuz .. .cache home lib lost+found OpenVPN root srv usr vmlinuz.old bin dev initrd.img lib64 media opt run sys var ┌──(beeee㉿kali)-[/] └─$ ls -F -R .: bin@ etc/ initrd.img.old@ libx32@ mnt/ proc/ sbin@ tmp/ vmlinuz@ boot/ home/ lib@ lost+found/ OpenVPN/ root/ srv/ usr/ vmlinuz.old@ dev/ initrd.img@ lib64@ media/ opt/ run/ sys/ var/ ./boot: config-6.1.0-kali5-686-pae initrd.img-6.1.0-kali5-686-pae vmlinuz-6.1.0-kali5-686-pae grub/ System.map-6.1.0-kali5-686-pae ./boot/grub: fonts/ grub.cfg grubenv i386-pc/ locale/ themes/ unicode.pf2 ... ┌──(beeee㉿kali)-[/] └─$ ls -l 总计 72 lrwxrwxrwx 1 root root 7 2023年 3月20日 bin -> usr/bin drwxr-xr-x 3 root root 4096 2023年 3月31日 boot drwxr-xr-x 17 root root 3400 10月25日 10:21 dev drwxr-xr-x 183 root root 12288 10月25日 10:21 etc drwxr-xr-x 3 root root 4096 2023年 3月20日 home lrwxrwxrwx 1 root root 35 2023年 3月20日 initrd.img -> boot/initrd.img-6.1.0-kali5-686-pae |
3.6 处理文件
touch <filename> 创建文件
创建空文件,更改文件时间戳
cp <source> <destination> 复制文件
-i 强制shell询问是否需要覆盖已有文件 -R 递归复制整个目录的内容
<source> <destination>都既可以表示目录,也可以表示文件 若为目录建议在目录名后加”/”,并推荐使用相对路径
链接文件
软链接(符号链接)
使用命令ln -s
1 2 3 4 5 6 7 8 9 10 11 12 13 |
┌──(beeee㉿kali)-[~/test] └─$ ls -l 总计 0 -rw-r--r-- 1 beeee beeee 0 10月25日 13:55 test1 ┌──(beeee㉿kali)-[~/test] └─$ ln -s test1 slink_test1 ┌──(beeee㉿kali)-[~/test] └─$ ls -l 总计 0 lrwxrwxrwx 1 beeee beeee 5 10月25日 13:56 slink_test1 -> test1 -rw-r--r-- 1 beeee beeee 0 10月25日 13:55 test1 |
硬链接
使用命令ln
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
┌──(beeee㉿kali)-[~/test] └─$ ls -l 总计 0 lrwxrwxrwx 1 beeee beeee 5 10月25日 13:56 slink_test1 -> test1 -rw-r--r-- 1 beeee beeee 0 10月25日 13:55 test1 ┌──(beeee㉿kali)-[~/test] └─$ ln test1 hlink_test1 ┌──(beeee㉿kali)-[~/test] └─$ ls -li 总计 0 1766151 -rw-r--r-- 2 beeee beeee 0 10月25日 13:55 hlink_test1 1766161 lrwxrwxrwx 1 beeee beeee 5 10月25日 13:56 slink_test1 -> test1 1766151 -rw-r--r-- 2 beeee beeee 0 10月25日 13:55 test1 |
hlink_test1 和 test1 根本而言是同一个文件
mv 移动/重命名文件
-i 强制shell询问是否需要覆盖已有文件
rm 删除文件
-i 询问是否要删除文件 -f 强制删除
3.7 管理目录
mkdir 创建目录
-p 批量创建目录和子目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
┌──(beeee㉿kali)-[~/test] └─$ mkdir -p NewDir/SubDir/UnderDir dir ┌──(beeee㉿kali)-[~/test] └─$ ls -R .: dir NewDir ./dir: ./NewDir: SubDir ./NewDir/SubDir: UnderDir ./NewDir/SubDir/UnderDir: |
rmdir 删除目录
默认只能删除空目录
一口气删除目录树: rm -rf (慎用)
3.8 查看文件内容
file 查看文件类型
查看整个文件
cat more less
查看部分文件
tail 显示文件最后几行(默认10行)
head 显示文件开头几行(默认10行)
使用-n指定行数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
┌──(beeee㉿kali)-[~/test] └─$ cat test_txt line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 ┌──(beeee㉿kali)-[~/test] └─$ tail -n 7 test_txt line9 line10 line11 line12 line13 line14 line15 ┌──(beeee㉿kali)-[~/test] └─$ head -n 5 test_txt line1 line2 line3 line4 line5 |
第四章 更多的bash shell命令
4.1 监测程序
ps 探查进程
常用:ps -ef 显示系统中的所有进程并扩充内容
只能显示某一特定时间点的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
┌──(beeee㉿kali)-[~] └─$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 3 23:41 ? 00:00:02 /sbin/init splash root 2 0 0 23:41 ? 00:00:00 [kthreadd] root 3 2 0 23:41 ? 00:00:00 [rcu_gp] root 4 2 0 23:41 ? 00:00:00 [rcu_par_gp] root 5 2 0 23:41 ? 00:00:00 [slub_flushwq] root 6 2 0 23:41 ? 00:00:00 [netns] root 7 2 0 23:41 ? 00:00:00 [kworker/0:0-events] root 8 2 0 23:41 ? 00:00:00 [kworker/0:0H-events_highpri] root 9 2 3 23:41 ? 00:00:02 [kworker/u64:0-events_unbound] root 10 2 0 23:41 ? 00:00:00 [mm_percpu_wq] root 11 2 0 23:41 ? 00:00:00 [rcu_tasks_kthread] root 12 2 0 23:41 ? 00:00:00 [rcu_tasks_rude_kthread] root 13 2 0 23:41 ? 00:00:00 [rcu_tasks_trace_kthread] root 14 2 0 23:41 ? 00:00:00 [ksoftirqd/0] |
UID | 启动该进程的用户 |
PID | 进程ID |
PPID | 父进程的PID |
C | 进程生命周期的CPU利用率 |
STIME | 进程启动时的系统时间 |
TTY | 进程是从哪个终端设备启动的 |
TIME | 运行进程的累计CPU时间 |
CMD | 启动的程序名称 |
top 实时监测进程
结束进程 : kill pkill
kill <PID> -s 强制终止 检查kill命令是否生效,可再次执行ps top命令
pkill <进程名> 支持通配符
4.2 监测磁盘空间
挂载存储设备
mount 默认输出当前系统已挂载的设备列表,较新版本的内核还会挂载大量用作管理目的的虚拟文件系统 可用于手动在虚拟目录中挂载设备
umount 卸载设备 支持通过设备文件或者挂载点来指定要卸载的设备,若有程序正在使用设备上的文件,则系统将不允许卸载该设备
查看所有已挂载磁盘的使用情况 df
常用-h 显示磁盘空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
┌──(beeee㉿kali)-[~] └─$ df -t ext4 -t vfat 文件系统 1K的块 已用 可用 已用% 挂载点 /dev/sda1 29801344 13135012 15127160 47% / ┌──(beeee㉿kali)-[~] └─$ df -h 文件系统 大小 已用 可用 已用% 挂载点 udev 973M 0 973M 0% /dev tmpfs 201M 1.2M 200M 1% /run /dev/sda1 29G 13G 15G 47% / tmpfs 1004M 0 1004M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock vmhgfs-fuse 293G 291G 2.9G 100% /mnt/hgfs tmpfs 201M 80K 201M 1% /run/user/1000 |
显示某个特定目录的磁盘使用情况 du
默认显示当前目录下所有文件、目录、子目录的磁盘使用情况,以磁盘块为单位来表明每个文件或目录占用了多大存储空间
-c 显示所有已列出文件的总大小 -h 以K M G为单位输出大小 -s 输出每个参数的汇总信息
4.3 处理数据文件
数据排序 sort
默认将文本文件中的数据进行字符排序
-n 将数字按值排序 -M 将字符按月排序 -r 逆序排序 -d 仅考虑空白字符和字母数字字符,不考虑特殊字符 -t 指定字段分隔符 -k 排序键从POS1位置开始,到POS2位置结束(如果指定POS2的话)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
┌──(beeee㉿kali)-[~] └─$ sort -t ':' -k 3 -n /etc/passwd root:x:0:0:root:/root:/usr/bin/zsh daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
┌──(beeee㉿kali)-[~] └─$ du -sh * | sort -nr 26M nmap_nsevulscan 24K test 16K p0f.log 16K myscan01.xml 14M 下载 12K myscan01.html 4.0K 桌面 4.0K 音乐 4.0K 文档 4.0K 图片 4.0K 视频 4.0K 模板 4.0K 公共 |
数据搜索 grep
grep [options] pattern [file]
数据压缩
工具 | 文件拓展名 | 描述 |
---|---|---|
bzip2 | .bz2 | |
compress | .Z | 使用少 |
gzip | .gz | 最流行 |
xz | .xz | 日渐流行 |
zip | .zip |
gzip软件包包含:
gzip 用于压缩文件 可用通配符 gzcat 用于查看压缩过的文本文件的内容 gunzip 用于解压文件
数据归档 tar
tar function [options] object1 object2
function 定义了tar要进行的操作
操作 | 描述 |
---|---|
-A | 将一个tar归档文件追加到另一个tar归档文件末尾 |
-c | 创建新的tar归档文件 |
-d | 检查归档文件和文件系统的不同之处(–diff)从tar归档文件中删除文件(–delete) |
-r | 将文件追加到tar归档文件末尾 |
-t | 列出tar归档文件的内容 |
-u | 将比tar归档文件中已有的同名文件更新的文件追加到该归档文件 |
-x | 从tar归档文件中提取文件 |
[options]
选项 | 描述 |
---|---|
-C dir | 切换到指定目录 |
-f file | 将结果输出到文件或设备 |
-j | 将输出传给bzip2命令进行压缩 |
-J | 将输出传给xz命令进行压缩 |
-p | 保留文件的所有权限 |
-v | 在处理文件时显示文件名 |
-z | 将输出传给gzip命令进行压缩 |
-Z | 将输出传给compress命令进行压缩 |
1 2 3 |
tar -cvf test,tar test1/ test2/ tar -tf test.tar tar -xvf test.tar |
.tgz结尾的文件是经gzip压缩过的tar文件 可用tar -zxvf filename.tgz 来提取其中的内容
第五章 理解shell
5.1 shell的类型
可使用which bash命令找出 bash shell 的位置 bash通常位于/usr/bin 目录,也可能位于/bin目录 在现代linux系统中,/bin目录通常是/usr/bin目录的符号链接
1 2 3 |
┌──(beeee㉿kali)-[~] └─$ which bash /usr/bin/bash |
可能还存在tcsh zsh csh dsh等等shell 可查看文件 /etc/shells文件列出各种已安装的shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
┌──(beeee㉿kali)-[~] └─$ cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/bash /usr/bin/bash /bin/rbash /usr/bin/rbash /bin/dash /usr/bin/dash /usr/bin/tmux /usr/bin/screen /bin/zsh /usr/bin/zsh /usr/bin/zsh |
默认的交互式shell也称登录shell,只要用户登录某个虚拟控制台终端或是在GUI中启动终端仿真器
作为默认的系统shell,sh用于那些需要在启动时使用的系统shell脚本
1 2 3 4 5 6 7 |
┌──(beeee㉿kali)-[~] └─$ which sh /usr/bin/sh ┌──(beeee㉿kali)-[~] └─$ ls -l /usr/bin/sh lrwxrwxrwx 1 root root 4 2023年 1月 5日 /usr/bin/sh -> dash |
可以启动任意一种已安装的shell
echo $0会显示当前shell的名称(在shell命令行中),如果在shell脚本中使用,则显示的是脚本的名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
┌──(beeee㉿kali)-[~] └─$ echo $0 /usr/bin/zsh ┌──(beeee㉿kali)-[~] └─$ dash $ echo $0 dash $ exit ┌──(beeee㉿kali)-[~] └─$ echo $0 /usr/bin/zsh bash前有一个连字符表明该shell是用户的登录shell |
5.2 shell的父子关系
当用户在CLI提示符输入bash或其他shell程序名时,会创建新的shell程序,这是一个子shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
┌──(beeee㉿kali)-[~] └─$ ps -f UID PID PPID C STIME TTY TIME CMD beeee 1883 1613 0 10:07 pts/0 00:00:02 /usr/bin/zsh beeee 11352 1883 0 10:26 pts/0 00:00:00 ps -f ┌──(beeee㉿kali)-[~] └─$ bash ┌──(beeee㉿kali)-[~] └─$ ps -f UID PID PPID C STIME TTY TIME CMD beeee 1883 1613 0 10:07 pts/0 00:00:02 /usr/bin/zsh beeee 11370 1883 0 10:26 pts/0 00:00:00 bash beeee 11397 11370 0 10:26 pts/0 00:00:00 ps -f |
子shell既可以从父shell中创建,也可以从另一个子shell中创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
┌──(beeee㉿kali)-[~] └─$ ps --forest PID TTY TIME CMD 1883 pts/0 00:00:03 zsh 11814 pts/0 00:00:00 \_ ps ┌──(beeee㉿kali)-[~] └─$ bash ┌──(beeee㉿kali)-[~] └─$ bash ┌──(beeee㉿kali)-[~] └─$ bash ┌──(beeee㉿kali)-[~] └─$ ps --forest PID TTY TIME CMD 1883 pts/0 00:00:03 zsh 11868 pts/0 00:00:00 \_ bash 11880 pts/0 00:00:00 \_ bash 11906 pts/0 00:00:00 \_ bash 12038 pts/0 00:00:00 \_ ps |
ps -f 可表现子shell间的嵌套关系,通过PPID列显示出谁是谁的父进程
1 2 3 4 5 6 7 8 |
┌──(beeee㉿kali)-[~] └─$ ps -f UID PID PPID C STIME TTY TIME CMD beeee 1883 1613 0 10:07 pts/0 00:00:03 /usr/bin/zsh beeee 11868 1883 0 10:27 pts/0 00:00:00 bash beeee 11880 11868 0 10:27 pts/0 00:00:00 bash beeee 11906 11880 0 10:27 pts/0 00:00:00 bash beeee 12791 11906 0 10:29 pts/0 00:00:00 ps -f |
可用exit退出子shell
exit命令不仅能够退出子shell,还可以注销当前的虚拟控制台终端或终端仿真器软件
查看进程列表
进程列表 圆括号包围起来一组命令 使命令列表变成进程列表 — 命令分组的一种,生成一个子shell来执行这些命令。可嵌套。
echo $BASH_SUBSHELL; 能用以判断是否生成了子shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
┌──(beeee㉿kali)-[~] └─$ pwd; ls test*; cd /etc; pwd; cd; pwd; echo $BASH_SUBSHELL; /home/beeee dir NewDir test_txt /etc /home/beeee 0 ┌──(beeee㉿kali)-[~] └─$ (pwd; ls test*; cd /etc; pwd; cd; pwd; echo $BASH_SUBSHELL;) /home/beeee dir NewDir test_txt /etc /home/beeee 1 |
子shell用法 — 后台模式
后台模式介绍
1 2 3 4 5 6 7 8 9 10 |
┌──(beeee㉿kali)-[~] └─$ sleep 3000& [1] 14382 ┌──(beeee㉿kali)-[~] └─$ ps -f UID PID PPID C STIME TTY TIME CMD beeee 1879 1614 0 10:07 pts/1 00:00:00 /usr/bin/zsh beeee 14382 1879 0 10:32 pts/1 00:00:00 sleep 3000 beeee 14411 1879 0 10:32 pts/1 00:00:00 ps -f |
sleep命令在后台(&)睡眠3000秒。当被置于后台时,在shell CLI 提示符返回之前,屏幕上会出现两条信息。第一条为方括号中的后台作业号,第二条为后台作业的进程ID
jobs 显示后台作业信息
-l 显示更多信息
1 2 3 |
┌──(beeee㉿kali)-[~] └─$ jobs -l [1] + 14382 running sleep 3000 |
后台作业完成,会显示出结束状态
1 2 3 |
┌──(beeee㉿kali)-[~] └─$ [1] + done sleep 3000 |
将进程列表置入后台
可在子shell中进行大量的多进程处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
┌──(beeee㉿kali)-[~] └─$ (sleep 2; echo $ZSH_SUBSHELL; sleep 2) 1 ┌──(beeee㉿kali)-[~] └─$ (sleep 2; echo $ZSH_SUBSHELL; sleep 2)& [2] 18544 ┌──(beeee㉿kali)-[~] └─$ ┌──(beeee㉿kali)-[~] └─$ 1 [2] + done ( sleep 2; echo $ZSH_SUBSHELL; sleep 2; ) (tar -cf Doc.tar Documents; tar -cf Music.tar Music)& |
协程
同时在后台生成一个子shell 并将命令置于后台,在该子shell中执行命令
coproc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
┌──(beeee㉿kali)-[~] └─$ coproc sleep 10 [1] 24674 ┌──(beeee㉿kali)-[~] └─$ jobs -l [1]+ 24674 运行中 coproc COPROC sleep 10 & ┌──(beeee㉿kali)-[~] └─$ coproc My_job { sleep 10; } bash: 警告:execute_coproc: 副进程 [24674:COPROC] 仍然存在 [2] 24867 [1] 已完成 coproc COPROC sleep 10 ┌──(beeee㉿kali)-[~] └─$ jobs -l [2]+ 24867 运行中 coproc My_job { sleep 10; } & |
coproc My_job{ sleep 10; }命令中,'{}’ 前后与命令和’;’ 间必须要有一个空格 该命令在bash中使用
外部命令和内部命令
外部命令
存在于bash shell之外的程序,通常位于/bin /usr/bin /sbin /usr/sbin中
每当执行外部命令时,就会创建一个子进程。这种操作叫做衍生 forking。
例如:对于外部命令ps
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
┌──(beeee㉿kali)-[~] └─$ which ps /usr/bin/ps ┌──(beeee㉿kali)-[~] └─$ type ps ps is /usr/bin/ps ┌──(beeee㉿kali)-[~] └─$ ps -f UID PID PPID C STIME TTY TIME CMD beeee 1879 1614 0 10:17 pts/1 00:00:02 /usr/bin/zsh beeee 29098 1879 0 11:12 pts/1 00:00:00 ps -f |
ps命令的PPID为1879,即父进程shell的PID
因此只要涉及进程衍生,需耗费时间和资源来设置子进程的环境, 外部命令系统开销较高,内建命令开销较低
内建命令
无须使用子进程来执行
可使用 type which 命令判断某个命令是否为内建
1 2 3 4 5 6 7 |
┌──(beeee㉿kali)-[~] └─$ type cd cd is a shell builtin ┌──(beeee㉿kali)-[~] └─$ type exit exit is a shell builtin |
有些命令有多种实现,例如echo 和 pwd 既有内建命令也有外部命令,可通过type -a查看
对于有多种实现的命令,如果想使用其外部命令实现,直接指明其对应的文件即可、如: 要使用外部命令pwd,可输入/usr/bin/pwd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
┌──(beeee㉿kali)-[~] └─$ type -a echo echo is a shell builtin echo is /usr/bin/echo echo is /bin/echo ┌──(beeee㉿kali)-[~] └─$ type -a pwd pwd is a shell builtin pwd is /usr/bin/pwd pwd is /bin/pwd ┌──(beeee㉿kali)-[~] └─$ /usr/bin/pwd /home/beeee ┌──(beeee㉿kali)-[~] └─$ pwd /home/beeee |
history命令
查看最近用过的命令列表 — history
唤回历史记录中最近的命令 — !!
命令历史记录保存在 .zsh_history / .bash_history /…中
当shell退出时才被写入历史文件, 可用history -a命令强制将命令历史记录写入.zsh_history文件
可唤回历史记录的任意命令 !<编号>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
┌──(beeee㉿kali)-[~] └─$ history 1 su 2 sudo passwd root 3 su 4 docker -v ... 143 ls -F 144 cd / ┌──(beeee㉿kali)-[~] └─$ !143 ┌──(beeee㉿kali)-[~] └─$ ls -F 公共/ 视频/ 文档/ 音乐/ myscan01.html nmap_nsevulscan/ test/ 模板/ 图片/ 下载/ 桌面/ myscan01.xml p0f.log |
使用命令别名 alias
查看当前可用的别名 alias -p (zsh内为alias)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
┌──(beeee㉿kali)-[~] └─$ alias -p alias: bad option: -p ┌──(beeee㉿kali)-[~] └─$ alias diff='diff --color=auto' egrep='egrep --color=auto' fgrep='fgrep --color=auto' grep='grep --color=auto' history='history 0' ip='ip --color=auto' l='ls -CF' la='ls -A' ll='ls -l' ls='ls --color=auto' which-command=whence ┌──(beeee㉿kali)-[~] └─$ bash ┌──(beeee㉿kali)-[~] └─$ alias -p alias diff='diff --color=auto' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias ip='ip --color=auto' alias l='ls -CF' alias la='ls -A' alias ll='ls -l' alias ls='ls --color=auto' |
创建自己的别名,注意别名只在其被定义的shell进程中才有效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
┌──(beeee㉿kali)-[~] └─$ alias li='ls -i' ┌──(beeee㉿kali)-[~] └─$ li 418542 公共 418545 图片 418544 音乐 1714901 myscan01.xml 1725351 test 418541 模板 418543 文档 418539 桌面 1726691 nmap_nsevulscan 418546 视频 418540 下载 1714907 myscan01.html 1766983 p0f.log ┌──(beeee㉿kali)-[~] └─$ bash ┌──(beeee㉿kali)-[~] └─$ li li:未找到命令 |
可用unalias alias-name删除指定的别名
第六章 Linux环境变量
6.1 环境变量介绍
全局环境变量
对于shell会话和所有生成的子shell都是可见的
可用env 或 printenv命令来查看全局变量
1 2 3 4 5 6 7 8 |
┌──(beeee㉿kali)-[~] └─$ printenv SHELL=/usr/bin/zsh SESSION_MANAGER=local/kali:@/tmp/.ICE-unix/1393,unix/kali:/tmp/.ICE-unix/1393 WINDOWID=0 QT_ACCESSIBILITY=1 COLORTERM=truecolor ... |
可用printenv 或 echo 命令显示个别环境变量的值 (env不支持)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
┌──(beeee㉿kali)-[~] └─$ printenv HOME /home/beeee ┌──(beeee㉿kali)-[~] └─$ env HOME env: "HOME": 没有那个文件或目录 ┌──(beeee㉿kali)-[~] └─$ echo $HOME /home/beeee ┌──(beeee㉿kali)-[~] └─$ ls $HOME 公共 视频 文档 音乐 myscan01.html nmap_nsevulscan test 模板 图片 下载 桌面 myscan01.xml p0f.log |
在变量前加$可以让变量作为其他命令的参数
局部环境变量
只在定义它的进程中可见
没有哪个命令可以只显示这类变量
用户可定义自己的局部变量,这些变量称为用户自定义局部变量
set命令可以显示特定进程的所有环境变量,包括局部变量,全局变量与用户自定义变量
1 2 3 4 5 |
┌──(beeee㉿kali)-[~] └─$ set '!'=0 '#'=0 ' |
6.2 设置用户自定义变量
设置局部用户自定义变量
可以使用等号为变量赋值,值可以是数值或字符串。 如果要引用该变量的值,在变量名前加$号即可 如果用于赋值的字符串包含空格,必须使用单引号或双引号来界定该字符串的起止
尽量用小写字母命名用户自定义的局部变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
┌──(beeee㉿kali)-[~] └─$ my_variable=Hello ┌──(beeee㉿kali)-[~] └─$ echo $my_variable Hello ┌──(beeee㉿kali)-[~] └─$ my_variable=Hello world world:未找到命令 ┌──(beeee㉿kali)-[~] └─$ my_variable='Hello world' ┌──(beeee㉿kali)-[~] └─$ echo $my_variable Hello world |
注意:在变量名、等号和值直接没有空格,不然会被视作多个命令
只在设置该局部变量的shell可用
设置全局环境变量 export
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
┌──(beeee㉿kali)-[~] └─$ my_variable='I an Global now' ┌──(beeee㉿kali)-[~] └─$ export my_variable ┌──(beeee㉿kali)-[~] └─$ echo $my_variable I an Global now ┌──(beeee㉿kali)-[~] └─$ bash ┌──(beeee㉿kali)-[~] └─$ echo $my_variable I an Global now ┌──(beeee㉿kali)-[~] └─$ exit exit ┌──(beeee㉿kali)-[~] └─$ echo $my_variable I an Global now |
也可直接使用export my_variable=”I am Global now” 定义全局变量
修改子shell中的全局环境变量不会影响父shell中该变量的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
┌──(beeee㉿kali)-[~] └─$ export my_variable="test1" ┌──(beeee㉿kali)-[~] └─$ echo $my_variable test1 ┌──(beeee㉿kali)-[~] └─$ bash ┌──(beeee㉿kali)-[~] └─$ echo $my_variable test1 ┌──(beeee㉿kali)-[~] └─$ export my_variable="Null" ┌──(beeee㉿kali)-[~] └─$ echo $my_variable Null ┌──(beeee㉿kali)-[~] └─$ exit exit ┌──(beeee㉿kali)-[~] └─$ echo $my_variable test1 |
6.3 删除环境变量 — unset
1 2 3 4 5 6 7 8 9 |
┌──(beeee㉿kali)-[~] └─$ echo $my_variable test1 ┌──(beeee㉿kali)-[~] └─$ unset my_variable ┌──(beeee㉿kali)-[~] └─$ echo $my_variable |
注意:如果在子进程中删除了一个全局环境变量,那么该操作仅对子进程有效,该全局变量在父进程中依然可用
6.4 默认的shell环境变量
不是所有的默认环境变量都会在set命令的输出中列出,如果用不到,默认环境变量也并不要求有值
6.5 设置PATH环境变量
当使用外部命令时 ,shell必须搜索系统,从中找到对应的程序。
PATH环境变量定义了用于查找命令和程序的目录 如果命令或程序所在的位置没有包括在PATH变量中,那需要使用绝对路径,shell才能找到
可以把新的搜索目录添加到现有的PATH环境变量中,无需从头定义 ( 引用原来的PATH值,添加冒号: ,再使用绝对路径输入新目录)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
┌──(beeee㉿kali)-[~] └─$ ls /home/beeee/Stripts myprog ┌──(beeee㉿kali)-[~] └─$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games ┌──(beeee㉿kali)-[~] └─$ PATH=$PATH:/home/beeee/Stripts ┌──(beeee㉿kali)-[~] └─$ myprog The factorial of 5 is 120 |
6.6 定位系统环境变量
登录Linux系统启动bash shell时,默认情况下bash会在几个文件中查找命令。这些文件称作启动文件或环境文件。bash进程的启动文件取决于启动bash shell的方式。启动bash shell的方式有:
-
登录时作为默认登录shell
-
作为交互式shell,通过生成子shell启动
-
作为运行脚本的非交互式shell
登录shell
/etc/profile文件是bash shell的默认主启动文件,
/etc/bash.bashrc 包含系统环境变量
$HOME目录下的启动文件有:
$HOME/.bash_profile $HOME/.bashrc $HOME/.bash_login $HOME/.profile
这些文件都是为了提供用户专属的启动文件来定义该用户所用到的环境变量。 都以点号开头说明属于隐藏文件。 大多数Linux发行版只用4个启动文件中的一两个
$HOME代表某个用户的主目录,与 (~) 效果相同
交互式shell进程
作为交互式shell启动的bash并不处理/etc/profile文件,只检查用户$HOME中的.bashrc文件
非交互式shell
系统执行shell脚本时用的shell 没有命令行提示符
BASH_ENV 环境变量: 当shell启动一个非交互式shell进程时,会检查这个环境变量以查看要执行的启动文件名。如果有指定的文件,则shell会执行该文件里的命令,通常包括shell脚本变量设置
如果未设置BASH_ENV变量,shell脚本有可能是通过继承父shell的导出变量获取环境变量的,也有可能是使用了当前shell的局部变量和全局变量
环境变量持久化
对于全局环境变量(Linux系统的所有用户都要用到的变量)来说,不建议放在/etc/profile文件中,因为/etc/profile文件会随发行版的更新而更新。
最好在/etc/profile.d目录中创建一个以.sh结尾 的文件,把所有新的或修改过的全局环境变量设置放在这个文件中
在大多数发行版中,保存个人用户永久性bash shell变量的最佳地点是$HOME/.bashrc文件,这适用于所有类型的shell进程。但如果设置了BASH_ENV,除非值为$HOME/.bashrc,否则应该将非交互式的用户变量放在别的地方
可以把个人的alias设置放在$HOME/.bashrc启动文件中,使其效果永久化
6.7 数组变量
环境变量可以作为数组使用,但不常用
索引方式在不同shell间不同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
┌──(beeee㉿kali)-[~] └─$ mytest=(zero one two three four) ┌──(beeee㉿kali)-[~] └─$ echo $mytest zero one two three four ┌──(beeee㉿kali)-[~] └─$ echo ${mytest[2]} one ┌──(beeee㉿kali)-[~] └─$ echo ${mytest[*]} zero one two three four |
可修改数组中的某个值
1 2 3 4 5 6 |
┌──(beeee㉿kali)-[~] └─$ mytest[2]=seven ┌──(beeee㉿kali)-[~] └─$ echo ${mytest[2]} seven |
可删除数组中的某个值,也可删除整个数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
┌──(beeee㉿kali)-[~] └─$ unset mytest[2] ┌──(beeee㉿kali)-[~] └─$ echo $mytest zero two three four ┌──(beeee㉿kali)-[~] └─$ echo ${mytest[2]} ┌──(beeee㉿kali)-[~] └─$ unset mytest ┌──(beeee㉿kali)-[~] └─$ echo $mytest |