shell函数

makefile学习笔记

我的梦境 提交于 2020-03-06 22:45:22
#。对于一般多字符变量的引用必须使用括号了标记,否则make将把变量名的首字母作为作为变量而不是整个字符串(“$PATH”在Makefile中实际上是“$(P)ATH”)。 # 这一点和shell中变量的引用方式不同。shell中变量的引用可以是“${xx}”或者“$xx”格式。但在Makefile中多字符变量名的引用只能是“$(xx)”或者“${xx}”格式。 name1 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) include inc.mk #并且下面的定义也相当于 foo = $(P)ATH。如果$P变量没有定义,则为ATH。 foo = $PATH ch = $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH)))) pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH))))) name2 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) all: @echo $$(foo) #相当于在命令行执行 @echo $(f00) @echo $(foo) #相当于 @echo ATH #value函数功能:不对变量

shell脚本编写习惯

淺唱寂寞╮ 提交于 2020-03-05 12:00:20
前言:在公众号看一篇比较不错的shell脚本文章,自己学习同时,加一些例子分享下,哪里做得不好,请多多指教哈 一.在脚本写注释 1 #脚本的参数 2 #脚本的用途 3 #脚本的注意事项 4 #脚本的写作时间,作者,版权等 5 #各个函数前的说明注释 6 #一些较复杂的单行命令注释 二、脚本中有命令运行失败时退出脚本 set -o errexit 或 set -e 例子:touch命令替换为touchs #!/bin/bash set -e number=1 echo $number touchs 1.txt set +e 执行脚本 sh test.sh test.sh: line 6: touchs: command not found 三、脚本中使用到未声明变量时退出脚本 set -o nounset 或 set-u   例子:number是未声明变量 #!/bin/bash set -u numbers=1 echo $number echo '哈哈' set +u 执行脚本 sh test.sh test.sh: line 5: number: unbound variable 四、使用双引号引用变量  例子:一个普通循环 例子 #!/bin/bash set -u for i in `seq 10`;do echo "$i" done 五、在脚本中多使用函数 #!/bin

Shell编程基础

风流意气都作罢 提交于 2020-03-04 07:19:09
写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单、灵活、高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作变得容易、简单、高效 shell脚本可移植性好,在unix/linux系统中可灵活移植,几乎不用任何设置就能正常运行 shell脚本可轻松方便读取和修改源代码,不需要编译 掌握shell可以帮你解决一些故障问题,比如脚本引起的故障问题 掌握shell是一个中级以上系统工程师必需要会的 掌握shell是你系统管理进阶的必经之路 掌握shell是你面试更高级职位的一块敲门砖 那什么时候不使用Shell 脚本? 资源密集型的任务,尤其在需要考虑效率时(比如排序,hash 等) 需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理) 有跨平台移植需求(一般使用C 或Java) 复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等) 对于影响系统全局性的关键任务应用。 对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等. 项目由连串的依赖的各个部分组成。 需要大规模的文件操作 需要多维数组的支持 需要数据结构的支持,比如链表或数等数据结构 需要产生或操作图形化界面 GUI 需要直接操作系统硬件 需要 I/O

Linux的gdb调试命令(详细)

↘锁芯ラ 提交于 2020-03-04 06:23:22
转自: https://blog.csdn.net/gatieme/article/details/51671430 程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。 本文将主要介绍linux下的强大调试工具是怎么完成这些工作的。 之所以要调试程序,是因为程序的运行结果和预期结果不一致,或者程序出现运行时错误。 调试的基本思想是: 分析现象 -> 假设错误原因 -> 产生新的现象去验证假设 调试器(如GDB)的目的是允许你在程序运行时进入到某个程序内部去看看该程序在做什么,或者在该程序崩溃时它在做什么。 GDB主要可以做4大类事(加上一些其他的辅助工作),以帮助用户在程序运行过程中发现bug。 * 启动您的程序,并列出可能会影响它运行的一些信息 * 使您的程序在特定条件下停止下来 * 当程序停下来的时候,检查发生了什么 * 对程序做出相应的调整,这样您就能尝试纠正一个错误并继续发现其它错误 您能使用GDB调试用C、C++、Modula-2写的程序等GNU Fortran编译器准备好过后,GDB将提供对Fortran的支持 gdb参数选项详解 gcc调试相关编译选项 GDB通过在命令行方式下输入gdb来执行。启动过后,GDB会从终端读取命令,直到您输入GDB命令quit使GDB退出。您能通过GDB命 gcc -g main.c 1

