- Bash只是linux众多的CLI(命令行界面区别于GUI-图形用户界面)的shell的一种。shell是一个介于用户和操作系统内核之间的负责沟通的工具。
- shell从人机交互角度上看,可分为交互式和非交互式。从字面上很好理解,你可以在交互式shell上的提示符右边输入命令,查询结果。非交互式可以执行脚本,但没有命令提示符。下面是mac上的两种默认的交互shell。
使用对象 | 确认方法 | 实例 |
---|---|---|
用户默认交互shell | cat /etc/passwd | bash |
系统默认交互shell | ls /bin/sh | sh |
shell从安全性上讲,分为登录shell和非登录shell。和交互非交互是两个维度的东西。
使用对象 | 确认方法 | 实例 |
---|---|---|
登录shell | 可用exit和logout退出 | 登录后打开的第一个bash |
非登录shell | 只能用exit退出 | 通过登录shell(bash)打开的其它shell |
两个视角的shell(这里就当bash)也可看做bash可运行在两两组合的四种不同模式上,具体例子看下表,使用的环境文件是不同的,也就是说这四种不同模式下的环境变量是不同的。你如果想保存你的hash的环境变量,只和你自己有关的,可保存在$HOME/.bashrc中,和所有用户都相关的,保存在/etc/profile中source的那个profile.d目录中新建的脚本文件中,而不要直接修改profile(升级后会变)
使用对象 | 交互 | 非交互 |
---|---|---|
登录shell | 登录后打开的第一个bash | 常见的shell脚本的运行方式 |
环境文件 | /etc/profile $HOME/.bash_profile $HOME/.bash_login $HOME/.profile $HOME/.bashrc | /etc/profile |
非登录shell | 通过登录shell(bash)打开的其它shell | 强制使用登录方式打开的shell脚本。可以改变脚本访问的全局文件,在不少情况下也需要使用(远程使用非登录shell调用脚本但需要登录的全局环境时适用) |
环境文件 | $HOME/.bashrc | /etc/profile |
- 终端(TTY:teletypewriter ,通过线缆和主机相连的哑(不发声,有/无屏幕)终端)和控制台(console)则是完全继承于UNIX诞生时小型机时代的概念,一般我们在涉及硬件相关描述的时候,才会用这两个词。控制台是一种特殊的终端,是固定在大型机上的那个终端。那个带键盘的东西就是(console),买机器的时候一般都需要买个这个。控制台是个完完全全的CLI,你如果想要这个,当前Linux通过ctrl+alt+F1,Fn提供给你。F1~Fn那是因为1个控制台不够,你可以同时启动多个会话。需要注意的是,好多类UNIX系统的GUI提供了一个图形化的仿真终端软件,名字就叫终端,我一般就是在这用,基本上和TTY没有什么区别,但在TTY中无法运行任何GUI程序。容易混淆,值得注意。**但不管是哪种终端,终端的作用就是运行shell。**图片为DEC的PDP-7,也就是那台UNIX的载体:
- 用户:linux系统安全的核心是用户账户。每个能进入linux系统的用户都会被分配唯一的用户用户账户。用户信息记录在/etc/passwd文件中。linux系统会为各种不同功能创建不同的用户账户,而这些用户并不是真正地用户。Ubuntu从1000开始为真正的用户分配用户ID。macos从500开始分。下面的ubuntu显示的部分数据我们可以看到我当前的用户ken的用户id为1000,设置的一个uftp服务用户id为1001。另外,系统还为提供的ftp服务设置了一个ftp用户。提供telnet服务的telnetd进程设置了一个telnetd服务。
用户名 | 密码 | 用户ID | 用户组ID | 用户备注字段 | 用户主工作目录 | 用户使用的shell种类 |
---|---|---|---|---|---|---|
root | x | 0 | 0 | root | /root | /bin/bash |
daemon | x | 1 | 1 | daemon | /usr/sbin | /usr/sbin/nologin |
bin | x | 2 | 2 | bin | /bin | /usr/sbin/nologin |
sys | x | 3 | 3 | sys | /dev | /usr/sbin/nologin |
ken | x | 1000 | 1000 | ken, | /home/ken | /bin/bash |
ftp | x | 122 | 127 | ftp daemon, | /srv/ftp | /usr/sbin/nologin |
uftp | x | 1001 | 1001 | /home/uftp/ | /bin/bash | |
telnetd | x | 123 | 128 | /nonexistent | /usr/sbin/nologin |
注意,上面这个表格是通过sed命令直接生成的符合编辑器要求的格式。
for line in $(cat /etc/passwd); do echo "|$line|" | sed 's/:/|/g'; done
-
用户组:linux为了解决共享资源所采用的另外一个安全概念group。组的权限允许多个用户对系统中的对象(文件,目录,设备)共享一组共用的权限。不同的系统对group的使用思路有差异,Ubuntu会为每个用户创建一个单独的与用户账号同名的组。GID的分配方式和UID类似。
-
BASH上可以运行的命令分为两种,内建命令和外部命令。可以通过type -a命令进行查询。区别是执行效率的区别,BASH上执行外部命令要fork(衍生)一个子进程,效率显然要低一点。内部命令是和BASH编译在一起的。就像你随身带个工具箱,总比工具箱放别人那,每次用还要走申请,批准流程啥的。因而效率高。但有个叫ZSH的shell挺牛,貌似能把外部命令转换成内部命令。
-
文件系统和文件格式,linux中一切皆文件,这两个概念一定要明确。文件格式是决定了软件如何使用该文件,比如mp4是视频的一种文件格式,使用它的是视频播放软件(VLC)或硬件。mp3是音频的一种文件格式。ELF是一种可执行文件的格式,使用它的是操作系统。 文件系统是一套管理办法(协议),如何组织,添加,删除,查找…文件的方法.比如EXT文件系统。规定了文件名命名方法,文件名长度,文件大小限制,目录的组织方法等等。linux和windows文件系统的处理上有个显著区别就是目录和分区的关系。windows的目录在分区中,而linux的分区挂载在目录上。那你可能要问,我连分区都没有,linux的目录在那哪呢?分区挂哪里呢?linux的目录结构大的框架是内定的,是虚拟的,也就说文件系统直遵循了这个协议。比如’/'是根目录,根目录上还有一些约定俗成的目录。/mnt目录就是用来挂载的。
/bin二进制可执行命令
/dev设备特殊文件
/etc系统管理和配置文件
/etc/rc.d启动的配置文件和脚本
/home用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/lib标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件
/sbin超级管理命令,这里存放的是系统管理员使用的管理程序
/tmp公共的临时文件存储点
/root系统管理员的主目录
/mnt系统提供这个目录是让用户临时挂载其他的文件系统
/lost+found这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
/proc虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/var某些大文件的溢出区,比方说各种服务的日志文件
/usr最庞大的目录,要用到的应用程序和文件几乎都在这个目录,其中包含:
/usr/x11R6存放xwindow的目录
/usr/bin众多的应用程序
/usr/sbin超级用户的一些管理程序
/usr/doclinux文档
/usr/includelinux下开发和编译应用程序所需要的头文件
/usr/lib常用的动态链接库和软件包的配置文件
/usr/man帮助文档
/usr/src源代码,linux内核的源代码就放在/usr/src/linux里
/usr/local/bin本地增加的命令
/usr/local/lib本地增加的库根文件系统 -
api是不是内核,不是,操作系统的内核通过对外提供系统调用提供服务,API是输入第三方(不是操作系统内核提供方)提供的。比如linux的Glibc库,就是一个用封装了系统调用(system call,这玩意是属于内核的)对外提供的C语言接口API。即便都是C语言,还有不同作用的API,有的关注兼容性,有的关注GUI。不同语言还有不同语言的API,比如python也可进行系统编程。所以api是应用层的东西。我理解这也是为啥当初GNU在没有Linux内核的情况下,也能开发GNU工具的原因,GNU如果基于C语言开发,那么Glibc(linux上的C语言Runtime库)的api只要实现的预期功能,就可以达成该目标。
-
驱动是内核,驱动是系统调用和硬件的中间层。,驱动允许应用和物理设备之间交换数据。驱动程序有两种方法生效,编译进操作系统或插入操作系统(安装驱动程序)。
-
shell上也可以编程,跑脚本,shell中的那些命令是API么?shell实际上是人机交互的命令行界面工具,shell上的命令就是操作系统提供的系统命令,比如ls,pwd…这些命令大部分是用C编写的,这我们就明白了,shell中的那些命令不是API,是一个一个高级的小工具。而shell就是一个高效使用这些工具的平台。
经常看到有这样的图阐述shell:我理解这里面有的概念是对的,左边这个用户是对的,右边这三个同心圆的概念是错误的,shell搞的好像和API的位置相同,而且完全包住了系统内核。其实不然,shell只是上图中应用程序那一层的一部分。运用到了很多其它工具。说shell(使用的命令)比API高至少2个层次一点都不过分。BASH和gcc,gdb,glibc, ls,pwd,sed,awk,grep等工具相互成全,混杂在一起,都放到上面的GNU系统工具链里。
建议这个图改成这样,用户通过shell或GUI和电脑操作,就这么简单。