0

私は文字通りここで髪を引っ張っています。IRC ボットのリモート シェル実行を作成しようとしていますが、「ls」や「cd」などのコマンドを使用すると、「: not found」が返されますが、mkdir やecho は正常に動作しているようです。コマンドをハードコーディングする場合も同様で、得られる出力は本来あるべきものとまったく同じです。

誰でも理由がわかりますか?これが私のコードです:

            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

改行は、シェルにとって空白ではないため、このような奇妙なエラーの悪名高いソースですが、印刷すると実際にはわかりません。

于 2013-01-29T17:11:27.453 に答える
1

上記のコードでは、ptr1は初期化されていません。ptr1がコマンドであり、他の場所に入力されていると仮定して、文字列が正しい場所でゼロで終了しているかどうかを確認しましたか?printfを使用している場合でも、文字列の末尾とゼロ終端の間に印刷できない文字が含まれている可能性があるため、「ls___」が使用されます。ptr1の長さを簡単に確認するだけで、次のことが可能になります。

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

于 2013-01-29T17:05:16.643 に答える