myshell实现Sudo三部曲 : crypt函数和getpass函数

上一章, 我们讲了如何获取加密密码, 现在我们要做的就是输入密码, 然后验证. 在这一部分, 我们要学习两个函数: crypt()getpass()


crypt()

原型: char *crypt(const char *key, const char *salt);

key是要加密的信息(最多八字节), salt是加密的算法类型 和 扰动数据. 我们的密码就是用这种方式来加密的, 那么, 如何将输入的密码进行加密后对比呢. 我们首先要找到某用户的salt. salt就是在加密口令的开始一部分的值, 它的格式为: $id$salt$ . 我们读取了这一部分之后, 就可以进行比对了.


getpass()

原型: char *getpass(const char *prompt);

了解了crypt, 我们的Sudo基本就完成了。
但是有一个值得优化的地方:密码的输入不能是明文!!! 
那大家就再了解一个函数吧,getpass是一个非回显输入的函数,它的参数和readline一样,起到输入提示的作用。有了这个函数,我们就可以非回显的输入密码,不怕别人看见了。

有人可能会问,为什么不用getch()函数呢。原因很简单。 Linux下没有这个函数,如果我们要实现这种功能, 只能修改终端设置,我的shell中, 就用到了这种方法实现getch的。


结语:
这就是我实现sudo命令的整个思路,整个shell的链接如下 github : myshell

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言实现Shell脚本重定向函数check4redirection和执行函数execute的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #define MAXARGS 20 #define MAXLINE 80 int check4redirection(char *cmd, int *in, int *out) { int i, len, pos = 0; char *args[MAXARGS]; char *infile, *outfile; len = strlen(cmd); for (i = 0; i < len; i++) { if (cmd[i] == '<') { infile = strtok(&cmd[i+1], " \t\n"); *in = open(infile, O_RDONLY); if (*in == -1) { perror("Open file error"); return -1; } cmd[i] = '\0'; } if (cmd[i] == '>') { outfile = strtok(&cmd[i+1], " \t\n"); *out = open(outfile, O_WRONLY|O_TRUNC|O_CREAT, 0644); if (*out == -1) { perror("Open file error"); return -1; } cmd[i] = '\0'; } } args[pos++] = strtok(cmd, " \t\n"); while ((args[pos++] = strtok(NULL, " \t\n")) != NULL); args[pos] = NULL; if (*in != STDIN_FILENO) { if (dup2(*in, STDIN_FILENO) == -1) { perror("Dup2 error"); return -1; } close(*in); } if (*out != STDOUT_FILENO) { if (dup2(*out, STDOUT_FILENO) == -1) { perror("Dup2 error"); return -1; } close(*out); } return execvp(args[0], args); } int execute(char *cmd) { int pid, status, in = STDIN_FILENO, out = STDOUT_FILENO; if ((pid = fork()) == -1) { perror("Fork error"); return -1; } else if (pid == 0) { return check4redirection(cmd, &in, &out); } else { while (wait(&status) != pid); return status; } } int main(int argc, char *argv[]) { char line[MAXLINE]; int status; while (1) { printf("myShell> "); fgets(line, MAXLINE, stdin); if (strcmp(line, "exit\n") == 0) exit(0); status = execute(line); printf("Exit status: %d\n", status); } return 0; } ``` 检查重定向的函数check4redirection接受一个命令字符串,以及两个指针(in和out),用于存储输入和输出的文件描述符。该函数首先使用strtok函数将命令字符串拆分为命令和参数数组args,然后在命令字符串获取输入和输出文件名,并打开相应文件。最后,该函数使用dup2函数将输入和输出文件描述符复制到STDIN_FILENO和STDOUT_FILENO,并关闭原始文件描述符。最后,该函数使用execvp函数执行指定的命令和参数。 执行函数execute接受一个命令字符串并在新进程调用check4redirection函数。如果fork失败,则返回-1。在子进程,调用check4redirection函数执行命令。在父进程,等待子进程执行完毕,并返回子进程的退出状态。主函数使用fgets从标准输入读取命令行,并在循环执行命令。如果用户输入exit,则退出程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值