Часть вашей командной строки:
… <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:Some DNS,Some IP"))
Вы используете специфичную для Bash нотацию - процесс подстановки - дважды. В оболочке C это просто не сработает. Оболочка C не имеет ни малейшего представления, что вы имеете в виду (посмотрите на сообщение об ошибке).
Вам придется заключить команду в скрипт 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. (См. Программирование оболочки C, считающееся вредным или Десять главных причин не использовать оболочку C .) С оболочкой POSIX вы можете гарантировать, что временный файл будет удален, если вы не жестоко убьете скрипт с SIGKILL
.