注册 登录
编程论坛 Linux教室

C实现一个 Shell 却登录失败

我要爆炸 发布于 2022-09-02 17:06, 3316 次点击
我自己写了一个Shell,发布到 /usr/local/bin/myshell,并修改 /etc/passwd 中的“登录Shell”字段,使其指向 /usr/local/bin/myshell,但是登录时出现问题。
如果我在物理机上以多用户模式登录,则每次输入完密码后,就会让我重新输入用户名和密码。
如果使用 XShell 就能正常登录。
老哥们帮我看看,到底是哪出问题了。

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <glob.h>
#include <sys/types.h>
#include <wait.h>

#define DELIMS " \t\n"

//虽然目前我们解析外部命令,只要一个glob_t就行了,但考虑到将来可能还要解析内部命令,
//到时候还要附带额外信息,所以做成结构体,将所有用到的数据封装进去。
struct cmd_st
{
    glob_t globres;
};

static void prompt(void)
{
    printf("mysh-0.1 $ ");
}

static void parse(char* line, struct cmd_st* cmd)
{
    char* tok;
    int flag = 0;
    tok = strtok(line, DELIMS);
    while (1)
    {
        if (tok == NULL)
            break;
        /*!!! GLOB_APPEND * flag 操作,惊为天人 !!!*/
        glob(tok, GLOB_NOCHECK | GLOB_APPEND * flag, NULL, &(cmd->globres));
        flag = 1;
        tok = strtok(NULL, DELIMS);
    }
}

int main()
{
    char* linebuf = NULL;
    size_t linebuf_size = 0;
    struct cmd_st cmd;
    pid_t pid;

    while (true)
    {
        prompt();
        if (getline(&linebuf, &linebuf_size, stdin) < 0)
            break;
        parse(linebuf, &cmd);
        if (0)        //内部命令
        {
            /* Do Something */
        }
        else        //外部命令
        {
            pid = fork();
            if (pid < 0)
            {
                perror("fork()");
                exit(1);
            }
            if (pid == 0)
            {
                execvp(cmd.globres.gl_pathv[0],cmd.globres.gl_pathv);
                perror("execvp()");
                exit(1);
            }
            else
            {
                wait(NULL);
            }
        }
    }
    exit(0);
}
1 回复
#2
apull2022-09-05 15:40
你的linebuf 分配了多少内存用来接收字符串?
1