我想制作一个使用本地命名空间套接字的小程序,我需要使用临时文件名作为套接字的地址。
那么如何在Linux下生成随机文件名?
+我在Debian Linux下使用C编程语言 +根据GNU C库参考,tmpname不安全。但安全的tmpfile和mkstemp 创建并打开生成的文件。是否有安全< / strong>和非创建 - 打开到此。换句话说,该函数应禁止在特定目录下创建生成的文件名的任何其他请求。
感谢。
答案 0 :(得分:7)
如果您在C中执行此操作,请使用mkdtemp
创建目录,并将套接字放在此目录中。
tmpnam
或mktemp
等其他功能不安全;因为它们不会为您创建和打开临时文件,所以很容易受到预先存在的符号链接(由猜测您的临时文件名的攻击者放置)到某个重要文件(如/etc/passwd
)的影响,覆盖它。
请注意,无法“锁定”路径 - 您只能在那里创建某些内容。如果你最终需要在那里放一个套接字,那么使用目录作为占位符是最好的选择。
答案 1 :(得分:2)
有mktemp
程序作为GNU coreutils的一部分提供。 See it's manpage for details.
典型用法就像这样简单:
TEMPDIR=$(mktemp -d)
echo $TEMPDIR
touch $TEMPDIR/yourfile.txt
(如前所述in other answer,创建目录是安全的。)
答案 2 :(得分:1)
您没有指定您正在使用的语言,但假设它是C / C ++方言(或其他一些可以访问C运行时库的语言),您可以使用tmpnam函数。
tmpnam存在一些问题,其中最严重的问题可能是您获取的临时文件名实际上并未“锁定”,直到您使用它来创建文件,因此理论上其他一些进程可能会创建该文件从你身下出来。您还必须确保通过tmpnam的缓冲区有足够的空间来容纳操作系统可以支持的最长路径。
现在建议您拨打tmpfile。这将在一个(希望是原子)操作中为您创建文件,并返回一个文件句柄。另一个好处是,当您关闭文件时会自动删除该文件。没有麻烦,没有大惊小怪。
答案 3 :(得分:-1)
使用/ dev / random。
谷歌的快速搜索给了我这个打击:
< /dev/urandom tr -dc A-Za-z0-9 | head -c8
如果你想在C中做同样的事, 只需打开/ dev / random并将其转换为字符串(忽略无效的字符)。