如何在Linux环境下的c程序中使用chdir

时间:2012-11-02 23:59:11

标签: c linux chdir

我是c编程的新手。 我如何进入Linux环境,如/ home / jobs / $ ans / xxx /,而我的$ ans是一个用户字符串,我不能在c程序中使用chdir。

我的脚本如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
char jdir;
printf("Enter job directory:");  /* user input for different directories */
scanf("jdir");
chdir("/home/jobs/%jdir/xxx");
system("ls -ltr");
return(0);
}

如何获得chdir?

2 个答案:

答案 0 :(得分:2)

使用类似:

char jdir[200]
scanf("%s", &jdir);
char blah[200];
snprintf(blah, 199, "/home/jobs/%s/xxx", jdir);
chdir(blah);

答案 1 :(得分:2)

用C语言写这个程序似乎有些愚蠢,但是如果有充分的理由这样做(例如,如果它必须是setuid)那么你应该对它有更大的防御性。我会做这样的事情:

#define _XOPEN_SOURCE 700 /* getline */
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
    char *jobdir = 0;
    size_t asize = 0;
    ssize_t len;

    fputs("Enter job directory: ", stdout);
    fflush(stdout);
    len = getline(&jobdir, &asize, stdin);
    if (len < 0) {
        perror("getline");
        return 1;
    }

    jobdir[--len] = '\0'; /* remove trailing \n */
    if (len == 0 || !strcmp(jobdir, ".") || !strcmp(jobdir, "..")
        || strchr(jobdir, '/')) {
        fputs("job directory name may not be empty, \".\", or \"..\", "
              "nor contain a '/'\n", stderr);
        return 1;
    }

    if (chdir("/home/jobs") || chdir(jobdir) || chdir("xxx")) {
        perror(jobdir);
        return 1;
    }
    execlp("ls", "ls", "-ltr", (char *)0);
    perror("exec");
    return 1;
}

这个答案的编辑历史将证明让这100%正确是多么困难 - 我一直回到它并意识到我忘记了另一个需要防范的案例。