问题起源:
lighttpd 在接收到上传数据(PUT/POST),会生成大小为1M的很多临时文件。
线上最近有很多上传请求,lighttpd 经常报警,说上传的临时文件丢失,
分析
起初怀疑是被其它程序删除,后来勇哥提到,会不会是我们生成临时文件的方法有问题,生成了重名的临时文件?
查了lighttpd 的实现,使用的是mktemp函数:
http://linux.die.net/man/3/mktemp
If the call was successful, the last six bytes of template will have been modified in such a way that the resulting name is unique (does not exist already). If the call was unsuccessful, template is made an empty string.
Never use mktemp(). Some implementations follow 4.3BSD and replace XXXXXX by the current process ID and a single letter, so that at most 26 different names can be returned.
The tempnam() function is re-entrant while mktemp() isn't 不可重入,可能两个进程产生同一个文件名
|
实验:
a.c |
#include<stdio.h>
int main(){
int i = 0;
for (i=0; i< 1024*1024*8; i++){
char s[200] = "/tmp/XXXXXX";
mktemp(s);
printf("%s\n", s);
}
}~
|
ning@ning-baidu ~/idning/langtest/c/mktemp$ cc a.c/tmp/ccXoEO8Z.o: In function `main':a.c:(.text+0x63): warning: the use of `mktemp' is dangerous, better use `mkstemp' or `mkdtemp'ning@ning-baidu ~/idning/langtest/c/mktemp$ ./a.out > /tmp/x^Cning@ning-baidu ~/idning/langtest/c/mktemp$ cat /tmp/x | sort | uniq -c | sort -nr | head 2 /tmp/ywysSJ 2 /tmp/YbfzNb 2 /tmp/wzJUMa 2 /tmp/WwwcEJ 2 /tmp/wV6oJe 2 /tmp/wjsmMR 2 /tmp/WIefPG 2 /tmp/wbOxzX 2 /tmp/UPUz9A 2 /tmp/uGJcIG可以看出确实有重名文件生成。lighttpd源码中使用了: #define mkstemp(x) open(mktemp(x), O_RDWR)解决
建议去掉该#define,直接使用可重入的 mkstemp,它会返回: fd = __open (tmpl, (flags & ~O_ACCMODE) | O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); 打开的文件Warning: Between the time the pathname is constructed and the file is created another process might have created a file with the same name using mktemp, leading to a possible security hole. The implementation generates names which can hardly be predicted, but when opening the file you should use the O_EXCL flag. Using mkstemp is a safe way to avoid this problem.
分享到:
相关推荐
`mktemp`是这些基础命令的扩展,它在处理临时文件时提供了额外的安全性,是系统管理员和开发人员日常工作中不可或缺的一部分。在使用`mktemp`时,理解其选项和用法可以确保临时资源的安全管理和有效利用。
Linux是一种广泛使用的开源类Unix操作系统,其用户界面是基于命令行的。在Linux环境下,命令行工具和脚本提供了强大的数据操作和系统管理能力。以下是一些Linux系统中常用的命令及其使用方法: 1. 文件和目录操作 ...
Kali Linux提供的命令体系完整且功能强大,从系统管理到文件操作,再到安全测试,每一个命令都是系统管理不可或缺的工具。通过深入学习这些命令,即便是新手也能快速掌握Kali Linux的使用,进而在网络安全领域开展...
2. `chattr`:改变文件的特殊属性,如使文件不可修改。 3. `chgrp`:更改文件或目录的所属组。 4. `chmod`:改变文件或目录的权限设置,如读、写、执行权限。 5. `chown`:改变文件或目录的所有者,通常只有root用户...
Linux系统中存在众多的命令行工具,它们支持文件管理...此外,Linux命令的参数和选项众多,大多数命令还支持高级选项,可用于执行更为复杂和专业的任务,用户在实践中应通过man命令获取更多相关信息以加深理解和应用。
`chattr [选项] 属性 文件`,如添加“i”属性使文件不可修改。 - **chgrp**:更改文件所属的组。`chgrp [选项] 组名 文件`,用于改变文件或目录的所有者组。 - **chmod**:更改文件权限。`chmod [选项] 模式 文件`,...
### Linux常用命令集详解 #### 引言 随着信息技术的发展,Linux作为一种开源的操作系统,在服务器领域及开发环境中占据了举足轻重的地位。相比于Windows,Linux以其稳定性和安全性著称,并且具备丰富的命令行工具...
- **ftp count**:具体含义不明确,在标准`ftp`命令集中未提及该命令,可能是特定环境中使用的自定义命令或语法错误。 - **ftp shut (ftp shutdown)**:用于关闭`ftp`服务。 - **ftp who**:显示当前连接到`ftp`...
然而,对于`mktemp`、`tmpnam`和`tempnam`这些函数,由于它们在安全性和健壮性方面的不足,通常不推荐在现代编程中使用。`mkstemp`和`tmpfile`提供了更好的解决方案,尤其是考虑到防止文件名冲突和保护文件内容的...
### Linux命令手册知识点详解 #### 文件目录管理 在Linux系统中,文件目录管理是极其重要的一个环节,涉及到了文件和目录的各种操作。 - **cat**:用于显示文件内容或者连接多个文件并打印到标准输出设备上。 - *...
- **功能**:压缩可执行文件为.gz格式,并保持其可执行性。 - **用法**:`gzexe [文件]`。 **2.9 GZIP (GNU Zip)** - **功能**:压缩文件为.gz格式。 - **用法**:`gzip [文件]`。 **2.10 LHA** - **功能**:一种...
依赖于任何POSIX兼容的Shell PulseAudio FFmpeg mktemp(可选,当使用-p文件名运行virtualmic时不需要)安装将脚本复制到任何$ PATH目录中。 在大多数系统上,/ usr / bin是最明智的目录。 用法用法:virtualmic [-p...
根据提供的文件内容,这份文档是关于阮一峰所编写的Bash脚本教程,主要涉及Linux命令行环境下Bash的基本用法和脚本编程。下面将详细介绍文档中提及的知识点: 1. Bash简介: - Bash(Bourne Again SHell)是Unix...
- 环境变量对整个shell会话有效,只读变量一旦设定不可更改。 - 位置变量用于存储命令行参数,退出状态码表示命令执行结果。 - 使用`$`引用变量,`$*`和`$@`用于获取所有参数。 4. 流程控制: - 条件选择:`if`...
只读变量是被设置后不可更改的变量。位置变量指的是脚本调用时传入的参数。退出状态码变量存储上一个执行命令的退出状态。 ### 命令和执行 Shell脚本中的命令和执行部分涉及算术运算、逻辑运算、条件测试以及使用...