标题:C实现一个 Shell 却登录失败
取消只看楼主
我要爆炸
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2022-9-2
 问题点数:0 回复次数:0 
C实现一个 Shell 却登录失败
我自己写了一个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);
}
搜索更多相关主题的帖子: cmd include Shell NULL 登录 
2022-09-02 16:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509936-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.135992 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved