Приветствую.
Исходная задача: нужно в неинтерактивном режиме запустить ssh-keygen -y -f $privkey
и скормить ему парольную фразу, причём сделать это максимально секьюрно. С stdin он её читать не хочет.
Переформулировка задачи: я решил запускать ssh-keygen, передавая ему в качестве SSH_ASKPASS путь к вспомогательной программе, которая, запустившись, как-то получит у меня парольную фразу и отдаст её ssh-keygen'у в stdout. Вопрос: как?
- Тупо скормить в stdin и надеяться, что запущенный псевдо-askpass унаследует файловый дескриптор от ssh-keygen'а — ненадёжно, в будущей версии openssh могут решить закрывать все fd на всякий случай.
- Создавать named pipe, System V SHM, ... — несекьюрно, можно успеть подключиться раньше и вычитать оттуда всё что нужно.
- Что ещё?
Clarification. В итоге я всё-таки заставил ssh-keygen читать парольную фразу из stdin без применения костылей с подложным SSH_ASKPASS. Для этого нужно убрать переменную DISPLAY= и завернуть процесс в setsid, чтобы отобрать доступ к /dev/tty:
( unset DISPLAY; exec setsid -w ssh-keygen -y -f "$privkey_file" < "$passphrase_file" )