Kali学习之从入门到入狱(三)

Kali学习之从入门到入狱

  • 冒个泡
  • 开篇
  • 1 Linux 常见目录
  • 2 Linux基础命令
    • 2.0 环境变量
    • 2.1 apt-get 安装
    • 2.2 ls ll 和 alias
    • 2.3 花式grep
    • 2.4 git 命令
    • 2.5 sed(stream editor流式编辑器) 命令
    • 2.6 awk命令详解
  • 2.7 命令
  • 3 shell基础
  • 4 脚本应用
    • 4.0 crontab定时任务
    • 4.1 监测进程并重启脚本
    • 4.2 获取本机IP发送邮件
    • expect脚本自动连接服务器
  • 5 docker
    • 5.1基础
    • 5.2 dockerfile(构建docker镜像的文件)
    • 5.3 docker网络
  • 全文最重要的话

冒个泡

发点存货证明自己没有进去!!!
我以为只要小说会被催更,原来博客也会被催,谢谢大家的厚爱,日后会逐渐更新《Kali学习之从入门到入狱(一)》中的常用工具。

说一下一直不更新的原因:博主主要是做算法的,最近事情也比较多,玩渗透只是兴趣爱好,还有交了女朋友影响了我打字速度。。。奥,编不动了,其实主要是懒。

开篇

相信看到这里的同学都已经玩过kali机了,kali是自带图形界面的,我们可以像Windows一样通过点击的方式去操作他。即使不会Linux一样可以点点点。但是如果想使用kali的渗透工具,全部都是命令行,完全无从下手。这一期把我学习Linux,shell、except的笔记,分享一下。

1 Linux 常见目录

/etc/shells   				# 记录了当前Linux系统中所支持的shell版本
/etc/security/limits.conf	# 对系统的内存,cpu,最大打开文件数等资源进行限制。 
/etc/hosts
/etc/profile 				# 系统级环境变量和开始程序 
							# 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行
							# 并从/etc/profile.d目录的配置文件中搜集shell的设置.  
/etc/cron.d/ 				# 定时任务目录 
/etc/sysconfig/network 		# 网络
/etc/rc.d/init.d 			# 启动的配置文件和脚本 
/etc/rc.d 					# 启动的配置文件和脚本 
/etc/passwd 				# 用户信息文件 
/etc/group 					# 组信息文件 
/etc/bashrc 				# 系统级	为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.  


/var/log 					# linux默认应用的日志路径 
/var/log/cron 				# 定时任务日志 
/var/log/httpd/ 			# Apache相关日志 mod_jk, access, error 
/var/log/rpmpkgs 			# rpm packags 
/var/spool 					# 放置“假脱机(spool)”程序的目录,如mail、news、打印队列和其他队列工作的目录。每个不同的spool								# 在/var/spool下有自己的子目录,例如,用户的邮箱就存放在/var/spool/mail 中。 


/proc/version 				# 查看linux版本信息
/proc/cpuinfo 				# cpu 信息  命令:lscpu
/proc/meminfo 				# 内存 信息
/proc/interrupts 			# 查看中断
/proc/loadavg 				# 查看系统负载


/dev/null     				# 丢弃的文件 , 一般 2>dev/null ,将错误信息放入文件
strings /dev/urandom 		# 生成随机字符串的设备文件


/var 包含 系统一般运行时要改变的数据。 通常这些数据所在的目录的大小是要经常变化或扩充的。原来/ v a r目录中有些内容是在/ u s r中的,但为了保持/ u s r目录的相对稳定,就把那些需要经常改变的目录放到/ v a r中了。每个系统是特定的,即不通过网络与其他计算机共享。 
/bin 						# 该目录中存放Linux的常用命令,在有的版本中是一些和根目录下相同的目录。 
/sbin 						# 该目录用来存放系统管理员的系统管理程序。 
/etc 						# 该目录存放了系统管理时要用到的各种配置文件和子目录,
							# 例如网络配置文件、文件系统、X系统配置文件、设备配置信息、设置用户信息等。 
