【发布时间】:2020-02-19 09:37:41
【问题描述】:
我的程序创建了一个使用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 "$"
我希望我的程序捕获“权限被拒绝”错误。
【问题讨论】:
-
您的脚本生成代码是用什么语言编写的?
-
查看system(3)的手册了解如何获取退出码。
-
你能在你的机器和 sftp 服务器之间设置 SSH 密钥吗?这会让你的生活变得更简单。
-
@ColinMacleod,我正在使用 C++