一、mktemp 命令
1、mktemp命令用法和格式
mktemp 命令会根据指定的模板在临时目录(默认为/tmp,可以通过 -p 进行修改)下创建临时文件或目录,并返回该文件的全路径。临时文件或目录的名称会基于模板生产,并添加一些随机字符保证唯一
需要注意的是,mktemp命令只会创建临时文件或目录,并不会自动删除它们。如果不再需要这些临时文件或目录,应该手动删除以释放系统资源
mktemp命令在编写脚本或需要创建临时文件或目录的场景中非常有用,可以确保生成的临时名称是唯一的,避免命名冲突
mktemp [OPTION]... [TEMPLATE]
说明:TEMPLATE: filenameXXXX,X至少要出现三个
选项 说明
-d 创建一个临时目录而不是临时文件
-p 指定临时文件或目录的父目录
-t 在生成的文件名或目录名中添加指定的后缀
-u 仅显示将要创建的临时文件或目录名,而不实际创建
-q 不显示任何输出① 模板参数:mktemp 命令的最后一个参数是模板参数,用于指定临时文件或目录的命名规则。模板参数必须包含至少6个连续的X字符,这些字符将被替换为随机生成的字符。例如,/tmp/tmp.XXXXXX是一个有效的模板参数
② 临时文件和目录:默认情况下,mktemp 命令会创建临时文件。如果想要创建临时目录,可以使用 -d 选项。例如,mktemp -d 会创建一个临时目录
③ 父目录:如果想要指定临时文件或目录的父目录,可以使用 -p 选项
例如,mktemp -p /tmp 会在/tmp目录下创建临时文件或目录
④ 后缀:可以使用 -t 选项来指定生成的临时文件或目录的后缀
例如,mktemp -t .txt 会在临时文件名或目录名的末尾添加 .txt 后缀
⑤ 预览模式:使用 -u 选项可以进入预览模式,只显示将要创建的临时文件或目录名,而不实际创建。这对于调试和测试非常有用
⑥ 错误处理:如果 mktemp 命令无法创建临时文件或目录,会显示错误信息并退出。因此,在使用 mktemp 命令之前,确保目标目录存在且可写
⑦ 安全性:mktemp 命令会生成随机的临时文件或目录名,以避免命名冲突。这可以防止其他用户或恶意程序对临时文件进行操作。因此,使用 mktemp 命令可以提高系统的安全性
2、mktemp 命令的实现原理
在 Linux Shell 中,mktemp 命令的底层实现是通过调用C库函数来完成的。具体来说,mktemp 命令使用了一个叫做 mkstemp 的C函数。
mkstemp 函数是一个系统调用,用于创建一个唯一的临时文件。它的实现过程如下:
①首先,mkstemp 函数会根据传入的模板参数创建一个临时文件。模板参数必须包含至少6个连续的X字符,这些字符将被替换为随机生成的字符。例如,/tmp/tmp.XXXXXX 是一个有效的模板参数
②接下来,mkstemp 函数会尝试打开临时文件,并返回一个文件描述符。如果打开文件成功,文件描述符将用于后续的读写操作
③在打开文件后,mkstemp 函数会将临时文件的权限设置为安全模式,以确保只有当前用户可以访问该文件
④最后,mkstemp 函数会返回临时文件的文件描述符,供调用者使用。调用者可以使用该文件描述符进行读写操作,完成临时文件的使用
⑤需要注意的是,mkstemp 函数创建的临时文件是唯一的,它的文件名是随机生成的,以避免命名冲突。这可以提高系统的安全性,防止其他用户或恶意程序对临时文件进行操作
总之,Linux Shell 的 mktemp 命令底层通过调用C库函数 mkstemp 来创建唯一的临时文件,并返回文件描述符供调用者使用。这种实现方式确保了临时文件的安全性和唯一性
3、相关操作
3.1 创建临时文件或目录
#创建一个临时文件
[root@pve ~]# mktemp
/tmp/tmp.aIaQMFjVJb
#创建一个临时目录
[root@pve ~]# mktemp -d
/tmp/tmp.kWBUGyJoBU
[root@pve ~]# ls -l /tmp/tmp.*
-rw------- 1 root root 0 Jan 16 17:32 /tmp/tmp.aIaQMFjVJb
/tmp/tmp.kWBUGyJoBU:
total 03.2 指定临时文件名或目录名的后缀字符位数
注意:这种方式指定出来的临时文件或目录是在当前目录下的
#创建一个临时文件,想要文件名的后缀有几个随机字符,就添加几个X(大写)
[root@pve ~]# mktemp test.XXXXXXX
test.vVcHO7f
#创建一个临时目录,想要目录名的后缀有几个随机字符,就添加几个X(大写)
[root@pve ~]# mktemp -d test.XXXXXXX
test.6boYWWe
# 注意:这种方式指定出来的临时文件或目录是在当前目录下的
[root@pve ~]# ls -l
total 91040
drwx------ 2 root root 6 Jan 16 17:33 test.6boYWWe
-rw------- 1 root root 0 Jan 16 17:33 test.vVcHO7f3.3 指定临时文件或目录的父目录
#创建一个临时文件,并指定临时文件的父目录
[root@pve ~]# mkdir /tmp/test
[root@pve ~]# mktemp -p /tmp/test/ test.XXXXXXX
/tmp/test/test.T5PGjq2
#创建一个临时目录,并指定目录的父目录
[root@pve ~]# mktemp -d -p /tmp/test/ test.XXXXXXX
/tmp/test/test.ekiB3l0
# 查看
[root@pve ~]# ls -l /tmp/test/
total 0
-rw------- 1 root root 0 Jan 16 17:36 test.T5PGjq2
drwx------ 2 root root 6 Jan 16 17:37 test.ekiB3l03.4 指定临时文件或目录的后缀
#创建一个临时文件,并指定临时文件的后缀名
[root@pve ~]# mkdir -p /tmp/tesst
[root@pve ~]# mktemp -p /tmp/tesst/ XXXXXXX.test
/tmp/tesst/5yAyn0m.test
#创建一个临时目录,并指定目录的后缀名
[root@pve ~]# mktemp -d -p /tmp/tesst/ XXXXXXX.test
/tmp/tesst/Fv1BX9X.test
# 查看
[root@pve ~]# ls -l /tmp/tesst/
total 0
-rw------- 1 root root 0 Jan 16 17:38 5yAyn0m.test
drwx------ 2 root root 6 Jan 16 17:38 Fv1BX9X.test4、实现文件独立的目录垃圾箱
[root@pve test.6boYWWe]# vim trash.sh
#!/bin/bash
DIR="$(mktemp -d ./trash-$(date +%F_%H-%M_%S)XXXXXX)"
mv "${*}" $DIR
echo "${*} is move to ${DIR}"
[root@pve test.6boYWWe]# chmod +x trash.sh
[root@pve test.6boYWWe]# ls
trash.sh
[root@pve test.6boYWWe]# touch aa
[root@pve test.6boYWWe]# touch bb
[root@pve test.6boYWWe]# ls
aa bb trash.sh
[root@pve test.6boYWWe]# ./trash.sh aa
aa is move to ./trash-2025-01-16_17-47_18w7Fs7n
[root@pve test.6boYWWe]# ls
bb trash-2025-01-16_17-47_18w7Fs7n trash.sh
[root@pve test.6boYWWe]# ./trash.sh bb
bb is move to ./trash-2025-01-16_17-47_29nVDl9F
[root@pve test.6boYWWe]# ls
trash-2025-01-16_17-47_18w7Fs7n trash-2025-01-16_17-47_29nVDl9F trash.sh
[root@pve test.6boYWWe]# ls -l *
-rwxr-xr-x 1 root root 182 Jan 16 17:46 trash.sh
trash-2025-01-16_17-47_18w7Fs7n:
total 0
-rw-r--r-- 1 root root 0 Jan 16 17:47 aa
trash-2025-01-16_17-47_29nVDl9F:
total 0
-rw-r--r-- 1 root root 0 Jan 16 17:47 bb定义rm放入回收站
function rm () {
local trash=`mktemp -d /tmp/trashXXXX`;mv $*
$trash;
}二、install 命令
1、install 命令用法和格式
install 功能相当于cp,chmod,chown,chgrp ,mkdir 等相关工具的集合,主要用于安装文件或目录
install [OPTION]... SOURCE DEST
#OPTION是选项,SOURCE 是要安装的文件或目录的路径,DEST 是安装后的目标路径
选项 说明
-b 创建备份文件
-c 比较源文件和目标文件,如果不同则更新目标文件
-d 创建目录
-g 设置文件的组
-m 设置文件的权限
-o 设置文件的所有者
-s 设置文件的大小
-t 设置文件的修改时间
-v 显示详细的安装过程2、相关操作
# 复制文件 /etc/passwd 到 /opt 目录下,并指定权限为 644、文件的所有者为 dh 用户、文件的所属组为 dh
[root@pve opt]# install /etc/passwd -m 644 -o dh -g dh /opt3、拓展
假设由于操作失误导致chmod命令无法使用,如何使用install命令解决?
# 模拟操作失误导致chmod命令无法使用
[root@pve ~]# chmod 000 /usr/bin/chmod
[root@pve ~]# chmod 644 /opt/passwd
-bash: /usr/bin/chmod: Permission denied
# 使用install命令解决问题
[root@pve ~]# install /usr/bin/chmod -m 755 /opt
[root@pve ~]# ll /opt/chmod
-rwxr-xr-x 1 root root 57536 Jan 16 17:55 /opt/chmod
[root@pve ~]# mv /opt/chmod /usr/bin/chmod
mv: overwrite '/usr/bin/chmod'? y
[root@pve ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1147 Dec 26 18:20 /etc/passwd
[root@pve ~]# chmod 655 /etc/passwd
[root@pve ~]# ll /etc/passwd
-rw-r-xr-x. 1 root root 1147 Dec 26 18:20 /etc/passwd
[root@pve ~]# chmod 644 /etc/passwd
[root@pve ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1147 Dec 26 18:20 /etc/passwd
评论区