可以解决os.system那种无法获取程序执行结果的缺点 os.popen 返回了一个类似与文件句柄的东西。...返回一个shell 命令的标准输出或者时错误输出 In [17]: commands.getoutput('ls /home -l') Out[17]: 'total 4\ndrwxr-xr-x 31...获取一个文件的状态。...调用 os.execvp()的时候 ,到$PATH 中去找这个可执行程序,没有找到,所以程序出现了异常。...设置 shell=True .这样当再执行类似的程序时,会调用相应的shell 去做 shell -c "cat /etc/passwd" subprocess.Popen("cat /etc/passwd
argv:参数表,比如ls命令中可带的命令行参数-l,-a等。注意,argv的第一个元素必须是要执行的程序(命令)的路径名。 envp:环境变量表,供要执行的命令使用。...execve(“/usr/bin/gcc”, argv, environ); // 出错,因为目录/usr/下没有ls程序。...**arg:**可执行程序所带的参数,第一个参数为可执行文件名字,没有带路径且arg必须以NULL结束。...redirect_stdout中处理,execvp填入可执行文件参数,子进程开始执行,若出错才会执行下面的execvp error打印错误语句,waitpid等 待特定fork后子进程号结束,若出错则同样做出错打印信息处理...2.6 cd命令 对于一个自制shell如果没有cd命令就不算一个合格的shell,因为cd是shell内部命令,如果用execve系统调用,fork出子进程改变的是子 进程的目录,父进程的目录仍然没有发生改变
除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件: .bash_profile :定义了用户的个人化路径与环境变量的文件名称。...~]# ls aaaa ls: 无法访问aaaa: 没有那个文件或目录 [1]+ Done sleep 30 [root@localhost ~]# ls...aaaa ls: 无法访问aaaa: 没有那个文件或目录 [root@localhost ~]# ls aaaa 2> /tmp/error [root@localhost ~]# cat /tmp.../error ls: 无法访问aaaa: 没有那个文件或目录 [root@localhost ~]# ls aaaa 2>> /tmp/error [root@localhost ~]# cat.../tmp/error ls: 无法访问aaaa: 没有那个文件或目录 ls: 无法访问aaaa: 没有那个文件或目录 [ ] 中括号,中间为字符组合,代表中间字符中的任意一个。
echo 表示会在命令历史里面,倒着网上找第一个执行以 echo 开头的命令 查看敲过的命令存放位置 在我们使用过的命令,会存放在用户的家目录下 /root/.bash_history [root@localhost...在敲完命令后,直接到配置文件中查看,会发现其中并没有存在 这是因为仅存在内存中,只有在退出终端的时候,才能够保存到配置文件中去 环境变量HISTSIZE在 /etc/profile 中配置 vim...[root@hf-01 ~]# cat a.txt ls: 无法访问aaa.txt: 没有那个文件或目录 1.txt 2.txt [root@hf-01 ~]# 把正确和错误的输出到文件中,方法一...$ cat a.txt ls: 无法访问aaa.txt: 没有那个文件或目录 1.txt 2.txt ls: 无法访问aaa.txt: 没有那个文件或目录 1.txt 2.txt 把正确和错误的输出到文件中...~]# cat 1.txt 1.txt 2.txt [root@hf-01 ~]# cat a.txt ls: 无法访问aaa.txt: 没有那个文件或目录 既可以写入一个文件中,也可以分开写入 小于号
\n"); // 执行ls -l命令 execl("/bin/ls", "ls", "-l", NULL); // 只有替换失败才会执行到这里 perror...(const char *file, const char *arg, ...); // 示例:执行系统命令 execlp("ls", "ls", "-l", NULL); 自动在PATH环境变量中查找可执行文件...其他系列的exec函数,虽然没有显式传递env,但是子进程会自动继承父进程的环境变量,在函数内部自动完成覆盖。 环境变量本身就在进程地址空间上,可以随便获取。...); } 文件描述符保留 所有打开的文件描述符保持打开状态 特别注意管道和socket的继承问题 实际应用场景 Shell实现:处理命令执行 服务端编程:处理客户端请求 安全沙盒:限制程序执行环境 脚本解释器...:Python/Bash等脚本的加载执行 这类脚本语言程序执行的是需要解释器 程序这样的形式来执行 // 典型的使用模式 pid_t pid = fork(); if (pid == 0) {
靶机地址:https://www.vulnhub.com/entry/dc-5,314/ 学习到的知识 LFI(本地文件包含)日志获取shell wfuzz工具的使用 screen提权root 信息搜集...图片 LFI本地文件包含获取shell 看上去有点像 LFI(本地文件包含)漏洞,紧接着我用 KALI 自带的 wfuz 工具对它一顿FUZZ梭哈: wfuzz -w /usr/share/wfuzz/...图片 (温馨提示:到这里我靶机重启了一下,所以 IP 变了) 接下来然后用日志文件去执行命令 ls: http://192.168.1.144/thankyou.php?...file=/var/log/nginx/error.log&saul=ls ? 图片 成功执行命令!那么我就用 nc 反弹一个shell回来吧!...图片 screen -ls ? 图片 /tmp/rootshell ? 图片 最终也是在 /root 目录下拿到了 Flag: ?
, "-l", NULL}; // 命令行参数 printf("Before execvp\n"); // 使用 $PATH 查找可执行文件并执行 execvp("ls",...\n"); return 0; } 在这个示例中,execvp()会根据$PATH查找ls命令并执行。如果execvp()调用成功,后续的printf语句将不会执行。...如果调用失败,exec函数会返回-1,并设置errno,你可以通过perror()或strerror()函数来输出错误信息。 常见的错误包括: ENOENT:文件不存在。指定的可执行文件无法找到。...没有足够的权限来执行指定的文件。 ENOMEM:内存不足。系统无法为新的程序分配足够的内存。 3.2 exec的限制 exec替换时会丢失进程的原始状态。...函数 描述 execve 执行指定路径的程序,传递命令行参数和环境变量。 execvp 根据$PATH查找可执行文件并执行,传递参数。
合并编译后,得到了这样一个程序: 动图Gif 可以看到,bash 的基本雏形已经形成,不过还存在一些不足,比如 ls 命令显示文件无高亮、cd命令无法切换、环境变量无法添加至子进程等,这些问题都可以通过特殊处理避免...---- 5、特殊情况处理 对特殊情况进行处理,使 myBash 更加完善 5.1、ls 显示高亮 系统中的 bash 在面对 ls 等文件显示指令时,不仅会显示内容,还会将特殊文件做颜色高亮处理,比如在我的环境下...命令调用系统级接口 chdir 让 父进程(myBash) 进行目录间的移动 资料来源:互联网 5.3、cd 首先实现不同目录间的切换 切换的本质:令当前 bash 移动至另一个目录下,不能直接使用...子进程 ,因为需要移动的是 父进程(bash) 对于当前的 myBash 来说,cd 没有丝毫效果,因为此时 指令会被拆分后交给子进程处理,这个方向本身就是错误的 特殊情况特殊处理,同 ls 高亮一样...> 文件 向文件中写入数据,写入前会先清空内容 echo 字符串 >> 文件 向文件中追加数据,追加前不会先清空内容 可执行程序 文件 从文件中读取数据给可执行程序 所以实现重定向的关键在于判断指令中是否含有
譬如说我们希望子进程来执行ls -la 命令就不行了(没有源代码,只有编译好的可执行程序);为了解决这种不灵活性,所以在Linux系统中引入了exec族函数。...它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。...另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。...现在我们以可执行程序ls -la来演示,但是我们的先知道它的路径,要用命令---which ls 来查看: ubuntu@ubuntu-virtual-machine:~$ which ls...这两个函数会在下面进行讲解的): 现在使用excel来演示可执行程序----ls -la,最后它在环境变量目录下找到了ls ,在当前用户目录找不到: #include
execv、execvp和execvpe的第二个参数是一个字符串数组,新程序在启动时会把在argv数组中给定的参数传递到main 名字含字母“p”的函数会搜索PATH环境变量去查找新程序的可执行文件...如果可执行文件不在PATH定义的路径上,就必须把包括子目录在内的绝对文件名做为一个参数传递给这些函数。 名字最后一个字母为"e"的函数可以自设环境变量。...根目录 umask 文件锁 进程信号屏蔽 未处理信号 资源限制 进程时间 而下面属性是发生变化的: 文件描述符如果存在close-on-exec标记的话,那么打开的文件描述符会被关闭。...三、system函数 功能:system()函数调用“/bin/sh -c command”执行特定的命令,阻塞当前进程直到command命令执行完毕 原型: int system(const char...*command); 返回值: 如果无法启动shell运行命令,system将返回127;出现不能执行system调用的其他错误时返回-1。
Shell的本质认知 命令行解释器(Shell)是操作系统的"翻译官",它的核心工作流程可以抽象为: 循环 { 1. 显示提示符 2. 获取命令输入 3....解析命令参数 4. 执行命令程序 } 本实现仅需200行C++代码,却能完整展现Shell的核心工作机制。让我们通过解剖麻雀的方式,逐步拆解这个微型Shell的实现过程。...返回两次:父进程返回子进程PID,子进程返回0 写时复制(Copy-On-Write)优化内存使用 execvp()函数族: execvp("ls", ["ls","-l",nullptr])...结尾) p:自动搜索PATH环境变量中的可执行文件 执行成功时替换当前进程映像,失败返回-1 waitpid作用 防止僵尸进程产生 同步父子进程执行顺序 可获取子进程退出状态(本实现未使用) 后续扩展...处理内建命令 为什么路径已经更换了但是前面的命令行提示符没有反应?
文章目录 什么是进程 进程原语 fork 进程的产生方式: exec族 wait/waitpid 最后的惊喜 什么是进程 一段程序的执行过程。...(7)通知父进程 下面是一张进程列表的图,命令:pstree。...可以看到init是所有进程的父进程,其他进程都是由init进程直接或间接fork出来的。...exec族函数可以直接把一个编译好的可执行程序直接加载运行。 有了exec族函数后,典型的父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译链接成一个可执行程序(hello)。...("4------------execvp------------\n"); if( execvp( "ls", arg ) < 0 ) { perror( "execvp
注释:其中shift+\意味着 例如:date ; tar -zcvf etc.tar.gz /etc ; date可以计算中间打包压缩命令执行的耗时 再如:ls && echo yes || echo...管道符 命令格式: 命令1 | 命令2,有一定的编程思想在里面 命令1的正确输出作为命令2的操作对象,和逻辑与不一样 实际案例: ls -l /etc | more #代表将ls -l /etc的输出分屏显示...# 1>可以省略不写,默认所至标准输出 $ls test.sh test1.sh ls: test1.sh: 没有这个文件和目录 test.sh #示例3.把错误输出到err.txt,正确输出到suc.txt...中 $ls test.sh test1.sh 1>suc.txt 2> err.txt # 2>是将错误输出到文件 $cat suc.txt err.txt test.sh ls: 无法访问test1....sh: 没有那个文件或目录 # 继续追加把输出写入suc.txt err.txt “>>”追加操作符 $ls test.sh test1.sh 1>>suc.txt 2>>err.txt #示例
标准输入(standard input,简称stdin):默认情况下,标准输入指从键盘获取的输入 标准输出(standard output,简称stdout):默认情况下,命令执行所回传正确的信息会输出到屏幕上...标准错误输出(standard error output,简称stderr):默认情况下,标准错误输出可理解为命令执行失败后,所回传的错误信息会输出到屏幕上 5.2数据流重定向 简介: 无论正确或错误的数据都是默认输出到屏幕上...,而是以覆盖的方式写入到 指定文件中 若指定的文件不存在,则自动创建该文件 命令 2>文件 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中 若指定的文件不存在,则自动创建该文件...命令 2>/dev/null 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是写入到空设备文件中,即将输出的错误信息丢弃掉 命令 &>文件 或 命令 >&文件 将命令执行后的正确输出信息和错误信息不在默认的屏幕上显示...ls: 无法访问/aaaaaaaaa: 没有那个文件或目录 [root@localhost ~]# ls /home/ /aaaaaaaaa >list.txt 2>error.txt
它的作用是把前面命令的输出再输入给后面的命令。 注意: 1)管道命令只处理前一个命令正确输出,不处理错误输出 2)管道命令右边命令,必须能够接收标准输入流命令才行。...组user1内有用户user1,无法删除 说明: 该命令没有特殊选项,只能删除空白组!.../group slocate:x:21: test1:x:1002: [root@adai002 ~]# ls /home/user001 ls: 无法访问/home/user001: 没有那个文件或目录...说明: -M选项是不创建目录,但是在/etc/passwd文件中仍有这个字段,但是用ls /home/user001查看时提示目录不存在,所以-M选项的作用只是不创建那个目录。...-ld /home/test1/ ls无法访问/home/test1:没有那个文件或目录 即:-r选项的作用时删除账户的时候连带账户的家目录一起删除。
(绝对或相对路径)。...argv[]:参数列表(传递给程序的命令行参数)。第一个参数通常是程序本身的名称。 envp[]:环境变量列表。...它会在 PATH 环境变量指定的目录中搜索可执行文件。...函数原型如下: int execvp(const char *file, char *const argv[]); 参数如下: file:可执行文件的名称。 argv[]:参数数组。...execvp("ls", argv); // 根据 PATH 搜索并执行程序 perror("execvp error"); return 0; } 7、execvpe()
,回收系统资源(一定要考虑的) 获取子进程的退出信息,知道子进程是因为什么原因退出的(可选的功能) 系统调用 wait() wait() 函数使调用的进程(通常是父进程)暂停执行,直到一个子进程终止或发生一个信号...这里,新程序是系统的 ls 命令,用来列出当前目录中的所有文件和目录(包括隐藏文件),并以长格式显示。...execl("/usr/bin/ls", "ls", "-l", "-a", NULL); execl 是 exec 系列函数之一,用于替换当前进程的映像为一个新的可执行文件。...接下来的参数 “ls”, “-l”, “-a” 是传递给 ls 程序的参数,分别代表程序名、长格式列表和显示所有文件(包括以点开头的隐藏文件)。 最后一个参数 NULL 表示参数列表的结束。..."ls", "-l", "-a", NULL); // 子进程中执行 ls 命令 exit(1); // 如果 execl 执行失败,退出子进程,返回状态 1 } //
/.bash_history /root/.bash_history history的家目录 显示使用过的命令历史,默认保存1000条使用过的命令(注:此令需要是在正常关机操作情况下的处1000...~]# echo $HISTSIZE 2000 搜索关键字"HIST"找到‘HISTSIZE=1000’,在此更改其数字,保存退出,然后执行命令‘source /etc/profile’刷新该配置文件才会生效...HIST HISTSIZE=1000 8.3 命令补全和别名 命令补全Tab 按一次tab可以补全一个命令或参数(需要安装包bash-completion,并重启系统);按两次tab可以显示以某字母开头的所有命令或文件名...,2>>” ‘>’:输出重定向 ‘>>’:追加重定向 ‘2>’:错误重定向 ‘<’:输入重定向 使用‘>’命令时会将文件内原有内容删除。...: 无法访问aaaa.txt: 没有那个文件或目录 说明: 使用ls命令查看 {1,2}.txt aaaa.txt,1.txt和2.txt文件存在,可以使用ls查看,aaaa.txt不存在,使用ls查看会报错
execlp:该函数与 execl 类似,但是它会在系统的环境变量 PATH 指定的目录中查找可执行文件。...:类似于 execv,但是它会在系统的环境变量 PATH 指定的目录中查找可执行文件。...它的原型如下: int execvp(const char *file, char *const argv[]); file 是要执行的可执行文件的文件名,argv 是一个以 NULL 结尾的参数数组,...(phony targets)通过声明伪目标,你可以确保 make 总是执行相应的命令,而不会因为同名的文件或目录的存在而跳过这些命令 运行 make 命令时(没有指定具体目标),make 会首先查找...然而,对于 clean 这样的伪目标,它并没有列出任何依赖项,因此其他目标的构建状态不会影响 clean 的执行
领取专属 10元无门槛券
手把手带您无忧上云