MongoDB shell 介绍

◇◆丶佛笑我妖孽 提交于 2020-03-03 23:07:16
MongoDB shell 介绍 MongoDB自带javascript shell, 可在shell中使用命令行与MongoDB实列交互。shell可以执行管理操作,检查运行实列等等操作。 一:如何运行shell? 在命令行中,运行mongo, 就可以启动shell,如下命令: 注意:启动时,shell将自动连接MongoDB服务器,必须确保mongod已经启动。 shell是一个功能完备的javascript解析器,可以运行任意的javascript程序。我们请看如下几个简单的demo。 它还可以定义和调用Javascript函数,如下代码命令: 二:MongoDB客户端 运行命令 mongo后,shell会连到 MongoDB服务器的test数据库,并将数据库的链接赋值给全局变量db。 注意:db这个变量是通过shell访问MongoDB的主要入口点。 如果现在我们想要查看db当前指向那个数据库,可以使用db命令,如下所示: shell还包含一些非Javascript语法的扩展,比如选择数据库操作这些~ 如下代码: 如果现在查看db变量,会发现其正指向foobar数据库,如下命令: 如上,通过db变量,可以访问其中的集合,比如,通过db.foobar 可返回当前数据库的foobar集合。这意味着,几乎所有的数据库操作都可以通过shell完成。 三:shell中创建,读取,更新

内存安全实验

送分小仙女□ 提交于 2020-03-02 01:30:33
实验环境: Linux ubuntu 4.15.0-47-generic #50~16.04.1-Ubuntu SMP Fri Mar 15 16:03:40 UTC 2019 i686 i686 i686 GNU/Linux 栈的保护机制 地址随机化 地址随机化 :通过随机化整个segment,比如栈,堆,或者代码区的地址对内存进行保护。 关闭该机制可使用以下命令: sudo sysctl -w kernel.randomize_va_space=0 #关闭内存地址随机化 栈不可执行和DEP保护 NX(DEP) :NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。 栈保护基址 :栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行

gcc生成静态库和动态库

依然范特西╮ 提交于 2020-03-01 08:03:34
gcc生成静态库和动态库 一、库文件简介 简单地说,库(Library)就是一组已经写好了的函数和变量、经过编译代 码,是为了能够提高开发效率和运行效率而设计的。库分为静态库(Static Library)和共享库(Shared library)两类。 静态库文件的扩展名是.a,共享库文件的扩展名是.so (在CYGWIN环境下,分别叫做.o和.dll)。共享库现在常常被叫做 动态库,是由于很多人借用了MS Windows的DLL(Dynamic Linked Library)这个词。 (1)静态库 静态是指每个用到该库的应用程序都拥有一份自己的库拷贝;应用程序运行的时候,即使将库删除也没有问题,因为应用程序自己已经有了自己的拷贝。 (2) 共享库 一个共享库有可能被多个所有应用程序共享。因此,对每个应用程序来说,即使不再使用某个共享库,也不应将其删除。此外,应用程序需要正确的环境变量设置 (LD_LIBRARY_PATH),从而找到共享库所在的位置,否则,应用程序运行时会报告找不到这个库。 二、关于使用库的问题 如果库是已经编译好的,那么如何在开发、运行应用程序时使用呢?头文件和库文件所在的路径,必须通过适当的方式通知给编译器、链接器和相关的应用程序。 对于静态库来说,主要涉及开发工具,如gcc。例如,用gcc编译、链接时,需要通过适当的路径找到头文件和静态库文件;