/home 						# 用来存放该用户独立数据的主目录。 
/lib 						# 该目录用来存放系统动态连接共享库,几乎所有的应用程序都会用到该目录下的共享库 
/lost+found 				# 该目录在大多数情况下都是空的。但当突然停电、或者非正常关机后,有些文件就临时存放在这里。 
/mnt 						# 该目录在一般情况下也是空的,你可以临时将别的文件系统挂在该目录下。 
/proc 						# 可以在该目录下获取系统信息,这些信息是在内存中由系统自己产生的 
/root 						# 如果你是以超级用户的身份登录的,这个就是超级用户的主目录 
/tmp 						# 用来存放不同程序执行时产生的临时文件 
/boot 						# 该目录下存放的都是系统启动时要用到的程序,当用lilo引导Linux时,会用到这里的一些信息 
/dev 						# 该目录包含了Linux系统中使用的所有外部设备,它实际上是访问这些外部设备的端口,
							# 你可以访问这些外部设备,与访问一个文件或一个目录没有区别。
							# 键入"cd /dev/cdrom",就可以看到光驱中的文件;键入"cd /dev/mouse"即可看鼠标的相关文件。 

2 Linux基础命令

2.0 环境变量

# 连接到当前终端 是 /bin/bash  命令行 (pstree)
输入pstree 可以看到sshd这是因为我用item2通过ssh连接的服务器。出现两个sshd的原因我猜测是做过内网穿透的原因。
bash 就是我们当前连接的命令行,pstree说明我们在当前命令行执行了pstree命令
─sshd───sshd───bash───pstree
当我们输入在命令行输入bash,发现执行成功但是看不出变化,继续输入pstree命令
bash 发现多了一个bash说明我们现在执行的命令已经是新的bash
─sshd───sshd───bash───bash───pstree
# 两个bash会造成的影响,发现第二 echo $a 为空,说明变量a只是局部变量
a=10
echo $a
bash
echo $a
# 我们设置全局变量后全部bash都可以访问
# 方法一(当前终端有效,窗口关闭后无效):
export a=10
# 方法二(vi ~/.bashrc 或 ~/.bash_profile 用户环境变量,只对当前用户有效,且永久生效):
# 	   (vi /etc/bashrc 或 vi /etc/profile 系统环境变量,对所有用户有效,且永久生效)
进入文件写入 a=10
source ~/.bashrc

现在有了全局变量和局部变量的知识,那么问题来了,通过全局变量的设置,我们的Linux命令可以在任意bash下执行的,但是Linux为什么可以在任意目录下执行?这就要说到PATH变量。
PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就可以执行.

# 我们看一下系统默认设置的PATH路径
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 我们通过寻找 /bin 目录发现ls 命令在这个命令下
ll /bin/ | grep ls

所以,我们完全可以把下载好的应用拷贝到 /bin,/usr/bin 等任意目录,
我们下载的应用也可以像Linux自带的命令一样在任意位置执行。
# 或者直接将路径添加在PATH变量上:
export PATH=/home/user/mysql/bin:$PATH
# 或者把PATH放在前面
export PATH=$PATH:/home/user/mysql/bin

sh 和 source 区别

sh 执行脚本 : 新创建一个bash 在新建bash下执行 脚本
source 执行脚本 : 在当前 bash 执行脚本

2.1 apt-get 安装

apt-get 命令是 Ubuntu 系统中的包管理工具,可以用来安装、卸载包,也可以用来升级包,还可以用来把系统升级到新的版本。
相比较Windows,需要打开应用商店,搜索软件,然后才能下载,安装。
Ubuntu只需要知道要下载的软件名一条命令就可以完成。
# 下载包目录:/var/cache/apt/archives
# 安装应用目录:/usr/share或/usr/local
apt-get install 软件名
# 删除已安装的软件包(保留配置文件),不会删除依赖软件包,保留配置文件;
apt-get remove 软件名
# 删除已经安装过的的软件安装包;即自动将/var/cache/apt/archives/下的所有deb删掉
apt-get clean
# 搜索:系统会列出与名称相匹配的包
apt-cache search <package>
# 更新
apt-get update 是更新软件列表,
apt-get upgrade 是更新软件。

2.2 ls ll 和 alias

ls 大家都知道是打印出当前目录的列表
ls -l 可以看到详细信息
ll 与 ls -l 的效果一样的
但是并不是有ll这个命令而是在环境变量中设置了别名
vi ~/.bashrc
在文末添加:
alias ll='ls -l --color=auto'
alias name=value 			# =两边不能有空格,可以自定义一些命令
source ~/.bashrc

2.3 花式grep

# 找到id_all.txt中所有不在id_1k.txt中的字符串           取反 字符串匹配 全部匹配 指定规则文件 
grep -v -F -w -f id_1k.txt id_all.txt
-i 或 --ignore-case : 忽略字符大小写的差别。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-v 或 --invert-match : 显示不包含匹配文本的所有行。
-w 或 --word-regexp : 只显示全字符合的列。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-q 或 --quiet或--silent : 不显示任何信息。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
# grep 多种规则 ^$ 去除空行
grep -E'(John|Jerry|^$)' roster.txt

# 通过pgrep来获得正在被调度的进程的相关信息
pgrep -l 程序名
-l:同时显示进程名和PID

# fgrep 因为它搜索字符串而不是搜索匹配表达式的模式。 命令使用快速的压缩算法。
fgrep 使用相当于 grep -F 的效果

# egrep
egrep命令检索扩展的正则表达式

2.4 git 命令

# 用户标识(必须配置)
git config user.name "username"
git config user.email "email"
git config --global user.name "zhangyiqian"  #名称
git config --global user.email 496115313@qq.com  #邮箱
# 局部配置
git config user.name "username"
git config user.email "email"
# 显示中文
git config --global core.quotepath false
# 初始化
git init
# git操作
git status  							# 查看文件状态
git add .  								# 所有文件提交到暂存区
git commit -m "new file"  # 提交信息
git push   								# push 到远程仓库
# 忽略文件 .gitignore
*.txt    				# 忽略.txt结尾文件
!lib.txt				#lib.txt	除外
/temp						# 忽略 /temp下所有文件
# 远程
ssh-keygen      # 生成公钥,免密登录
id_rsa.pub      # 公钥添加到gitee


# 版本恢复
1、查看版本
git log
# 方法1 git reset --hard 目标版本号
git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本
# 方法2 git revert -n  目标版本号
git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。
比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。



# 多人操作 分支
git branch 										# 列出本地分支
git branch -r									# 列出远程分支
git branch [branch-name]			# 新建分支
git checkout -b [branch]			# 新建并切换分支
git merge [branch]						# 合并指定分支到当前分支
git checkout -d [branch]			# 删除分支
git push origin --delete [branch-name] # 删除远程分支
git branch -dr [branch]				# 删除远程分支
# 远程分支使用
git checkout -b new_branch 		# 本地新建分支
git push <远程> <分支> 				 # 提交到远程

2.5 sed(stream editor流式编辑器) 命令

# 语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
-n:仅显示script处理后的结果。
-r:支持扩展正则
-i:直接修改源文件

# 打印行 p
sed -n 5p 文件名                 # 输出第5行
sed -n '70,75p' 文件名        		#输出第70行到第75行的内容
sed -n '6p;260;400p; ' 文件名    # 输出第6行 和 260到400行
sed -n '1~2p; ' 文件名  					# 输出第一行开始,步长为2 即:1,3,5..行
sed -n '1,+2p; ' 文件名				 # 输出第一行开始,及后面2行 即:1,2,3
sed -n '/Name/,$p'							# 输出匹配到的第Name到最后

# 删除行 d 
sed 'd' 文件名											# 删除全部
sed '1,3d' 文件名									# 删除 1-3行
sed '/dev/!d' 文件名								# 删除不包含 dev 的行
sed '/^$/d' 文件名									# 删除空白行
# 替换行 c
sed 'c 123456' 文件名  						# 替换所有行为123456
sed '/password/c 123456' 文件名  	# 匹配password 替换 为123456
sed '4c 123456' 文件名 						# 第4行替为123456

