2-3解释器文件

解释器文件

是一种文本文件, 如 php写的解释器文件,python/shell解释器文件

解释器 是可执行文件ELF

如PHP解释器文件 新建 bash.php

1
2
3
4
##!/usr/local/php/bin/php
<?php
  echo 'hello';

可以通过像执行脚本文件(.sh)一样直接运行

1
./bash.php

在解释器文件开头必须指明解释器所在的绝对路径

如何启动的

为什么可以使用这种方式启动呢,使用 strace进行调试,发现execve的第一个参数说明

此处观察并不明显,我们再使用PHP解释器直接运行脚本并跟踪,对比execve函数的说明即可明白

1
strace -f -s 65500 php bash.php

execve()

pathname must be either a binary executable, or a script starting

with a line of the form:

##!interpreter [optional-arg]

第一个参数必须是一个可执行二进制文件,或一个脚本文件

bash进程是如何启动的

  1. 直接在centos终端登录, login服务去开启bash进程(物理机)
  2. 使用网络方式登录shell终端,由sshd服务区开启bash进程

sshd服务监听22端口

进程观察的命令
  1. pstree 查看进程树关系

    -a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;

    -c:不使用精简标示法;

    -G:使用VT100终端机的列绘图字符;

    -h:列出树状图时,特别标明现在执行的程序;

    -H<程序识别码>:此参数的效果和指定”-h"参数类似,但特别标明指定的程序;

    -l:采用长列格式显示树状图;

    -n:用程序识别码排序。预设是以程序名称来排序;

    -p:显示程序识别码;

    -u:显示用户名称;

    -U:使用UTF-8列绘图字符;

    -V:显示版本信息。

配合 $$ 名称查看当前的bash进程,或者在开一个窗口创建一个新的ssh连接,再次使用 pstree命令会发现sshd进程多一个bash子进程

编写一个不会退出的PHP脚本并运行,使用pstree命令查看信息

1
2
3
4
5
6
<?php
echo posix_getpid();
while(true){
  sleep(2);
  }

######## 查看bash的创建及运行

可以使用strace追踪sshd服务的进程号,使用 -p参数,然后创建新的ssh连接到服务器,可以观察到sshd服务创建的bash进程过程及在终端输入命令与shell交互的解析过程

可以看到连接到新的shell终端时,首先会使用 clone 函数克隆一个进程出来,并且执行 使用execve函数执行了 /bin/bash ,使用此函数会执行一个二进制ELF文件或者解释器脚本,并且会带上之前记录的命令行参数和环境变量表,这些就是克隆出来的新进程,会被新的执行程序覆盖,之后再此终端再进行的操作都是由当前bash再克隆出来的子进程在运行,同样是使用clone函数和execve, 如 ls命令,会先clone ,然后 execve('/usr/bin/ls’,…)

前台作业丢到后台运行

  1. ctrl+z 改命令会使任务被挂起,需要使用 bg %任务号使任务在后台继续运行

  1. 命令最后使用 & 符号

命令会放入都后台队列中运行,可以使用jobs命令查看

对于Ctrl+z后台任务列表中的任务,我们可以使用fg转为前台,只有一个时可以省略任务号