“缺少重定向名称。”在CSH环境中运行命令时出错

时间:2019-06-09 05:21:45

标签: linux shell csh

我试图在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 错误。

我该如何解决?

1 个答案:

答案 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 HarmfulTop Ten Reasons not to use the C shell。)使用POSIX Shell,可以确保删除临时文件,除非您用SIGKILL残酷地杀死脚本。