UNIX
汇编
BSD(FreeBSD)
DOS
施乐 GUI
1969年,美国贝尔实验室的肯-汤普森在DEC PDP-7机器上开发出了UNIX系统。
1971年,肯-汤普森的同事丹尼斯-里奇发明了C语言;1973年,UNIX系统的绝大部
分源代码用C语言重写,这为提高UNIX系统的可移植性打下基础。
Linux分为两个派系
RedHat Debian
CentOS Ubuntu
CentOS6.4
一切都是文件
常用命令
cd / 跳转到根目录
cd ~ 跳转到当前用户的家目录
cd .. 跳转到上一级目录
cd - 返回跳转来的那个目录
ls list dir
ls -a 显示所有文件
. 当前目录
.. 上一级目录
ls -l 显示此文件夹下的所有文件的详细信息
ls -d 显示目录的信息
ls -ld 显示这个目录的详细信息
ls -ld /opt/etc
ls -h human readable
$ ls -l /opt/etc/fstab
-rw-r--r--. 1 root root 843 Sep 17 19:44 /opt/etc/fstab
第一个字符
-: 二进制文件
d: 文件夹
l: link 软链接
c: character
第2~10个字符
rw- :User
r-- :Group
r-- :Other
r: read
w: write
x: execute
1:硬链接数
root:文件所属的用户
root:文件所属的组
843:文件的大小
Sep 17 19:44 最后一次修改时间
/opt/etc/fstab 文件名称
mkdir 创建文件夹
mkdir -p 创建多级文件夹
touch 文件名称 ----创建文件
删除文件或文件夹
rm 文件名 #删除一个文件
rmdir 文件夹名称 #必须文件夹中为空
常用:rm -r (recusive)
rm -f (force)
rm -rf
mv (move) 剪切+重命名
mv 源文件 目标文件
查看文件
cat 文件名
more 文件名
head 文件名 #默认查看前10行
head -行数 文件名 #查看前几行
tail 文件名 #默认查看最后10行
tail -行数 文件名 #看最后几行
tail -f 文件名 #实时查看最后几行
软链接
ln -s 源文件 目标文件(在当前文件夹新建的文件或文件夹)
软连接好比一个快捷方式,更改源文件或者软连接任意一个,另一个都会随之改变。
删除源文件后,软连接仍存在但内容为空,使用ll命令查看其指向文件闪烁,表示已删除。
硬链接
ln 源文件 目标文件
软链接相当于快捷方式
硬链接就是产生一个完全相同的文件,彼此同步更新,
删除一个不影响另一个
软链接拥有不同的inode(身份证号)
硬链接拥有相同的inode
vi/vim
命令模式--a i o --> 插入模式 - ESC -> 命令模式
命令模式-- : --> 编辑模式
进入插入模式
i:insert 在字符之前插入
a:append 在字符之后插入
o: 在字符的下一行插入
定位
j 向下移动
k 向上移动
l 向右移动
h 向左移动
gg 到第一行
G 到最后一行
:n 到第n行
设置行号 :set nu
取消行号 :set nonu
dd 删除(剪切)当前行
ndd 删除(剪切)下面n行
yy 复制当前行
nyy 复制下面n行
x 删除一个字符
nx 删除光标后的n个字符
r 替换当前光标出的字符
p 粘贴
u 撤销上一步操作
另存为
:w 保存修改
:w new_filename (更新文件名称)
:wq 保存修改并推出
ZZ 保存修改并推出
:q! 不保存就退出
:wq! 对于文件所有者可以忽略只读属性
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
用户管理
用户分成3类
1.root UID=0
2.伪用户 UID=[1,499]
3.普通用户 UID=[500,60000]
useradd 用户名 #创建一个普通用户
在/etc/passwd下看到user的配置信息
account:password:UID:GID:GECOS:directory:shell
用户名:密码:UID:GID:注释性描述:目录:shell
设置密码
passwd 用户名
查看/etc/shadow
tom:$1$NasXshaj$xAeCENIFwzcTer0UVmuLQ0:17063:0:99999:7:::
用户名
加密后的密码(可更改为 !! 将密码置为空)
最后一次修改的天数:17063
设置密码的时间间隔:两次修改密码之间的最小天数
普遍是0,如设置为3,意味着至少要3天以上才能再次修改密码
密码保留的最大天数:99999
警告时间:从密码开始失效到警告的天数
帐号闲置时间
失效时间
标识
删除用户
userdel 用户名
在用户被删除之后,/etc/passwd和/etc/shadow文件中的配置信息被删除了
组
在创建用户之后,系统会默认创建一个与用户名同名的组,
且GID和UID相同
在/etc/group文件中进行查看
组密码设置的配置文件: /etc/gshadow
id 命令:查看当前用户
对文件进行操作时全县问题的处理 修改权限 和 修改文件所属用户
权限
语法:
方式一:加减号修改权限
chmod mode(u+w) 文件名
修改文件权限
mode:
rw-r--rw-
User u+r u+w u+x u-r u-w u-x
Group g+r g+w g+x g-r g-w g-x
Other o+r o+w o+x o-r o-w o-x
对于文件:
r cat more tail
w vi vim >> >
x ./
对于文件夹:
r ls
w touch rm
x cd
方式二:数字方式修改权限
r---4 2^2
w---2 2^1
x---1 2^0
rwx 7
rw- 6
r-x 5
-wx 3
r-- 4
-w- 2
--x 1
--- 0
一次性表示的数字
rwxrwxrwx 777
rwxrw-rw- 766
rwxr-xr-x 755
rw-r--r-- 644
eg:chmod 755 文件名
所属用户的修改:
chown
修改文件(文件夹)的所属用户和所属组
chown [-R] 所属用户[:所属组] 文件名(文件夹名)
-R recursive 递归修改文件夹内所有文件的所属用户和所属组
chgrp
修改文件(文件夹)的所属组
语法 :
chgrp [-R] 所属组 文件名(文件夹名)
-R recursive
umask
# umask
0022
0 特殊位
022 掩码值
777-022=755(文件的默认权限)
rwxr-xr-x
-x
rw-r--r--
linux操作系统在新建的所有文件都不带有执行权限,保证安全性
# umask -S
u=rwx,g=rx,o=rx
登录信息修改文件
/etc/issue 前
/etc/motd 后
登陆信息显示数据 : /etc/issue (无论登录成功与否都会显示)
登陆信息显示数据 : /etc/motd(只有登录成功了才能显示)
还记得在我们登陆终端机的时候,会有几行提示的字符串.
那这些设置在哪里呢?? 嘎嘎, 是在/etc/issue里面.
这些都是我们可以自己设置的哟.
我们可以使用Vi来打开.
一般的设置都是只有:Kernel \r on an \m
咿呀?这些\r \m是代表啥捏?
以下呢就是解释咯!
\d 本地端时间的日期
\l 显示第几个终端机的接口;
\m 显示硬件的等级(i386/i486/i586/i686....)
\n 显示主机的网络名称
\o 显示 domain name
\r 操作系统的版本 (类似 uname-r)
\t 显示本地端时间的时间
\s 操作系统的名称
\v 操作系统的版本
嘿嘿.这个就是相关的意思咯
比如,我进行想设置一下本地端的时间
我们可以先vi打开/etc/issue
然后按"I"编辑. 然后写入 date: \d
然后 wq保存.
之后呢大家就可以exit退出.重新登陆一下.看看我们设置的有没有成功
那现在我们又有一个需求.
比如说,我们的服务器要在2010年8月31日10点开始维护.需要通知给其他的登陆者.
这个时候我们需要怎么办呢? 嘿嘿.这里就用到了 /etc/motd了.
只要把你想说的通知写在这里,那么当别的用户登陆的时候都会提示他.
呵呵,看看我自己设置的吧!
init 3 进入命令行终端模式;
init 5 退出终端进入图形化界面!
grep: 搜索文件内容中的某一行或某几行
grep 查询内容 文件名
1.作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2.格式
grep [options]
3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。
4.grep命令使用简单实例
$ grep ‘test’ d*
显示所有以d开头的文件中包含 test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep ‘[a-z]\{5\}’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep ‘w\(es\)t.*\1′ aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。
5.grep命令使用复杂实例
假设您正在’/usr/src/Linux/Doc’目录下搜索带字符 串’magic’的文件:
$ grep magic /usr/src/Linux/Doc/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?
其中文件’sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。
默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:
grep: sound: Is a directory
这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:
明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip
如果有很多 输出时,您可以通过管道将其转到’less’上阅读:
$ grep magic /usr/src/Linux/Documentation/* | less
这样,您就可以更方便地阅读。
有一点要注意,您必需提供一个文件过滤方式(搜索全部文件的话用 *)。如果您忘了,’grep’会一直等着,直到该程序被中断。如果您遇到了这样的情况,按 <CTRL c> ,然后再试。
下面还有一些有意思的命令行参数:
grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
grep -n pattern files 即可显示行号信息
grep -c pattern files 即可查找总行数
这里还有些用于搜索的特殊符号:
\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 会匹配 ‘Batman’、’manic’、’man’等,
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,
grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。
‘^’:指匹配的字符串在行首,
‘$’:指匹配的字符串在行 尾,
ps -ef 查看所有进程
| 管道:
命令1 | 命令2 | 命令3
第一个命令的输出就会作为第二个命令的输入
例:ls -l /etc/ | grep sudoers 表示在 etc 中的所有文件详细信息中筛选出带有sudoers的文件详细列出
echo "内容" >> 文件名
> 覆盖
>> 追加 (使用时注意 >> 符号后一定要有空格,否则效果将是覆盖)
和管道一样同样是两个命令叠加的效果 ls -l /etc > channel 是将命令1的结果放入到已有channel文件夹里
man
可以查看命令的帮助信息 man 1 命令 1可省略即为 man 命令
可以查看配置文件的帮助信息 man 5 还有 man 1--9
find 查找文件
根据文件名查找
find 目录 -name *文件名*
根据文件大小查找
find 目录 -size +1M/-1M
大于1M或小于1M,没有正负号就是等于,一般不可能使用这个
根据所属用户查找
find /opt/ -user 用户名
根据时间查找
按天查找
atime access
ctime change(所有者、所属组、权限..任何一个被修改)属性被修改过
mtime modify 内容被修改过
find /opt/ -mtime -10
按分钟查找
amin
cmin
mmin
find /opt/ -mmin -10
负号表示少于
正好表示大于
磁盘管理
sda
sda1 sda2 sda3
cylinder 柱面
挂载新硬盘分四个步骤:
一、添加分区
fdisk /dev/sdb
n add
p print
l list
w write 保存之后可以在/dev/目录下找到相应分区
二、格式化
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
mkfs.ext4 /dev/sdb3
文件系统
ext2 ext3 ext4
三、挂载
mount 分区 挂载点
mount /dev/sdb1 /mnt/sdb1
四、配置文件/etc/fstab
/dev/sdb3 /mnt/sdb3 ext4 defaults 1(检测) 2(后检测)
分区名 挂载点 文件系统 默认 是否检测 检测顺序
sudo 命令
普通用户使用sudo命令来完成root用户才能执行的命令权限
visudo 进入sudo文件进行编辑
visudo 完成 /etc/sudoers 配置文件修复
或者 vi /etc/sudoers 进入配置文件进行编辑
增加 nicole ALL=(ALL) ALL
压缩 解压缩
gzip gunzip
tar tar
zip unzip
gzip:
1.不能打包
2.不能对目录压缩
3.压缩之后源文件没有了
**tar
压缩 tar -zcvf xxx.tar.gz 源文件...
解压缩 tar -zxvf xxx.tar.gz -C 指定目录
zip
zip 压缩后的文件名 需要压缩的文件
unzip 压缩文件名
1.保留源文件
2.可以对目录压缩 zip -r 压缩后的文件名 目录
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
用户管理
useradd 用户名
/etc/passwd
用户分成3类
1.root用户 UID=0
2.伪用户 UID=1~499
3.普通用户 UID=500~60000
userdel 用户名
passwd 用户名——>
/etc/shadow
!!
groupadd 添加一个组
groupdel 删除一个组
/etc/gshadow
权限
文件的权限
umask 查看权限的掩码值 777-掩码值
umask -S
linux中,默认没有执行x权限
chmod
加减号修改权限
u+r/w/x u-r/w/x
g+r/w/x g-r/w/x
o+r/w/x o-r/w/x
数字修改权限
r 4
w 2
x 1
chmod 755 文件名
对文件的权限进行修改
r 读 cat more tail head
w 写 vi vim
x 执行 sh ./
对目录的权限进行修改
r 查看 ls
w 修改 touch rm
x 进入 cd
sudo
编辑配置文件
visudo ---> /etc/sudoers
find
按照文件名查找
find 目录 -name *xx*
按照文件大小查找
find 目录 -size +10M
按照时间查找
a access
c change
m modify
按天查找 atime ctime mtime
按分钟查找 amin cmin mmin
find 目录 -mtime -2
按照文件类型查找
find 目录 -type f(文件) d(目录)
连接符 -a
find 目录 -name xxx -a -type f
磁盘挂载
查看分区 df -h
分区
fdisk /dev/sdb
m for help
n add a partition
extended
primary partition(1-4)
3P+1E(N个逻辑分区)
w write ---> /dev/sdb1 /dev/sdb2 /dev/sdb3
格式化
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
mkfs.ext4 /dev/sdb3
挂载
mount /dev/sdb1 /mnt/sdb1
配置文件
vi /etc/fstab
/dev/sdb3 /mnt/sdb3 ext4 defaults 1(检测) 2(后检测)
分区名 挂载点 文件系统 默认 是否检测 检测顺序
压缩 解压缩
gzip gunzip
不能打包
源文件不保留
不能压缩目录
tar tar
都可以
zip unzip
源文件保留
可以压缩目录 -r
tar 打包+压缩
修改hosts
vi /etc/hosts
IP hostname
修改hostname
vi /etc/sysconfig/network
使生效
hostname 主机名
查看主机名
hostname
软件包管理
sudo-1.7.2p1-5.el5.i386.rpm
软件名(sudo),版本号(1.7.2pl),发行号(5.el5),和硬件平台(i386)。
rpm
查询安装的软件
rpm -qa
rpm -ql 软件名 #查找安装的软件的具体位置
安装软件
rpm -ivh 软件的全名
卸载软件
rpm -e 软件名 --nodeps no dependences
yum
安装软件
yum -y install 软件名
卸载软件
yum -y remove 软件名
查询
yum list
yum list updates 列出所有可更新的
yum list extras 列出所有已安装但仓库中没有的
shell
一般以.sh结尾的文件
#!/bin/sh #!/bin/bash
#开头的部分都是注释,没有多行注释
shell脚本的执行
方式一:
sh xxx.sh
方式二:
./xxx.sh #此时需要一个x权限
变量
环境变量 set查看
位置变量
9种 $1~$9
用于接收对应位置的参数
单引号内的会原样输出
双引号内的会将变量的值输出
字符串拼接的时候没有+号
echo语句后面可以没有引号
预定义变量
$0
$!
$$
$#
$?
自定义变量
区分大小写
等号两边不能有空格
调用变量的时候需要加上$符号
变量的赋值
TIME=100 #给TIME附一个字符串
TIME2=$TIME #将一个变量赋给另一个变量
TIME3=`date`#将一个命令赋给一个变量
shell的运算
$(( 3 + 5 ))
$[ 3 + 5 ]
`expr 3 + 5 `
`expr 3 \* 5` #注意此时需要转译符号
test 测试表达式
if test $1 -gt $2
[]表达式
if [ $1 -gt $2 ]
比较两个数值
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
-eq 等于
-ne 不等于
比较两个字符串
= if [ $a = $b ] true
!= if [ $a != $b ] true
-z if [ -z $a ] a的长度为0返回true
-n if [ -n $a ] a的长度不为0返回true
str if [ $a ] a不为null返回true
测试文件
-d 如果目录存在则为true
-f 如果文件存在则为true
-r 可读则为true
-w 可写则为true
-x 可执行则为true
for循环
语法一:
for 变量 in 值1 值2...
do
command..
done
语法二:
for((i=0;i<10;i++))
do
command..
done
for MONTH in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
do
echo $MONTH
done
for((i=0;i<10;i++))
do
echo $i
done
while循环
# !/bin/sh
echo "input a num:"
read num
while [ $num -le 10 ]
do
echo "num is : $num"
#num=`expr $num + 1`
let num++
done
if语句
语法
if []
then
command
elif []
then
command
...
else
command
fi
#===
read score
if [ $score -ge 90 ]
then
echo "level A"
elif [ $score -ge 80 ] && [ $score -lt 90 ]
then
echo "level B"
else
echo "level E"
fi
case..esac 语句
# !/bin/sh
echo "input from : one two three"
read input
case $input in
one)
echo "your input is one"
;;
two)
echo "your input is two"
;;
three)
echo "your input is three"
;;
*)
echo "your input is $input"
esac
date
[MMDDhhmm[[CC]YY][.ss]]
092015502016
date -s 2016-10-10
date -s 10:10:10
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
软件包的安装
rpm
sudo-1.7.2p1-5.el5.i386.rpm
软件名 版本号 发行号 硬件平台
rpm -ivh sudo-1.7.2p1-5.el5.i386.rpm
rpm -e sudo
rpm -qa
rpm -ql 软件
依赖 --nodeps
yum
查询 yum list
yum list updates
yum list extras
安装 yum install 软件名
卸载 yum remove 软件名
解决了依赖问题
yum源的位置
/etc/yum.repos.d/CentOS-Base.repo
shell
结构
xxx.sh
#!/bin/sh
#!/bin/bash
注释内容:#开头
变量
环境变量 set
位置变量 $1~$9
预定义变量 $0
$*
$$
自定义变量
等号两边没有空格
区分大小写
调用的时候用$
变量的赋值
TIME=100
TIME2=$TIME
TIME3=`date`
test测试表达式
[ ]
对于数字的比较
-gt
-ge
-lt
-le
-eq
-ne
对于字符串的比较
=
!=
-z 长度为0则为true
-n
str 不为null则为true [ $str ]
对于文件的比较
-d
-f
-r
-w
-x
表达式
(( exp ))
[ exp ]
`expr 3 + 5`
必须有空格
其中的*必须转译 \*
流程控制语句
if [ ]
then
command...
elif [ ]
then
command...
...
else
command...
fi
for var in ...
do
command..
done
for((i=0;i<10;i++))
do
command...
done
while []
do
command
done
case esac
case var in
condition)
command
;;
condition2)
command
;;
*)
command
esac
at
一次性的计划任务
at 时间 #进入交互页面
command
ctrl+d结束
at -l
atq
都是用来查询当前计划任务的,当计划任务执行完成之后
就会删除掉计划任务
at -d 删除计划任务
at -f 脚本文件 时间 #计划执行一个shell脚本
绝对计时方法
at 09:30 today
at 15:30
at 4:30pm
at 5:30pm 1/20/16 #推荐使用
相对计时法
now + 10 minutes
now + 10 hours
now + 2 days
crontab -e #编辑crontab文件
crontab -l #查看计划任务
crontab -r #删除计划任务
cat /etc/crontab配置文件
* minutes 0-59
* hours 0-23
* day 1-31
* month 1-12
* date 0-6
command
每周三下午三点半执行 ls -l
30 15 * * 3 ls -l
每个月的第二天上午9点钟,没两分钟都执行一次脚本
*/2 9 2 * * command
周一到周五每天凌晨2点到4点,每2分钟都要执行一次记录日志的工作
*/2 2-4 * * 1-5 command
每周一、三、五每天凌晨2点-6点,执行某任务
0,2,4,6,8 2-6 * * 1,3,5 command
防火墙
查看状态
service iptables status
关闭
service iptables stop
开启
service iptables start
重启不打开
chkconfig iptables off
selinux
/usr/sbin/sestatus 查看状态
/etc/selinux/config 修改配置文件