Linux 基础 Linux 开始 虚拟机 Linux 准备工作 Linux 安装步骤
修改最大磁盘大小(这里最大磁盘大小指给虚拟机分配的,但不真正使用不是这么多)
注意: Linux 版本根据自己的Linux 版本选择。列如:我这用的是 CentOS-6.5-x86_64-minimal.iso,
所以选择 Linux 版本时选择时 Centos 64位
添加 ISO 镜像文件,之后开启虚拟机即可
选择编辑虚拟机设置
2. 挂载 iso 镜像文件
注意事项:
VM 安装选择自定义安装,便于之后的自定义硬件配置(如:磁盘大小等)
语言、键盘都选择英文
时区选择亚洲/上海
密码设置要简单透明
磁盘需要手动分区 boot(200MB) swap(2G) /(剩余所有)
Linux 静态 IP 设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 # 设置静态 IP # 编辑 vi /etc/sysconfig/network-scripts/ifcfg-eth0 [root@node01 network-scripts]# cd /etc/sysconfig/network-scripts/ [root@node01 network-scripts]# vi ifcfg-eth0 # ifcfg-eth0 网卡配置,使用打开后编辑,# ONBOOT=on 开机自启 # BOOTPROTO=static 表示 IP 使用静态IPDEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.170.101 NETMASK=255.255.255.0 GATEWAY=192.168.170.2 DNS1=144.144.144.144 DNS2=8.8.8.8 # 删除 rm -f 70-persistent-net.rules # 70-persistent-net.rules 该文件的作用是将 IP 地址与 MAC 地址绑定[root@node01 etc]# cd /etc/udev/rules.d/ [root@node01 rules.d]# ll total 16 -rw-r--r--. 1 root root 316 Nov 22 2013 60-raw.rules -rw-r--r--. 1 root root 789 Sep 21 19:33 70-persistent-cd.rules -rw-r--r--. 1 root root 420 Sep 21 19:28 70-persistent-net.rules -rw-r--r--. 1 root root 54 Dec 8 2011 99-fuse.rules [root@node01 rules.d]# rm -f 70-persistent-net.rules # 关机 poweroff # 修改主机名[root@node01 ~]# vi /etc/sysconfig/network # 编辑 network 文件NETWORKING=yes HOSTNAME=node01
Linux 网络配置文件位置
文件位置
文件作用说明
/etc/sysconfig/network-scripts/ifcfg-eth0
配置静态 IP 地址
/etc/udev/rules.d/70-persistent-net.rules
将 IP 地址与 MAC 地址绑定
/etc/sysconfig/network
配置主机名
使用 VM 软件 记录快照
Linux 关机和重启命令
关机
重启
poweroff
reboot
init 0
init 6
Linux 常用命令
命令
作用
ls
显示目录内容 ll –i
pwd
显示当前目录的绝对路径
cd
切换目录
mkdir
文件夹 -p {}
cp
复制 -r
mv
移动
touch
创建文件夹、文件
type 命令名
查看指定命令的文件的存放位置 外部命令 & 内部命令
cat
查看文件内容
file
查看文件详细信息 (ELF 表示二进制文件)
echo
回声,打印标椎输出 echo $PATH 查看环境变量路径echo $$ 当前shell的PID
help
查看内部命令
man
查看外部命令命令
whereis
定位命令位置
hash
查看 hash 表
ps -ef
查看当前进程信息
df -h
显示文件系统使用情况[甩锅]
du -h
查看某种文件使用状况[甩锅]
mount/unmout
挂载/卸载磁盘文件
#### ls 命令 ####
文件类型: -:普通文件 (f) d: 目录文件
b: 块设备文件 (block) c: 字符设备文件 (character)
l: 符号链接文件(symbolic link file)
p: 命令管道文件(pipe) s: 套接字文件(socket) 文件权限:9位,每3位一组,3组 权限(U,G,O)每一组:rwx(读,写,执行), r– 文件硬链接的次数 文件的属主(owner) 文件的属组(group) 文件大小(size),单位是字节 时间戳(timestamp):最近一次被修改的时间 访问:access 修改:modify,文件内容发生了改变 改变:change,metadata,元数据
使用 ls 同时展示多个目录
1 2 3 4 5 6 [root@node01 god]# ls ~ /usr/local /root: anaconda-ks.cfg install.log install.log.syslog /usr/local: bin etc games include lib lib64 libexec sbin share src
使用 mkdir 命令同时创建多个文件夹
1 2 3 4 5 6 7 8 9 10 [root@node01 c]# mkdir Hello/{a,b,c}A -p [root@node01 c]# ll total 4 drwxr-xr-x. 5 root root 4096 Sep 22 00:45 Hello [root@node01 c]# cd Hello [root@node01 Hello]# ll total 12 drwxr-xr-x. 2 root root 4096 Sep 22 00:45 aA drwxr-xr-x. 2 root root 4096 Sep 22 00:45 bA drwxr-xr-x. 2 root root 4096 Sep 22 00:45 cA
查看文件系统和文件使用情况
1 2 3 4 5 6 7 8 9 10 [root@node01 /]# du -h /etc/udev 4.0K /etc/udev/makedev.d 20K /etc/udev/rules.d 32K /etc/udev [root@node01 /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 97G 842M 91G 1% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 194M 28M 157M 15% /boot /dev/sr0 398M 398M 0 100% /mnt
使用硬链接和软链接
硬链接类似于拷贝,即使原文件被删除了,硬链接生成文件仍可使用
安装 man 命令
1 yum install man man-pages
Linux命令执行流程 用户通过客户端命令行输入命令以及命令参数, bash 解释器会根据空白符切割,得到的第一个元素,作为命令 command。通过判断该 command 命令是外部命令还是内部命令,若内部命令,则由 bash 执行器直接执行。若是外部命令,则 根据 $PATH 中给定的目录中从左向右寻找该命令文件的可执行程序文件,然后由 bash 执行器执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@node01 ~]# type ls ls is aliased to `ls --color=auto' [root@node01 ~]# type -a ls ls is aliased to `ls --color=auto' ls is /bin/ls [root@node01 ~]# type ifconfig ifconfig is /sbin/ifconfig [root@node01 ~]# file /sbin/ifconfig /sbin/ifconfig: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped [root@node01 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@node01 ~]# type yum yum is hashed (/usr/bin/yum) [root@node01 ~]# file /usr/bin/yum /usr/bin/yum: a /usr/bin/python script text executable
小技巧:使用 xshell 登录 Linux ssh root:123456@192.168.170.101
Linux 文件系统 boot 目录的挂载与卸载 1 2 3 4 5 6 7 8 9 10 11 [root@node01 /]# umount /boot [root@node01 /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 97G 842M 91G 1% / tmpfs 491M 0 491M 0% /dev/shm [root@node01 /]# mount /dev/sda1 /boot [root@node01 /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 97G 842M 91G 1% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 194M 28M 157M 15% /boot
File System Hierarchy Standard
文件系统层次化标准
目录
/boot
系统启动相关的文件,如内核、initrd,以及grub(bootloader)
/dev
设备文件
/etc
配置文件
/home
用户的家目录,每一个用户的家目录通常默认为/home/USERNAME
/root
管理员的家目录
/lib
库文件
/media
挂载点目录,移动设备
/mnt
挂载点目录,额外的临时文件系统
/opt
可选目录,第三方程序的安装目录
/proc
伪文件系统,跟硬件设备相关的属性映射文件
/sys
临时文件, /var/tmp
/tmp
可变化的文件
/bin
可执行文件, 用户命令
/sbin
管理命令
系统启动必须:
/boot: 存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。
/etc: 存放所有 的系统需要的配置文件 和子目录列表, 更改目录下的文件可能会导致系统不能启动。
/lib :存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
/sys : 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中
指令集合:
/bin: 存放着最常用的程序和指令
/sbin: 只有系统管理员能使用的程序和指令。
外部文件管理:
/dev : Device(设备)的缩写, 存放的是Linux的外部设备。注意: 在Linux中访问设备和访问文件的方式是相同的。
/media :类windows的其他设备, 例如U盘、光驱等等,识别后linux会把设备放到这个目录下。
/mnt :临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
临时文件:
账户:
运行过程中要用:
扩展用的:
挂载 cdrom 到 /mnt 目录下
文本操作命令
command
作用
cat
显示全部文本文件内容
more
逐页显示文本文件内容
less
一次性读取全部文件内容,相比more,可以往回看
head
显示前 n 行的内容
tail
显示后 n 行的内容
|
管道
xargs
使用 head 和 tail 命令遍历每行
1 2 [root@node01 god]# cat profile | head -3 | tail -1 # System wide environment and startup programs, for login setup
xargs 用法
1 2 3 4 5 6 [root@node01 god]# echo "/" |xargs ls -l total 90 dr-xr-xr-x. 2 root root 4096 Sep 21 19:29 bin dr-xr-xr-x. 5 root root 1024 Sep 21 19:29 boot drwxr-xr-x. 18 root root 3680 Sep 21 22:21 dev # ....
vi 全屏文本编辑器 打开方式 1 2 3 4 vim /path/to/somefile vim +# :打开文件,并定位于第#行 vim +:打开文件,定位至最后一行 vim +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首
关闭文件 1 2 3 4 5 6 7 8 9 末行模式: :q 退出 没有动过文件 :wq 保存并退出 动过了,不后悔 :q! 不保存并退出 动过了,后悔了 :w 保存 :w! 强行保存 :wq --> :x ZZ: 保存并退出 不需要冒号,编辑模式 # 重点*
三种模式 按键具有编辑文本功能:默认打开进入编辑模式 输入模式:按键本身意义 末行模式:接受用户命令输入
编辑模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 编辑-->输入: i: 在当前光标所在字符的前面,转为输入模式;* a: 在当前光标所在字符的后面,转为输入模式;* o: 在当前光标所在行的下方,新建一行,并转为输入模式; O:在当前光标所在行的上方,新建一行,并转为输入模式; I:在当前光标所在行的行首,转换为输入模式 A:在当前光标所在行的行尾,转换为输入模式 输入-->编辑: ESC # 编辑-->末行:: # 末行-->编辑:ESC, ESC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 # 移动光标字符 h: 左;j: 下;k: 上;l: 右 # 单词w: 移至下一个单词的词首* e: 跳至当前或下一个单词的词尾 b: 跳至当前或前一个单词的词首 # 行内0: 绝对行首 ^: 行首的第一个非空白字符* $ : 绝对行尾*# 行间G:文章末尾 3G:第3行 gg:文章开头 # 翻屏ctrl:f,b # 删除&替换单个字符x:删除光标位置字符 3x:删除光标开始3个字符 r:替换光标位置字符 # 删除命令 : d dw,dd # 复制粘贴&剪切 yw(复制一个词),yy(复制一行) p(向下粘贴) P(向上粘贴) # 撤销&重做u 撤销* ctrl+r 重做 撤销的操作* . 重复上一步的操作
末行模式 (进入末行模式 shirt+: )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 set:设置 set nu number set nonu nonumber set readonly /:查找 /after n(向下查找),N(向上查找) ?向上查找 !:执行命令 :!ls -l / s查找并替换 s/str1/str2/gi /:临近s命令的第一个字符为边界字符:/,@,# g:一行内全部替换(若没有选择,则替换当前行的第一个替换) i:忽略大小写 范围 n:行号 .:当前光标行 +n:偏移n行 $ :末尾行,$-3% :全文# 替换查找从当前光标处,到文件末尾处eg: .,$s/str1/str2/gi
末行模式小技巧 1 2 3 4 5 编辑模式下 : :Gd 清空内容 :.,$d 删除从当前光标到末尾所有行 :n,md 删除从第 n 行到 m 行的所有内容 :n,my 复制从第 n 行到 m 行的所有内容
正则表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 grep:显示匹配行 - v:反显示 - e:使用扩展正则表达式 匹配操作符 \ 转义字符 . 匹配任意单个字符 [1249a],[^12],[a-k] 字符序列单字符占位 ^ 行首 $ 行尾 \<,\>:\<abc 单词首尾边界* | 连接操作符 (,) 选择操作符 \n 反向引用 重复操作符: ? 匹配0到1次。 * 匹配0到多次。 + 匹配1到多次。 {n} 匹配n次。 {n,} 匹配n到多次。 {n,m} 匹配n到m次。 与扩展正则表达式的区别:grep basic \?, \+, \{, \|, \(, and \) 匹配任意字符 .*
注意:在未扩展正则表达式时,若匹配规则中含有 ?,+,{,},|,(,) ,都需要通过 \ 转义,否则匹配不到
查询文章中包括4位整数的行
1 grep -E "([^0-9][0-9]|^[0-9])([0-9]{2})([0-9][^0-9]|[0-9]$)" grep.txt
查看指定单词
反向引用
1 2 3 4 [root@node01 god]# grep -E ".*(god).*(good).*\2.*\1" test asgodssgoodsssagoodssgod [root@node01 god]# grep -E ".*(god).*(good).*\1.*\2" test asgodssgoodsssagodssgood
文本处理 cut 命令 1 2 3 4 cut:显示切割的行数据 f:选择显示的列 s:不显示没有分隔符的行 d:自定义分隔符
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@node01 god]# cut -d' ' -s -f1-3 grep.txt ooxx 12121212 oox 12121212 1212 ooxx 1212 [root@node01 god]# cut -d' ' -f1,2,3 grep.txt ooxx12121212ooxx ooxx 12121212 oox 12121212 1212 ooxx 1212 oo3xx oo4xx ooWxx oomxx $ ooxxoo1234xx ooxyzxx
sort命令 1 2 3 4 5 6 7 sort:排序文件的行 n:按数值排序 r:倒序 t:自定义分隔符 k:选择排序列 u:合并相同行 f:忽略大小写
1 2 3 4 5 6 [root@node01 god]# sort -k2 -n -r fruits.txt orange--27 banana--15 apple--20 apple--20 [root@node01 god]# sort -k2 -n -r fruits.txt
wc 命令
1 2 3 4 5 6 [root@node01 god]# wc fruits.txt 4 4 42 fruits.txt [root@node01 god]# cat fruits.txt | wc 4 4 42 [root@node01 god]# cat fruits.txt | wc -l 4
统计当前目录中文件的个数
行编辑器 sed 命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 sed [options] 'AddressCommand' file ... -n: 静默模式,不再默认显示模式空间中的内容 -i: 直接修改原文件* -e SCRIPT -e SCRIPT:可以同时执行多个脚本 -f /PATH/TO/SED_SCRIPT -r: 表示使用扩展正则表达式* d: 删除符合条件的行; p: 显示符合条件的行; a \string: 在指定的行后面追加新行,内容为string* \n:可以用于换行 i \string: 在指定的行前面添加新行,内容为string* r FILE: 将指定的文件的内容添加至符合条件的行处 w FILE: 将地址指定的范围内的行另存至指定的文件中; s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串* g: 行内全局替换 i: 忽略字符大小写 s///: s###, s@@@ \(\), \1, \2 * sed:行编辑器Address 可以没有 给定范围 查找指定行/str/
模糊匹配指定行,并替换
1 2 3 # id:9:initdefault:sed "s/\(id:\)[0-9]\(:initdefault:\)/\19\2/" inittab
模糊匹配 IP 地址,并替换最后的主机号
1 2 3 4 sed "s/\(IPADDR=\(\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\).*/\1144/" ifcfg-eth0 [root@node01 god] [root@node01 god]
注意: \. 表示真实的点,不作为正则匹配中任意字符
awk 命令
awk是一个强大的文本分析工具。 相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。 简单来说awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 awk -F '{pattern + action}' {filenames} 支持自定义分隔符 支持正则表达式匹配 支持自定义变量,数组 a[1] a[tom] map(key) 支持内置变量 ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数* NR 已读的记录数* OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符 支持函数 print、split、substr、sub、gsub 支持流程控制语句,类C语言 if、while、do/while、for、break、continue # --------------------------------------------------------------------------------#只是显示/etc/passwd的账户:CUT awk -F':' '{print $1}' passwd 只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行开始前添加列名name,shell,在最后一行添加"blue,/bin/nosh"(cut,sed) awk -F':' 'BEGIN{print "name,shell"} {print $1 "," $7} END{print "blue,/bin/nosh"}' passwd 搜索/etc/passwd有root关键字的所有行 awk '/root/ { print $0}' passwd
注意:
$0 表示一整行内容
代码块{} 外加单引号,不能是双引号,即 '{}'
awk 默认以空白、TAB作为分隔符 delimiter,即若以空白、TAB为分隔号,不需要指定 -F参数
统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容
1 2 3 4 5 6 7 awk -F":" 'BEGIN{ print "NR\tNF\tContent" } {print NR "\t" NF "\t" $0 }' passwd # 结果NR NF Content 1 7 root:x:0:0:root:/root:/bin/bash 2 7 bin:x:1:1:bin:/bin:/sbin/nologin 3 7 daemon:x:2:2:daemon:/sbin:/sbin/nologin # ....
打印报表功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # awk.txtTom 0 2012-12-11 car 3000 John 1 2013-01-13 bike 1000 vivi 1 2013-01-18 car 2800 Tom 0 2013-01-20 car 2500 John 1 2013-01-28 bike 3500 # awk.sh{ split($3,date,"-") if(date[2] == "01"){ name[$1] += $5 #把名字作为数组下标,对应的value为工资 } if($2 == "0"){ role[$1] = "manager" }else{ role[$1] = "worker" } } END{ for (i in name){ print i "\t" role[i] "\t" name[i] } } # 使用[root@node01 god]# awk -f awk.sh awk.txt vivi worker 2800 Tom manager 2500 John worker 4500
Linux 用户管理
命令
说明
id
打印输出有效用户的自身的ID 和 所在组的 ID
useradd
添加用户
userdel
删除用户
groupadd
添加组
groupdel
删除组
passwd
设置或修改密码
sudo *
提升权限
su
切换用户
删除用户
若要删除用户,再创建同名用户,需要在创建前删除原 /home 目录和 /var/mail 目录下的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@node01 /]# userdel god [root@node01 /]# useradd god useradd: warning: the home directory already exists. Not copying any file from skel directory into it. Creating mailbox file: File exists [root@node01 /]# rm -rf /home/god/ [root@node01 /]# useradd god useradd: user 'god' already exists [root@node01 /]# rm -fr /var/ cache/ empty/ lib/ lock/ mail/ opt/ run/ tmp/ db/ games/ local/ log/ nis/ preserve/ spool/ yp/ [root@node01 /]# rm -fr /var/mail/god [root@node01 /]# useradd god
权限
命令
说明
r
读权限 r=4
w
写权限 w=2
x
可执行权限 x=1
usermod
修改用户权限
chown
修改文件的属主和属组
chmod
修改文件操作权限 (RWX) augo
注意:
一个文件只能有一个属主和一个属组
文件夹的执行权限 x ,表示用户是否可以进入到该文件夹下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 useradd sxt01 passwd sxt01 useradd sxt02 passwd sxt02 mkdir /var/swapdata 1,权限修正: chmod 770 swapdata | chmod o-rwx g+rwx swapdata 2,修正属组 groupadd sxtswap usermod -a -G sxtswap sxt01 usermod -a -G sxtswap sxt02 chown root:sxtswap swapdata chown :sxtswap ooxx.file chmod 770 ooxx.file id username
Linux 编译安装
执行顺
说明
./configure
生成编译依赖关系
make
编译
make install
新建文件夹、拷贝文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1,下载源码包 2,解压缩:tar xf filename 3,cd:vi README 4,./configure 检查操作系统 检查编译环境 yum install gcc pcre 依赖库 yum search pcre yum install pcre-devel openssl yum install opssl-devel ./configure --help ./configure --prefix=/opt/sxt/nginx #配置安装路径 5,Makefile 6,make 7,make install 8,cd /opt/sxt/nginx/sbin ./nginx 9,浏览器访问测试 10,祝君好运~!
Linux RPM 安装
Redhat提供了rpm管理体系 已经编译的软件包:针对不同的平台系统编译目标软件包 操作系统维护安装信息 软件包包含依赖检查,但还需人为解决
安装 rpm 软件
rpm 命令使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 rpm安装: -ivh filename --prefix rpm升级: -Uvh -Fvh rpm卸载: -e PACKAGE_NAME # rpm查询rpm -qa : 查询已经安装的所有包 rpm -q PACKAGE_NAME: 查询指定的包是否已经安装 rpm -qi PACKAGE_NAME: 查询指定包的说明信息 rpm -ql PACKAGE_NAME: 查询指定包安装后生成的文件列表 rpm -qc PACEAGE_NEME:查询指定包安装的配置文件 rpm -qd PACKAGE_NAME: 查询指定包安装的帮助文件 rpm -q --scripts PACKAGE_NAME: 查询指定包中包含的脚本 rpm -qf /path/to/somefile: 查询文件是由哪个rpm包安装生成的 如果某rpm包尚未安装,需查询其说明信息、安装以后会生成的文件 rpm -qpi /PATH/TO/PACKAGE_FILE rpm -qpl
Linux YUM 安装 yum 命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 yum命令: yum repolist yum clean all yum makecache yum update 查询: yum list yum search yum info 安装&卸载: yum install remove|erase yum命令:分组 yum grouplist yum groupinfo yum groupinstall yum groupremove yum groupupdate
更换安装为阿里源 1 2 3 4 5 6 7 8 # 备份mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 下载阿里 yum 源curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo # 更新缓存yum makecache
本地 yum 源
为当前虚拟机挂载镜像文件
操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 挂载 cdrom mount /dev/cdrom /mnt repo: /etc/yum.repos.d/ [repoID] baseurl= http:// file:// ftp:// # gpgchkeck= 有1和0两个选择,分别代表是否是否进行gpg校验,如果没有这一项,默认是检查的。 gpgcheck=1/0 # 当某个软件仓库被配置成 enabled=0 时,yum 在安装或升级软件包时不会将该仓库做为软件包提供源。使用这个选项,可以启用或禁用软件仓库。 enable=0/1 # [base]name=local failovermethod=priority baseurl=file:///mnt gpgcheck=1 enable=1
注意: 若包名中间包括空格,一定使用双引号括起来
中文显示,查看中文文档 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # yum 的 repo 变成aliyun || 本地DVDyum grouplist yum groupinstall "Chinese Support" echo $LANG en_US.UTF-8 LANG=zh_CN.UTF-8 # 增加epel的repo:http://mirrors.aliyun.com epel> >>>>helpwget centos6....... yum clean all yum makecache yum search man-pages yum install man man-pages man-pages-zh-CN 【【【【 man bash 】】】】
文本流
变量 引用&命令替换 退出状态&逻辑判断 表达式 流程控制
1 2 3 4 5 6 7 8 9 10 重定向:不是命令 程序自身都有I/O 0:标准输入 1:标准输出 2:错误输出 控制程序I/O位置 一切皆文件 /proc/$$/fd 程序是否处理I/O? 绑定顺序:从左到右
输出重定向
输出重定向
说明
1>xxx
标准输出覆盖重定向
1>>xxx
标准输出追加重定向
2>xxx
错误覆盖重定向
2>>xxx
错误追加重定向
>&或者&> xxx
向 xxx 文件添加错误和标准输出信息
注意: 重定向符号左边都不能包括空格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [root@node01 god]# ls /yy 2>error [root@node01 god]# ll total 8 -rw-r--r--. 1 root root 140 Sep 22 22:39 a -rw-r--r--. 1 root root 49 Sep 22 22:40 error [root@node01 god]# cat error ls: cannot access /yy: No such file or directory [root@node01 god]# ls /123 2>>error [root@node01 god]# cat error ls: cannot access /yy: No such file or directory ls: cannot access /123: No such file or directory [root@node01 god]# ls / /suibian 1>ls02.out 2>&1 [root@node01 god]# cat ls02.out ls: cannot access /suibian: No such file or directory /: abc bin # ... 省略[root@node01 god]# ls / /suibian >& ls01.out [root@node01 god]# cat ls01.out ls: cannot access /suibian: No such file or directory /: abc bin boot # ... 省略
注意: 若一条命令中既包括错误输出,也包括正确输出,则先输出错误输出
输入重定向
输入重定向
说明
<<<
从字符串中读取输入
<<E
从键盘中读取输入,E表示结束符
<
从文件中读取输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@node01 god]# read aaa <<<"HelloWord" [root@node01 god]# echo $aaa HelloWord [root@node01 god]# read aaa<<GG > ljasf> ajlsdfj;la> ;ajdfkl> GG #跟 GG 一样,表示输入退出[root@node01 god]# echo $aaa ljasf # input.sh 脚本cat <<AABB print error info AABB echo "you know me .." # 执行source input.sh [root@node01 god]# cat 0< /etc/in init/ init.d/ inittab inputrc [root@node01 god]# cat 0< /etc/inittab # inittab is only used by upstart for the default runlevel.# # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
全重定向 1 2 3 exec 8<> /dev/tcp/www.baidu.com/80 echo -e "GET / HTTP/1.0\n" >& 8 cat <& 8
Shell 编程 bash 1 2 3 4 5 6 7 8 9 10 11 shell bash 解释器,启动器 解释器: 用户交互输入 文本文件输入* 脚本本质: # ! /bin/bash# ! /usr/bin/python读取方式: 当前shell:source/. 新建子shell:/bin/bash file / ./file.sh 《chmod +x file.sh》
执行方式
说明
source xxx.sh
在当前 bash 中执行脚本
./xxx.sh
开启一个子 bash 执行脚本
注意:在不同 bash 中执行的结果有可能不相同,即要理清父子 bash 之间的关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [root@node01 sh]# echo $$ 1132 [root@node01 sh]# source sh01.sh abc boot etc lib lost+found mnt proc sbin share sys usr bin dev home lib64 media opt root selinux srv tmp var Hello World 1132 init─┬─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─master─┬─pickup │ └─qmgr ├─6*[mingetty] ├─rsyslogd───3*[{rsyslogd}] ├─sshd───sshd───bash───pstree └─udevd───2*[udevd] [root@node01 sh]# ./sh01.sh abc boot etc lib lost+found mnt proc sbin share sys usr bin dev home lib64 media opt root selinux srv tmp var Hello World 1296 init─┬─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─master─┬─pickup │ └─qmgr ├─6*[mingetty] ├─rsyslogd───3*[{rsyslogd}] ├─sshd───sshd───bash───bash───pstree └─udevd───2*[udevd]
变量
类型
作用
本地变量
作用于当前 bash 中
局部变量
local,只作用于当前代码块
位置变量
$1,$2,,从脚本文件后,读取参数
特殊变量
$#: 位置参数个数$*: 参数列表,双引号引用为一个字符串$@: 参数列表,双引号引用为单独的字符串$$:当前 shell 的 PID:接收者$BASHPID:真实 管道 * $?:上一个命令退出状态 - 0 成功 -other: 失败
环境变量
- export 定义变量 - 导出到子 shell - fork() Copy On Write 时间复杂度 O(1) 适用用于函数 unset: 取消变量 set: 查看shell 的变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 [root@node01 sh]# num=1 [root@node01 sh]# myfunc(){ > echo $num> echo HelloWorld> }[root@node01 sh]# myfunc 1 HelloWorld # 本地变量 local[root@node01 sh]# myfunc(){ > local fun=1> echo $fun> echo ok> }[root@node01 sh]# myfunc 1 ok [root@node01 sh]# echo $fun # -------------------------------# 位置参数[root@node01 sh]# cat sh02.sh echo $1 echo $2 [root@node01 sh]# vi sh02.sh [root@node01 sh]# source sh02.sh 1 2 1 2 # 特殊参数[root@node01 sh]# cat sh02.sh echo $1 echo $2 echo ${11} echo "---------" echo {'position parameters:'}$# echo $@ [root@node01 sh]# source sh02.sh a b c d e f j h k m n o a b n --------- {position parameters:}12 a b c d e f j h k m n o # 查看上一个命令的执行状态[root@node01 sh]# ls / abc bin boot dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux share srv sys tmp usr var [root@node01 sh]# echo $? 0 [root@node01 sh]# ls /asf ls: cannot access /asf: No such file or directory [root@node01 sh]# echo $? 2 # 数组使用[root@node01 sh]# arr=(1 2 3) [root@node01 sh]# echo $arr[1] 1[1] [root@node01 sh]# echo ${arr[1]} 2 [root@node01 sh]# echo ${arr[0]} 1 [root@node01 sh]# echo ${arr[2]} 3 # 变量与其他字符串的拼接,需要使用花括号 {},标识为变量[root@node01 sh]# num=1 [root@node01 sh]# echo $num1231 [root@node01 sh]# echo ${num}111 1111 # 管道--管道两边分为在两个子 bash 中, 子 bash 可以使用父 bash 中的引用[root@node01 sh]# dd=1 [root@node01 sh]# dd=10 | echo $dd 1 # export 导入不共享[root@node01 sh]# cat sh04.sh echo $k echo "-------------" sleep 10 echo $k [root@node01 sh]# export k=5 [root@node01 sh]# ./sh04.sh & # $ 表示在后台运行 [1] 1729 [root@node01 sh]# 5 ------------- ^C [root@node01 sh]# k=8 [root@node01 sh]# 5 ^C [1]+ Done ./sh04.sh
注意:
数组元素之间通过空格分隔,使用逗号分号,bash 会把数组整体当做字符串使用
export 导出非共享引用
双引号:弱引用,参数扩展 单引号:强引用,不可嵌套 花括号扩展不能被引用 命令执行前删除引用
1 2 3 4 5 6 7 8 [root@node01 sh]# kk=12 [root@node01 sh]# echo "$kk" 12 [root@node01 sh]# echo '$kk' $ kk# 花括号扩展不能被引用[root@node01 b]# cp "/etc/{passwd,inittab}" ./ cp: cannot stat `/etc/{passwd,inittab}': No such file or directory
命令替换 1 2 3 反引号:`ls -l /` $ (ls -l /)可以嵌套
1 2 3 4 5 6 7 8 9 10 [root@node01 sh]# echo "`echo 123`" 123 [root@node01 sh]# abc=$(echo $(echo "sxt")) [root@node01 sh]# echo $abc sxt [root@node01 sh]# abc=$(ls -l /) [root@node01 sh]# echo $abc total 98 drwxrw-r-x. 3 root root 4096 Sep 22 13:53 abc dr-xr-xr-x. 2 root root 4096 Sep 22 21:34 bin dr-xr-xr-x. 5 root root 1024 Sep 21 19:29 boot drwxr-xr-x. 18 root root 3680 Sep 22 21:45 dev drwxr-xr-x. 76 root root 4096 Sep 22 21:45 etc drwxr-xr-x. 4 root root 4096 Sep 22 13:04 home dr-xr-xr-x. 8 root root 4096 Sep 22 14:16 lib dr-xr-xr-x. 10 root root 12288 Sep 22 21:34 lib64 drwx------. 2 root root 16384 Sep 21 19:28 lost+found drwxr-xr-x. 2 root root 4096 Sep 23 2011 media drwxr-xr-x. 2 root root 4096 Sep 23 2011 mnt drwxr-xr-x. 2 root root 4096 Sep 23 2011 opt dr-xr-xr-x. 87 root root 0 Sep 22 21:45 proc dr-xr-x---. 5 root root 4096 Sep 23 03:26 root dr-xr-xr-x. 2 root root 12288 Sep 22 17:58 sbin drwxr-xr-x. 7 root root 0 Sep 22 21:45 selinux drwxrwx---. 2 root share 4096 Sep 22 13:51 share drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv drwxr-xr-x. 13 root root 0 Sep 22 21:45 sys drwxrwxrwt. 3 root root 4096 Sep 23 02:02 tmp drwxr-xr-x. 14 root root 4096 Sep 22 17:50 usr drwxr-xr-x. 17 root root 4096 Sep 21 19:28 var
逻辑判断* 1 2 3 4 5 退出状态 echo $? 逻辑判断 command1 && command2 command1 || command2
表达式 算术表达式 1 2 3 4 5 6 7 8 9 10 let 算术运算表达式 let C=$A+$B $ [算术表达式]C =$[$A+$B] $ ((算术表达式))C=$(($A+$B)) expr 算术表达式 注意:表达式中各操作数及运算符之间要有空格。而且要使用命令引用 C=`expr $A + $B` help let
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@node01 sh]# a=1 [root@node01 sh]# b=2 [root@node01 sh]# let c=$a+$b [root@node01 sh]# echo $c 3 [root@node01 sh]# c=3 [root@node01 sh]# d=4 [root@node01 sh]# e=$(($c+$d)) [root@node01 sh]# echo $e 7 [root@node01 sh]# j=1 [root@node01 sh]# k=2 [root@node01 sh]# c=$((j+k)) [root@node01 sh]# echo $c 3 [root@node01 sh]# echo $a 2 [root@node01 sh]# ((a++)) [root@node01 sh]# echo $a 3
条件表达式 1 2 3 4 [ expression ] test expression [[ expression ]] help test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@node01 sh]# test -a /etc/adf [root@node01 sh]# echo $? 1 [root@node01 sh]# test -a /etc/password [root@node01 sh]# echo $? 1 [root@node01 sh]# [ $a -gt $b ] [root@node01 sh]# echo $? 0 [root@node01 sh]# [3 -gt 2] -bash: [3: command not found [root@node01 sh]# [ 3 -gt 2 ] [root@node01 sh]# echo $? 0
注意: 靠近 [] ,需要有空格间隔
添加用户脚本 1 2 3 4 5 6 7 8 9 10 11 12 # 添加用户# 用户密码同用户名# 静默运行脚本# 避免捕获用户接口# 程序自定义输出# ! /bin/bash[ ! $# -eq 1 ] && echo "args error ! " && exit 3 id $1 >&/dev/null && echo "user exits" && exit 4 useradd $1 >& /dev/null && echo $1 | passwd --stdin $1 >& /dev/null && echo "useradd user success!" && exit 0 echo "don't know, user add error!"
流程控制 if 1 2 3 4 5 6 7 8 [test06@node01 sh]$ if [ 3 -gt 1 ]; then echo ok; fi ok [test06@node01 sh]$ a=1 [test06@node01 sh]$ b=2 [test06@node01 sh]$ if [ $b -lt $a ];then echo ok;elif [ $b -gt $a ];then echo ojbk;fi ojbk [test06@node01 sh]$ if [ $b -lt $a ];then echo lt;else echo gt;fi gt
while 1 2 3 4 5 6 7 8 9 10 11 [test06@node01 sh]$ while ls /;do echo ok;break;done abc boot etc lib lost+found mnt proc sbin share sys usr bin dev home lib64 media opt root selinux srv tmp var ok [test06@node01 sh]$ a=1 [test06@node01 sh]$ while [ $a -le 5 ];do echo $a;((a++));done 1 2 3 4 5
for 1 2 3 4 5 6 7 8 9 10 11 [test06@node01 sh]$ for ((ab=1;ab<5;ab++));do echo ab=$ab;done ab=1 ab=2 ab=3 ab=4 [test06@node01 sh]$ for i in 1 2 3 4 5;do echo $i;done 1 2 3 4 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 用户给定路径# 输出文件大小最大的文件# 递归子目录# ! /bin/basholdIFS=$IFS IFS=$'\n' for i in `du -a $1 | sort -nr`;do filename=`echo $i | awk '{print $2}'` if [ -f $filename ];then echo $filename break; fi done IFS=$oldIFS
注意: 变量的赋值等于号前面两边不能有空格,bash 对空格敏感
循环遍历文件输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 # ! /bin/basholdIFS=$IFS IFS=$'\n' num=0 for i in `cat file.txt`;do echo $i ((num++)); done # ! /bin/basholdIFS=$IFS IFS=$'\n' num=0 for i in `cat file.txt`;do echo $i ((num++)); done echo "num:$num" IFS=$oldIFS echo "---------------" lines=`cat file.txt | wc -l` for ((i=1;i<=lines;i++));do echo `head -$i file.txt | tail -1` ((line++)) done echo "line:$line" echo "---------------" num=0 while read line ;do echo $line ((num++ )) done < file.txt echo "num:$num" echo "-----------------" num=0 cat file.txt | while read line;do echo $line ((num++)) done echo "num:$num"