2017-02-22 33 views
1

У меня есть приложение на Linux C++, перенесенное с ОС Solaris, и приложение должно написать некоторые текстовые данные через gpg (или gpg2) в зашифрованный файл. Поэтому текстовые данные должны быть записаны непосредственно в gpg (зашифрованный файл). создать трубы:Ищете правильный способ в Linux писать зашифрованный текст из приложения C++ в зашифрованный файл gpg

if(pipe(pipes) == -1) 
    throw Exception("Error creating pipes"); 

switch(fork()) 
{ 
    case -1: 
    throw Exception("fork() failure"); 
    case 0: // child process 
    close(pipes[PIPE_PARENT]); 
    close(READ); 
    close(ERR); 
    if(dup(pipes[PIPE_CHILD]) != READ) 
     throw Exception("dup() failure, READ descriptor unavailable"); 

    execlp("gpg", "gpg", "--no-tty", "-r", "username", "-e", "-o", "home/username/out.pgp", NULL); 
    break; 
} 

... Тогда я использовать запись():

intWCount = write(intTextFD, strData.str().c_str(), strData.str().size()); 

Тогда я видеть ERRNO == 9, intWCount = -1. От STDOUT я получаю:

«GPG: ВНИМАНИЕ: стандартная ошибка вновь»

и текстовые данные не записываются в файл. Я использую Ubuntu 16.04, gpg (GnuPG) 1.4.20, gcc 5.4.0.

Главный вопрос - как безопасно записывать мои текстовые данные в зашифрованный файл gpg?

Спасибо!

ответ

0

https://wiki.gnupg.org/APIs состояние это:

Ряд старших приложений требует GnuPG исполняемых файлов в подпроцессе и взаимодействовать с ними с помощью аргументов командной строки и файловых дескрипторов. Это менее опасно для GPGME, потому что аргументы командной строки и текстовые выходы не являются (официальным) API для GnuPG. Несмотря на усилия, направленные на то, чтобы они были стабильными, использование официального API GPGME может справиться с этим более точно и, таким образом, вы получите более надежное решение.

Правильный способ использования gpgme как api, он имеет привязки C++.

Если вы абсолютно уверены, что хотите сделать это по своему усмотрению, возможно, вы захотите рассмотреть popen(), введя двоичный код без «--no-tty» и записать в полученный файл указатель. Однако это не оптимально, поскольку GnuPG обычно задает вопросы, и вам нужно быть готовым к тому, чтобы ваша программа ответила на них.

Использование API намного предпочтительнее.

+0

Спасибо, я думал, что предложенный способ. Я использовал -r [имя пользователя], и тесты в терминале не имели никаких предупреждений или ошибок. В то же время я попытался удалить «-no-tty» в параметрах gpg, но с тем же результатом - я получил предупреждение в debug/Output и gpg был непригодным (errno 9). –

+0

Является ли ERR тем же FD, что и STDERR? Вы пытались сделать то же самое без закрытия() ERR? Для меня это похоже на то, что GnuPG жалуется на то, что не имеет STERR и ему нужно его снова открыть. Я просто сделал int main (void) { FILE * fp = popen ("gpg2 -r 1346E6A5 -e -o /tmp/out.pgp", "w"); write ("foo", fp, 4); return (0); } – SunTsu

+0

Я пробовал в обоих направлениях. И когда я попытался имитировать действие с помощью команды, gpg (gpg -e -r имя пользователя -o filename) не записывал текст с клавиатуры в файл. gpg сделал файл, он сделал только заголовок. –