0

我真的把我的头发拉出来了。我正在尝试为我的 IRC 机器人创建远程 shell 执行,但是,当我使用诸如 "ls" 或 "cd" 之类的命令时,我得到了 ": not found" 的返回,但是,其他命令,例如 mkdir 或回声似乎工作正常。当我对命令进行硬编码时也是如此,我得到的输出与它应该的完全一样。

谁能明白为什么?这是我的代码:

            FILE *fp;
            int status;
            char path[1035];
            /* Open the command for reading. */
            fp = popen(ptr1, "r"); // hard code command and it works ????fp = popen("/bin/ls /etc/", "r");
            printf("%s", ptr1);//check received command (debugging)
            if (fp == NULL) {
                printf("Failed to run command\n" );

出于道德原因删除了一些代码。

4

2 回答 2

2

我会从您的错误消息中猜测您传递给 popen 的字符串中有一个虚假的回车符。因此,您实际上是在调用,例如popen("ls\r", "r");失败并显示错误消息ls\r: not found。当您打印该错误消息时,回车会导致它跳回到行首,看起来像: not found

回车是此类奇怪错误的臭名昭著的来源,因为它们不是 shell 的空白,但是当您将它们打印出来时,您实际上看不到它们。

于 2013-01-29T17:11:27.453 回答
1

在您上面的代码中 ptr1 未初始化。假设 ptr1 是您的命令并且在其他地方填充,您是否检查过字符串是否在正确的位置以零结尾?即使使用 printf,一些不可打印的字符也可能位于字符串结尾和零终止之间,因此您有“ls___”。只需对 ptr1 长度进行快速健全性检查即可:

printf("%s : %lu", ptr1, strlen(ptr1));

于 2013-01-29T17:05:16.643 回答