我试图在CSH环境中使用以下命令生成一些证书:
/usr/bin/openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout "selfsigned.key" \
-out "selfsigned.crt" -subj "/C=XX/ST=XX/L=XX/O=XX/OU=XX/CN=Some IP" -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:Some DNS,Some IP"))
出现 Missing name for redirect
错误。
我该如何解决?
答案 0 :(得分:0)
您的命令行的一部分是:
… <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:Some DNS,Some IP"))
您两次使用Bash特定的符号-process substitution。在C shell中,这根本行不通。 C shell不了解您的意思(见证错误消息)。
您必须将命令包装在Bash脚本中,然后使用Bash执行它。或重新考虑该命令,以便根本不使用进程替换。
一种选择是创建一个临时文件并在命令中使用该文件:
set tmpfile `mktemp`
cat /etc/ssl/openssl.cnf > $tmpfile
printf "\n[SAN]\nsubjectAltName=DNS:Some DNS,Some IP\n" >> $tmpfile
/usr/bin/openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout "selfsigned.key" \
-out "selfsigned.crt" -subj "/C=XX/ST=XX/L=XX/O=XX/OU=XX/CN=Some IP" -extensions SAN \
-config $tmpfile
rm -f $tmpfile
这可能会导致临时文件在中断的情况下留下来,这是标准建议不要在C shell中编写脚本的原因之一。 (请参阅C Shell Programming Considered Harmful或Top Ten Reasons not to use the C shell。)使用POSIX Shell,可以确保删除临时文件,除非您用SIGKILL
残酷地杀死脚本。