当你敲下命令的瞬间,发生了什么?

Crq
Crq
Crq
1228
文章
0
评论
2024年12月21日05:53:35
评论
20 2418字阅读8分3秒
摘要

我们总是在敲命令,但是有没有思考当我们敲下命令的瞬间,我们的操作系统为我们做了什么呢?本文主要讲一讲当我们敲下命令按了回车,系统做了什么事情。希望可以让我们对于系统的理解更加深入。

日常工作中,我们总是在敲命令,但是有没有思考当我们敲下命令的瞬间,我们的操作系统为我们做了什么呢?下面我们主要讲一讲当我们敲下命令按了回车,系统做了什么事情。希望可以让我们对于系统的理解更加深入。

我们都知道,linux里面一切都是文件,那么其实我们敲的命令也不例外,命令也是文件。那当我们敲下比如“pwd”命令的时候,发生了什么事情呢?

1、了解shell

计算机硬件是由运算器、控制器、存储器、输入输出设备等设备组成的,而能够让机箱内各种设备各司其职的叫做系统内核。系统内核负责驱动硬件、管理活动和分配/管理硬件资源,它对于计算机太重要了,所以不可以让用户直接操作。

因为用户不能直接控制硬件,也不能直接操作系统内核,于是便需要基于“系统调用接口”开发出的程序/服务来满足用户的日常工作,那么shell就是人与硬件之间的翻译官。

用户将一些命令“告诉”Shell,它就会调用相应的程序服务执行工作啦,很厉害吧~~现在包括红帽系统在内的许多热门Linux系统主流默认字符Shell是Bash(Bourne-Again SHell)。

bash拥有以下四点优点:

1.通过上下方向键来调取过往执行过的命令。
2.命令或参数仅需输入前几位就可以用tab键补全。
3.强大的批处理脚本。
4.实用的环境变量。
2、检查命令的路径

比如我们写一个“ls”命令给系统,系统如何知道我们写的这个命令是什么意思呢?

首先,第一步骤阶段是判断用户是否以绝对路径方式输入命令。如果是绝对路径(如/bin/ls)的话则直接执行。如果不是的话,系统就直接进入下一步的判断。

3、别名命令?

然后,系统会判断是不是别名命令。即用一个自创的命令名称来替换原本的命令名称。

咱们可以用alias命令来创建自己的命令别名,格式为:“alias 别名=命令”,若要取消一个别名的话则是用unalias命令,格式为:“unalias 别名”。

例如咱们以前用rm命令删除文件的时候都要被要求再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令,咱们可以将它取消掉:

[root@localhost ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
[root@localhost ~]# rm anaconda-ks.cfg 
rm: remove regular file ‘anaconda-ks.cfg’? y
[root@localhost ~]# alias rm
alias rm='rm -i'
[root@localhost ~]# unalias rm
[root@localhost ~]# rm initial-setup-ks.cfg 
[root@localhost ~]#
4、内部/外部命令?

然后,就是由SHELL解释器(Bash)来判断用户输入的是内部命令还是外部命令。

所谓的内部命令是解释器内部的指令(在启动时就调入内存的,执行效率高),会被直接的执行,而绝大部分的时候都会是外部命令(系统的软件功能,用户需要时才从硬盘调入内存的),交由给第四步骤来继续处理,当然您还可以使用“type 命令名称”来手工判断是内部命令还是外部命令,也是很有趣的。

5、查找命令

当bash判断该命令是外部命令的时候,我们需要系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫做PATH,可以简单把它理解成是“解释器的小助手”,作用是告诉解释器要执行的命令可能存放到了那里,然后bash就会乖乖的在这些目录中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,咱们对这些路径的增加和删除操作就是在直接影响bash解释器搜索linux命令的位置。

[root@linuxprobe ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
[root@linuxprobe ~]# PATH=$PATH:/root/bin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
经典问题:为什么不能在$PATH中添加进当前目录(.)那?

虽然将$PATH变量添加了当前目录(.)会在一些情况让用户免去输入命令所在路径的麻烦,但如果黑客在比较常用的公共目录/tmp中存放了一个名为"ls"或"cd"的同名木马文件,那么用户就极有可能错误的执行了。

所以作为一名谨慎的、有经验的运维人员在接手了一台Linux系统后一定会在执行命令前先检查下PATH变量中是否有可疑的目录,您可以使用env命令来查看到linux系统中所有的环境变量。

本文原创地址:https://www.linuxprobe.com/what-happened-click.html作者:王毅,审核员:逄增宝

本文原创地址:https://www.linuxprobe.com/what-happened-click.html编辑:王毅,审核员:暂无

weinxin
我的微信
这是我的微信扫一扫
Crq
  • 本文由 发表于 2024年12月21日05:53:35
  • 转载请注明:https://www.cncrq.com/12236.html
提高 Java 中锁的性能的技巧 Linux教程

提高 Java 中锁的性能的技巧

两个月前向Plumbr公司引进线程死锁的检测之后,我们开始收到一些类似于这样的询问:“棒极了!现在我知道造成程序出现性能问题的原因了,但是接下来该怎么做呢?”
Linux十大PHP安全要点 Linux教程

Linux十大PHP安全要点

PHP是使用最广泛的脚本编程语言之一。市场份额颇能说明其主导地位。PHP 7已推出,这个事实让这种编程语言对当前的开发人员来说更具吸引力。尽管出现了一些变化,但是许多开发人员对PH...
SUID~这账怎么算? Linux教程

SUID~这账怎么算?

我们都知道linux里面一切都是文件。文件拥有普通权限rwx,特殊权限suid,sgid,sbit等。本文分享一下suid几个的小实验,通过实验我们可以更加深入的理解suid权限,...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: