shell本身也是个应用程序,利用C库或者系统调用执行相应的操作。考虑最简单的场景,读取用户输入,并执行指令,即可实现一个最简单的shell。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFF_LEN 128
int main()
{
char buff[BUFF_LEN] = {0};
while (1) {
printf("yihelscBash>");
fflush(stdout);
fgets(buff, BUFF_LEN, stdin);
buff[strlen(buff) - 1] = 0;
system(buff);
}
}
简单的几行代码即可获取stdin的输入,然后直接调用system执行。在UBUNTU环境,实际生效为shell还需要将这个shell路径加入到/etc/shells。
然后切换shell指令,输入密码即可。
我们可以从/etc/passwd中看到用户的shell已经修改成功。
当我们再次通过ssh登陆到到用户时,就会进入我们自己的shell。
这样我们最简单的shell就开发并替换完成了。请注意,这个shell虽然可以执行很多输入的命令,但是距离一个可以实用的,让系统各个功能运行起来的成熟shell还差很远,至少当前阻塞性读取stdin的机制就会导致其他应用或系统部调用shell去执行命令时直接卡住。
最后提醒大家测试完成后,及时换回到原来的shell。另外,测试shell程序时要创建一个测试用户,修改测试用户的shell,避免因为shell写的有问题,导致用户再也无法回到原来的shell等严重问题。
gitcode链接: