Kali学习之从入门到入狱
冒个泡
发点存货证明自己没有进去!!!
我以为只要小说会被催更,原来博客也会被催,谢谢大家的厚爱,日后会逐渐更新《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
# 搜索:系统会列出与<package>名称相匹配的包
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/shadowsocks 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
全文最重要的话
这次为了更新作者利用宝贵的上班摸鱼时间完成,一键三连拿来把你!!!