| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 267 人关注过本帖
标题:C实现一个 Shell 却登录失败
只看楼主 加入收藏
我要爆炸
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2022-9-2
收藏
 问题点数:0 回复次数:1 
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 登录 Shell NULL include 
2022-09-02 17:06
apull
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:三体星系
等 级:版主
威 望:149
帖 子:1281
专家分:7714
注 册:2010-3-16
收藏
得分:0 
你的linebuf 分配了多少内存用来接收字符串?
2022-09-05 15:40
快速回复:C实现一个 Shell 却登录失败
数据加载中...
 
   



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

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