解释器文件
# interpreter
解释器文件是一种文本文件,
php
写的解释器文件解释器文件也是可执行文件
ELF
一般格式为
#!/usr/bin/php
1
这一行为解释器所在的绝对路径。
Linux
查看 php 所在的位置
whereis php
1
如果写成上述加上解释器文件格式的在Linux
中可以使用如下方式进行运行
php demo4.php
1
或者直接运行它本身,但是这里需要权限,我们可以查看文件的权限
[root@VM-16-4-centos process]# ls -al ./demo4.php
-rw-r--r-- 1 root root 35 Apr 2 14:20 ./demo4.php
1
2
2
这里没有可执行的权限,所以需要加上权限。
chmod who[u,g,o user,group,other] 操作[+,-,=] 权限[r 读, w 写, x 执行]
1
[root@VM-16-4-centos process]# chmod u+x demo4.php
[root@VM-16-4-centos process]# ls -al ./demo4.php
-rwxr--r-- 1 root root 35 Apr 2 14:20 ./demo4.php
1
2
3
2
3
[root@VM-16-4-centos process]# ./demo4.php
test
1
2
2
这种就可以不加php
直接运行,这个就是解释器文件的编写和运行。
# bash 进程启动的过程
echo $$
1
先输出当前进程号。
- 如果是直接在
centos
终端登录,就有login
服务,它会去开启bash
进程,这个我们不用管。 - 是通过网络方式登录到
shell
终端,它是有sshd
服务去启动bash
进程
sshd
服务监听的端口是 22。
# 进程观察的几个命令
pstree
可以查看进程的一些关系:
pstree -ap
1
1 号进程是一个很特殊的进程,是杀不掉的,下面的都是它的子进程
systemd,1 --switched-root --system --deserialize 22
1
─sshd,1590 -D
│ ├─sshd,4315
│ │ └─bash,4317
│ │ └─pstree,12596 -ap
│ └─sshd,8087
│ └─sftp-server,8089
1
2
3
4
5
6
2
3
4
5
6
我们可以看到它下面的子进程有一个bash
[root@VM-16-4-centos process]# echo $$
4317
1
2
2
我们可以看到当前进程就是bash
的进程号
如果我们开启多个ssh
客户端去连接,我们再次使用pstree -ap
进行查看的时候,会再次开启一个bash
进程。
如果在当前bash
下,运行php demo4.php
则在bash
进程下又会有一个php
执行的一个进程。
使用strace
命令来跟踪调用
strace -f -s 65500 -o ssh1.log -p 1590
1
-f
:跟踪由fork
调用所产生的子进程-s
:指定输出的字符串的最大长度,默认为 32 位-o
:将跟踪的信息输出到指定的文件-p
:跟踪的进程 id
输入完之后提示:
[root@VM-16-4-centos process]# strace -f -s 65500 -o ssh1.log -p 1590
strace: Process 1590 attached
1
2
2
当我们重新打开一个连接:
strace: Process 1590 attached
strace: Process 24095 attached
strace: Process 24099 attached
strace: Process 24100 attached
...
1
2
3
4
5
2
3
4
5
产生了很多进程。
我们在新的连接里不做过多的操作,操作显示一下当前内容:ls
即可,然后我们再把前面的跟踪的进程断掉【ctrl + c
】,然后会提示:
^Cstrace: Process 1590 detached
strace: Process 24095 detached
strace: Process 24100 detached
1
2
3
2
3
使用ctrl + c
产生一个特殊字符,产生一个中断信号,就会退出进程。
然后看到目录下已经生成了一个ssh1.log
这个文件,我们可以把它下载下来进行查看。
select(19, [3 4], NULL, NULL, NULL) = 1 (in [3])
# 第一步:接收 ssh 客户端连接
accept(3, {sa_family=AF_INET, sin_port=htons(21831), sin_addr=inet_addr("客户端ip")}, [128->16]) = 5
1
2
3
2
3
select
:会监听文件描述符(fd)上的就绪事件,此处为 19accept
:是用来接收一个客户端,返回一个客户端的链接的文件描述符,连接过来的客户端端口和 ip 地址
# 第二步:创建一个子进程
<... clone resumed>child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcaa76f9b90) = 24095
1
2
2
24095:就是上述记录的一个进程号
clone
:相当于fork
,就是用来创建一个子进程
execve("/usr/sbin/sshd", ["/usr/sbin/sshd", "-D", "-R"], 0x564f1fd38ab0 /* 4 vars */) = 0
1
execve
:执行一个程序 把当前进程的映像【正文段、数据段】用sshd
程序来替换掉
socket(AF_NETLINK, SOCK_RAW, NETLINK_AUDIT) = 6
1
创建了一个
socket
套接字文,用于进程之间内部通信
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f152da53b90) = 24099
1
又继续创建了一个进程:24099
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f152da53b90) = 24100
1
继续创建一个进程:24100,这个过程会很多。
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f71c796fa10) = 24408
execve("/usr/bin/ls", ["ls", "--color=auto"], 0xc88dd0 /* 24 vars */) = 0
1
2
3
2
3
继续往下找,找到一个我们在另一个连接,创建一个新的bash
进程,并且输入ls
命令。
编辑 (opens new window)
上次更新: 2022/04/02, 17:04:53