获取由system()运行的SFTP命令的退出代码

问题描述 投票:-1回答:1

我的程序创建了一个脚本,该脚本使用Expect执行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 "$"

我希望我的程序捕获“权限被拒绝”错误。

c++ system expect
1个回答
0
投票

所有进程在结束时都设置一个数字退出代码(0..255)。更改期望脚本,以便您可以区分正常结束的脚本(通常退出代码为0)和错误后的显式exit。通过向该行添加参数来执行此操作,例如:

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

您可以使用以下方法在C ++程序中恢复此代码:>

int exit_code = system(command.c_str());

请参见man 3 exit

© www.soinside.com 2019 - 2024. All rights reserved.