# 替换关键词 s
sed 's/2046/xxx/' 文件名 					# 全文替换匹配到的第一个 2046 为 xxx
sed 's/2046/xxx/2' 文件名 					# 全文替换匹配到的第2个 2046 为 xxx
sed 's/2046/xxx/g' 文件名 					# 全文替换匹配到的所有 2046 为 xxx
sed 's/2046/(&)/g' 文件名 					# 全文替换匹配到的所有 2046 为 (2046)
sed '2s/2046/xxx/g' 文件名 				# 第二行替换匹配到的所有 2046 为 xxx

# 打印行号  =	
sed -n '1=' 文件名									# 打印第一行
sed -n '/root/=' 文件名						# 打印有root的行号
sed -n '$=' 文件名									# 统计行数
# 正则 () 技巧 
echo "hello world" | sed -r 's#(.)(.*)(.)#\3\2\1#'  
输出:dello worlh

# 插入 i
sed '3i ABC' 文件名								# ABC插入第三行,行前写入
sed '/2046/i ABC' 文件名						# ABC插入有2046的行,行前写入
# 追加
sed '3a ABC' 文件名								# ABC追加第三行,行后写入
sed '/2046/a ABC' 文件名						# ABC追加有2046的行,行后写入

# 将其他文件内容导入  r
sed '2r /etc/hosts' txt					# 在txt第二行 后面导入/etc/hosts
sed 'r /etc/hosts' txt					# 在txt每行 后面导入/etc/hosts
sed '/2021/r /etc/hosts' txt		# 在txt有"2021"行 后面导入/etc/hosts

# 将文件内容导出
sed '2w /etc/hosts' txt					# 在txt第二行 另存为/etc/hosts
sed 'w /etc/hosts' txt					# 在txt每行 另存为/etc/hosts
sed '/2021/w /etc/hosts' txt		# 在txt有"2021"行 另存为/etc/hosts

2.6 awk命令详解

# 1、调用awk:
# 第一种,如:
awk [选项] '[条件]{指令}' 文件..
# 第二种
前置命令 | awk [选项] '[条件]{指令}'

# 选项
-F:指定分割符
-v:调用shell中的变量
# 内置变量
NR:行号
NF:列数

# -v 使用
shell中变量 name="zhang"
awk -v x=$name 'BEGIN{print x}'
# 表示打印所有域并把结果重定向到sav.txt中  $0 == 一行
awk '{print $0}' temp.txt > sav.txt
# BEGIN , END
awk '{x++;print x}' /etc/passwd												# 文件有几行,x++几次,x不赋值默认为0
awk '/bash$/{x++;print x}' /etc/passwd										# 文件匹配到几次bash结尾,x++几次,输出几次
awk 'BEGIN{x=0}  /bash$/{x++} END{print x}' /etc/passwd			# 文件匹配到几次bash结尾,x++几次,最后输出一次

# awk条件判断
1.正则 -  /正则表达式/  # ~匹配  !~不匹配
awk -F : '/bash$/{print $1,$7}' /etc/passwd								# 匹配到bash结尾的数据
awk -F : '$7!~/bash$/{print $1,$7}' /etc/passwd 					# $7不匹配bash结尾的数据
2.数字、字符串比较
awk 'NR==2 ' /etc/passwd 
awk '$7!="/bin/bash" ' /etc/passwd 												# 没有指令默认print $0
awk '$3>=1000 ' /etc/passwd 
3.逻辑比较 &&  ||

# awk 流程控制, if,while 都是指令,指令必须放在 {}中 
awk '{if($1=="root"){print $1}}' /etc/passwd 		
ls -l /etc/ | awk '{if($1~/^-/){x++} else {y++}} END{print x}' 
if(){} else if() {} else{}
awk 'BEGIN {for(i=1;i<5;i++){print i}}'

# 数组
遍历数组 for(变量名 in 数组名){print 数组名[变量]}

# 格式化输出 column
awk -F : 'BEGIN{ print "用户名 uid 家目录"} {print $1,$3,$6}' /etc/passwd | column -t

# 显示可以登录的用户名 
awk -F : '/bash$/{print $1}' /etc/passwd

