1

我正在为 MAC OSX 编写一个 C++ 程序,并且我有第三个奇偶校验程序“parse”,用​​于将一些 .js 上传到他们的服务器。终端中只有几个 cmd 行可以运行。

>parse new [folder]
Login>[email]
Pw>[pw]
projectID>[pid]

我想自动。这个过程在我的程序中,但我不知道如何将所有 cmd 打包在一起。

当我打电话时system("parse new [folder] && [email] && [pw] && [pid]");

进程保持在登录>

然后我打电话system("parse new [folder] && wait && [email] && wait && [pw] && wait && [pid]");

它仍然保持在登录>

请问怎么给cmd输入参数?谢谢

4

2 回答 2

1

我不记得确切的命令叫什么,但它存在!

现在,我找到了。该expect命令将等待您所描述的提示,然后它将伪装成键盘并输入数据。一个简单的例子:

#!/usr/bin/expect


set timeout 20

spawn "./parse"

FOLDER="/x/y/z"
LOGIN="Randy"
PASSWORD="horse_stapler"
PROJECTID="136729"


expect "parse new " { send "$FOLDER" }
expect "Login>" { send "$LOGIN" }
expect "Pw>" { send "$PASSWORD" }
expect "projectID>" { send "$PROJECTID" }

interact

...更多像这样的例子在这里

可是等等。

需要知道两件事。

首先,脚本顶部是“#!/usr/bin/expect”的原因是因为这不是 bash。相反,这是它自己的特殊脚本。在链接中阅读更多内容。

这个非常重要。我不打算讨论这个,但是永远不要在程序中将密码存储为纯文本。不要将此程序提供给使用纯文本密码的人,因为它是一个巨大的安全漏洞。

于 2013-07-24T04:17:28.637 回答
0

parse程序似乎正在从标准输入读取。如果这是正确的,您需要确保在不同的输入行中提供电子邮件、目录和项目 ID。

测试这是否适用于一个简单的 shell 脚本:

parse new [folder] <<EOF
[email]
[pw]
[pid]
EOF

如果它有效,那么您需要在传递给的字符串中使用多行格式化相同的命令system()

如果它不起作用,则表明parse程序正在从标准输入以外的其他内容中读取;它可能与/dev/tty其他东西有关。我会仔细研究它的功能strace或类似的程序,以了解它实际执行的系统调用。

您使用&&etc 的代码将不起作用;运行parse命令,如果成功,则运行程序[email],如果由于某种意外有效,则运行[pw],并且[pid]

于 2013-07-24T04:18:28.143 回答