Получить код завершения команды SFTP, запущенной системой () - PullRequest
0 голосов
/ 19 февраля 2020

моя программа создала скрипт, который выполняет команду sftp с использованием ожидаемого. Скрипт должен загрузить файл с SFTP-сервера. Когда сценарий генерируется, моя программа вызывает системную команду для запуска сценария. Сценарий должен завершиться при возникновении ошибки. Например, если пароль неверный. Как я могу получить ошибку, возвращаемую командой sftp?

Ниже приведен код, который генерирует и запускает сценарий:

downloadFileFromServer()
{
    ofstream downloadScript;
    string  result, command;

    downloadScript.open("/temp/download.sh");

    downloadScript << "#!/usr/bin/expect -f \n";
    downloadScript << "spawn sftp -P " + <port number> +
                      " " + <user name> +
                      "@" + <IP> + "\n";
    downloadScript << "expect { \ntimeout {\nsend_user \"Permission denied\\n\"\nexit\n}\n}\n";

    downloadScript << "send \"" + <password> + "\\n\"\n";
    downloadScript << "expect \"sftp>\"""\n";
    downloadScript << "send \"cd " + <source directory> + "\\n\"\n";
    downloadScript << "expect \"sftp>\"""\n";
    downloadScript << "send \"lcd " + <destination directory> + "\\n\"\n";
    downloadScript << "expect \"sftp>\"""\n";
    downloadScript << "send \"get " + <file name> + "\\n\"\n";
    downloadScript << "expect \"sftp>\"""\n";
    downloadScript << "send \"exit\\n\"\n";
    downloadScript << "expect -exact \"$\"""\n";

    downloadScript.close();

    command = "chmod +x /temp/download.sh && /temp/download.sh";
    system(command.c_str());

}

Ниже создан сценарий:

#!/usr/bin/expect -f 
spawn sftp -P <port numner> <user name>@<IP>
expect "<user name>@<IP>'s password:"
expect { 
timeout {
send_user "Permission denied\n"
exit
}
}
send "<password>\n"
expect "sftp>"
send "cd <source directory>\n"
expect "sftp>"
send "lcd <destination directory>\n"
expect "sftp>"
send "get <file name>\n"
expect "sftp>"
send "exit\n"
expect -exact "$"

Я хочу, чтобы моя программа обнаружила ошибку «Отказано в доступе».

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Вам необходимо отправить пароль, прежде чем проверять таймауты

expect "<user name>@<IP>'s password:"
send "<password>\n"
expect {
    timeout {
        send_user "Permission denied\n"
        exit 1
    }
    "sftp>"
}
send "cd ..."

Я ожидаю поиска таймаута или приглашения, в зависимости от того, что наступит раньше.

0 голосов
/ 19 февраля 2020

Все процессы устанавливают цифры c код выхода (0..255), когда они заканчиваются. Измените ожидаемый сценарий, чтобы вы могли различать guish между сценарием, заканчивающимся нормально (когда обычно код выхода будет равен 0), и явным exit после ошибки. Сделайте это, добавив параметр в эту строку, например:

...
send_user "Permission denied\n"
exit 77
...

Вы можете восстановить этот код в программе на C / C ++ с помощью

int wstatus = system(command.c_str());
if (WIFEXITED(wstatus))
  int exit_code = WEXITSTATUS(wstatus);

wstatus состоит из 2 части, код завершения процесса и некоторые флаги, дающие информацию о том, был ли процесс запущен или был прерван, и так далее. Используйте вышеупомянутые макросы для извлечения информации. См man 3 exit, man waitpid.

...