侧边栏壁纸
博主头像
小续的成长时光 博主等级

行动起来,活在当下

  • 累计撰写 21 篇文章
  • 累计创建 14 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

mktemp和install命令

小续
2025-01-16 / 2 评论 / 2 点赞 / 74 阅读 / 0 字 / 正在检测是否收录...

一、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 0

3.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.vVcHO7f

3.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.ekiB3l0

3.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.test

4、实现文件独立的目录垃圾箱

[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 功能相当于cpchmodchownchgrp ,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 /opt

3、拓展

假设由于操作失误导致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

2

评论区