Alibaba Cloud Linux操作系统Shell程序
1. 创建资源
开始实验之前,您需要先创建实验相关资源。
- 在实验室页面,单击创建资源。
- (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。
说明:资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。
实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。
资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息
2. shell的基础知识及使用
- Linux Shell的基础知识
1)Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。是在Linux内核与用户之间的解释器程序,现在Linux通常指/bin/bash解释器来负责向内核翻译以及传达用户/程序指令,shell相当于操作系统的“外壳”。
2)、shell不止有一种。在计算机历史的长河里,有许多种shell,例如:
①Bourne shell(简称为sh):第一个shell,UNIX上的标准shell,很多UNIX版本都配有sh。sh是第一个流行的Shell。
②C shell(简称为csh):这个shell的语法有点类似C语言,所以才得名为C shell ,简称为csh。
③Bourne Again Shell(简称为bash):这是对Bourne shell的增强版本。bash shell是Linux的默认shell。bash由GNU组织开发,保持了对sh shell的兼容性,是各种Linux发行版默认配置的 shell。尽管如此,bash和sh还是有一些不同之处:一方面,bash扩展了一些命令和参数;另一方面,bash并不完全和sh;兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用bash代替sh。
④Tenex C shell(简称tcsh):是C shell的增强版本,加入了命令补全功能,提供了更加强大的语法支持。
⑤ash:一个简单的轻量级的Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
- 默认的linux Shell ——bash Shell和ksh、tcsh以及zsh使用和设置
- shell常用命令的使用
cd命令
cd .. ——进入上级目录,cd 路径——切换到路径目录下
输入cd .. 可见 ~ 变为 / ,意味着从家目录切换到了根目录。家目录一般为用户目录。
输入命令 ls 可以看到根目录脚下的所有文件。
cd root / 又变回~,说明这里的家目录是root,因为我们目前使用的是root账户。
touch命令——新建一个文件
输入touch 1.c,在输入ls可以看到创建文件成功。亦可用vi编辑器创建文件,这里不再演示。
mkdir命令——新建文件夹
输入 mkdir new,再输入ls查看。
cat命令——查看当前文件内容
用vi/vim编辑器编辑1.c,这里不再演示,直接上结果。
./+可执行文件名——运行可执行文件
gcc编译并生成可执行文件
2)更换其他类型的shell
Linux默认使用的是bash,但是其实支持许多类型的。可以通过这个命令查看linux支持的cat /etc/shells
用echo $SHELL可以查看系统默认的shell
没有ksh、tcsh、zsh,需要安装
输入yum -y install ksh tcsh zsh进行这些shell的安装,并再次查看当前linux的shell,发现已经都成功安装。
chsh命令——用来更换登录系统时使用的shell
通过chsh -s /bin/xxx 尝试shell的切换
上述命令只是修改了登录时启动的shell,如果要切换shell需要重新登录
通过sudo login想重新登录,系统提示远程连接断开,点击重新连接后,再查看当前的shell,改变了。
3. shell的原理及实现
1.了解管道和进程组、会话和进程组、会话和作业控制的内容。
管道 :多个进程的一种通信手段 共享内存区,进程把共享信息放在那里,通过一些API提供信息交换
进程组 :是一个或者多个进程的集合,通常与一组作业相关联
会话 :是一个或者多个进程组的集合,一个会话可以有一个控制终端
作业控制: 让一个作业在前台或者后台运行
2.shell原理
shell就是利用程序替换的原理进行实现的。fork一个进程,如果fork成功,子进程执行指定的操作或命令,需要执行exec族函数;父进程⽤wait命令等待子进程结束。wait系统调⽤同时从内核取得退出状态或者信号序号以告知⼦进程是如何结束的。
3.实现一个简单的命令解释器,即Linux中的Shell程序。要求其设计类似目前流行的Shell解释程序,但不需要具备太复杂的功能。
这部分需要独立完成,并不会给出教程,实现shell过程中可能会用到的系统调用如下。
(1) pid_t fork(void):创建一个新的进程。返回值:一次调用两次返回,子进程返回0,父进程返回子进程ID,创建进程失败,返回-1.
注意:通过fork创建的子进程,会拷贝父进程的(数据段、bss段、堆、栈、I/O流缓冲区等)数据段,与父进程共享代码段。可以根据返回值的不同,让父子进程进入不同的分支,执行不同的代码。
(2) int execvp(const char *file, char * const argv[]):加载一个可执行程序到调用进程的地址空间,然后执行这个程序。如果成功,它就会覆盖当前运行的进程内容。有若干个类似的exec系统调用。
(3) int wait(int *stat_loc):如果有退出的子进程,则返回退出的子进程的状态;如果没有任何子进程在运行,则返回错误。如果当前有子进程正在运行,则函数会一直阻塞直到一个子进程退出。
(4) pid_t waitpaid(pid_t pid, int *stat_loc, int options):类似于函数wait,但允许用户等待某个进程组的特定进程,并可以设置等待选项。
(5) int tcsetpgrp(int fildes, pid_t pgid_id):将前台进程组ID设置为pgid_id,files是与控制终端相联系的文件描述符。终端通常指标准输入、标准输出和标准错误输出(文件描述符为0、1、2)。
(6) int setpgid(pid_t pid, pid_t pgid):把pid进程的进程组ID设置为pgid。
(7) int dup2(int fildes, int fildes2):把fildes文件描述符复制到fildes2。如果files2已经打开,则先将其关闭,然后进行复制,使fildes和fildes2指向同一文件。
(8) int pipe(int fildes[2]):创建一个管道,把管道的读和写文件描述符放到数组fildes中。
4. 实验要求及总结
(1) 比较至少两种Shell的特点;
(2) Shell环境变量对系统安全和用户使用的影响,以PATH alias举例说明;
(3) 实现一个简单的命令解释器,即Linux中的Shell程序。要求其设计类似目前流行的Shell解释程序,但不需要具备太复杂的功能。提供清晰、详细的Shell程序设计文档和源程序。
实验链接:https://developer.aliyun.com/adc/scenario/3238d571312543278c4b2c2eb3f104f5