第十九讲——IP地址和杂谈 说起IP地址,想来大家都不会陌生,因为在家里通过无线路由器上网都是需要无线路由器给手机或者电脑分配IP地址一般来说是从192.168.0.1-192.168.255.255,这些路由器都是支持DHCP服务,即自动分配、回收IP,所以我们只需要知道登录到无线路由器就可以连接互联网。 我们现在使用的是IPV4协议,不过现在IPV6也已经开始铺开了,就IPV4来说,共分为五类A、B、C、D、E 我们能够使用的就是A、B、C三类,IP地址第一位不能为0,最后一位也不能为0 A:1-127 B:128-191 C:192-233 D、E网段用于研究 我们使用正则表达式提取ifconfig中的IP地址,使用grep命令,如果仅仅是提取某个网卡的IP地址还需要使用到-A命令,即匹配网卡名称下#行。 Ifconfig |egrep ‘\<([1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\>\.){3}\<[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\>’ . 在正则中有特殊意义需要转义,使用{m,n}缩短书写。 fgrep ----fast grep 快速的匹配,但是不支持正则表达式,执行速度快 shell编程: shell编程通俗的说就是写脚本,但是再说shell编程之前饿哦们先了解一下编程语言 简单地说,编程语言按人类易懂的方式可以分为第低级语言和高级语言,低级是指更接近硬件,高级指的是更接近人类语言,低级语言的执行效率更高,但是更难编写,高级语言相对容易,但是执行效率低下。 在高级语言中可以分为 静态语言:静态语言通常为强类型语言(变量类型),执行时事先需要转换成可执行的格式,所以静态语言也是编译型语言,有完整的程序开发环境,由编译器直接编译成二进制文件,这类语言有C、C++、C#、JAVA等等 动态语言:解释型语言,边解释边执行,on the fly(运行过程中转换),如PHP、shell、Python,动态语言通常是弱类型语言(可以不用声明变量,直接使用)。 但是解释器本身是由静态语言开发的。 说完了语言的动静分类,还有一种分类方式:面向对象和面向过程。 面向过程:把编程的着眼点、立足点主要放在解决问题过程本身。如shell、c等等 面向对象:把整个我们要实现的项目抽象成一个个的对象,并定义对象之间的动作,就是可发出的操作来完成的,面向对象更适合开发大型程序。如JAVA、Python、perl、C++等等 面向过程和面向对象是两个不同的变成风格。 对于程序来说:变量是一个不可或缺的东西 变量:内存空间 变量名:用于引用内存空间,变量名会映射为内存地址。 变量使用完后还可以进行回收,为了确定数据的存储格式,所以有了变量类型的概念,即整型,长整型、字符型等等。 变量的类型:用于确定数据的存储格式和数据的长度。字符型、数值型、整型、浮点型。变量一定是某一进程的变量 例如时间的存储:2018-01-10,按字符存储需要64位,一个字符占一个字节,不算符号,但是按照时间戳(数值大小)存储,2^24次方(24位,三个字节),所以说按不同类型存储占用的空间也会不一样,当攻击者特意的制造一个数据使缓冲区溢出,缓冲区溢出是网络攻击中很严重的行为,避免的方法就是对输入所谓数据进行判断是否溢出。 有解释器的语言,也就是通常说的脚本语言,如果变量不符合法则,可以由解释器在另一个层次上避免,所以变量类型都是弱类型的。 布尔类型:只有真和假。 逻辑运算:与或非、异或 强类型的语言在使用变量前必须先进行声明,甚至还需要初始化,如果不初始化则内存中的随机数会对其进行干扰,一般来说数值初始为0,字符串初始为空(null) 当我们进行计算时1+1属于显式转换,1+c c会转换成相应的ASCII码的数值,在不同的语言中赋值的方式也可能不同 Bash变量的类型: 环境变量:作用域为当前shell进程及其子进程。 本地变量(局部变量),局部变量未必就是本地变量 本地变量:整个bash进程都有效 局部变量:只对当前代码段有效。 位置变量:grep或者sed中的后向引用属于位置变量$1,$2,$3等也属于位置变量,用于引用脚本的参数。 特殊变量:bash中内置保存某些特殊数据的变量(系统变量),保存有特殊数据,$?:保存上一个进程(命令)执行状态的返回值。程序执行时可能有两类返回值1是程序的执行结果,2是程序状态返回结果(0-255),0表示为正确运行1-255表示错误的不同,1/2/127为系统预留 Shell中变量的引用${},大多数情况下大括号是可以省略的,当遇到Animal=pig 需要输出pigs时 echo “there are some ${Animal}s” 脚本在执行的时候会执行一个子shell进程,所以当前shell的环境变量对于子shell是有效的(命令行启动的脚本会继承当前shell的环境变量) 如果是系统自动执行的脚本(非命令行启动的脚本),需要定义需要的个环境变量。 环境变量的声明:可以直接声明并定义 export name=China 也可以先定义后声明 name=China export name 向变量中追加字符:city=bazhong city=‘$city:dazhou’可完成追加 对于shell来说,默认所有的字符都是字符串,所以默认是不能进行算术运算的。 变量使用结束后需要释放,否则会占用空间,设置变量时使用set,释放变量使用unset。 Set命令可以查看系统所有的变量 查看当前shell中的环境变量 Printenv env export 特殊变量和位置变量无法查看。 对我们而言脚本就是一种命令的堆砌,按照实际需求结合流程控制语句实现的程序,我们称为脚本。 Shebang:魔数,以#!开头加上解释器的路径,内核会根据shebang所指定的路径调用解释器执行脚本除了第一行的#!,其他行出现失误#号都是注释行。 当脚本执行结束变量就会撤销。 执行一个脚本的方式: 将当前目录加入PATH,就可以当做命令来执行 直接指定路径也可以执行./指定为当前目录。 bash 1.sh 1.sh作为参数来运行,并不是作为脚本执行。 变量名只能包含字母数字和下划线,并且不能以数字开头,不应该和已有的环境变量重名,否则会覆盖掉环境变量的值,还要做到见名知意。 给自己讲linux 2016-12-19 评论 1527 次浏览
第十八讲——正则表达式 正则表达式:pattern(模式),由字符和正则表达式的元字符组合起来过滤文本的过滤条件。 正则表达式分为两类: 基本正则表达式 Basic REGEXP 扩展的正则表达式 Extend REGEXP 它们所支持的元字符有一部分是不一样的,甚至相同的元字符意义也不尽相同。 大多数的文本类处理命令都支持正则表达式,而且正则表达式是使得计算机变得智能化的一个重要途径。 掌握正则表达式对我们来讲,是我么处理文本的基本常识 默认情况下,我们的正则表达式工作在贪婪模式下。 基本正则表达式(basic REGEXP): 字符匹配: . (点)任意的单个字符 [] (中括号)指定范围内的任意单个字符 [^](中括号内部加上托字符)指定范围外的任意单个字符 次数匹配: (*) (星号)匹配前面的字符任意多次(零次或者多次) \? (转义后的问号)匹配前面的字符零次或一次 \{m,n\} (转义后的大括号) 匹配前面的字符至少m次,至多n次 .* 表示任意长度的任意字符 锚定: ^ 锚定行首(之后的字符) $ 锚定行尾(之前的字符) \<,\b 锚定单词首部 \>,\b 锚定单词尾部 \( \) 转义后的小括号用于实现分组(后向引用) 如sed中的sed ‘s/\(.*\):bash$/\1/g’ 实现后向引用,\1\2\3等等。 扩展正则表达式: 字符匹配: . 任意单个字符 [] 指定范围内的任意单个字符 [ ^] 指定范围外的任意单个字符 次数匹配: (*)匹配前面的字符任意次 ? 匹配其前面的字符零次或者一次 + 匹配前面的字符至少一次 () 括号,实现真正意义上的分组,实现后向引用\1,\2,\3 {m,n} 匹配其前的字符至少m次,至多n次 \<,\b 锚定行首(之前的字符) \>,\b 锚定行尾(之后的字符) $ 锚定行尾 ^ 锚定行首 | 或者 or c|cat 匹配c或者cat 例如:查找1-255之间的整数 分别锚定 egrep \<[1-9]\>|\<[1-9][0-9]\>|\<[1[0-9][0-9]\>|\<[2[0-4][0-9]\>|\<25[0-5]\>’ /boot/grub/grub.conf 整体锚定 grep –E ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’ /boot/grub/grub.conf grep默认仅支持基本正则表达式定义的模式来过滤文本的命令 -i 忽略大小写 -v 输出不匹配的行 -o 显示匹配的字符串 --color 支持匹配字符串高亮显示 -E 支持扩展正则表达式 -A #显示匹配行下的#行 -B #显示匹配行上的#行 -C #显示匹配行上下的#行 context 上下文 给自己讲linux 2016-12-18 评论 1511 次浏览
第十七讲——关于重定向和管道 我们先回顾一下计算机的五大基本组件 1.运算器 2.控制器 运算器和控制器是cpu的一部分 3.存储器 RAM易失性存储器 4.输入设备 5.输出设备 寄存器是CPU内部的临时存储器 程序是由指令和数据组成 三大总线 1.地址总线:用于实现内存的寻址 2.数据总线:用于传输数据 3.控制总线: 用于试下控制指令 实际上在机器上总线是复用的,即一根总线三种功能。 重定向: 我们能够同计算机产生交互,并且让计算机反馈回我们需要的信息,这是怎么做到的?这个就与输入输出设备相关。 常见的输入输出设备有很多,如果一个程序没有指定输入或者输出设备,系统为了统一调度,会提供默认的输入输出设备 标准输入 STDIN 0(描述符) 默认为键盘 标准输出 STDOUT 1(描述符) 默认为显示器 标准错误输出 STDERR 2(描述符) 默认为显示器 错误输出与标准输出是两个不同的数据流 改变数据输入输出叫做I/O重定向 > 输出重定向(覆盖原有内容) set -C 关闭重定向覆盖 set +C 开启重定向覆盖 >>追加重定向(在文件尾部追加) < 输入重定向 << Here document(此处生成文档) cat << EOF EOF为文档结束标记 end of file cat >> /tmp/test << EOF 等价于 cat << EOF >> /tmp/test(个人理解,如有错误请指正) 从标准输入向/tmp/test中追加内容 &>/dev/null 将正确和错误的全部丢掉。 管道: | echo “1234567890” |tee /tmp/test.sh tee 输出到屏幕并保存到/tmp/test,sh 从标准输入读取数据,输出到屏幕一份,保存到文件一份。 将echo的内容送给tee命令,就是管道的作用。 额……下一讲是比较绕来绕去的正则表达式。 给自己讲linux 2016-12-17 评论 1445 次浏览
第十六讲——权限管理 好像在之前的内容中设计了权限的相关命令,比较散,再总结总结,就当是巩固了。 先来一个改变用户默认shell的命令 chsh username newshell,将shell改为nologin将无法登陆。 权限管理: chown :改变文件(目录)的属主,只有管理员才能改变文件的属主。 chown username file1,file2……将文件的属主改为username -R 递归修改,修改目录及其文件属主。 – – reference = /etc/fatab file1,file2……按照指定参考文件进行修改属主属组 chown 属主:属组 file1,file2……以冒号为分隔符 chown 属主.属组 file1,file2……以点为分隔符 只修改属组时使用 chown :(.)group file1,file2…… chmod 修改文件权限 修改三类用户的权限(u属主,g属组,o其他人) chmod 755 file -R 递归修改 – -reference 指定参考文件修改权限 修改某一类权限, chmod u=rwx filename chmod g=rx filename chmod o=r filename chmod ug=rw filename chmod u=rwx,g=rw,o=r filename 修改某一类用户的某位权限 chmod u+x file 属主增加执行权限 chmod g-x file 属组减去执行权限 chmod g+wx file 可一次增加多位权限 我们普通用户能修改密码的原因: ls -l `which passwd` -rwsr-xr-x ……………………/usr/bin/passwd 在属主的权限里有特殊权限,当该程序被调用时,以属主的身份运行该程序。 手动生成一个密码字符串 openssl passwd -1 -salt ‘12345678’ #输入密码 -1为加密的方式 -salt为杂质。 umask 遮罩码 管理员默认为022 普通用户为002 创建文件时文件的权限为666-umask 创建目录时目录的权限为777-umask umask 001 可以临时设定遮罩码 如果遮罩码为055,创建文件时按道理权限应该为611,但是系统默认文件不能具有执行权限,所以执行权限位自定+1,为622. 文件的rx权限应当是成对出现,否则只有r的话能ls不能cd,只有x的话能cd但是不能ls,太不人道了…… 给自己讲linux 2016-12-16 评论 1497 次浏览
python之初识 昨天晚上开始学习python,算不上是学习吧,笼统的了解一下python的工作方式,什么语言起源什么的鬼东西记住了一些,可能是由于我最开始接触VB的原因,感觉很像python,都是定义一个对象,然后对属性进行操作,但是python属性的命名简单直接,我喜欢,不想vb里面绕来绕去的,整的人晕晕乎乎的,shell以及服务的架设还是要继续进行,这将要占去大量的手工时间,真是的,我已经好久没有动动手了,虽然技术很差,但是我还是喜欢动动手做些小玩意儿。 突然想起一句话,学习是一个不会停止的过程,可能是我实在是不知道玩啥了,才会想起来学习一点东西自娱自乐,也可能是以前把现在的娱乐时间都消耗殆尽了,现在只能这样了。想写些东西的念头也很强烈,空余时间已经在着手整理素材了,酝酿了好久的东西,我不能做到一鸣惊人,但是我的让自己高兴起来,这是我的责任。 今天就到这里了,因为刚接触只是用了一个turtle的库画画一些指定的小东西,本来是说要画一面国旗,奈何我的水准实在是欠缺很多,步骤过于繁琐,我想先静一静,边学边整,首要任务是服务的架设和故障的排解,还有shell,这是个大头,千万不能给忽视了。 随手笔记 2016-12-16 评论 1691 次浏览
第十五讲——文件名通配 文件名通配:globbing 文件名通配并不能解决所有遇到的问题。 * 匹配任意长度的任意字符 ? 匹配任意单个字符 [] 匹配指定范围内的任意单个字符 [^] 匹配指定范围外的任意单个字符 [:字符集合:] man 7 glob 文档中有详细解释 一组字符或者某一类字符 [:space:] 空白字符 [:punct:] 所有的标点符号 [:lower:] 所有的小写字母 [:upper:] 所有的大写字母 [:alpha:] 所有的字母 [:digit:] 数字 [:alnum:] 数字和大小写字母 在字符集外加^,表示非,例如[^[:digit:]] 非数字。比较特别的是由两个中括号,内部的中括号表示一个字符集。 给自己讲linux 2016-12-15 评论 1435 次浏览