Использование QProcess для CLI

Как я могу использовать QProcess для интерактивных аргументов командной строки, я пытаюсь передать файл, используя scp, который запрашивает пароль

QString program = "c:/temp/pscp.exe";
QStringList arguments;
arguments << "C:/Users/polaris8/Desktop/Test1GB.zip" <<   "[email protected]:/home/";
QPointer<QProcess> myProcess;
myProcess = new QProcess;
connect(myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
myProcess->start(program , arguments);

После этого командная строка запрашивает пароль, как его удовлетворить с помощью QProcess, могу ли я преодолеть это, указав некоторые параметры в моих аргументах только для scp, или какой должен быть код в моем слоте readOutput, который выдает пароль в командную строку. Любые предложения были бы полезны. Спасибо


person user3110438    schedule 14.01.2014    source источник
comment
передать имя пользователя/пароль в качестве аргументов в scp   -  person BЈовић    schedule 14.01.2014
comment
@LaszloPapp правильно. поэтому ему нужно выбрать другую программу для копирования   -  person BЈовић    schedule 14.01.2014
comment
Я бы не стал возиться с паролями, а вместо этого использовал аутентификацию на основе ключей.   -  person Frank Osterfeld    schedule 14.01.2014
comment
@BЈовић: ах, хм. pscp также является sftp-клиентом, и у него действительно есть параметры имени пользователя и пароля, в отличие от scp.   -  person lpapp    schedule 14.01.2014
comment
@LaszloPapp ... Я использую bash, было бы полезно немного подробностей .... спасибо   -  person user3110438    schedule 14.01.2014
comment
@ user3110438: уже отправил ответ некоторое время назад. :)   -  person lpapp    schedule 14.01.2014


Ответы (2)


Я думаю, вы можете передать имя пользователя/пароль в качестве параметров с помощью:

-l user
-pw passwd

Итак, ваши аргументы должны выглядеть так:

QStringList arguments;
arguments << "-l" << "Mrigendra" << "-pw" << "Password" <<
             "C:/Users/polaris8/Desktop/Test1GB.zip" <<
             "192.168.26.142:/home/";
person ThorKhan    schedule 14.01.2014
comment
Между прочим, документация QProcess предпочитает стиль QStringList arguments; arguments << "-style" << "fusion";. Я думаю, что в мире Qt -pw Password - это два аргумента, а не один. Хоть терминологически и логически, но ваш код может работать. - person lpapp; 14.01.2014
comment
@ThorKhan, спасибо, но он не работает с QProcess, но хорошо работает в командной строке Windows .... - person user3110438; 14.01.2014
comment
@ user3110438: по той причине, о которой я упоминал. Вам нужно будет разделить пароль -pw на отдельные аргументы в соответствии с моим ответом. - person lpapp; 14.01.2014
comment
Строго говоря, есть еще куда стремиться, поскольку такого типа, как StringList, не существует. - person lpapp; 14.01.2014

Вроде у scp таких опций нет, а у pscp (клиент sftp есть). Итак, я бы написал что-то подобное, чтобы расширить ваши первоначальные аргументы с помощью этого варианта на основе следующая справочная страница:

QString program = "c:/temp/pscp.exe";
QStringList arguments;
arguments << "-pw" << "password" << "C:/Users/polaris8/Desktop/Test1GB.zip" << "[email protected]:/home/";
             ^^^^^^^^^^^^^^^^^^^
QPointer<QProcess> myProcess;
myProcess = new QProcess;
connect(myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
myProcess->start(program , arguments);

Кроме того, я рекомендую вам использовать QStandardPaths для путь как у вас. Подробности смотрите в документации:

QStandardPaths::DesktopLocation 0   Returns the user's desktop directory.

Итак, вы можете в конечном итоге заменить эту строку:

"C:/Users/polaris8/Desktop/Test1GB.zip"

со следующим:

QStandardPaths::locate(QStandardPaths::DesktopLocation, "Test1GB.zip")

При этом вы можете рассмотреть возможность использования ключей вместо пароля в будущем. Это было бы немного более безопасно, а также удобно для вашего приложения.

person lpapp    schedule 14.01.2014
comment
порядок имеет значение, так как порядок, который вы указали, запрашивает пароль, и даже QProcess не работает. ; отлично работает в командной строке Windows, но Qproces терпит неудачу ..... Я делаю Qt несчастным в любом месте этого утверждения - person user3110438; 14.01.2014
comment
Правильный порядок: аргументы ‹‹ -pw ‹‹ polaris ‹‹ C:/Users/polaris8/Desktop/ToDo.txt ‹‹ [email protected]:/home/;... Это работает Спасибо Ласло и @ThorKhan - person user3110438; 14.01.2014
comment
@ user3110438: Кроме того, согласно моему ответу и подсказке о QStandardPaths, пожалуйста, не используйте жестко закодированные пути в своем коде. - person lpapp; 14.01.2014
comment
посмотрю на QStandardPaths.. Спасибо, что указали на это... Ласло, есть ли способ избавиться от имени пользователя и паролей и просто использовать ключи с помощью pscp? - person user3110438; 14.01.2014
comment
@user3110438: dafis.ucdavis.edu/install/sftp/PuttyPSCPKey.cfm Это помогает? - person lpapp; 14.01.2014