【问题标题】:How to chdir using C in Linux environment如何在 Linux 环境中使用 C 进行 chdir
【发布时间】:2012-11-02 23:59:10
【问题描述】:

我是 C 编程新手。当我有$ans 时如何更改/home/jobs/$ans/xxx/ 之类的目录是我不能在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更改目录?

【问题讨论】:

  • sprintf 是你想要的功能。

标签: c linux chdir


【解决方案1】:

使用类似的东西:

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

【讨论】:

  • snprintf(blah, sizeof(blah), ...) 是标准的成语。您不必为呼叫中指定的号码预留额外的字符。 OTOH,您可以/应该使用if (scanf("%199s", jdir) != 1),更正&amp;jdir(相同的值,不同的类型)并确保字符串不会溢出(并且199是正确的;您必须分配额外的字符)。 而且(就像@cHao 说的那样),如果用户在jdir 中输入了很多字符,则blah 需要更多空间。事实上,blah 至少应该比jdir 长 15 个字符。
  • 据说,您可能需要调整这些缓冲区大小。如果我输入“../jobs/./././(87+ more ./'s)”,看起来这会让我进入 /home/jobs。 (是的,我很无聊。)blah 应该足够大,至少可以考虑输入大小加上已知文本。
  • scanf("%s")gets 一样不安全。
【解决方案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% 正确是多么困难 - 我不断回顾它并意识到我忘记了另一个需要防御的案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2018-08-12
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多