我正在学习一门在线课程,其中一个步骤是生成证书签名请求或 CSR 文件以生成自签名证书。
应该生成证书的命令是
sudo openssl req \
-out / root/certreq.csr \
-key /etc/ssl/private/priv.key \
-subj "/CN=server.lab" \
-reqexts SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:server.lab")) \
-new
但是,我在运行上述命令时收到以下错误 -
error on line -1 of /dev/fd/63
140520560354976:error:02001002:system library:fopen:No such file or directory:bs s _ file. c: 169: fopen( ' /dev/fd/63' , 'rb')
routinesI:B10 new file:no such file:bss file.c: 172:
140520560354976:error:OE078072:configuration file routines:DEF LOAD:no such file :conf def.c: 197:
错误输出是从我运行命令的虚拟机中松散复制的。
我在这里做错了什么?
答案1
sudo
显式关闭除 0、1 和 2 之外的文件描述符:
$ sudo ls -l /proc/self/fd 5< /dev/null
total 0
lrwx------ 1 root root 64 Dec 1 08:04 0 -> /dev/pts/7
lrwx------ 1 root root 64 Dec 1 08:04 1 -> /dev/pts/7
lrwx------ 1 root root 64 Dec 1 08:04 2 -> /dev/pts/7
lr-x------ 1 root root 64 Dec 1 08:04 3 -> /proc/5390/fd
因此,这包括 fd 63,它是由进程替换创建的管道的读取端。
没有sudo
:
$ ls -l <(:) /proc/self/fd
lr-x------ 1 chazelas chazelas 64 Dec 1 08:07 /dev/fd/63 -> 'pipe:[146184]'
/proc/self/fd:
total 0
lrwx------ 1 chazelas chazelas 64 Dec 1 08:07 0 -> /dev/pts/7
lrwx------ 1 chazelas chazelas 64 Dec 1 08:07 1 -> /dev/pts/7
lrwx------ 1 chazelas chazelas 64 Dec 1 08:07 2 -> /dev/pts/7
lr-x------ 1 chazelas chazelas 64 Dec 1 08:07 3 -> /proc/7305/fd
lr-x------ 1 chazelas chazelas 64 Dec 1 08:07 63 -> 'pipe:[146184]'
和sudo
:
$ sudo ls -l <(:) /proc/self/fd
ls: cannot access '/dev/fd/63': No such file or directory
/proc/self/fd:
total 0
lrwx------ 1 root root 64 Dec 1 08:07 0 -> /dev/pts/7
lrwx------ 1 root root 64 Dec 1 08:07 1 -> /dev/pts/7
lrwx------ 1 root root 64 Dec 1 08:07 2 -> /dev/pts/7
lr-x------ 1 root root 64 Dec 1 08:07 3 -> /proc/7929/fd
如果sudoers
允许(closefrom_override
默认为关闭),您可以使用sudo
的-C
选项来禁用它:
$ sudo -C65536 ls -l <(:) /proc/self/fd
lr-x------ 1 root root 64 Dec 1 08:15 /dev/fd/63 -> 'pipe:[148888]'
/proc/self/fd:
total 0
lrwx------ 1 root root 64 Dec 1 08:15 0 -> /dev/pts/8
lrwx------ 1 root root 64 Dec 1 08:15 1 -> /dev/pts/8
lrwx------ 1 root root 64 Dec 1 08:15 2 -> /dev/pts/8
lr-x------ 1 root root 64 Dec 1 08:15 3 -> /proc/15147/fd
lr-x------ 1 root root 64 Dec 1 08:15 63 -> 'pipe:[148888]'
(这里告诉sudo
不要关闭65536以下的fd)
或者,如果使用zsh
,您可以使用=(...)
进程替换的形式,该形式使用临时文件(并传递其路径)而不是管道(并传递/dev/fd/<its-fd>
)。