# 相同的key值做匹配
awk 'NR==FNR{s[$1]=$2}NR!=FNR{print $0,s[$1]}' bb.txt cc.txt
# 查看两个文件有重复值输出
awk 'NR == FNR {utts[$1];next} ($1 in utts)' 1.txt 2.txt
# 查看两个文件没有重复值输出
awk 'NR == FNR {utts[$1];next} !($1 in utts)' 1.txt 2.txt

2.7 命令

常见命令自己百度吧,快到吃饭点了

  • split
  • sort
  • find
  • wget
  • mount
  • paste
find `pwd` -name "*pcm" 	#绝对路径下的所有pcm
find `pwd` \( -name "*.txt" -o -name "*.text" \)		# 绝对路径下的所有.txt和.text
find `pwd` -type d    		#绝对路径下的所有目录,f是文件
find `pwd` -iname "*txt" 	#绝对路径下的所有txt(且不区分大小写)
find `pwd` -maxdepth 1 		#查找目录最大深度为1
find `pwd` -size +9600000c 	#查找目录大于9600000字节的文件

3 shell基础

# 单引号
变量无效,转义也不可以
# 双引号
变量有效,可出现转义符

# 变量
name="nihao" # 局部变量,仅在当前shell有效
exprot name="nihao" # 全局变量,所有shell有效

# 获取字符串长度
在${}中使用“#”获取长度
# 提取子字符串
${str:start:len}

