远程执行shell命令

时间:2013-01-29 16:20:24

标签: c linux sockets

我真的把头发拉到这里。我正在尝试为我的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" );

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

2 个答案:

答案 0 :(得分:2)

我会从你的错误消息中猜到你在传递给popen的字符串中有一个虚假的回车符。所以你实际上正在调用,例如popen("ls\r", "r");失败并显示错误消息ls\r: not found。当您打印该错误消息时,回车使其跳回到行的开头,看起来像: not found

回车是这种奇怪错误的臭名昭着的来源,因为它们不是外壳的空白,但是当你将它们打印出来时你无法真正看到它们。

答案 1 :(得分:1)

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

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