了解黑客的关键工具---揭开Shellcode的神秘面纱

纵然是瞬间 提交于 2020-02-29 21:45:27
ref: http://zhaisj.blog.51cto.com/219066/61428/ 了解黑客的关键工具---揭开Shellcode的神秘面纱 对于初期接触网络安全的人来说,Shellcode是很神秘的东西,对于网络攻击过程中的嗅探信息、漏洞剖析都是可以理解的,但真正利用漏洞入侵时,通过把一段二进制码送入后并执行,就可以获得目标机器的控制权,之后的事情是属于爱好者学习技术,还是黑客的行为,就看攻击者的一念之差了。Shellcode就好象神秘的武器,安全防护变得如此不堪一击。Shellcode究竟是什么样的程序?是什么特殊代码?如何才能学会编写?我下面收集了几类常见的Shellcode,主要是学习使用。它其实也是一般的软件程序,主要是因为二进制码的“不可读性”,增加了神秘色彩。 Shellcode是指能完成特殊任务的自包含的二进制代码,根据不同的任务可能是发出一条系统调用或建立一个高权限的Shell,Shellcode也就由此得名。它的最终目的是取得目标机器的控制权,所以一般被攻击者利用系统的漏洞送入系统中执行,从而获取特殊权限的执行环境,或给自己设立有特权的帐户。Shellcode因操作系统有一些差异,这里以Linux为例。 Shellcode是一段高技巧的软件代码,为了小而精,一般直接写为16进制的操作码,当然编写者一般采用C或汇编编写

任意排列、组合终极Shell脚本

六眼飞鱼酱① 提交于 2020-02-29 08:13:54
作者: crulat 永夜 #!/bin/bash # permutation_combination.sh arg0=-1 number=${2} eval ary=({1..${1}}) length=${#ary[@]} output(){ echo -n ${ary[${!i}]}; } prtcom(){ nsloop i 0 number+1 output ${@}; echo; } percom(){ nsloop i ${1} number${2} ${3} ${4} ${5}; } detect(){ (( ${!p} == ${!q} )) && argc=1 && break 2; } invoke(){ echo $(percom ${argu} nsloop -1) ${para} $(percom ${argu}); } permut(){ echo -n "${1} arg${i} ${2} "; (( ${#} != 0 )) && echo -n " length "; } nsloop(){ for((${1}=${2}+1; ${1}<${3}; ++${1})); do eval eval \\\$\{{4..${#}}\}; done; } combin(){ (( ${#} != 0 )) && echo -n "${1} arg$((i

shell之变量和引用

六月ゝ 毕业季﹏ 提交于 2020-02-29 04:39:56
一 变量 变量:本质上是程序中保存用户数据的一块内存空间,变量名就是内存空间地址。 Shell中:变量可有字母数字和下划线组成,只能以字母或下划线开头。 命名:PATH=/sbin JAVA_HOME=”/usr/lib” (变量名区分大小写) 在shell中,变量的数据类型无需显示低声明,变量的数据类型会根据不同操作有所变化。 (shell变量部分数据类型,统一按字符串存储,但根据变量的上下文环境,允许程序执行一些不同操作)。为了能执行加减法计算,shell为自动进行数据类型的转换,如果遇到含义非数字的字符串,则该字符串被转换成整数0。同时,在空串以及没有定义变量的情况下,变量值都会被转换为整数0。 例如,n=“” echo “n=$n” Echo “p=$p” 1.1变量的定义: Shell中可以直接使用变量,无需定义,如果变量的值包含空格,一定要用引号引起来。 declare attribute variable(控制变量相关属性) attribute 表示变量属性,variable表示名称,属性有: -p:显示所有变量值 -i:定义为整数 -r:定义为只读变量 -a:定义为数组变量 -f:显示所有自定义函数,包括名称和函数体 -x:变量设置成环境变量,随后的脚本和程序可以使用 例子: x=6/3 echo "$x" //6/3 #定义变量x为整数 declare -i x