# 数组 bash只支持一维数组,不支持多维数组
# 定义
array_name=(li wang xiang zhang) (小括号做边界、使用空格分离)
# 获取数组元素
echo ${array_name[0]}
# 取得元素个数:
${#array_name[@]} 或者 ${#array_name[*]}
# 取得单个元素长度:
${#array_name[1]}

# 参数
- $#:参数个数
- $@:显示所有向脚本传递的参数  “1” “2” “3”(传递了三个参数)
- $*:显示所有向脚本传递的参数  “1 2 3” (传递了一个参数)
- $?:是显示最后命令的退出状态,0表示没有错误,其他表示有错误
- $!:最后一个运行的后台进程 
# 算数运算
$[1+1]$((1+1))`expr 2 + 2` (中间要有空格)let i=1+1
# bc 上面的都不能做小数运算,可以使用bc计算器,也支持 逻辑运算 echo "1>2" | bc 成立返回1,不成立返回0
- scale=n 可以约束小数位
1.直接输入bc,可以进入交互模式
2.echo "scale=2;1.1+1.1" | bc

# 数字关系运算符
-eq := ,Equal
-ne: != , Not Equal
-gt: > , Greater Than
-ge:  >= , Greater or Equal
-lt : < , Less Than
-le : <= , Less or Equal

# 字符串运算符
= :检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= :检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z :len == 0,为0返回 true。 [ -z $a ] 返回 false。
-n :len != 0,不为0返回 true。 [ -n “$a] 返回 true。
$ : a != "",不为空返回 true。 [ $a ] 返回 true。

# 布尔运算符
! :非运算,表达式为 true 则返回 false。   [ ! false ] 
-o :| ,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ]
-a :& ,两个表达式都为 true 才返回 true。	[ $a -lt 20 -a $b -gt 100 ]

# 逻辑运算符  有多个判断条件,所以有两个 [[  ]]
&& :逻辑的 AND 	[[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| :逻辑的 OR 		[[ $a -lt 100 || $b -gt 100 ]] 返回 true

# 文件运算符
-d file :检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file :检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-s file :检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file :检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
-r file  -w file -x file :可读可写可执行返回true

# 字符串切割 
${file#.*} 删掉第一个 
${file##.*} 删掉最后一个 
${file%%.*} 删掉最后一个 
${file%.*} 删掉第一个 

${file/dir/path}:将第一个dir替换为 path
${file//dir/path}: 将全部dir替换为 path

# read == 标准输入
read -p "请输入姓名" -t 3 -s name
-p:提示输入
-t:计时输入
-s:输入不显示,类似于密码输入
cat txt | while read line;do commend ;done # 按行读取文本


# 条件测试
test 选项 参数  或  [ 选项 参数 ] (空格必须加)
- 多个命令组合
; - [ 1 -eq 1 ] ;echo 1 # 用;两条命令没有逻辑关系,依次执行
&& - [ 1 -eq 1 ] && echo 1 # && 有关系,只有第一条命令执行成功,才能执行第二条
|| - [ 1 -eq 1 ] || echo 1 # || 有关系,如果第一条命令执行成功,第二条就不执行,反之,第二条执行

# if 判断 
if 条件测试;then
 命令
elif 条件判断;then
 命令
else
 命令
fi

# for 循环
# 方法一:
for 变量 in 值列表  # 技巧 {1..10} 1-10 ; {a..z} a-z
do 
 命令
done
# 方法二:
for((初值;条件;步长))
do 
 命令
done

# case 语句
case 变量 in
模式1)
 命令;;
模式2)
 命令;;
*)
 默认命令
esac


# 函数
function 函数名{  }
函数名(){  }

# basename 命令
$ basename /usr/bin/sort       输出"sort"。
$ basename ./include/stdio.h .h  输出"stdio"# dirname 命令
$ dirname /tmp/test/file.txt    输出"/tmp/test"

# tr 命令
-s :  删除重复字符串
echo "a   b   c" | tr -s " "   # a b c
echo "aaaaaab" | tr -s "a"     # ab
-c : 取反
-d : 删除
tr -cd '0-9a-zA-z' < /dev/urandom  | head -c 10 # 只提取前10个字符

# cut 命令 切割列
-d:指定分隔符
-f:指定第几列
cut -d : -f 1 txt  # 选择以:为分割符的第一列

4 脚本应用

4.0 crontab定时任务

# 编辑脚本
vi test.sh
# 赋予权限
chmod 777 test.sh
# -e : 执行文字编辑器来设定时程表
crontab -e
# 编辑定时任务,每天 0点定时执行 test.sh 脚本
0 0 * * * /root/test.sh

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

4.1 监测进程并重启脚本

#!/bin/bash
pgrep test.sh &> /dev/null #pgrep是读取进程名为输入内容的进程号,返回到下面,&>输入到空文件
if [ $? -gt 0 ]; #$?代表上面的返回值(进程ID,当且仅当存在这个进程时才会高于0) -gt是大于号
then
	echo "`date` restart" >> /var/log/test.log #`date`是当前时间,>>输出到log文件中作为新的一行,log文件也可以与脚本放在同一个目录下
	/etc/init.d/s start  #进程启动命令
#调试阶段此处可以加入返回running状态的内容,去掉井号即可
#else
	#echo "`date` restart" 
fi

4.2 获取本机IP发送邮件

#!/bin/bash

#fix can't lock /sent
HOME='/root/'

# check network availability
while true
do
  TIMEOUT=5
  SITE_TO_CHECK="www.baidu.com"
  RET_CODE=`curl -I -s --connect-timeout $TIMEOUT $SITE_TO_CHECK -w %{http_code} | tail -n1`
  if [ "x$RET_CODE" = "x200" ]; then
  echo "Network OK, will send mail..."
  break
  else
  echo "Network not ready, wait..."
  sleep 1s
  fi
done

# get the IP address of eth0, e.g. "192.168.16.5"
ETH0_IP_ADDR=`ifconfig wlan0 | sed -n "2,2p" | awk '{print substr($2,1)}'`

# send the Email
echo "Current time: `date '+%F %T'`. Enjoy it. IP Address of Raspberry Pi: $ETH0_IP_ADDR" | mutt -s "email—title" 邮箱

expect脚本自动连接服务器

想要了解更多expect可以看这个,expect命令

expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

命令 作用
spawn 启动一个新的进程,用来执行后面所接的COMMAND
expect 期待从进程中获取的内容
send 向进程发送内容
set timeout n 设置超时时间,单位:秒,超过n秒则不再继续等待进程的内容返回
interact 是否保留交互状态
#!/usr/bin/expect

set timeout 30 				
set usr speech				# usr = root  	跳板机用户名
set host 192.168.1.1 		# host = ip		跳板机ip

spawn ssh $usr@$host
expect {
        "(yes/no)?"
        {send "yes\n";exp_continue}
        "password:"
        {send "123456\r"}
}
interact 

5 docker

5.1基础

# 启动容器
docker run -d --name nginx01 -p 3344:80 nginx(要启动的镜像名)
-d:后台运行
--name:给容器取名
-p 主机端口:docker端口:将docker中的80端口映射到主机的3344端口,即localhost:3344,可以访问到docker的80端口

# 进入容器
docker exec -it 容器id /bin/bash [-c (可以执行command)] 
docker attch 容器id 

# 容器可视化
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
# 拷贝
docker cp 容器id:/root/file /root

# 容器数据卷
- 容器持久化和同步操作,容器之间也可以数据共享
docker run -it -v 主机目录:容器目录 -p 80:8080 tomcat 

# 配置mysql
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -d -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql mysql

# 具名挂载和匿名挂载
-v 容器内路径    # 匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径  #指定路径挂载

# ro和rw
-v /宿主机路径:容器内路径:ro  # readonly容器内只读,只能用宿主机编辑
-v /宿主机路径:容器内路径:rw  # 读写

# 数据卷容器,实现多个容器之间数据共享
docker run -it --name docker02 --volumes-from docker01 mysql
# 多个mysql共享
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d -v /etc/mysql/conf.d -v /var/lib/mysql mysql
docker run --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d --volumes-from mysql01 mysql

数据卷容器的生命周期是持续到没有人使用为止

5.2 dockerfile(构建docker镜像的文件)

# 1、编写dockerfile :
FROM centos
VOLUME ["volume01"] # 匿名挂载
CMD echo -----end----

# 2、docker build 构建称为一个镜像
docker build -f dockerfile -t myimage:1.0 .

# 3、docker run 运行镜像
# 4、docker push发布镜像(DockerHub、阿里云镜像仓库)
基础知识:
1、保留关键字(指令)都必须是大写字母
2# 表示注释
3、每一个指令都会创建提交一个新的镜像层,并提交

FROM 				# 基础镜像,一切从这里开始构建
MAINTAINER 	# 镜像是谁写的,姓名+邮箱
RUN					# 镜像构建时需要运行的命令 ===> RUN yum -y install vim
ADD					# 添加内容
WORKDIR			# 镜像的目录
VOLUME			# 挂载目录
EXPOST 			# 暴露端口配置
CMD					# 指定容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	# 指定容器启动时要运行的命令,可以追加命令
ONBUILD			# 构建一个被继承DockerFile这个时候就好运行ONBULD指令,触发指令
COPY				# 类似ADD,将文件拷贝到镜像中
ENV					# 构建的时候设置环境变量  ==> ENV key value

# docker tomcat镜像构建

# dockerhub镜像发布
docker login -u 用户名
docker tag imageId newname:1.0
docker push newname:1.0

5.3 docker网络

1、每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker就会有一个docker0网卡
(桥接模式,使用的技术是evth-pair)
evth-piar:一对虚拟设备接口,他们都是成对出现,一段连接协议,一段彼此相连
# NAT(直连)
Docker中的所有网络接口都是虚拟的。虚拟的转发效率高。(内网传递文件)
只要容器删除,对应网桥消失
# 查看网络
docker network ls
# --link 通过主机名ping通网络,而不是ip(不建议)
docker run --name tomcat02 --link tomcat01 tomcat
本质在hosts配置了一个
ip   tomcat01
# 自定义网络
1、网络模式
bridge : 桥接
none   : 不配置网络
host   : 和宿主机共享网络
container:容器网络连同(用的少)
2、创建网络
docker network create --driver bridge --subnet 192.168.0.0/16 --geteway 192.168.0.1 mynet 
3、使用网络
docker run -d -P --name tomcat-net-01 --net mynet tomcat
# 16表示子网掩码255.255.0.0

# 网络连同 docker 和 mynet已经不是一个网段 不能连同
docker network connect mynet tomcat01(docker网段)
docker network inspect mynet 
# 结果:将tomcat01加入mynet ,一个容器两个ip

全文最重要的话

这次为了更新作者利用宝贵的上班摸鱼时间完成,一键三连拿来把你!!!

你可能感兴趣的:(hanker,linux,运维,服务器)