澳门在线威尼斯官方 > 电脑操作 > 适合所有菜鸟学习和老手回顾,很实用的Linux

原标题:适合所有菜鸟学习和老手回顾,很实用的Linux

浏览次数:152 时间:2020-01-01

1 文件{
ls -rtl # 按时间倒叙列出所有目录和文件 ll -rt
touch file # 创建空白文件
rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制)
dos2unix # windows文本转linux文本
unix2dos # linux文本转windows文本
enca filename # 查看编码 安装 yum install -y enca
md5sum # 查看md5值
ln 源文件 目标文件 # 硬链接
ln -s 源文件 目标文件 # 符号连接
readlink -f /data # 查看连接真实目录
cat file | nl |less # 查看上下翻页且显示行号 q退出
head # 查看文件开头内容
head -c 10m # 截取文件中10M内容
split -C 10M # 将文件切割大小为10M -C按行
tail -f file # 查看结尾 监视日志文件
tail -F file # 监视日志并重试, 针对文件被mv的情况可以持续读取(实时查看文件,可用于查看服务日志文件,方便排错)
file # 检查文件类型
umask # 更改默认权限
uniq # 删除重复的行
uniq -c # 重复的行出现次数
uniq -u # 只显示不重复行
paste a b # 将两个文件合并用tab键分隔开
paste -d'+' a b # 将两个文件合并指定'+'符号隔开
paste -s a # 将多行数据合并到一行用tab键隔开
chattr +i /etc/passwd # 不得任意改变文件或目录 -i去掉锁 -R递归
more # 向下分面器
locate 字符串 # 搜索  (需要先‘updatedb’更新数据)
wc -l file # 查看行数
cp filename{,.bak} # 快速备份一个文件
cp a b # 拷贝不提示 既不使用别名 cp -i
rev # 将行中的字符逆序排列
comm -12 2 3 # 行和行比较匹配
iconv -f gbk -t utf8 原.txt > 新.txt # 转换编码
rename 原模式 目标模式 文件 # 重命名 可正则
watch -d -n 1 'df; ls -FlAt /path' # 实时某个目录下查看最新改动过的文件
cp -v /dev/dvd /rhel4.6.iso9660 # 制作镜像
diff suzu.c suzu2.c > sz.patch # 制作补丁
patch suzu.c < sz.patch # 安装补丁

作为Linux运维,需要了解Linux操作系统的基本使用和管理知识,下面脚本之家小编给大家介绍下Linux运维需要掌握的命令,想成为Linux运维的朋友可以来学习一下。

sort排序{

1 文件管理2 软件管理3 系统管理
4 服务管理5 网络管理6 磁盘管理

-t # 指定排序时所用的栏位分隔字符
-n # 依照数值的大小排序
-r # 以相反的顺序来排序
-f # 排序时,将小写字母视为大写字母
-d # 排序时,处理英文字母、数字及空格字符外,忽略其他的字符
-c # 检查文件是否已经按照顺序排序
-b # 忽略每行前面开始处的空格字符
-M # 前面3个字母依照月份的缩写进行排序
-k # 指定域
-m # 将几个排序好的文件进行合并
-T # 指定临时文件目录,默认在/tmp
+<起始栏位>-<结束栏位> # 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
-o # 将排序后的结果存入指定的文

7 用户管理8 脚本相关9 服务配置


sort -n # 按数字排序
sort -nr # 按数字倒叙
sort -u # 过滤重复行
sort -m a.txt c.txt # 将两个文件内容整合到一起
sort -n -t' ' -k 2 -k 3 a.txt # 第二域相同,将从第三域进行升降处理
sort -n -t':' -k 3r a.txt # 以:为分割域的第三域进行倒叙排列
sort -k 1.3 a.txt # 从第三个字母起进行排序
sort -t" " -k 2n -u a.txt # 以第二域进行排序,如果遇到重复的,就删除

1 文件管理

创建空白文件
touch
不提示删除非空目录
rm -rf 目录名
(-r:递归删除-f 强制)
##################################
恢复rm 删除的文件(ext3)
查看磁盘分区格式
df -T
卸载挂载
umount /data/
ext3grep /dev/sdb1 --ls --inode 2
记录信息继续查找目录下文件inode 信息
ext3grep /dev/sdb1 --ls --inode 131081 # 此处是inode
记录下inode 信息开始恢复目录
ext3grep /dev/sdb1 --restore-inode 49153
##################################
windows 文本转linux 文本
dos2unix
linux 文本转windows 文本
unix2dos
转换编码
iconv -f gbk -t utf8 原.txt > 新.txt
查看md5 值
md5sum
硬链接
ln
符号连接
ln -s
查看上下翻页且显示行号
cat ? | nl |less
q 退出
结束状态
ctrl+z
查看文件开头内容
head
查看文件结尾内容
tail -f # 监视日志文件
检查文件类型
file
重命名
rename
rename source_pattern target_pattern source_files
更改默认权限
umask
按数字排序
sort -n
按数字倒叙
sort -nr
过滤重复行
sort -u
删除重复的行
uniq
重复的行出现次数
uniq -c
只显示不重复行
uniq -u
将两个文件合并用tab 键分隔开
paste a b
将两个文件合并指定'+'符号隔开
paste -d'+' a b
将多行数据合并到一行用tab 键隔开
paste -s a
设置隐藏属性
chattr [+-=] [ASacdistu] 文件或目录
向下分面器
more
搜索
locate 字符串
查看行数
wc -l
实时某个目录下查看最新改动过的文件
watch -d -n 1 'df; ls -FlAt /path'
快速备份一个文件
cp filename{,.bak}
##################################
配置编辑器
gconf-editor
vi 配置文件
vi /etc/vimrc
编辑文件
vim
打开行号
:set nu
取消行号
:set nonu
跳转到200
200G
取消高亮
:nohl
设置自动缩进
:set autoindent
查看文本格式
set ff
改为unix 格式
set binary
向前翻页
ctrl+ U
向后翻页
ctrl+ D
全部替换
g/字符1/s//字符2/g
%s/字符1/字符2/g
# 普通用户打开文档不能保存
# tee 是一个把stdin 保存到文件的小工具,而%,是vim 当中一个只读寄存器的名字,总保存着当
前编辑文件的文件路径
:w !sudo tee %
##################################
按文件名查找
find /etc -name http
查找某一类型文件
find . -type f
按照文件权限查找
find / -perm
按照文件属主查找
find / -user
按照文件所属的组来查找文件
find / -group
文件使用时间在N 天以内
find / -atime -n
文件使用时间在N 天以前
find / -atime +n
文件内容改变时间在N 天以内
find / -mtime -n
文件内容改变时间在N 天以前
find / -mtime +n
文件状态改变时间在N 天前
find / -ctime +n
文件状态改变时间在N 天内
find / -ctime -n
# linux 文件无创建时间
# Access 使用时间
# Modify 内容修改时间
# Change 状态改变时间(权限、属主)
查找文件长度大于1M 字节的文件
find / -size +1000000c -print
按名字查找文件传递给-exec 后命令
find /etc -name "passwd*" -exec grep "xuesong" {} ;
查找文件名,不取路径
find . -name 't*' -exec basename {} ;

}

##################################


find查找{

2 软件管理

解包tar
tar xvf 1.tar -C 目录
打包tar
tar -cvf 1.tar *
查看tar
tar tvf 1.tar
给tar 追加文件
tar -rvf 1.tar 文件名
解包gz
tar zxvpf gz.tar.gz
打包gz
tar zcvpf gz.tar.gz
查看gz
tar ztvpf gz.tar.gz
解压bzip2
bzip2 -dv 1.tar.bz2
解压gzip 到tar
gzip -dv 1.tar.gz
压缩tar 到gz
gzip -v 1.tar
bzip2 压缩
bzip2 -v 1.tar
查看bzip2
bzcat
rpm 安装
rpm -ivh
卸载
rpm -e lynx
强制卸载
rpm -e lynx --nodeps
测试
rpm --test lynx
查看所有安装的rpm 包
rpm -qa
查找包是否安装
rpm -qa | grep http
解压zip
unzip zip.zip
压缩zip
zip zip.zip *
rar3.6 下载地址

压缩文件为rar 包
rar a rar.rar *.jpg
解压rar 包
unrar x rar.rar
7z 压缩
7z a 7z.7z *
7z 解压
7z e 7z.7z
查看字符行
zgrep 字符1.gz
打包/home, /etc ,但排除/home/dmtsai
tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
在/home 当中,比2005/06/01 新的文件才备份
tar -N "2005/06/01" -zcvf home.tar.gz /home
下载
wgetrc
文本上网
lynx
制作镜像
cp -v /dev/dvd /software/rhel4.6.iso9660
清除编译结果
make clean
源码安装
./configure --help |less
./configure --prefix=/usr/local/
make
make install
perl 程序编译
perl Makefile.PL
make
make test
make install
perl 程序编译
python file.py
编译c 程序

# linux文件无创建时间
# Access 使用时间
# Modify 内容修改时间
# Change 状态改变时间(权限、属主)
# 时间默认以24小时为单位,当前时间到向前24小时为0天,向前48-72小时为2天
# -and 且 匹配两个条件 参数可以确定时间范围 -mtime +2 -and -mtime -4
# -or 或 匹配任意一个条件

gcc -g hello.c -o hello


find /etc -name "*http*" # 按文件名查找
find . -type f # 查找某一类型文件
find / -perm # 按照文件权限查找
find / -user # 按照文件属主查找
find / -group # 按照文件所属的组来查找文件
find / -atime -n # 文件使用时间在N天以内
find / -atime +n # 文件使用时间在N天以前
find / -mtime +n # 文件内容改变时间在N天以前
find / -ctime +n # 文件状态改变时间在N天前
find / -mmin +30 # 按分钟查找内容改变
find / -size +1000000c -print # 查找文件长度大于1M字节的文件
find /etc -name "*passwd*" -exec grep "xuesong" {} ; # 按名字查找文件传递给-exec后命令
find . -name 't*' -exec basename {} ; # 查找文件名,不取路径
find . -type f -name "err*" -exec rename err ERR {} ; # 批量改名(查找err 替换为 ERR {}文件
find 路径 -name *name1* -or -name *name2* # 查找任意一个关键字

3 系统管理

终端锁屏Ctrl+S
解锁屏Ctrl+Q
PS1 环境变量控制提示显示
PS1='[u@ H w A @#]$'
开机启动模式
vi /etc/inittab
查找命令的目录
whereis
查看当前要执行的命令所在的路径
which
让部命令后台运行
命令&
将前台放入后台(暂停)
ctrl+z
查看后台运行程序
jobs
启动后台暂停进程
bg 2
调回后台进程
fg 2
后台运行不受shell 退出影响
nohup cmd &
清空整个屏幕
clear
重新初始化屏幕
reset
查询用过的命令默认1000 条
history
清楚记录命令
history -c
cat /root/.bash_history
查看登陆过的用户信息
last
last -n user
who /var/log/wtmp
列出登录系统失败的用户相关信息
lastb -a
/var/log/btmp
防火墙日志
tail -f /var/log/messages
ssh 日志
tail -f /var/log/secure
随机生成密码
mkpasswd
-l 位数-C 大小-c 小写-d 数字-s 特殊字符
mkpasswd -l 8 -C 2 -c 2 -d 4 -s 0
当前在线用户
who
w
查看当前用户名
whoami
查看登陆用户名
logname
显示月历
cal
查看服务器启动时间
uptime
设日期
date -s 20091112
设时间
date -s 18:30:50
同步时间
/usr/sbin/ntpdate stdtime.gov.hk
7 天前日期
`date -d "7 days ago" +%Y%m%d`
日期格式转换
`date +%Y-%m-%d -d '20110902'`
日期和时间
date +%Y-%m-%d_%X
查看时间
hwclock
账户影子文件
/etc/shadow
列出所有语系
locale -a
修改语言
LANG=en
修改编码
vi /etc/sysconfig/i18n
utf-8 <---> GBK
强制字符集
export LC_ALL=C
查询静态主机名
vi /etc/hosts
最大连接
/etc/security/limits.conf
grub 开机启动项添加
/etc/grub.conf
title ms-dos
rootnoverify (hd0,0)
chainloader +1
别名
alias
监测命令
watch
查看Linux 版本信息
uname -a
cat /proc/version
cat /etc/issue
lsb_release -a
查看cpu 信息
more /proc/cpuinfo
查看cpu 型号和逻辑核心数
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
cpu 运行的位数
getconf LONG_BIT
物理cpu 个数
cat /proc/cpuinfo | grep physical | uniq -c
结果大于0 支持64 位
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
查看cpu 是否支持虚拟化
cat /proc/cpuinfo|grep flags
pae 支持半虚拟化Intel VT 支持全虚拟化
查看内存信息
more /proc/meminfo
查看全面硬件信息
dmidecode
查看服务器型号
dmidecode | grep "Product Name"
查看软raid 信息
cat /proc/mdstat
查看硬raid 信息
cat /proc/scsi/scsi
查看硬件信息
lspci
查看是否支持raid
lspci|grep RAID
显示开机信息
dmesg
进程树
pstree
每隔一秒报告虚拟内存统计信息9 次
vmstat 1 9
把180 号进程的优先级加1
renice +1 180
终止某个PID 进程
kill -9 PID
指定三天后下午5:00 执行/bin/ls
at 5pm + 3 days /bin/ls
编辑周期任务
crontab -e
分钟小时天月星期命令或脚本
01 1-3/2 * * * 命令或脚本
直接将命令写入周期任务
echo "40 7 * * 2 /root/sh">>/var/spool/cron/root
查看自动周期性任务
crontab -l
删除自动周期性任务
crontab -r
禁止或允许用户使用周期任务
cron.deny 和cron.allow
启动自动周期性服务
service crond 启动|停止|重启|状态>
是否打开了某个端口
netstat -anlp | grep 端口号
查看监听
netstat -anlp
sudo 命令权限添加
visudo
用户别名(可用all)=NOPASSWD:命令1,命令2
wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart
UserName ALL=(ALL) ALL
制作补丁
diff suzu.c suzu2.c > sz.patch
安装补丁
patch suzu.c < sz.patch
显示打开指定文件的所有进程
lsof 文件
查看端口的进程
lsof -i :32768
显示消耗内存最多的10 个运行中的进程,以内存使用量排序.cpu +3
ps aux |grep -v USER | sort -nk +4 | tail
查看内核模块
lsmod
yum 扩展源

wget
rpm -Uvh epel-release-5-4.noarch.rpm
升级所有包版本,依赖关系,系统版本内核都升级
yum -y update
升级指定的软件包
yum -y update 软件包名
不改变软件设置更新软件,系统版本升级,内核不改变
yum -y upgrade
yum 搜索相关包
yum search mail
会改变配置文件,改变旧的依赖关系,改变系统版本
dist-upgrade
编辑启动项
/boot/grub/grub.conf
开机启动脚本顺序
/etc/profile
/etc/profile.d/*.sb
~/bash_profile
~/.bashrc

}

/etc/bashrc

top
前五行是系统整体的统计信息。
第一行是任务队列信息,同uptime 命令的执行结果。其内容如下:
01:06:48 当前时间
up 1:22 系统运行时间,格式为时:分
1 user 当前登录用户数
load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。
三个数值分别为1 分钟、5 分钟、15 分钟前到现在的平均值。
第二、三行为进程和CPU 的信息。当有多个CPU 时,这些内容可能会超过两行。内容如下:
Tasks: 29 total 进程总数
1 running 正在运行的进程数
28 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s): 0.3% us 用户空间占用CPU 百分比
1.0% sy 内核空间占用CPU 百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU 百分比
98.7% id 空闲CPU 百分比
0.0% wa 等待输入输出的CPU 时间百分比
0.0% hi
0.0% si
最后两行为内存信息。内容如下:
Mem: 191272k total 物理内存总量
173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量。
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
该数值即为这些内容已存在于内存中的交换区的大小。
相应的内存再次被换出时可不必再对交换区写入。
进程信息区
统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
序号列名含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为?
h PR 优先级
i NI nice 值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU 环境下有意义
k %CPU 上次更新到现在的CPU 时间占用百分比
l TIME 进程使用的CPU 时间总计,单位秒
m TIME+ 进程使用的CPU 时间总计,单位1/100 秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考sched.h
##################################
iptables
内建三个表:nat mangle 和filter
filter 预设规则表,有INPUT、FORWARD 和OUTPUT 三个规则链
INPUT 进入
FORWARD 转发
OUTPUT 出去
ACCEPT 将封包放行
REJECT 拦阻该封包
DROP 丢弃封包不予处理
-A 在所选择的链(INPUT 等)末添加一条或更多规则
-D 删除一条
-E 修改
-p tcp、udp、icmp 0 相当于所有all !取反
-P 设置缺省策略(与所有链都不匹配强制使用此策略)
-s IP/掩码(IP/24) 主机名、网络名和清楚的IP 地址!取反
-j 目标跳转,立即决定包的命运的专用内建目标
-i 进入的(网络)接口[名称] eth0
-o 输出接口[名称]
-m 模块
--sport 源端口
--dport 目标端口
#配置文件
vi /etc/sysconfig/iptables
#将防火墙中的规则条目清除掉
iptables -F
#注意:iptables -P INPUT ACCEPT
#导入防火墙规则
iptables-restore <规则文件
#保存防火墙设置
/etc/init.d/iptables save
#重启防火墙服务
/etc/init.d/iptables restart
#查看规则
iptables -L -n
iptables -L -n --line-numbers
#从某个规则链中删除一条规则
iptables -D INPUT --dport 80 -j DROP
iptables -D INPUT 8
#取代现行规则
iptables -R INPUT 8 -s 192.168.0.1 -j DROP
#插入一条规则
iptables -I INPUT 8 --dport 80 -j ACCEPT
#查看转发
iptables -t nat -nL
#在内核里打开ip 转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
##################################
#允许本地回环
iptables -A INPUT -s 127.0.0.1 -p tcp -j ACCEPT
#允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#开放对外访问
iptables -P OUTPUT ACCEPT
#指定某端口针对IP 开放
iptables -A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT
#允许的IP 或IP 段访问
iptables -A INPUT -s 192.168.10.37 -p tcp -j ACCEPT
#开放对外开放端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#关闭入口
iptables -P INPUT DROP
#关闭转发
iptables -P FORWARD DROP
##################################
iptables 规则文件
# Generated by iptables-save v1.2.11 on Fri Feb 9 12:10:37 2007
*filter
:INPUT DROP [637:58967]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [5091:1301533]
#允许的IP 或IP 段访问
-A INPUT -s 127.0.0.1 -p tcp -j ACCEPT
-A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT
#开放对外开放端口
-A INPUT -p tcp --dport 80 -j ACCEPT
#指定某端口针对IP 开放
-A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT
#拒绝所有协议(INPUT 允许的情况)
#-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#拒绝ping
-A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Fri Feb 9 12:10:37 2007
##################################
常用实例
#允许在IP 访问指定端口
iptables -A INPUT -s 192.168.62.1 -p tcp --dport 22 -j ACCEPT
#禁止使用某端口
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 31 -j REJECT
#禁止QQ 端口
iptables -D FORWARD -p udp --dport 8000 -j REJECT
#禁止icmp 端口
#除192.168.62.1 外,禁止其它人ping 我的主机
iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP
#其它情况不允许
iptables -A INPUT -i eth0 -j DROP
#禁止指定IP 访问
iptables -A INPUT -p tcp -s IP -j DROP
#禁止指定IP 访问端口
iptables -A INPUT -p tcp -s IP --dport port -j DROP
#阻止所有没有经过你系统授权的TCP 连接
iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP
#添加网段转发
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
#IP 包流量限制
iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -j DROP
#端口映射
iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 --dport 80 -j REDIRECT --to-ports
3128
#列出某规则链中的所有规则
iptables -L INPUT
#删除某个规则链,不加规则链,清除所有非内建的
iptables -X allowed
#将封包计数器归零
iptables -Z INPUT
#定义新的规则链
iptables -N allowed
#定义过滤政策
iptables -P INPUT DROP
#修改某自订规则链的名称
iptables -E allowed disallowed
#比对通讯协议类型是否相符
#-p ! tcp 排除tcp 以外的udp、icmp。-p all 所有类型
iptables -A INPUT -p tcp
#比对封包的来源IP
#192.168.0.0/24 ! 反向对比
iptables -A INPUT -s 192.168.1.1
#比对封包的目的地IP
iptables -A INPUT -d 192.168.1.1
#比对封包是从哪片网卡进入
#eth+表示所有的网卡
iptables -A INPUT -i eth0
#比对封包要从哪片网卡送出
iptables -A FORWARD -o eth0
#比对某段时间内封包的平均流量
#例子是用来比对:每小时平均流量是否超过一次3 个封包。除了每小时平均次外,也可以每
秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、/minute、/day。
除了进行封数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因
骇客使用洪水攻击法,导致服务被阻断。
iptables -A INPUT -m limit --limit 3/hour
#比对瞬间大量封包的数量
#例子是用来比对一次同时涌入的封包是否超过5 个(这是默认值),超过此上限的封包将被直
接丢弃。使用效果同上。
iptables -A INPUT -m limit --limit-burst 5
#比对来自本机的封包
#是否为某特定使用者所产生的,这样可以避免服务器使用root 或其它身分将敏感数据传送出,
可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。
iptables -A OUTPUT -m owner --uid-owner 500
#比对来自本机的封包
iptables -A OUTPUT -m owner --gid-owner 0
iptables -A OUTPUT -m owner --pid-owner 78
iptables -A OUTPUT -m owner --sid-owner 100
#用来比对联机状态
iptables -A INPUT -m state --state RELATED,ESTABLISHED
联机状态共有四种:INVALID、ESTABLISHED、NEW 和RELATED。
#-j 参数指定进行的处理动作,处理动作包括: ACCEPT、REJECT、DROP、REDIRECT、
MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,说明:
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
#可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset
REDIRECT 将封包重新导向到另一个端口(PNAT)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
MASQUERADE 改写封包来源IP 为防火墙NIC IP
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG 将封包相关讯息纪录在/var/log 中
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT 改写封包来源IP 为某特定IP 或IP 范围
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source
194.236.50.155-194.236.50.160:1024-32000
DNAT 改写封包目的地IP 为某特定IP 或IP 范围
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination
192.168.1.1-192.168.1.10:80-100
MIRROR 镜射封包
QUEUE 中断过滤程序
RETURN 结束在目前规则炼中的过滤程序
MARK 将封包标上某个代号
##################################
iptables 配置实例
允许某段IP 访问任何端口
iptables -A INPUT -s 192.168.0.3/24 -p tcp -j ACCEPT
设定预设规则(拒绝所有的数据包,再允许需要的,如只做WEB 服务器.还是推荐三个链都是
DROP)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
(注:意直接设置这三条完已经掉线了)
开启22 端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
如果OUTPUT 设置成DROP 的,要写上下面一条
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
(注:,不写导致无法SSH.其他的端口一样,OUTPUT 设置成DROP 的话,也要添加一条链)
如果开启了web 服务器,OUTPUT 设置成DROP 的话,同样也要添加一条链
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
做WEB 服务器,开启80 端口,其他同理
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
做邮件服务器,开启25,110 端口
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
允许icmp 包通过,允许ping
iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT 设置成DROP 的话)
iptables -A INPUT -p icmp -j ACCEPT (INPUT 设置成DROP 的话)
允许loopback!(不然会导致DNS 无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)

vim编辑器{

IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)


gconf-editor # 配置编辑器
/etc/vimrc # 配置文件路径
vim +24 file # 打开文件定位到指定行
vim file1 file2 # 打开多个文件
vim -O2 file1 file2 # 垂直分屏
vim -on file1 file2 # 水平分屏
sp filename # 上下分割打开新文件
vsp filename # 左右分割打开新文件
Ctrl+W [操作] # 多个文件间操作 大写W # 操作: 关闭当前窗口c 屏幕高度一样= 增加高度+ 移动光标所在屏 右l 左h 上k 下j 中h 下一个w
:n # 编辑下一个文件
:2n # 编辑下二个文件
:N # 编辑前一个文件
:rew # 回到首文件
:set nu # 打开行号
:set nonu # 取消行号
200G # 跳转到200
:nohl # 取消高亮
:set autoindent # 设置自动缩进
:set ff # 查看文本格式
:set binary # 改为unix格式
ctrl+ U # 向前翻页
ctrl+ D # 向后翻页
%s/字符1/字符2/g # 全部替换
X # 文档加密

4 服务管理

启动sendmail 服务
./sendmail start
/etc/init.d/sendmail start
关闭sendmail 服务
./sendmail stop
查看sendmail 服务当前状态
./sendmail status
发送邮件
echo 内容| /bin/mail -s "标题" 收件箱
打开服务列表需要打*
ntsysv
让某个服务不自动启动35 指的是运行级别
httpd:chkconfig --level 35 httpd off
让某个服务自动启动
httpd:chkconfig --level 35 httpd on
查看所有服务的启动状态
chkconfig --list
查看某个服务的启动状态
chkconfig --list |grep httpd
查看服务的状态
chkconfig –-list [服务名称]
设置非独立服务启状态
chkconfig 服务名on|off|set
开启mysql 后台运行
/usr/local/mysql/bin/mysqld_safe --user=mysql &
开机启动执行
vi /etc/rc.d/rc.local
开机启动和关机关闭服务连接
/etc/rc.d/rc3.d/S55sshd
# S 开机start K 关机stop 55 级别后跟服务名

}

ln -s -f /usr/local/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd


归档解压缩{

5 网络管理

##################################
本机网络配置文件
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.1.255
HWADDR=00:0C:29:3F:E1:EA
IPADDR=192.168.1.55
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.1.1
##################################
增加逻辑IP 地址
ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0
查看路由表
route
添加路由表
route add default gw 192.168.1.1 dev eth0
设置DNS
vi /etc/resolv.conf
禁用网卡
ifconfig eth0 down
启用网卡
ifconfig eth0 up
ifup eth0:0 up
测试跳数
traceroute www.baidu.com (linux)
tracert www.baidu.com (windows)
根据IP 和主机最大数计算掩码
ipcalc -m "$ip" -p "$num"
用wget 的递归方式下载整个网站
wget --random-wait -r -p -e robots=off -U Mozilla www.example.com
通过DNS 来读取Wikipedia 的hacker 词条
dig +short txt hacker.wp.dg.cx
host -t txt hacker.wp.dg.cx
rz ssh 小文件上传
sz ssh 小文件下载
从linux ssh 登录另一台linux
ssh -p 22 wang@192.168.1.209
利用ssh 操作远程主机
ssh -p 22 root@192.168.1.209 环境变量中脚本
把本地文件拷贝到远程主机
scp -P 22 文件root@ip:/目录
ssh 连接不提示yes
ssh -o StrictHostKeyChecking=no 192.168.70.130
把远程指定文件拷贝到本地
scp root@192.168.1.209:远程目录本地目录
通过SSH 挂载远程主机上的文件夹
sshfs name@server:/path/to/folder /path/to/mount/point
卸载的话使用fusermount 命令
fusermount -u /path/to/mount/point
用DIFF 对比远程文件跟本地文件
ssh user@host cat /path/to/remotefile | diff /path/to/localfile -
用SSH 创建端口转发通道
ssh -N -L2001:remotehost:80 user@somemachine
嵌套使用SSH
ssh -t host_A ssh host_B
密钥信任
ssh-keygen –t rsa
vi 用户/.ssh/authorized_keys
远程关掉一台WINDOWS 机器
net rpc shutdown -I IP_ADDRESS -U username%password
禁ping
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
##################################
先ping 在扫描主机开放端口
nmap -PT 192.168.1.1-111
扫描出系统内核版本
nmap -O 192.168.1.1
扫描端口的软件版本
nmap -sV 192.168.1.1-111
半开扫描(通常不会记录日志)
nmap -sS 192.168.1.1-111
不支持windows 的扫描(判断是否是windows)
nmap -sF 192.168.1.1-111
nmap -sX 192.168.1.1-111
nmap -sN 192.168.1.1-111
不ping 直接扫描
nmap -P0 192.168.1.1-111
详细信息
nmap -d 192.168.1.1-111
无法找出真正扫描主机(隐藏IP)
nmap -D 192.168.1.1-111
端口范围
nmap -p 20-30,139,60000-
表示:扫描20 到30 号端口,139 号端口以及所有大于60000 的端口
组合扫描(不ping、软件版本、内核版本、详细信息)
nmap -P0 -sV -O -v 192.168.30.251

tar zxvpf gz.tar.gz -C 放到指定目录 包中的目录 # 解包tar.gz 不指定目录则全解压
tar zcvpf /$path/gz.tar.gz * # 打包gz 注意*最好用相对路径
tar zcf /$path/gz.tar.gz * # 打包正确不提示
tar ztvpf gz.tar.gz # 查看gz
tar xvf 1.tar -C 目录 # 解包tar
tar -cvf 1.tar * # 打包tar
tar tvf 1.tar # 查看tar
tar -rvf 1.tar 文件名 # 给tar追加文件
tar --exclude=/home/dmtsai --exclude=*.tar -zcvf myfile.tar.gz /home /etc # 打包/home, /etc ,但排除 /home/dmtsai
tar -N "2015/06/01" -zcvf home.tar.gz /home # 在 /home 当中,比 2015/06/01 新的文件才备份
tar -zcvfh home.tar.gz /home # 打包目录中包括连接目录
tar zcf - ./ | ssh root@IP "tar zxf - -C /xxxx" # 一边压缩一边解压
zgrep 字符 1.gz # 查看压缩包中文件字符行
bzip2 -dv 1.tar.bz2 # 解压bzip2
bzip2 -v 1.tar # bzip2压缩
bzcat # 查看bzip2
gzip A # 直接压缩文件 # 压缩后源文件消失
gunzip A.gz # 直接解压文件 # 解压后源文件消失
gzip -dv 1.tar.gz # 解压gzip到tar
gzip -v 1.tar # 压缩tar到gz
unzip zip.zip # 解压zip
zip zip.zip * # 压缩zip
# rar3.6下载:
rar a rar.rar *.jpg # 压缩文件为rar包
unrar x rar.rar # 解压rar包
7z a 7z.7z * # 7z压缩
7z e 7z.7z # 7z解压

##################################


}

6 磁盘管理

查看硬盘容量
df -h
查看磁盘分区格式
df -T
修改只读文件系统为读写
mount -o remount,rw /
查看卷标
e2label /dev/sda5
创建卷标
e2label /dev/sda5 new-label
NTFS 添加卷标
ntfslabel -v /dev/sda8 new-label
ext2 分区转ext3 分区
tune2fs -j /dev/sda
格式化分区
mkfs -t ext3 /dev/hda3
指定索引块大小
mke2fs -b 2048 /dev/sda5
对文件系统修复
fsck -y /dev/sda6
查看超级块的信息
dumpe2fs -h /dev/sda5
查看当前系统支持文件系统
cat /proc/filesystems
检测硬盘状态
smartctl -H /dev/sda
检测硬盘信息
smartctl -i /dev/sda
检测所有信息
smartctl -a /dev/sda
检测目录下所有文件大小
du -h 目录
显示当前目录中子目录的大小
du -h --max-depth=1
挂载光驱
mount -t iso9660 /dev/dvd /mnt
挂载镜像文件
mount -o loop /software/rhel4.6.iso /mnt/
##################################
磁盘grub 开机引导项添加
/etc/grub.conf
title ms-dos
rootnoverify (hd0,0)
chainloader +1
##################################
建立软RAID1
两块硬盘分区一样,分别新建分区文件类型为software RAID
创建两个就点击raid 合并为RAID1,这里的挂载点为正常linux 目录
查看raid 工作状态
cat /proc/mdstat
两个盘都加grub 引导
查看
cat /boot/grub/grub.conf
grub
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
修改grub 启动项配置文件
vi /boot/grub/grub.conf
复制title CentOS 到最后的四行
在下面粘贴修改为刚才新加的引导(hd1,0)。
查看分区
sfdisk -d /dev/hda
导出A 盘分区列表
sfdisk -d /dev/hda > fq.hda
将分区列表导入到新加的硬盘
sfdisk /dev/hdb < fq.hda
恢复新挂载的硬盘分区
mdadm /dev/md1 -a /dev/hdb5
# raid5 可利用lvm 扩容
##################################
新硬盘挂载
fdisk /dev/sdc
p # 打印分区
d # 删除分区
n # 创建分区,(一块硬盘最多4 个主分区,扩展占一个主分区位置。p 主分区e 扩展)
w # 保存退出
mkfs -t ext3 -L 卷标/dev/sdc1 # 格式化相应分区
mount /dev/sdc1 /mnt # 挂载
添加开机挂载分区
vi /etc/fstab
用卷标挂载
LABEL=/data /data ext3 defaults 1 2
用真实分区挂载
/dev/sdb1 /data4 ext3 defaults 1 2
第一个数字"1"该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需
要转储就设置该字段为0
第二个数字"2"该字段被fsck 命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统
"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该
字段为0

文件ACL权限控制{

##################################


getfacl 1.test # 查看文件ACL权限
setfacl -R -m u:xuesong:rw- 1.test # 对文件增加用户的读写权限 -R 递归

7 用户管理

建立用户
useradd xuesong
修改密码
passwd 用户
echo "xuesong" | passwd xuesong --stdin
查找用户显示信息
finger
添加组
groupadd
修改文件拥有者(R 递归)
chown -R
修改所有者用户中包含点"."
chown y.li:mysql
修改用户组
chgrp
修改用户名
usermod -l 新用户名老用户名
修改用户所属组
usermod -g user group
修改用户家目录
usermod -d 目录-m 用户
将用户添加到附加组
usermod -G user group
删除帐号及家目录
userdel -r
指定组并不允许登录的用户
useradd -g www -M -s /sbin/nologin www
切换用户执行
su - user -c "
#命令1

}

"


svn更新代码{

8 脚本相关

##################################
正则表达式
^ 行首定位
$ 行为定位
. 匹配除换行符以外的任意字符
* 匹配0 或多个重复字符

  • 重复一次或更多次
    ? 重复零次或一次
    [] 匹配一组中任意一个字符
    [^] 匹配不在指定组内的字符
    用来转义元字符
    < 词首定位符(支持vi 和grep)
    <love
    > 词尾定位符(支持vi 和grep)
    love>
    x{m} 重复出现m 次
    x{m,} 重复出现至少m 次
    x{m,n} 重复出现至少m 次不超过n 次
    X? 匹配出现零次或一次的大写字母X
    X+ 匹配一个或多个字母X
    (abc|def)+ 匹配一连串的(最少一个) abc 或def;abc 和def 将匹配
    d 匹配任意一位数字
    D 匹配任意单个非数字字符
    w 匹配任意单个字母数字字符,同义词是[:alnum:]
    s 匹配任意的空白符
    b 匹配单词的开始或结束
    [:alpha:] 代表所有字母不论大小写
    [:lower:] 表示小写字母
    [:upper:] 表示大写字母
    [:digit:] 表示数字字符
    () 括号内的字符为一组
    ##################################
    基本流程结构
    if [ $a == $b ]
    then
    echo "等于"
    else
    echo "不等于"
    fi
    ##################################
    case $xs in
    0) echo "0" ;;
    1) echo "1" ;;
    *) echo "其他" ;;
    esac
    ##################################
    num=1
    # while true 等同while :
    while [ $num -lt 10 ]
    do
    echo $num
    ((num=$num+2))
    done
    ##################################
    grep a a.txt | while read a
    do
    echo $a
    done
    ##################################
    w=`awk -F ":" '{print $1}' c`
    for d in $w
    do
    $d
    done
    ##################################
    for ((i=0;i<${#o[*]};i++))
    do
    echo ${o[$i]}
    done
    ##################################
    until 循环# 当command 不为0 时
    until command
    do
    body
    done
    ##################################
    流程控制
    break N # 跳出几层循环
    continue N # 跳出几层循环,循环次数不变
    continue # 重新循环次数不变
    ##################################
    变量
    将变量A 赋值为字串
    A="a b c def"
    A=`命令`
    间接调用
    eval a=$$a
    将变量A 定义为組数
    A=(a b c def)
    set a1 a2 a3 a4
    $1 $2 $*
    在子shell 中运行
    (a=bbk)
    定义变量类型
    declare 或者typeset
    -r 只读(readonly 一样)
    -i 整形
    -a 数组
    -f 函数
    -x export
    declare -i n=0
    env # 查看环境变量
    env | grep "name" # 查看定义的环境变量
    set # 查看环境变量和本地变量
    read name # 输入变量
    readonly name # 把name 这个变量设置为只读变量,不允许再次设置
    readonly # 查看系统存在的只读文件
    export name # 变量name 由本地升为环境
    export name="RedHat" # 直接定义name 为环境变量
    export Stat$nu=2222 # 变量引用变量赋值
    unset name # 变量清除
    export -n name # 去掉只读变量
    shift # 用于移动位置变量,调整位置变量,使$3 的值赋给$2.$2 的值赋予$1
    name + 0 # 将字符串转换为数字
    number " " # 将数字转换成字符串
    常用系统变量
    $0 # 脚本启动名(包括路径)
    basename $0 # 只取脚本名
    $n # 当前程式的第n 个参数,n=1,2,…9
    $* # 当前程式的所有参数(不包括脚本本身)
    $# # 当前程式的参数个数(不包括脚本本身)
    $$ # 当前程式的PID
    $! # 执行上一个指令的PID
    $? # 执行上一个指令的返回值
    变量引用技巧${}
    ${name:+value} # 如果设置了name,就把value 显示,未设置则为空
    ${name:-value} # 如果设置了name,就显示它,未设置就显示value
    ${name:?value} # 未设置提示用户错误信息value
    ${name:=value} # 如未设置就把value 设置并显示<写入本地中>,
    ${#A} # 可得到变量中字节
    ${#A[*]} # 数组个数
    ${A[2]} # 脚本的一个参数
    ${A:4:9} # 取变量中第4 位到后面9 位
    ${A/www/http} # 取变量并且替换每行第一个关键字
    ${A//www/http} # 取变量并且全部替换每行关键字
    定义了一个变量为:
    file=/dir1/dir2/dir3/my.file.txt
    ${file#*/} # 去掉第一条/ 及其左边的字串:dir1/dir2/dir3/my.file.txt
    ${file##*/} # 去掉最后一条/ 及其左边的字串:my.file.txt
    ${file#*.} # 去掉第一个. 及其左边的字串:file.txt
    ${file##*.} # 去掉最后一个. 及其左边的字串:txt
    ${file%/*} # 去掉最后条/ 及其右边的字串:/dir1/dir2/dir3
    ${file%%/*} # 去掉第一条/ 及其右边的字串:(空值)
    ${file%.*} # 去掉最后一个. 及其右边的字串:/dir1/dir2/dir3/my.file
    ${file%%.*} # 去掉第一个. 及其右边的字串:/dir1/dir2/dir3/my
    # # 是去掉左边(在键盘上# 在$ 之左边)
    # % 是去掉右边(在键盘上% 在$ 之右边)
    # 单一符号是最小匹配﹔两个符号是最大匹配
    ##################################
    test 条件判断
    # 符号[ ] 等同test
    expression 为字符串操作
    -n str # 字符串str 是否不为空
    -z str # 字符串str 是否为空
    expression 为文件操作
    -b # 是否块文件
    -p # 文件是否为一个命名管道
    -c # 是否字符文件
    -r # 文件是否可读
    -d # 是否一个目录
    -s # 文件的长度是否不为零
    -e # 文件是否存在
    -S # 是否为套接字文件
    -f # 是否普通文件
    -x # 文件是否可执行,则为真
    -g # 是否设置了文件的SGID 位
    -u # 是否设置了文件的SUID 位
    -G # 文件是否存在且归该组所有
    -w # 文件是否可写,则为真
    -k # 文件是否设置了的粘贴位
    -t fd # fd 是否是个和终端相连的打开的文件描述符(fd 默认为1)
    -O # 文件是否存在且归该用户所有
    ! # 取反
    expression 为整数操作
    expr1 -a expr2 # 如果expr1 和expr2 评估为真,则为真
    expr1 -o expr2 # 如果expr1 或expr2 评估为真,则为真
    两值比较
    整数字符串
    -lt <: # 小于
    -gt >: # 大于
    -le <=: # 小于或等于
    -ge >=: # 大于或等于
    -eq ==: # 等不等
    -ne !=: # 不等于
    判断大小,0 为真,1 为假
    test 10 -lt 5
    echo $?
    1
    判断字符串长度是否为0
    test -n "hello"
    0
    ##################################
    重定向
    # 标准输出stdout 和标准错误stderr 标准输入stdin
    cmd 1> fiel # 把标准输出重定向到file 文件中
    cmd > file 2>&1 # 把标准输出和标准错误一起重定向到file 文件中
    cmd 2> file # 把标准错误重定向到file 文件中
    cmd 2>> file # 把标准错误重定向到file 文件中(追加)
    cmd >> file 2>&1 # 把标准输出和标准错误一起重定向到file 文件中(追加)
    cmd < file >file2 # cmd 命令以file 文件作为stdin(标准输入),以file2 文件作为标
    准输出
    cat <>file # 以读写的方式打开file
    cmd < file cmd # 命令以file 文件作为stdin
    cmd << delimiter
    cmd; #从stdin 中读入,直至遇到delimiter 分界符。
    delimiter
    >&n # 使用系统调用dup (2) 复制文件描述符n 并把结果用作标准输出
    <&n # 标准输入复制自文件描述符n
    <&- # 关闭标准输入(键盘)
    >&- # 关闭标准输出
    n<&- # 表示将n 号输入关闭
    n>&- # 表示将n 号输出关闭
    ##################################
    运算符
    $[]等同于$(()) # $[]表示形式告诉shell 求中括号中的表达式的值
    ~var # 按位取反运算符,把var 中所有的二进制为1 的变为0,为0 的变为1
    var<<str # 左移运算符,把var 中的二进制位向左移动str 位,忽略最左端移出的各位,最
    右端的各位上补上0 值,每做一次按位左移就有var 乘2
    var>>str # 右移运算符,把var 中所有的二进制位向右移动str 位,忽略最右移出的各位,
    最左的各位上补0,每次做一次右移就有实现var 除以2
    var&str # 与比较运算符,var 和str 对应位,对于每个二进制来说,如果二都为1,结果为1.
    否则为0
    var^str # 异或运算符,比较var 和str 对应位,对于二进制来说如果二者互补,结果为1,
    否则为0
    var|str # 或运算符,比较var 和str 的对应位,对于每个二进制来说,如二都该位有一个1
    或都是1,结果为1,否则为0
    运算符的优先级
    级别运算符说明
    1 =,+=,-=,/=,%=,*=,&=,^=,|=,<<=,>>== # 赋值运算符
    2 || # 逻辑或前面不成功执行
    3 && # 逻辑与前面成功后执行
    4 | # 按位或
    5 ^ # 按异位与
    6 & # 按位与
    7 ==,!= # 等于/不等于
    8 <=,>=,<,> # 大于或等于/小于或等于/大于/小于
    9 <<,>> # 按位左移/按位右移(无转意符号)
    10 +,- # 加减
    11 *,/,% # 乘,除,取余
    12 ! ,~ # 逻辑非,按位取反或补码
    13 -,+ # 正负
    ##################################
    数学运算
    $(( )) 整数运算符号大致有这些:
    • * / **:分別为"加、減、乘、除、密运算"
      & | ^ !:分別为"AND、OR、XOR、NOT" 运算
      % :余数运算
      运算
      let
      let x=16/4
      let x=5**5
      手工命令行计数器
      expr
      SUM=`expr 2 * 3`
      计算字串长度
      expr length "bkeep zbb"
      抓取字串
      expr substr "bkeep zbb" 4 9
      抓取第一个字符数字串出现的位置
      expr index "bkeep zbb" e
      整数运算
      expr 14 % 9
      expr 30 / 3 / 2 # 运算符号有空格
      增量计数(加循环即可)
      LOOP=0
      LOOP=`expr $LOOP + 1`
      数值测试(如果试图计算非整数,则会返回错误。)
      rr=3.4
      expr $rr + 1
      expr: non-numeric argument
      rr=5
      expr $rr + 1
      6
      模式匹配(可以使用expr 通过指定冒号选项计算字符串中字符数)
      .* 意即任何字符重复0 次或多次
      expr bkeep.doc : '.*'
      在expr 中可以使用字符串匹配操作,这里使用模式抽取.doc 文件附属名。
      expr bkeep.doc : '(.*).doc'
      次方计算
      echo "m^n"|bc
      ##################################
      grep 用法
      -c 显示匹配到得行的数目,不显示内容
      -h 不显示文件名
      -i 忽略大小写
      -l 只列出匹配行所在文件的文件名
      -n 在每一行中加上相对行号
      -s 无声操作只显示报错,检查退出状态
      -v 反向查找
      -e 使用正则表达式
      -A1 打印匹配行和下一行
      -wc 匹配出现次数
      grep 可用于if 判断,找到$?为then
      过滤关键字符行
      grep -v "a" txt
      精确匹配字符串
      grep 'a>' txt
      大小写敏感
      grep -i "a" txt
      同时匹配大小写
      grep "a[bB]" txt
      查找0-9 重复三次的所在行
      grep '[0-9]{3}' txt
      任意条件匹配
      grep -E "word1 | word2 | word3" file
      同时匹配三个
      grep word1 file | grep word2 |grep word3
      ##################################
      tr 用法
      -c 用字符串1 中字符集的补集替换此字符集,要求字符集为ASCII。
      -d 删除字符串1 中所有输入字符。
      -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
      [a-z] a-z 内的字符组成的字符串。
      [A-Z] A-Z 内的字符组成的字符串。
      [0-9] 数字串。
      octal 一个三位的八进制数,对应有效的ASCII 字符。
      [O*n] 表示字符O 重复出现指定次数n。因此[O*2]匹配OO 的字符串。
      tr 中特定控制字符的不同表达方式
      速记符含义八进制方式
      a Ctrl-G 铃声07
      b Ctrl-H 退格符10
      f Ctrl-L 走行换页14
      n Ctrl-J 新行12
      r Ctrl-M 回车15
      t Ctrl-I tab 键11
      v Ctrl-X 30
      将所有大写转换成小写字母
      tr A-Z a-z
      将空格替换为换行
      tr " " "n"
      删除空行
      tr -s "[12]" < plan.txt
      tr -s ["n"] < plan.txt
      删除文件中的^M,并代之以换行
      tr -s "[15]" "[n]" < file
      tr -s "[r]" "[n]" < file
      替换passwd 文件中所有冒号,代之以tab 键
      tr -s "[:]" "[11]" < /etc/passwd
      tr -s "[:]" "[t]" < /etc/passwd
      增加显示路径可读性
      echo $PATH | tr ":" "n"
      tr 在vi 内使用,在tr 前加处理行范围和感叹号('$'表示最后一行)
      1,$!tr -d 't'
      Mac -> UNIX
      tr "r" "n"<macfile > unixfile
      UNIX -> Mac
      tr "n" "r"<unixfile > macfile
      DOS -> UNIX
      Microsoft DOS/Windows 约定,文本的每行以回车字符(r)并后跟换行符(n)结束
      tr -d "r"<dosfile > unixfile
      UNIX -> DOS:在这种情况下,需要用awk,因为tr 不能插入两个字符来替换一个字符
      awk '{ print $0"r" }'<unixfile > dosfile
      ##################################
      awk 用法
      b 退格
      f 换页
      n 换行
      r 回车
      t 制表符Tab
      c 代表任一其他字符
      -F 改变FS 值(分隔符)
      ~ 匹配
      = 赋值
      == 匹配
      += 叠加
      [:alnum:] 字母数字字符
      [:alpha:] 字母字符
      [:cntrl:] 控制字符
      [:digit:] 数字字符
      [:graph:] 非空白字符(非空格、控制字符等)
      [:lower:] 小写字母
      [:print:] 与[:graph:]相似,但是包含空格字符
      [:punct:] 标点字符
      [:space:] 所有的空白字符(换行符、空格、制表符)
      [:upper:] 大写字母
      [:xdigit:] 十六进制的数字(0-9a-fA-F)
      内建变量
      $n 当前记录的第n 个字段,字段间由FS 分隔
      $0 完整的输入记录
      ARGC 命令行参数的数目
      ARGIND 命令行中当前文件的位置( 从0 开始算)
      ARGV 包含命令行参数的数组
      CONVFMT 数字转换格式( 默认值为%.6g)
      ENVIRON 环境变量关联数组
      ERRNO 最后一个系统错误的描述
      FIELDWIDTHS 字段宽度列表( 用空格键分隔)
      FILENAME 当前文件名
      FNR 同NR ,但相对于当前文件
      FS 字段分隔符( 默认是任何空格)
      IGNORECASE 如果为真(即非0 值),则进行忽略大小写的匹配
      NF 当前记录中的字段数(列)
      NR 当前行数
      OFMT 数字的输出格式( 默认值是%.6g)
      OFS 输出字段分隔符( 默认值是一个空格)
      ORS 输出记录分隔符( 默认值是一个换行符)
      RLENGTH 由match 函数所匹配的字符串的长度
      RS 记录分隔符( 默认是一个换行符)
      RSTART 由match 函数所匹配的字符串的第一个位置
      SUBSEP 数组下标分隔符( 默认值是/034) 。
      BEGIN 先处理(可不加文件参数)
      END 结束时处理
      [[:digit:][:lower:]] 数字和小写字母(占一个字符)
      -F"[ ]+|[%]+" 已多个空格或多个%为分隔符
      [a-z]+ 多个小写字母
      [a-Z] 代表所有大小写字母(aAbB...zZ)
      [a-z] 代表所有大小写字母(ab...z)
      打印匹配到得行
      awk '/Tom/' 文件
      如果第三个字段值小于4000 才打印
      awk '$3 <4000' 文件
      匹配Tom 开头的行打印第一个字段
      awk '/^Tom/{print $1}'
      显示所有第一个字段不是以ly 结尾的行
      awk '$1 !~ /ly$/' 文件
      条件判断(如果$1 大于$2,max 值为为$1,否则为$2)
      awk '{max=($1 > $2) ? $1 : $2; print max}' 文件
      awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' e.txt
      (括号代表if 语句判断"?"代表then ":"代表else)
      算术运算(第三个字段和第四个字段乘积大于500 则显示)
      awk '$3 * $4 > 500' 文件
      打印tom 到suz 之间的行
      awk '/tom/,/suz/' 文件
      去掉前三行
      awk '{$1="";$2="";$3="";print}' a.sh
      将date 值赋给d,并将d 设置为数组mon,打印mon 数组中第2 个元素
      awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' 文件
      以空格、:、制表符Tab 为分隔符
      awk -F'[ :t]' '{print $1,$2}'
      取关键字下第几行
      awk '/关键字/{a=NR+2}a==NR {print}'
      awk 中引用变量
      a=22aa &&echo 88:99:44|awk -F":" '{print $1,"'"$a"'",$2,$3}'
      指定类型(%d 数字,%s 字符)
      /sbin/ifconfig |awk '{printf("line %d,%sn",NR,$0)}'
      awk -v RS=# 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}' 文件
      awk 加if 判断
      awk '{if ( $6 > 50) print $1 " Too high" ;
      else print "Range is OK"}' file
      awk '{if ( $6 > 50) { count++;print $3 }
      else { x+5; print $2 } }' file
      awk 加循环
      awk '{i = 1; while ( i <= NF ) { print NF, $i ; i++ } }' file
      awk '{ for ( i = 1; i <= NF; i++ ) print NF,$i }' file
      提取时间,空格不固定
      ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}'
      查看磁盘空间
      df|awk -F"[ ]+|%" '$5>14{print $5}'
      取出第四列等于90 的第五列
      awk '$4==90{print $5}'
      打印所有以模式no 或so 开头的行
      awk '/^(no|so)/' test
      排列打印
      awk 'END{printf
      "%-10s%-10sn%-10s%-10sn%-10s%-10sn","server","name","123","12345","234","1234"}' txt
      awk 'BEGIN{printf
      "|%-10s|%-10s|n|%-10s|%-10s|n|%-10s|%-10s|n","server","name","123","12345","234","1234"}'
      awk 'BEGIN{
      print " *** 开始*** ";
      print "+-----------------+";
      printf "|%-5s|%-5s|%-5s|n","id","name","ip";
      }
      $1!=1 && NF==4{printf "|%-5s|%-5s|%-5s|n",$1,$2,$3" "$11}
      END{
      print "+-----------------+";
      print " *** 结束*** "
      }' txt
      awk 中计算(求余数)
      echo list|awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}'
      sub 匹配第一次出现的符合模式的字符串,相当于sed 's//'
      awk '{sub(/Mac/,"Macintosh");print}' urfile
      #用Macintosh 替换Mac
      gsub 匹配所有的符合模式的字符串,相当于sed 's//g'
      awk '{sub(/Mac/,"MacIntosh",$1); print}' file
      #第一个域内用Macintosh 替换Mac
      处理sql 语句
      cat 1.txt|awk -F" # " '{print "insert into user
      (user,password,email)values(""'''"$1"'','""'''"$2"'','""'''"$3"'');'"}' >>insert_1.txt
      引用外部变量
      awk '{print "'"$a"'","'"$b"'"}'
      在END 块里面把数组内容写到文件
      awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}' data >tmp
      将$1 的值叠加后赋给sum
      awk 'sum+=$1{print sum}' <<EOF
      1 11 111
      2 22 222
      8 33 333
      10 44 444
      EOF
      加入END 只打印最后的结果
      awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' <<EOF
      1324236000: 4.8726625090e+06 1.4806911317e+07
      1324236300: 3.1952608823e+05 1.3144868085e+07
      1324236600: 5.0792587262e+05 1.4931600767e+07
      EOF
      #结果中第一个值是$2 的总和第二个值是$3 的总和第三个值是$2 总和除个数(平均值) 第
      四个值是$3 总和除个数(平均值)
      #e+06 是科学计数法,表示乘以10 的6 次方
      awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' <<EOF
      1: 3 30
      2: 6 60
      3: 9 90
      EOF
      列求和
      cat txt |awk '{a+=$1}END{print a}'
      列求平均值
      cat txt |awk '{a+=$1}END{print a/NR}'
      列求最大值
      cat txt |awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}'
      #设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束
      求最小值
      cat txt |awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}'
      判断$1 是否整除(awk 中定义变量引用时不能带$ )
      cat txt |awk '{ i=$1%10;if ( i == 0 ) {print i}}'
      ##################################
      sed 用法
      -n 输出由编辑指令控制(取消默认的输出,必须与编辑指令一起配合)
      -i 直接对文件操作
      -e 多重编辑
      p 打印
      d 删除
      s 替换
      g 配合s 全部替换
      i 行前插入
      a 行后插入
      r 读
      y 转换
      q 退出
      (..) 保存..作为标签1(1)
      & 代表查找的串内容
      * 前导符
      .* 匹配任意多个字符
      模式空间(两行两行处理)
      N 将第二行追加到第一行将换行符n 替换空极为一行
      n 将第二行覆盖到第一行
      h 把模式空间里的行拷贝到暂存空间
      H 把模式空间里的行追加到暂存空间
      g 用暂存空间的内容替换模式空间的行
      G 把暂存空间的内容追加到模式空间的行后
      x 将暂存空间的内容于模式空间里的当前行互换
      ! 对所选行以外的所有行应用命令。
      注意:暂存空间里默认存储一个空行。
      sed 命令替换并打印出替换行( -i 改变文本)
      sed -n -e "{s/文本(正则表达式)/替换的文本/p}"
      打印并删除正则表达式的那部分内容
      sed -n -e "{s/^ *[0-9]*//p}"
      删除含关键的一行
      sed -i "/^$f/d" a
      直接对文本替换
      sed -i "s/=/:/" c
      找到pearls 开头在行尾加jcui
      sed -i "/^pearls/s/$/jcui/" ab.txt
      标签(保存(mar)作为标签1)
      sed -n 's/(mar)got/1ianne/p' 文件
      echo "margot"|sed -n 's/(mar).*(t)/12/p'
      sed -e 's/^([a-zA-Z]+) ([a-zA-Z]+)(.*)/2 13/g' file
      在以[0-9][0-9]结尾的行后加5
      sed 's/[0-9][0-9]$/&5' 文件
      打印从第5 行到以no 开头行之间的所有行
      sed -n '5,/^no/p' 文件
      修改west 和east 之间的所有行,在结尾处加*VACA*
      sed '/west/,/east/s/$/*VACA*/' 文件
      多重编辑(先删除1-3 行,在将1 替换成2)
      sed -e '1,3d' -e 's/1/2/' 文件
      找到含suan 的行,在后面加上读入的文件内容
      sed '/suan/r 读入文件' 文件
      找到含no 的行,写入到指定文件中
      sed -n '/no/w 写入文件' 文件
      取出第一组数字,并且忽略掉开头的0
      sed 's/[^1-9]*([0-9]+).*/1/'
      打印1 和3 之间的行
      sed '/1/,/3/p' file
      取出指定行
      sed -n '1p' 文件
      在第5 行之前插入行
      sed '5iaaa' file
      在第5 行之后抽入行
      sed '5aaaa' file
      在匹配行前插入一行
      echo a|sed -e '/a/ib'
      在匹配行后插入一行
      echo a|sed -e '/a/ab'
      echo a|sed 's/a/&nb/g'
      引用外部变量
      sed -n ''$a',10p'
      sed -n ""$a",10p"
      取用户家目录(匹配不为/的字符和匹配:到结尾的字符全部删除)
      sed -n '{s/^[^/]*//;s/:.*//;p}' /etc/passwd
      将换行符转换为换行
      echo abcd\nabcde |sed 's/\n/@/g' |tr '@' 'n'
      删除掉@后面所有字符,和空行
      sed -e 's/@.*//g' -e '/^$/d'
      将几行合并成一行
      echo $(cat file)|sed 's/ //g'
      取一列最大值
      cat tmp|awk '{print $1}'|sort -n|sed -n '$p'
      查找属主权限为7 的文件
      ls -l|sed -n '/^.rwx.*/p'
      在a 前面加#号
      echo a|sed -e 's/a/#&/g'
      ##################################
      图形dialog
      多选界面[方括号]
      dialog --title "Check me" --checklist "Pick Numbers" 15 25 3 1 "one" "off" 2 "two" "on" 3 "three"
      "off" 2>tmp
      多选界面(圆括号)
      dialog --title "title" --radiolist "checklist" 20 60 14 tag1 "item1" on tag2 "item2" off 2>tmp
      单选界面
      dialog --title "title" --menu "MENU" 20 60 14 tag1 "item1" tag2 "item2" 2>tmp
      进度条
      dialog --title "Installation" --backtitle "Star Linux" --gauge "Linux Kernel" 10 60 50
      选择yes/no
      dialog --title "标题" --backtitle "Dialog" --yesno "说明" 20 60
      公告
      dialog --title "公告标题" --backtitle "Dialog" --msgbox "内容" 20 60
      显示讯息后立即离开
      dialog --title "hey" --backtitle "Dialog" --infobox "Is everything okay?" 10 60
      输入对话框
      dialog --title "hey" --backtitle "Dialog" --inputbox "Is okay?" 10 60 "yes"
      显示文档内容
      dialog --title "Array 30" --backtitle "All " --textbox /root/txt 20 75
      多条输入对话框
      dialog --title "Add a user" --form "Add a user" 12 40 4 "Username:" 1 1 "" 1 15 15 0 "Full
      name:" 2 1 "" 2 15 15 0 2>tmp
      星号显示输入--insecure
      dialog --title "Password" --insecure --passwordbox "请输入密码" 10 35
      选择日期
      dialog --stdout --title "日历" --calendar "请选择" 0 0 9 1 2010
      ##################################
      脚本头# sh 为当前系统默认shell,可指定为bash 等
      #!/bin/sh
      临时文件定义
      errtmp=/tmp/$$`date +%s%N`.errtmp
      outtmp=/tmp/$$`date +%s%N`.outtmp
      true > $outtmp
      随机数
      $RANDOM
      进程号
      $$
      纳秒
      date +%N
      在当前bash 环境下读取并执行FileName 中的命令
      source file-name # 等同. FileName
      间隔睡眠5 秒
      sleep 5
      在接收到信号后将要采取的行动
      trap
      当前目录
      $PWD
      之前一个目录的路径
      $OLDPWD
      返回上一个目录路径
      cd -
      重复打印
      yes
      自动回答y 或者其他
      yes |rm -i *
      查看目录所有文件夹
      ls -p /home
      查看匹配完整路径
      ls -d /home/
      命令替换xargs
      #将前面的内容,作为后面命令的参数
      find / -perm +7000 | xargs ls -l
      不换行执行下一句话
      echo -n aa;echo bb
      使转义生效
      echo -e "stssnnn"
      取字符串中字元
      echo $a | cut -c2-6
      排列组合(括号内一个元素分别和其他括号内元素组合)
      echo {a,b,c}{a,b,c}{a,b,c}
      返回目录名
      pwd | awk -F/ '{ print "目录名:" ,$2 }'
      替换上一条命令中的(foo)一个短语(bar)
      ^foo^bar^
      !!:s/foo/bar/
      !!:gs/foo/bar
      ##################################
      shell 例子
      判断参数是否为空-空退出并打印null
      #!/bin/sh
      echo $1
      name=${1:?"null"}
      echo $name
      ##################################
      循环数组
      for ((i=0;i<${#o[*]};i++))
      do
      echo ${o[$i]}
      done
      ##################################
      判断路径
      if [ -d /root/Desktop/text/123 ];then
      echo "找到了123"
      if [ -d /root/Desktop/text ]
      then echo "找到了text"
      else echo "没找到text"
      fi
      else echo "没找到123 文件夹"
      fi
      ##################################
      匹配替换密码
      #!/bin/sh
      cat mailpassword > temp.txt
      sed -i "s/:/ = /" temp.txt
      w=`awk -F " = " '{print $1}' temp.txt`
      for d in $w
      do
      grep -w $d svnpassword >/dev/null
      if [ $? -eq 0 ]
      then
      sed -i "/^$d/d" svnpassword
      grep "^$d" temp.txt >> svnpassword
      #替换到转义就出问题
      #sed -i "/^$d/c $(grep "^$d" temp.txt)" svnpassword
      fi
      done
      rm temp.txt
      ##################################
      多行合并
      将两行并为一行(去掉换行符)
      sed '{N;s/n//}' file
      将4 行合并为一行(可扩展)
      awk '{if (NR%4==0){print $0} else {printf"%s ",$0}}' file
      将所有行合并
      awk '{printf"%s ",$0}'
      ##################################
      shift 用法
      ./cs.sh 1 2 3
      #!/bin/sh
      until [ $# -eq 0 ]
      do
      echo "第一个参数为: $1 参数个数为: $#"
      #shift 命令执行前变量$1 的值在shift 命令执行后不可用
      shift
      done
      ##################################
      给脚本加参数getopts
      #!/bin/sh
      while getopts :ab: name
      do
      case $name in
      a) aflag=1
      ;;
      b) bflag=1
      bval=$OPTARG
      ;;
      ?) echo "USAGE:`basename $0` [-a] [-b value]"
      exit 1
      ;;
      esac
      done
      if [ ! -z $aflag ] ; then
      echo "option -a specified"
      echo "$aflag"
      echo "$OPTIND"
      fi
      if [ ! -z $bflag ] ; then
      echo "option -b specified"
      echo "$bflag"
      echo "$bval"
      echo "$OPTIND"
      fi
      echo "here $OPTIND"
      shift $(($OPTIND -1))
      echo "$OPTIND"
      echo " `shift $(($OPTIND -1))` "
      ##################################
      判断脚本参数是否正确
      ./test.sh -p 123 -P 3306 -h 127.0.0.1 -u root
      #!/bin/sh
      if [ $# -ne 8 ];then
      echo "USAGE: $0 -u user -p passwd -P port -h host"
      exit 1
      fi
      while getopts :u:p:P:h: name
      do
      case $name in
      u)
      mysql_user=$OPTARG
      ;;
      p)
      mysql_passwd=$OPTARG
      ;; P)
      mysql_port=$OPTARG
      ;;
      h)
      mysql_host=$OPTARG
      ;;
      *)
      echo "USAGE: $0 -u user -p passwd -P port -h host"
      exit 1
      ;;
      esac
      done
      if [ -z $mysql_user ] || [ -z $mysql_passwd ] || [ -z $mysql_port ] || [ -z $mysql_host ]
      then
      echo "USAGE: $0 -u user -p passwd -P port -h host"
      exit 1
      fi
      echo $mysql_user $mysql_passwd $mysql_port $mysql_host
      #结果root 123 3306 127.0.0.1
      ##################################
      dialog 取值接值退出
      outtmp=/tmp/outtmp
      dialog --no-shadow --backtitle "雪松制作" --title "请选择" --ok-label "提交" --cancel-label "取消"
      --menu "请选择" 10 60 0
      1 "[目录]"
      q "[退出]"
      2> $outtmp
      #判断提交取消
      if [ $? == "1" ]
      then
      break
      #continue
      fi
      #只判断退出
      pt=`awk '{print}' $outtmp`
      if [ $pt == q ]
      then
      break
      fi
      #判断操作
      case $pt in
      1)
      #操作
      ;;
      q)
      exit #break
      ;;
      esac
      ##################################
      dialog 输入对话框加判断
      while :
      do
      outtmp=/tmp/outtmp
      dialog --title "雪松制作" --form "请输入" 20 60 10 "用户:" 1 2 "" 1 15 35 0 "ID:" 2 2 "" 2
      15 35 0 "" 6 2 "" 6 0 0 0 "输入格式如下" 7 2 "" 7 0 0 0 "说明" 8 2 "" 8 0 0
      0 2> $outtmp
      yh=`sed -n '1p' $outtmp`
      id=`sed -n '2p' $outtmp`
      if echo $yh | grep -e '^[1-9][0-9]{0,2}' > /dev/null 2>&1
      then
      if echo $id | grep -e '^[1-9][0-9]{0,12}' > /dev/null 2>&1
      then
      break
      else
      echo "您输入的不合法,请从新输入!"
      fi
      else
      echo "您输入的不合法,请从新输入!"
      fi
      done
      ##################################
      打印表格
      #!/bin/sh
      clear
      awk 'BEGIN{
      print "+--------------------+--------------------+";
      printf "|%-20s|%-20s|n","Name","Number";
      print "+--------------------+--------------------+";
      }'
      a=`grep "^[A-Z]" a.txt |sort +1 -n |awk '{print $1":"$2}'`
      #cat a.txt |sort +1 -n |while read list
      for list in $a
      do
      name=`echo $list |awk -F: '{print $1}'`
      number=`echo $list |awk -F: '{print $2}'`
      awk 'BEGIN{printf "|%-20s|%-20s|n","'"$name"'","'"$number"'";
      print "+--------------------+--------------------+";
      }'
      done
      awk 'BEGIN{
      print " *** The End *** "
      print " "
      }'
      ##################################
      判断日期是否合法
      #!/bin/sh
      while read a
      do
      if echo $a | grep -q "-" && date -d $a +%Y%m%d > /dev/null 2>&1
      then if echo $a | grep -e '^[0-9]{4}-[01][0-9]-[0-3][0-9]$'
      then
      break
      else
      echo "您输入的日期不合法,请从新输入!"
      fi
      else
      echo "您输入的日期不合法,请从新输入!"
      fi
      done
      echo "日期为$a"
      ##################################
      打印日期段所有日期
      #!/bin/bash
      qsrq=20010101
      jsrq=20010227
      n=0
      >tmp
      while :;do
      current=$(date +%Y%m%d -d"$n day $qsrq")
      if [[ $current == $jsrq ]];then
      echo $current >>tmp;break
      else
      echo $current >>tmp
      ((n++))
      fi
      done
      rq=`awk 'NR==1{print}' tmp`
      ##################################
      打印提示
      cat <<EOF
      #内容
      EOF
      登陆远程执行命令(特殊符号需要转义)
      ssh root@ip << EOF
      #执行命令
      EOF
      登陆mysql 执行命令
      mysql -uroot -ppasswd -S mysql.sock --default-character-set=gbk -A<<EOF>outtmp
      #mysql 命令
      EOF
      ##################################
      数学计算的小算法
      #!/bin/sh
      A=1
      B=1
      while [ $A -le 10 ]
      do
      SUM=`expr $A * $B`
      echo "$SUM"
      if [ $A = 10 ]
      then
      B=`expr $B + 1`
      A=1
      fiA
      =`expr $A + 1`
      done
      ##################################
      竖行转横行(三种)
      cat file|tr 'n' ' '
      echo $(cat file)
      #!/bin/sh
      for i in `cat file`
      do
      a=${a}" "${i}
      done
      echo $a
      ##################################
      取用户的根目录
      #! /bin/bash
      #showhome.sh
      IFS=:
      while read name pass uid gid gecos home shell
      do
      echo $home
      done
      执行./showhome.sh < /etc/passwd
      ##################################
      把汉字转成encode 格式:
      echo 论坛| tr -d "n" | xxd -i | sed -e "s/ 0x/%/g" | tr -d " ,n"
      %c2%db%cc%b3
      大写的:
      echo 论坛| tr -d "n" | xxd -i | sed -e "s/ 0x/%/g" | tr -d " ,n" | tr "[a-f]" "[A-F]"
      %C2%DB%CC%B3
      ##################################
      把带有大写字母的文件名改为全部小写
      #!/bin/bash
      for f in *;do
      mv $f `echo $f |tr "[A-Z]" "[a-z]"`
      done
      ##################################
      查找连续多行,在不连续的行前插入
      #/bin/bash
      lastrow=null
      i=0
      cat incl|while read line
      do
      i=`expr $i + 1`
      if echo "$lastrow" | grep "#include <[A-Z].h>"
      then
      if echo "$line" | grep -v "#include <[A-Z].h>"
      then
      sed -i ''$i'i\//All header files are include' incl
      i=`expr $i + 1`
      fi
      fi
      lastrow="$line"
      done

      ##################################


--force # 强制覆盖
/usr/bin/svn --username user --password passwd co $Code ${SvnPath}src/ # 检出整个项目
/usr/bin/svn --username user --password passwd up $Code ${SvnPath}src/ # 更新项目
/usr/bin/svn --username user --password passwd export $Code$File ${SvnPath}src/$File # 导出个别文件
/usr/bin/svn --username user --password passwd export -r 版本号 svn路径 本地路径 --force # 导出指定版本

9 服务配置

samba
修改配置文
/etc/samba/smb.conf
[global]
workgroup = WORKGROUP
server string = sambaserver
security=share
hosts allow=网络主机
[file]
comment=home directories
path=/etc/samba/xuesong
public=yes
writable=yes
browseable=yes
重启
service smb restart
linux 访问windows 共享
smbclient -L //ip 地址或计算机名
##################################
DNS 服务器
DNS 主配置文件,moon.com 域名,zone.moon.com 域的配置文件
vi /etc/named.conf
zone "moon.com" IN {
type master;
file "zone.moon.com";
allow-update { none; };
};
测试主配置文件
named-checkconf
新建域的配置文件zone.moon.com
vi /var/named/chroot/var/named/zone.moon.com
$TTL 86400
@ IN SOA xs. quanzhou722.163.com. (
20102014
3H
15M
1W
1D
)
IN NS xs.
IN MX 5 mail.
www IN A 192.168.1.209
ftp IN A 192.168.1.209
mail IN A 192.168.1.209
测试moon.com 域配置文件
named-checkzone moon.com /var/named/chroot/var/named/zone.moon.com
建立域配置文件的软连接
ln -s /var/named/chroot/var/named/zone.moon.com /var/named/zone.moon.com
重启named 服务
service named restart
设置DNS
vi /etc/resolv.conf
测试解析是否成功
host www.moon.com
nslookup www.moon.com
##################################
ftp 配置
查看vsftp 是否安装
rpm -qa | grep vsftp
主配置文件
vi /etc/vsftpd/vsftpd.conf
启动VSFTPD 服务
service vsftpd restart
查看21 端口是否开放
netstat -atln |grep 21
1、匿名用户是否允许访问
anonymous_enable=YES
anon_mkdir_write_enable=YES
2、本地用户管理
local_enable=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
将用户添加到vsftpd.chroot_list 文件中允许访问
cat /etc/passwd |grep ":5[0-9][0-9]:" | awk -F : '{print $1}' > /etc/vsftpd.chroot_list
3、虚拟用户管理
(1)要用到文件数据库db4
rpm -qa |grep db4
(2)将帐户放入文本:(奇数行)用户名(偶数行)密码
vi zhanghu.dat
(3)生成帐户的文件数据库
db_load -T -t hash -f zhanghu.dat /etc/vsftpd/vsftpd_zhanghu.db
(4)修改文件数据库访问权限
chmod 600 /etc/vsftpd/vsftpd_zhanghu.db
(5)手工建立虚拟用户所需的PAM 配置文件
vi /etc/pam.d/vsftpd.zhanghu
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_zhanghu
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_zhanghu
(6)添加一个虚拟用户的入口帐户
useradd -d /var/ZhanDian -s /sbin/nologin XuNiRuKou
(7)在主配置文件中添加虚拟用户的配置内容
虚拟用户的新添加配置
chroot_local_user=YES
guest_enable=YES
guest_username=XuNiRuKou
pam_service_name=vsftpd.zhanghu
(8)在vsftpd.conf 配置文件中指定用户配置文件的目录
user_config_dir=/etc/vsftpd/vsftpd_zhandian
(9)建立配置文件中指定用户配置文件的目录
mkdir /etc/vsftpd/vsftpd_zhandian
(10)因为入口帐户是一个本地帐户,所以要指定虚拟用户具有本地帐户的权限,才能读写自
己空间中的文件
虚拟用户就可以就拥有写权限
virtual_use_local_privs=YES
(11)
touch /etc/vsftpd/vsftpd_zhandian/xuesong
echo "local_root=/var/ZhanDian/xuesong" >> /etc/vsftpd/vsftpd_zhandian/xuesong
(12)
mkdir /var/ZhanDian/xuesong
(13)
chown -R XuNiRuKou:XuNiRuKou /var/ZhanDian/
(14)重启服务
/etc/init.d/vsftpd restart
(15)客户端虚拟账号测试
建立用户脚本。最好在加上判断用户名是否存在
#!/bin/sh
echo 请输入用户名
read y
echo $y >> zhanghu.dat
echo 请输入密码
read m
echo $m >> zhanghu.dat
db_load -T -t hash -f zhanghu.dat /etc/vsftpd/vsftpd_zhanghu.db
chmod 600 /etc/vsftpd/vsftpd_zhanghu.db
touch /etc/vsftpd/vsftpd_zhandian/$y
echo "local_root=/var/ZhanDian/$y" >> /etc/vsftpd/vsftpd_zhandian/$y
mkdir /var/ZhanDian/$y
chown -R XuNiRuKou:XuNiRuKou /var/ZhanDian/$y
/etc/init.d/vsftpd restart
##################################
httpd 安装
tar zxvf httpd-2.2.12.tar.gz
cd httpd-2.2.12
./configure --prefix=/usr/local/httpd
--enable-rewrite
make && make install
ls /usr/local/
groupadd www
useradd -g www -M -s /sbin/nologin www
cd /usr/local/httpd/
vi conf/httpd.conf
服务器开启在软件安装目录的bin 中
./apachectl start
网页放在的htdocs 中
开机启动
vi /etc/rc.d/rc.local
/usr/local/httpd/bin/apachectl start
如果启动提示
httpd: Could not reliably determine the server fully qualified domain name, using 127.0.0.1 for
ServerName
修改/etc/hosts 计算机名
在httpd.conf 中开启
ServerName 127.0.0.1:80
编码设置
AddDefaultCharset UTF-8
AddDefaultCharset GB2312
##################################
mysql 源码安装
groupadd mysql
useradd mysql -g mysql -M -s /bin/false
tar zxvf mysql-5.0.22.tar.gz
cd mysql-5.0.22
./configure --prefix=/usr/local/mysql
--with-client-ldflags=-all-static
--with-mysqld-ldflags=-all-static
--with-mysqld-user=mysql
--with-extra-charsets=all
--with-unix-socket-path=/var/tmp/mysql.sock
make && make install
生成mysql 用户数据库和表文件,在安装包中输入。
scripts/mysql_install_db --user=mysql
vi ~/.bashrc
export PATH="$PATH: /usr/local/mysql/bin"
配置文件,有large,medium,small 三个,根据机器性能选择
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
cd /usr/local
chmod 750 mysql -R
chgrp mysql mysql -R
chown mysql mysql/var -R
cp /usr/local/mysql/libexec/mysqld mysqld.old
ln -s /usr/local/mysql/bin/mysql /sbin/mysql
ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin
ln -s -f /usr/local/mysql/bin/mysqld_safe /etc/rc.d/rc3.d/S15mysql5
ln -s -f /usr/local/mysql/bin/mysqld_safe /etc/rc.d/rc0.d/K15mysql5
##################################
mysql rpm 安装
到 下载mysql RPM(service 和client),
MySQL-server-community-5.1.51-1.rhel5.i386.rpm 安装服务端
MySQL-client-community-5.1.51-1.rhel5.i386.rpm 安装客户端
MySQL-devel-community-5.1.51-1.rhel5.i386.rpm 用于php 的mysql 安装
rpm –ivh MySQL-server-community-5.1.51-1.rhel5.i386.rpm
rpm –ivh MySQL-client-community-5.1.51-1.rhel5.i386.rpm
rpm –ivh MySQL-devel-community-5.1.51-1.rhel5.i386.rpm
/etc/init.d/mysqld start
mysqladmin -u root password 'xuesong'
mysql -u root -S /var/lib/mysql/mysql.sock -p
数据目录/var/lib/mysql
chkconfig --list |grep mysqld
chkconfig --level 3 mysqld on
配置文件(日志pid)
/etc/my.cnf
ll /usr/bin/mysql*
##################################
mysql 常用命令
启动mysql 服务
./mysql/bin/mysqld_safe --user=mysql &
登录mysql 的命令
格式: mysql -h 主机地址-u 用户名-p 用户密码
mysql -h110.110.110.110 -P3306 -uroot -p
mysql -uroot -p -S /data1/mysql5/data/mysql.sock -A --default-character-set=GBK
刷新
flush privileges;
显示所有数据库
show databases;
打开数据库
use dbname;
显示选中数据库中所有的表
show tables;
查看表结构
desc tables;
删除数据库
drop database name;
删除表
drop table name;
创建数据库
create database name;
mysqladmin -h myhost -u root -p create dbname
创建表
create table ka(ka_id varchar(6),qianshu int);
插入字段
alter table name add column accountid(列名) int(11) NOT NULL(字段不为空);
不登陆mysql 插入字段
mysql -uroot -p -S mysql.sock -e "use db;alter table gift add column accountid int(11) NOT
NULL;flush privileges;"
查询
select 列名称from 表名称;
select host,user,password from user;
备份数据库
mysqldump -h host -u root -p dbname >dbname_backup.sql
mysqlhotcopy 只能备份MyISAM 引擎
/bin/mysqlhotcopy -u root -p
还原数据库
mysql -h host -u root -p dbname < dbname_backup.sql
登陆mysql 后还原sql 文件
source 路径.sql
赋予查询权限(没有用户,直接创建)
grant select on db.* to log@"%" Identified by "123456";
赋予所有权限(没有用户,直接创建)
grant all privileges on db.* to log@"IP" identified by '123456' with grant option;
更改密码
update user set password=password('新密码') where user='root'
mysqladmin -u root password 'xuesong'
mysql 查看所有用户的语句
select user();
删除用户
delete from user where user='sss' and host='localhost' ;
查看主从
show slave statusG;
查看主从复制进程
show processlist;
添加索引解决停mysql 速度慢
ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction);
创建主从复制用户
grant replication slave on *.* to '用户'@'%' identified by '密码';
备份表
mysqldump -u root -p -S mysql.sock --default-character-set=utf8 --hex-blob db table1 table1 >
/data/db.sql
查看系统的字符集和排序方式的设定
SHOW VARIABLES LIKE 'character_set_%';
查看mysql 所有参数
show variables;
删除空用户
delete from user where user='';
创建表指定存储引擎的类型:
CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB
CREATE TABLE myisam (id int, title char(20)) ENGINE = MyISAM
改变现有的表使用的存储引擎:
ALTER TABLE mytable ENGINE = MyISAM
查询表引擎
SHOW TABLE STATUS from 数据库库名where Name='表名';
SHOW TABLE STATUS from db where Name='innodb';
查看mysql 变量
SHOW VARIABLES;
查询用户权限
select host,user,password from user;
查看表的引擎状态
show table status
##################################
gd 安装
分别安装组件libxml、zlib、freetype、libpng、jpegsrc、gd
libxml2-2.6.24.tar.bz2
zlib-1.2.3.tar.gz
freetype-2.2.1.tar.gz
libpng-1.2.10.tar.gz
jpegsrc.v6b.tar.gz
gd-2.0.33.tar.gz
libxml 安装
tar xzvf libxml2-2.6.24.tar.bz2
tar xvf libxml2-2.6.24.tar
cd libxml2-2.6.24
./configure
make
make install
zlib 安装
tar xzvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure
make
make install
freetype 安装
tar xzvf freetype-2.2.1.tar.gz
cd freetype-2.2.1
./configure --prefix=/usr/local/php/modules/freetype
make
make install
libpng 安装
tar xzvf libpng-1.2.10.tar.gz
cd libpng-1.2.10
./configure --prefix=/usr/local/php/modules/libpng
jpeg 安装
mkdir /usr/local/php/modules/jpeg6
mkdir /usr/local/php/modules/jpeg6/bin
mkdir /usr/local/php/modules/jpeg6/lib
mkdir /usr/local/php/modules/jpeg6/include
mkdir /usr/local/php/modules/jpeg6/man
mkdir /usr/local/php/modules/jpeg6/man/man1
一句创建
mkdir -pv /usr/local/jpeg/{,bin,lib,include,man/man1,man1}
tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure --prefix=/usr/local/php/modules/jpeg6
--enable-shared
--enable-static
make
make install
gd 安装
tar zxvf gd-2.0.33.tar.gz
cd gd-2.0.33
./configure --prefix=/usr/local/gd2
--with-jpeg=/usr/local/php/modules/jpeg6
--with-png=/usr/local/php/modules/libpng
--with-zlib
--with-freetype=/usr/local/php/modules/freetype
修改Makefile 文件231 行,重复的第二个freetype 改为libpng
make
make install
php 安装
tar xvf php-5.1.6.tar
cd php-5.1.bz2.6
./configure --prefix=/usr/local/php
--sysconfdir=/etc
--with-apxs2=/usr/local/httpd/bin/apxs
--with-config-file-path=/usr/local/php/lib
--with-libxml-dir=/usr/local/libxml2
--with-zlib
--with-jpeg-dir=/usr/local/php/modules/jpeg6
--with-freetype-dir=/usr/local/php/modules/freetype
--with-gd=/usr/local/gd2
--with-openssl
--with-regex=php
--with-gnu-ld
--with-tsrm-pthreads
--with-bz2
--with-gettext
--with-db4=/usr
--enable-ftp
--enable-bcmath
--enable-dba
--enable-sockets
--enable-soap
--enable-zend-multibyte
--enable-mbstring
--with-curlwrappers
--with-curl=/usr/local/curl
--with-pdo-mysql=/usr/local/mysql
--with-mysql=/usr/local/mysql
--with-mysqli=/usr/local/mysql/bin/mysql_config
make
make install
cp php.ini-recommended /usr/local/php/lib/php.ini
vi /usr/local/php/lib/php.ini
在PHP.IN 添加
[eaccelerator]
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/usr/local/cache/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
完成后在/usr/local/httpd/conf/httpd.conf 文件上添加如下一行:
AddType application/x-httpd-php .php .php5
ln -s /usr/local/php/bin/php /sbin/php
vi index.php
<? php
phpinfo();
?>
重启httpd
/usr/local/httpd/bin/apachectl restart
最后一步重新启动apache 报如下错误:
httpd: Syntax error on line 53 of /usr/local/apache/conf/httpd.conf: Cannot load
/usr/local/apache/modules/libphp5.so into server: /usr/local/apache/modules/libphp5.so: cannot restore
segment prot after reloc: Permission denied
不关闭SELINUX 的方法:
# setenforce 0
# chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t /usr/local/apache/modules/libphp5.so
# service httpd restart
# setenforce 1
##################################
LINUX 集群
LVS-- ipvsadm 命令参考
ipvsadm 的用法和格式如下: ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p
[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C ipvsadm -R ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight] ipvsadm -d -t|u|f
service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] ipvsadm
--stop-daemon
ipvsadm -h
命令选项解释:有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都
可以。
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的
虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个
虚拟服务器中增加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表
其他的选项:-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or
[real-server-ip:port]
-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or
[real-server-ip:port]
-f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s --scheduler scheduler 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,-p
--persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同
一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i --ipip 指定LVS 的工作模式为隧道模式
-m --masquerading 指定LVS 的工作模式为NAT 模式
-w --weight weight 真实服务器的权值
--mcast-interface interface 指定组播的同步接口
-c --connection 显示LVS 目前的连接如:ipvsadm -L -c
##################################
VS-NAT 模式
内容服务器的容量10~20
使用保留地址的LAN
双向重写
安装ipvsadm 软件
内核做个连接
ln -s /usr/src/kernels/2.6.18-53.e15-i686/ /usr/src/linux
安装软件
查看ipvsadm 版本
ipvsadm --version
建立脚本/etc/rc.d/lvs
echo "1" > /proc/sys/net/ipv4/ip_forward
#清除ipvsadm 一系列规则
ipvsadm -C
ipvsadm -A -t 外网IP:端口-s rr
ipvsadm -a -t 外网IP:端口-r 内网1 服务器IP:端口-m -w 1
ipvsadm -a -t 外网IP:端口-r 内网2 服务器IP:端口-m -w 1
修改内网服务器ip 和网关,开启httpd,建立不同页面测试
缺点不能排除宕机的web 服务器,可使用LVS+Keepalived 组合
##################################
heartbeat 心跳检测(双机热备)
安装heartbeat 的rpm 包
需要先装heartbeat-pils 和heartbeat-stonith 两个包
主节点的配置
安装完解压配置文件
rpm -q heartbeat -d
cd /etc/ha.d
cp /usr/share/doc/heartbeat-2.1.3/ha.cf .
cp /usr/share/doc/heartbeat-2.1.3/authkeys .
cp /usr/share/doc/heartbeat-2.1.3/haresources .
查看计算机名,记录下来
uname -n
vi ha.cf
打开日志记录文件
logfile /var/log/ha-log
打开心跳检测
keepalive 2
死亡时间
deadtime 30
warntime 10
initdead 120
用什么协议端口(udp)
udpport 694
使用哪个网卡作为心跳检测
bcast eth1
备用的IP
ucast eth1 192.168.1.20
主节点服务器
node 主节点计算机名
node 另一个计算机名
ping 外网测试
ping 一个外网的IP
配置验证模式
vi authkeys
打开
auth1
1 crc
配置虚拟服务
vi haresources
加上一条名称和IP
计算机名IP httpd
sev1.example.com 222.90.88.88 httpd
hosts 文件要配置上两个机器的机器名和IP
vi /etc/hosts
222.90.88.10 sev1.example.com sev2
192.168.1.10 sev1
222.90.88.20 sev1.example.com sev2
192.168.1.20 sev1
chmod 600 authkeys
service heartbeat start
在配置备用节点
直接拷贝主节点的文件修改
安装完进入安装目录
cd /etc/ha.d
用sftp 登陆主机
sftp 222.90.88.10
cd /etc/ha.d
get ha.cf
get authkeys
get hare*
bye
只需要修改ha.cf 文件
vi ha.cf
ucast eth1 192.168.1.10
启动备用节点
service heartbeat start
测试
主节点和负节点建立不同index 页面
主节点虚拟出外网ip eth0:0
停掉主节点任务
重新访问
启动后在访问
##################################
DR 直接路由模式
同一网段的LAN
内容服务器的容量20 以上
降低LVF 的负载
VIP 服务器的配置脚本
vi /etc/init.d/vip.sh
ifconfig eth0:0 222.90.88.88 broadcast 222.90.88.88 netmask 255.255.255.255 up
route add -host 222.90.88.88 dev eth0:0
ipvsadm -C
ipvsadm -A -t 222.90.88.88:80 -s rr
ipvsadm -a -t 222.90.88.88:80 -r 222.90.88.10 -g
ipvsadm -a -t 222.90.88.88:80 -r 222.90.88.20 -g
ipvsadm
chmod 777 /etc/init.d/vip.sh
/etc/init.d/vip.sh
服务器配置脚本
vi /etc/init.d/lvs.sh
ifconfig lo:0 222.90.88.88 broadcast 222.90.88.88 netmask 255.255.255.255 up
route add -host 222.90.88.88 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
chmod 777 /etc/init.d/lvs.sh
/etc/init.d/lvs.sh
第二台服务器
sftp 222.90.88.10
get /etc/init.d/lvs.sh
bye
mv lvs.sh /etc/init.d/
/etc/init.d/lvs.sh
测试两个服务器测试页面写入不同内容
分别启动httpd
真是IP 可以分别访问不同服务器,访问虚拟IP88,则互相伦叫
##################################
IP 隧道模式
WAN(或LAN 也可)
内容服务器的容量能到100
vip-server
vi /etc/init.d/vip.sh
ifconfig tunl0 222.90.88.88 broadcast 222.90.88.88 netmask 255.255.255.255 up
route add -host 222.90.88.88 dev tunl0
ipvsadm -C
ipvsadm -A -t 222.90.88.88:80 -s rr
ipvsadm -a -t 222.90.88.88 :80 -r 222.90.88.10 -i
ipvsadm -a -t 222.90.88.88 :80 -r 222.90.88.20 -i
ipvsadm
chmod -R 777 /etc/init.d/vip.sh
/etc/init.d/vip.sh
1web 服务器
ifconfig runl0 222.90.88.88 broadcast 222.90.88.88 netmask 255.255.255.255 up
route add -host 222.90.88.88 dev tunl0
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_annaunce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_annaunce
sysctl -p
chmod 777 /etc/init.d/lvs.sh
/etc/init.d/lvs.sh
2web 服务器
sftp 222.90.88.10
get /etc/init.d/lvs.sh
bye
mv lvs.sh /etc/init.d/
/etc/init.d/lvs.sh
测试两个服务器测试页面写入不同内容
分别启动httpd
真是IP 可以分别访问不同服务器,访问虚拟IP88,则互相伦叫
##################################
sendmail 邮件服务器
配置DNS 服务器为mail 服务器IP 解析
在配置文件中添加
IN MX 5 mail.
mail IN A 192.168.1.209
重启服务service named restart
测试
ping mail.xuesong.com
nslookup mail.xuesong.com
mail 服务器上设置DNS 服务器
vi /etc/resolv.conf
安装软件
sendmail-8.13.8-8.el5.i386.rpm
sendmail-cf-8.13.8-8.el5.i386.rpm
sendmail-doc-8.13.8-8.el5.i386.rpm
yum install dovecot
m4
sendmail 配置文件目录:/etc/mail
vi local-host-names
添加xuesong.com
vi sendmai.mc
去掉前面两个dnl
dnl TRUST_AUTH_MECH('EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define('confAUTH_MECHANISMS', 'EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5
LOGIN PLAIN')dnl
修改IP
DAEMON_OPTIONS('Port=smtp,Addr=192.168.1.209, Name=MTA')dnl
生成sendmail 配置文件sendmail.cf
m4 sendmail.mc > sendmail.cf
查看启动级别
chkconfig --list |grep sas
开启启动级别3
chkconfig --level 3 saslauthd on
makemap hash access.db < access
vi /etc/dovecot.conf
打开下面一句话
protocols = imap imaps pop3 pop3s
service sendmail restart
service dovecot restart
group mail
useradd -g mail -M -s /sbin/nologin 用户名
##################################
JDK 安装
rpm -qa|grep jdk
确认gcj 的版本号
rpm -qa | grep gcj
卸载gcj
yum -y remove java-1.4.2-gcj-compat
从SUN 下载jdk-1_5_0_14-linux-i586-rpm.bin 或jdk-1_5_0_14-linux-i586.bin
mkdir /usr/java
cd /usr/java

  1. jdk-1_5_0_14-linux-i586-rpm.bin 文件安装
    chmod 777 jdk-1_5_0_14-linux-i586-rpm.bin
    rpm -ivh jdk-1_5_0_14-linux-i586.rpm
  2. jdk-1_5_0_14-linux-i586.bin 文件安装
    chmod u+x jdk-1_5_0_14-linux-i586.bin
    ./jdk-1_5_0_14-linux-i586.bin
    添加环境变量
    vi /etc/profile
    export JAVA_HOME=/usr/local/java/jdk1.6.0_23
    export
    CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin
    reboot 重启生效
    ##################################
    xen 管理
    查看虚拟主机列表
    xm list
    使用文本方式连接虚拟系统
    xm console test
    启动虚拟主机
    xm create test
    虚拟机和主机切换
    ctrl+]
    关闭虚拟主机
    xm shutdown 主机名
    虚拟机克隆(关闭后克隆)
    virt-clone -o test -n test1 -f /data/xen/test1.img
    虚拟机增加硬盘
    dd if=/dev/zero of=/data/xen/test.img bs=1M count=8
    编辑原来配置文件,添加新磁盘文件
    vi /etc/xen/vm11
    name = "vm11"
    uuid = "91b0200b-eb41-46d3-1e11-ee2a87035f24"
    maxmem = 128
    memory = 128
    vcpus = 1
    bootloader = "/usr/bin/pygrub"
    on_poweroff = "destroy"
    on_reboot = "restart"
    on_crash = "restart"
    vfb = [ "type=vnc,vncunused=1,keymap=en-us" ]
    disk = [ "tap:aio:/data/vm11.img,xvda,w", "tap:aio:/data/vm11b.img,xvdb,w" ]
    vif = [ "mac=00:16:36:75:8a:ea,bridge=virbr0,script=vif-bridge" ]
    启动XEN 虚拟机并登陆测试新加的磁盘
    增加虚拟机网卡
    cat /etc/xen/vm11
    name = "vm11"
    uuid = "91b0200b-eb41-46d3-1e11-ee2a87035f24"
    maxmem = 512
    memory = 128
    vcpus = 1
    bootloader = "/usr/bin/pygrub"
    on_poweroff = "destroy"
    on_reboot = "restart"
    on_crash = "restart"
    vfb = [ "type=vnc,vncunused=1,keymap=en-us" ]
    disk = [ "tap:aio:/data/vm11.img,xvda,w" ]
    vif = [ "mac=00:16:36:75:8a:ea,bridge=xenbr0,script=vif-bridge",
    "mac=00:16:36:75:8a:eb,bridge=xenbr0,script=vif-bridge" ]

以上所述是小编给大家介绍的linux运维常用命令,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

}

您可能感兴趣的文章:

  • Linux常用命令全集(超全面)
  • 图解linux安装tomcat(附常用命令)
  • Linux 中 CURL常用命令详解
  • Linux系统信息查看常用命令
  • linux系统安装git及git常用命令
  • Linux 常用命令大全(经典)
  • 基于Linux调试工具strace与gdb的常用命令总结
  • linux 入侵常用命令汇编
  • LINUX入门级常用命令20条整理
  • 详解Linux 常用命令 pwd cd的使用

git{

# 编译安装git-1.8.4.4
./configure --with-curl --with-expat
make
make install

git clone git@10.10.10.10:gittest.git ./gittest/ # 克隆项目到指定目录
git pull # 更新项目 需要cd到项目目录中
git add . # 更新所有文件
git commit -m "gittest up" # 提交操作并添加备注
git push # 正式提交到远程git服务器
git reset --hard # 本地恢复整个项目
git rm -r -n --cached ./img # -n执行命令时,不会删除任何文件,而是展示此命令要删除的文件列表预览
git rm -r --cached ./img # 执行删除命令 需要commit和push让远程生效
git init --bare smc-content-check.git # 初始化新git项目 需要手动创建此目录并给git用户权限 chown -R git:git smc-content-check.git
git config --global credential.helper store # 记住密码

}

恢复rm删除的文件{

# debugfs针对 ext2 #ext3   grep针对 ext3    #extundelete针对 ext4
df -T # 首先查看磁盘分区格式
umount /data/ # 卸载挂载,数据丢失请首先卸载挂载,或重新挂载只读
ext3grep /dev/sdb1 --ls --inode 2 # 记录信息继续查找目录下文件inode信息
ext3grep /dev/sdb1 --ls --inode 131081 # 此处是inode
ext3grep /dev/sdb1 --restore-inode 49153 # 记录下inode信息开始恢复目录

}

openssl{

openssl rand 15 -base64 # 口令生成
openssl sha1 filename # 哈希算法校验文件
openssl md5 filename # MD5校验文件
openssl base64 filename.txt # base64编码/解码文件(发送邮件附件之类功能会可以使用)
openssl base64 -d filename.bin # base64编码/解码二进制文件
openssl enc -aes-128-cbc filename.aes-128-cbc # 加密文档
# 推荐使用的加密算法是bf(Blowfish)和-aes-128-cbc(运行在CBC模式的128位密匙AES加密算法),加密强度有保障
openssl enc -d -aes-128-cbc -in filename.aes-128-cbc > filename # 解密文档

}

}

2 软件{

rpm{

rpm -ivh lynx # rpm安装
rpm -e lynx # 卸载包
rpm -e lynx --nodeps # 强制卸载
rpm -qa # 查看所有安装的rpm包
rpm -qa | grep lynx # 查找包是否安装
rpm -ql # 软件包路径
rpm -Uvh # 升级包
rpm --test lynx # 测试
rpm -qc # 软件包配置文档
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 # 导入rpm的签名信息
rpm --initdb # 初始化rpm 数据库
rpm --rebuilddb # 重建rpm数据库 在rpm和yum无响应的情况使用 先 rm -f /var/lib/rpm/__db.00* 在重建

}

yum{

yum list # 所有软件列表
yum install 包名 # 安装包和依赖包
yum -y update # 升级所有包版本,依赖关系,系统版本内核都升级
yum -y update 软件包名 # 升级指定的软件包
yum -y upgrade # 不改变软件设置更新软件,系统版本升级,内核不改变
yum search mail # yum搜索相关包
yum grouplist # 软件包组
yum -y groupinstall "Virtualization" # 安装软件包组
repoquery -ql gstreamer # 不安装软件查看包含文件
yum clean all # 清除var下缓存

}

yum使用epel源{

# 包下载地址: # 选择版本567
rpm -Uvh

}

自定义yum源{

find /etc/yum.repos.d -name "*.repo" -exec mv {} {}.bak ;

vim /etc/yum.repos.d/yum.repo
[yum]
#http
baseurl=
#挂载iso
#mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/
#本地
#baseurl=file:///data/iso/
enable=1

#导入key
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

}

编译{

源码安装{

./configure --help # 查看所有编译参数
./configure --prefix=/usr/local/ # 配置参数
make # 编译
# make -j 8 # 多线程编译,速度较快,但有些软件不支持
make install # 安装包
make clean # 清除编译结果

}

perl程序编译{

perl Makefile.PL
make
make test
make install

}

python程序编译{

python file.py

# 源码包编译安装
python setup.py build
python setup.py install

}

编译c程序{

gcc -g hello.c -o hello

}

}

}

3 系统{

wall     # 给其它用户发消息 (全屏 全终端)
whereis ls # 查找命令的目录
which # 查看当前要执行的命令所在的路径
clear # 清空整个屏幕
reset # 重新初始化屏幕
cal # 显示月历
echo -n 123456 | md5sum # md5加密
mkpasswd # 随机生成密码 -l位数 -C大小 -c小写 -d数字 -s特殊字符
netstat -anlp | grep port # 是否打开了某个端口
ntpdate stdtime.gov.hk # 同步时间
tzselect # 选择时区 #+8=(5 9 1 1) # (TZ='Asia/Shanghai'; export TZ)括号内写入 /etc/profile
/sbin/hwclock -w # 时间保存到硬件
/etc/shadow # 账户影子文件
LANG=en # 修改语言
vim /etc/sysconfig/i18n # 修改编码 LANG="en_US.UTF-8"
export LC_ALL=C # 强制字符集
vi /etc/hosts # 查询静态主机名
alias # 别名
watch uptime # 监测命令动态刷新
ipcs -a # 查看Linux系统当前单个共享内存段的最大值
ldconfig # 动态链接库管理命令
ldd `which cmd` # 查看命令的依赖库
dist-upgrade # 会改变配置文件,改变旧的依赖关系,改变系统版本
/boot/grub/grub.conf # grub启动项配置
ps -mfL <PID> # 查看指定进程启动的线程 线程数受 max user processes 限制
ps uxm |wc -l # 查看当前用户占用的进程数 [包括线程] max user processes
top -p PID -H # 查看指定PID进程及线程
lsof |wc -l # 查看当前文件句柄数使用数量 open files
lsof |grep /lib # 查看加载库文件
sysctl -a # 查看当前所有系统内核参数
sysctl -p # 修改内核参数/etc/sysctl.conf,让/etc/rc.d/rc.sysinit读取生效
strace -p pid # 跟踪系统调用
ps -eo "%p %C %z %a"|sort -k3 -n # 把进程按内存使用大小排序
strace uptime 2>&1|grep open # 查看命令打开的相关文件
grep Hugepagesize /proc/meminfo # 内存分页大小
mkpasswd -l 8 -C 2 -c 2 -d 4 -s 0 # 随机生成指定类型密码
echo 1 > /proc/sys/net/ipv4/tcp_syncookies # 使TCP SYN Cookie 保护生效 # "SYN Attack"是一种拒绝服务的攻击方式
grep Swap /proc/25151/smaps |awk '{a+=$2}END{print a}' # 查询某pid使用的swap大小

开机启动脚本顺序{

/etc/profile
/etc/profile.d/*.sh
~/bash_profile
~/.bashrc
/etc/bashrc

}

进程管理{

ps -eaf # 查看所有进程
kill -9 PID # 强制终止某个PID进程
kill -15 PID # 安全退出 需程序内部处理信号
cmd &    # 命令后台运行
nohup cmd & # 后台运行不受shell退出影响
ctrl+z # 将前台放入后台(暂停)
jobs # 查看后台运行程序
bg 2 # 启动后台暂停进程
fg 2 # 调回后台进程
pstree # 进程树
vmstat 1 9 # 每隔一秒报告系统性能信息9次
sar # 查看cpu等状态
lsof file # 显示打开指定文件的所有进程
lsof -i:32768 # 查看端口的进程
renice +1 180 # 把180号进程的优先级加1

ps{

ps aux |grep -v USER | sort -nk +4 | tail  #显示消耗内存最多的10个运行中的进程,以内存使用量排序.cpu +3
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
%CPU # 进程的cpu占用率
%MEM # 进程的内存占用率
VSZ # 进程虚拟大小,单位K(即总占用内存大小,包括真实内存和虚拟内存)
RSS # 进程使用的驻留集大小即实际物理内存大小
START # 进程启动时间和日期
占用的虚拟内存大小 = VSZ - RSS

ps -eo pid,lstart,etime,args # 查看进程启动时间

}

top{

前五行是系统整体的统计信息。
第一行: 任务队列信息,同 uptime 命令的执行结果。内容如下:
01:06:48 当前时间
up 1:22 系统运行时间,格式为时:分
1 user 当前登录用户数
load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。
三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

第二、三行:为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:
Tasks: 29 total 进程总数
1 running 正在运行的进程数
28 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s): 0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0% hi
0.0% si

第四、五行:为内存信息。内容如下:
Mem: 191272k total 物理内存总量
173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量。
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
该数值即为这些内容已存在于内存中的交换区的大小。
相应的内存再次被换出时可不必再对交换区写入。

进程信息区,各列的含义如下: # 显示各个进程的详细信息

序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程 父进程在但并不等待子进程
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

}

列出正在占用swap的进程{

#!/bin/bash
echo -e "PIDttSwapttProc_Name"
# 拿出/proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息)
for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`
do
# 让进程释放swap的方法只有一个:就是重启该进程。或者等其自动释放。放
# 如果进程会自动释放,那么我们就不会写脚本来找他了,找他都是因为他没有自动释放。
# 所以我们要列出占用swap并需要重启的进程,但是init这个进程是系统里所有进程的祖先进程
# 重启init进程意味着重启系统,这是万万不可以的,所以就不必检测他了,以免对系统造成影响。
if [ $pid -eq 1 ];then continue;fi
grep -q "Swap" /proc/$pid/smaps 2>/dev/null
if [ $? -eq 0 ];then
swap=$(grep Swap /proc/$pid/smaps
| gawk '{ sum+=$2;} END{ print sum }')
proc_name=$(ps aux | grep -w "$pid" | grep -v grep
| awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')
if [ $swap -gt 0 ];then
echo -e "${pid}t${swap}t${proc_name}"
fi
fi
done | sort -k2 -n | awk -F't' '{
pid[NR]=$1;
size[NR]=$2;
name[NR]=$3;
}
END{
for(id=1;id<=length(pid);id++)
{
if(size[id]<1024)
printf("%-10st%15sKBt%sn",pid[id],size[id],name[id]);
else if(size[id]<1048576)
printf("%-10st%15.2fMBt%sn",pid[id],size[id]/1024,name[id]);
else
printf("%-10st%15.2fGBt%sn",pid[id],size[id]/1048576,name[id]);
}
}'

}

linux操作系统提供的信号{

kill -l # 查看linux提供的信号
trap "echo aaa" 2 3 15 # shell使用 trap 捕捉退出信号

# 发送信号一般有两种原因:
# 1(被动式) 内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
# 2(主动式) 通过系统调用kill来向指定进程发送信号
# 进程结束信号 SIGTERM 和 SIGKILL 的区别: SIGTERM 比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。
# 如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。

SIGHUP 1 A # 终端挂起或者控制进程终止
SIGINT 2 A # 键盘终端进程(如control+c)
SIGQUIT 3 C # 键盘的退出键被按下
SIGILL 4 C # 非法指令
SIGABRT 6 C # 由abort(3)发出的退出指令
SIGFPE 8 C # 浮点异常
SIGKILL 9 AEF # Kill信号 立刻停止
SIGSEGV 11 C # 无效的内存引用
SIGPIPE 13 A # 管道破裂: 写一个没有读端口的管道
SIGALRM 14 A # 闹钟信号 由alarm(2)发出的信号
SIGTERM 15 A # 终止信号,可让程序安全退出 kill -15
SIGUSR1 30,10,16 A # 用户自定义信号1
SIGUSR2 31,12,17 A # 用户自定义信号2
SIGCHLD 20,17,18 B # 子进程结束自动向父进程发送SIGCHLD信号
SIGCONT 19,18,25 # 进程继续(曾被停止的进程)
SIGSTOP 17,19,23 DEF # 终止进程
SIGTSTP 18,20,24 D # 控制终端(tty)上按下停止键
SIGTTIN 21,21,26 D # 后台进程企图从控制终端读
SIGTTOU 22,22,27 D # 后台进程企图从控制终端写

缺省处理动作一项中的字母含义如下:
A 缺省的动作是终止进程
B 缺省的动作是忽略此信号,将该信号丢弃,不做处理
C 缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。
D 缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用)
E 信号不能被捕获
F 信号不能被忽略
}

系统性能状态{

vmstat 1 9

r # 等待执行的任务数。当这个值超过了cpu线程数,就会出现cpu瓶颈。
b # 等待IO的进程数量,表示阻塞的进程。
swpd # 虚拟内存已使用的大小,如大于0,表示机器物理内存不足,如不是程序内存泄露,那么该升级内存。
free # 空闲的物理内存的大小
buff # 已用的buff大小,对块设备的读写进行缓冲
cache # cache直接用来记忆我们打开的文件,给文件做缓冲,(把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
inact # 非活跃内存大小,即被标明可回收的内存,区别于free和active -a选项时显示
active # 活跃的内存大小 -a选项时显示
si # 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露,要查找耗内存进程解决掉。
so # 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi # 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte
bo # 块设备每秒发送的块数量,例如读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in # 每秒CPU的中断次数,包括时间中断。in和cs这两个值越大,会看到由内核消耗的cpu时间会越多
cs # 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用。
us # 用户进程执行消耗cpu时间(user time) us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施
sy # 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id # 空闲 CPU时间,一般来说,id + us + sy = 100,一般认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt # 等待IOCPU时间。Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

如果 r 经常大于4,且id经常少于40,表示cpu的负荷很重。
如果 pi po 长期不等于0,表示内存不足。
如果 b 队列经常大于3,表示io性能不好。

}

}

日志管理{

history # 历时命令默认1000条
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 让history命令显示具体时间
history -c # 清除记录命令
cat $HOME/.bash_history # 历史命令记录文件
lastb -a # 列出登录系统失败的用户相关信息 清空二进制日志记录文件 echo > /var/log/btmp
last # 查看登陆过的用户信息 清空二进制日志记录文件 echo > /var/log/wtmp 默认打开乱码
who /var/log/wtmp # 查看登陆过的用户信息
lastlog # 用户最后登录的时间
tail -f /var/log/messages # 系统日志
tail -f /var/log/secure # ssh日志

}

selinux{

sestatus -v # 查看selinux状态
getenforce # 查看selinux模式
setenforce 0 # 设置selinux为宽容模式(可避免阻止一些操作)
semanage port -l # 查看selinux端口限制规则
semanage port -a -t http_port_t -p tcp 8000 # 在selinux中注册端口类型
vi /etc/selinux/config # selinux配置文件
SELINUX=enfoceing # 关闭selinux 把其修改为 SELINUX=disabled

}

查看剩余内存{

free -m
#-/+ buffers/cache: 6458 1649
#6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器)
#linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小

}

系统信息{

uname -a # 查看Linux内核版本信息
cat /proc/version # 查看内核版本
cat /etc/issue # 查看系统版本
lsb_release -a # 查看系统版本 需安装 centos-release
locale -a # 列出所有语系
locale # 当前环境变量中所有编码
hwclock # 查看时间
who # 当前在线用户
w # 当前在线用户
whoami # 查看当前用户名
logname # 查看初始登陆用户名
uptime # 查看服务器启动时间
sar -n DEV 1 10 # 查看网卡网速流量
dmesg # 显示开机信息
lsmod # 查看内核模块

}

硬件信息{

more /proc/cpuinfo # 查看cpu信息
lscpu # 查看cpu信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 查看cpu型号和逻辑核心数
getconf LONG_BIT # cpu运行的位数
cat /proc/cpuinfo | grep 'physical id' |sort| uniq -c # 物理cpu个数
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l # 结果大于0支持64位
cat /proc/cpuinfo|grep flags # 查看cpu是否支持虚拟化 pae支持半虚拟化 IntelVT 支持全虚拟化
more /proc/meminfo # 查看内存信息
dmidecode # 查看全面硬件信息
dmidecode | grep "Product Name" # 查看服务器型号
dmidecode | grep -P -A5 "Memorys+Device" | grep Size | grep -v Range # 查看内存插槽
cat /proc/mdstat # 查看软raid信息
cat /proc/scsi/scsi # 查看Dell硬raid信息(IBM、HP需要官方检测工具)
lspci # 查看硬件信息
lspci|grep RAID # 查看是否支持raid
lspci -vvv |grep Ethernet # 查看网卡型号
lspci -vvv |grep Kernel|grep driver # 查看驱动模块
modinfo tg2 # 查看驱动版本(驱动模块)
ethtool -i em1 # 查看网卡驱动版本
ethtool em1 # 查看网卡带宽

}

终端快捷键{

Ctrl+A   # 行前
Ctrl+E   # 行尾
Ctrl+S   # 终端锁屏
Ctrl+Q  # 解锁屏
Ctrl+D    # 退出

}

开机启动模式{

vi /etc/inittab
id:3:initdefault: # 3为多用户命令
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now # 注释此行 禁止 ctrl+alt+del 关闭计算机

}

终端提示显示{

echo $PS1 # 环境变量控制提示显示
PS1='[u@ H w A @#]$'
PS1='[u@h W]$'

}

定时任务{

at 5pm + 3 days /bin/ls # 单次定时任务 指定三天后下午5:00执行/bin/ls

crontab -e # 编辑周期任务
#分钟 小时 天 月 星期 命令或脚本
1,30 1-3/2 * * * 命令或脚本 >> file.log 2>&1
echo "40 7 * * 2 /root/sh">>/var/spool/cron/root # 直接将命令写入周期任务
crontab -l # 查看自动周期性任务
crontab -r # 删除自动周期性任务
cron.deny和cron.allow # 禁止或允许用户使用周期任务
service crond start|stop|restart # 启动自动周期性服务

}

date{

星期日[SUN] 星期一[MON] 星期二[TUE] 星期三[WED] 星期四[THU] 星期五[FRI] 星期六[SAT]
一月[JAN] 二月[FEB] 三月[MAR] 四月[APR] 五月[MAY] 六月[JUN] 七月[JUL] 八月[AUG] 九月[SEP] 十月[OCT] 十一月[NOV] 十二月[DEC]

date -s 20091112 # 设日期
date -s 18:30:50 # 设时间
date -d "7 days ago" +%Y%m%d # 7天前日期
date -d "5 minute ago" +%H:%M # 5分钟前时间
date -d "1 month ago" +%Y%m%d # 一个月前
date -d '1 days' +%Y-%m-%d # 一天后
date -d '1 hours' +%H:%M:%S # 一小时后
date +%Y-%m-%d -d '20110902' # 日期格式转换
date +%Y-%m-%d_%X # 日期和时间
date +%N # 纳秒
date -d "2012-08-13 14:00:23" +%s # 换算成秒计算(1970年至今的秒数)
date -d "@1363867952" +%Y-%m-%d-%T # 将时间戳换算成日期
date -d "1970-01-01 UTC 1363867952 seconds" +%Y-%m-%d-%T # 将时间戳换算成日期
date -d "`awk -F. '{print $1}' /proc/uptime` second ago" +"%Y-%m-%d %H:%M:%S" # 格式化系统启动时间(多少秒前)

}

limits.conf{

ulimit -SHn 65535 # 临时设置文件描述符大小 进程最大打开文件柄数 还有socket最大连接数, 等同配置 nofile
ulimit -SHu 65535 # 临时设置用户最大进程数
ulimit -a # 查看

/etc/security/limits.conf

# 文件描述符大小 open files
# lsof |wc -l 查看当前文件句柄数使用数量
* soft nofile 16384 # 设置太大,进程使用过多会把机器拖死
* hard nofile 32768

# 用户最大进程数 max user processes
# echo $((`ps uxm |wc -l`-`ps ux |wc -l`)) 查看当前用户占用的进程数 [包括线程]
user soft nproc 16384
user hard nproc 32768

# 如果/etc/security/limits.d/有配置文件,将会覆盖/etc/security/limits.conf里的配置
# 即/etc/security/limits.d/的配置文件里就不要有同样的参量设置
/etc/security/limits.d/90-nproc.conf # centos6.3的默认这个文件会覆盖 limits.conf
user soft nproc 16384
user hard nproc 32768

sysctl -p # 修改配置文件后让系统生效

}

百万长链接设置{

# 内存消耗需要较大
vim /root/.bash_profile
# 添加如下2行,退出bash重新登陆
echo 20000500 > /proc/sys/fs/nr_open
ulimit -n 10000000

}

libc.so故障修复{

# 由于升级glibc导致libc.so不稳定,突然报错,幸好还有未退出的终端
grep: error while loading shared libraries: /lib64/libc.so.6: ELF file OS ABI invalid

# 看看当前系统有多少版本 libc.so
ls /lib64/libc-[tab]

# 更改环境变量指向其他 libc.so 文件测试
export LD_PRELOAD=/lib64/libc-2.7.so # 如果不改变LD_PRELOAD变量,ln不能用,需要使用 /sbin/sln 命令做链接

# 当前如果好使了,在执行下面强制替换软链接。如不好使,测试其他版本的libc.so文件
ln -f -s /lib64/libc-2.7.so /lib64/libc.so.6

}

sudo{

echo myPassword | sudo -S ls /tmp # 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备
visudo # sudo命令权限添加 /etc/sudoers
用户 别名(可用all)=NOPASSWD:命令1,命令2
user ALL=NOPASSWD:/bin/su # 免root密码切换root身份
wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart
UserName ALL=(ALL) ALL
UserName ALL=(ALL) NOPASSWD: ALL
peterli ALL=(ALL) NOPASSWD:/sbin/service
Defaults requiretty # sudo不允许后台运行,注释此行既允许
Defaults !visiblepw # sudo不允许远程,去掉!既允许

}

grub开机启动项添加{

vim /etc/grub.conf
title ms-dos
rootnoverify (hd0,0)
chainloader +1

}

stty{

#stty时一个用来改变并打印终端行设置的常用命令

stty iuclc # 在命令行下禁止输出大写
stty -iuclc # 恢复输出大写
stty olcuc # 在命令行下禁止输出小写
stty -olcuc # 恢复输出小写
stty size # 打印出终端的行数和列数
stty eof "string" # 改变系统默认ctrl+D来表示文件的结束
stty -echo # 禁止回显
stty echo # 打开回显
stty -echo;read;stty echo;read # 测试禁止回显
stty igncr # 忽略回车符
stty -igncr # 恢复回车符
stty erase '#' # 将#设置为退格字符
stty erase '^?' # 恢复退格字符

定时输入{

timeout_read(){
timeout=$1
old_stty_settings=`stty -g`  # save current settings
stty -icanon min 0 time 100  # set 10seconds,not 100seconds
eval read varname   # =read $varname
stty "$old_stty_settings"   # recover settings
}

read -t 10 varname # 更简单的方法就是利用read命令的-t选项

}

检测用户按键{

#!/bin/bash
old_tty_settings=$(stty -g) # 保存老的设置(为什么?).
stty -icanon
Keypress=$(head -c1) # 或者使用$(dd bs=1 count=1 2> /dev/null)
echo "Key pressed was ""$Keypress""."
stty "$old_tty_settings" # 恢复老的设置.
exit 0

}

}

iptables{

内建三个表:nat mangle 和 filter
filter预设规则表,有INPUT、FORWARD 和 OUTPUT 三个规则链
vi /etc/sysconfig/iptables # 配置文件
INPUT # 进入
FORWARD # 转发
OUTPUT # 出去
ACCEPT # 将封包放行
REJECT # 拦阻该封包
DROP # 丢弃封包不予处理
-A # 在所选择的链(INPUT等)末添加一条或更多规则
-D # 删除一条
-E # 修改
-p # tcp、udp、icmp 0相当于所有all !取反
-P # 设置缺省策略(与所有链都不匹配强制使用此策略)
-s # IP/掩码 (IP/24) 主机名、网络名和清楚的IP地址 !取反
-j # 目标跳转,立即决定包的命运的专用内建目标
-i # 进入的(网络)接口 [名称] eth0
-o # 输出接口[名称]
-m # 模块
--sport # 源端口
--dport # 目标端口

iptables -F # 将防火墙中的规则条目清除掉 # 注意: iptables -P INPUT ACCEPT
iptables-restore < 规则文件 # 导入防火墙规则
/etc/init.d/iptables save # 保存防火墙设置
/etc/init.d/iptables restart # 重启防火墙服务
iptables -L -n # 查看规则
iptables -t nat -nL # 查看转发

iptables实例{

iptables -L INPUT # 列出某规则链中的所有规则
iptables -X allowed # 删除某个规则链 ,不加规则链,清除所有非内建的
iptables -Z INPUT # 将封包计数器归零
iptables -N allowed # 定义新的规则链
iptables -P INPUT DROP # 定义过滤政策
iptables -A INPUT -s 192.168.1.1 # 比对封包的来源IP # ! 192.168.0.0/24 ! 反向对比
iptables -A INPUT -d 192.168.1.1 # 比对封包的目的地IP
iptables -A INPUT -i eth0 # 比对封包是从哪片网卡进入
iptables -A FORWARD -o eth0 # 比对封包要从哪片网卡送出 eth+表示所有的网卡
iptables -A INPUT -p tcp # -p ! tcp 排除tcp以外的udp、icmp。-p all所有类型
iptables -D INPUT 8 # 从某个规则链中删除一条规则
iptables -D INPUT --dport 80 -j DROP # 从某个规则链中删除一条规则
iptables -R INPUT 8 -s 192.168.0.1 -j DROP # 取代现行规则
iptables -I INPUT 8 --dport 80 -j ACCEPT # 插入一条规则
iptables -A INPUT -i eth0 -j DROP # 其它情况不允许
iptables -A INPUT -p tcp -s IP -j DROP # 禁止指定IP访问
iptables -A INPUT -p tcp -s IP --dport port -j DROP # 禁止指定IP访问端口
iptables -A INPUT -s IP -p tcp --dport port -j ACCEPT # 允许在IP访问指定端口
iptables -A INPUT -p tcp --dport 22 -j DROP # 禁止使用某端口
iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP # 禁止icmp端口
iptables -A INPUT -i eth0 -p icmp -j DROP # 禁止icmp端口
iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP # 阻止所有没有经过你系统授权的TCP连接
iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT # IP包流量限制
iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT # 除192.168.62.1外,禁止其它人ping我的主机
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent --update --seconds 5 --hitcount 20 --rttl --name WEB --rsource -j DROP # 可防御cc攻击(未测试)

}

iptables配置实例文件{

# Generated by iptables-save v1.2.11 on Fri Feb 9 12:10:37 2007
*filter
:INPUT ACCEPT [637:58967]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [5091:1301533]
# 允许的IP或IP段访问 建议多个
-A INPUT -s 127.0.0.1 -p tcp -j ACCEPT
-A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT
# 开放对外开放端口
-A INPUT -p tcp --dport 80 -j ACCEPT
# 指定某端口针对IP开放
-A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT
# 拒绝所有协议(INPUT允许)
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
# 允许已建立的或相关连的通行
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 拒绝ping
-A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Fri Feb 9 12:10:37 2007

}

iptables配置实例{

# 允许某段IP访问任何端口
iptables -A INPUT -s 192.168.0.3/24 -p tcp -j ACCEPT
# 设定预设规则 (拒绝所有的数据包,再允许需要的,如只做WEB服务器.还是推荐三个链都是DROP)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 注意: 直接设置这三条会掉线
# 开启22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 如果OUTPUT 设置成DROP的,要写上下面一条
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
# 注:不写导致无法SSH.其他的端口一样,OUTPUT设置成DROP的话,也要添加一条链
# 如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
# 做WEB服务器,开启80端口 ,其他同理
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 做邮件服务器,开启25,110端口
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# 允许icmp包通过,允许ping
iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)
# 允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)

}

centos6的iptables基本配置{
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 222.186.135.61 -p tcp -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
}

添加网段转发{

# 例如通过vpn上网
echo 1 > /proc/sys/net/ipv4/ip_forward # 在内核里打开ip转发功能
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE # 添加网段转发
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.0.0.0 -o eth0 -j SNAT --to 192.168.10.158 # 原IP网段经过哪个网卡IP出去
iptables -t nat -nL # 查看转发

}

端口映射{

# 内网通过有外网IP的机器映射端口
# 内网主机添加路由
route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.20.111 # 内网需要添加默认网关,并且网关开启转发
# 网关主机
echo 1 > /proc/sys/net/ipv4/ip_forward # 在内核里打开ip转发功能
iptables -t nat -A PREROUTING -d 外网IP -p tcp --dport 9999 -j DNAT --to 10.10.20.55:22 # 进入
iptables -t nat -A POSTROUTING -s 10.10.20.0/24 -j SNAT --to 外网IP # 转发回去
iptables -t nat -nL # 查看转发

}

}

}

4 服务{

/etc/init.d/sendmail start # 启动服务
/etc/init.d/sendmail stop # 关闭服务
/etc/init.d/sendmail status # 查看服务当前状态
/date/mysql/bin/mysqld_safe --user=mysql & # 启动mysql后台运行
vi /etc/rc.d/rc.local # 开机启动执行 可用于开机启动脚本
/etc/rc.d/rc3.d/S55sshd # 开机启动和关机关闭服务连接 # S开机start K关机stop 55级别 后跟服务名
ln -s -f /date/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd # 将启动程序脚本连接到开机启动目录
ipvsadm -ln # lvs查看后端负载机并发
ipvsadm -C # lvs清除规则
xm list # 查看xen虚拟主机列表
virsh # 虚拟化(xenkvm)管理工具 yum groupinstall Virtual*
./bin/httpd -M # 查看httpd加载模块
httpd -t -D DUMP_MODULES # rpm包httpd查看加载模块
echo 内容| /bin/mail -s "标题" 收件箱 -f 发件人 # 发送邮件
"`echo "内容"|iconv -f utf8 -t gbk`" | /bin/mail -s "`echo "标题"|iconv -f utf8 -t gbk`" 收件箱 # 解决邮件乱码
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # 检测nagios配置文件

chkconfig{

chkconfig 服务名 on|off|set # 设置非独立服务启状态
chkconfig --level 35 httpd off # 让服务不自动启动
chkconfig --level 35 httpd on # 让服务自动启动 35指的是运行级别
chkconfig --list # 查看所有服务的启动状态
chkconfig --list |grep httpd # 查看某个服务的启动状态
chkconfig –-list [服务名称] # 查看服务的状态

}

nginx{

yum install -y make gcc openssl-devel pcre-devel bzip2-devel libxml2 libxml2-devel curl-devel libmcrypt-devel libjpeg libjpeg-devel libpng libpng-devel openssl

groupadd nginx
useradd nginx -g nginx -M -s /sbin/nologin

mkdir -p /opt/nginx-tmp

wget
tar fxz ngx_cache_purge-1.6.tar.gz
# ngx_cache_purge 清除指定url缓存
# 假设一个URL为
# 通过访问 就可以清除该URL的缓存。

tar zxvpf nginx-1.4.4.tar.gz
cd nginx-1.4.4

# ./configure --help
# --with # 默认不加载 需指定编译此参数才使用
# --without # 默认加载,可用此参数禁用
# --add-module=path # 添加模块的路径
# --add-module=/opt/ngx_module_upstream_check # nginx 代理状态页面
# ngx_module_upstream_check 编译前需要打对应版本补丁 patch -p1 < /opt/nginx_upstream_check_module/check_1.2.6+.patch
# --add-module=/opt/ngx_module_memc # 将请求页面数据存放在 memcached中
# --add-module=/opt/ngx_module_lua # 支持lua脚本 yum install lua-devel lua

./configure
--user=nginx
--group=nginx
--prefix=/usr/local/nginx
--pid-path=/usr/local/nginx/nginx.pid
--lock-path=/usr/local/nginx/nginx.lock
--with-http_ssl_module
--with-http_realip_module
--with-http_gzip_static_module
--with-http_stub_status_module
--add-module=/opt/ngx_cache_purge-1.6
--http-client-body-temp-path=/opt/nginx-tmp/client
--http-proxy-temp-path=/opt/nginx-tmp/proxy
--http-fastcgi-temp-path=/opt/nginx-tmp/fastcgi
--http-uwsgi-temp-path=/opt/nginx-tmp/uwsgi
--http-scgi-temp-path=/opt/nginx-tmp/scgi

make && make install

/usr/local/nginx/sbin/nginx –t # 检查Nginx配置文件 但并不执行
/usr/local/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf # 检查Nginx配置文件
/usr/local/nginx/sbin/nginx # 启动nginx
/usr/local/nginx/sbin/nginx -s reload # 重载配置
/usr/local/nginx/sbin/nginx -s stop # 关闭nginx服务

}

httpd{

编译参数{

# so模块用来提供DSO支持的apache核心模块
# 如果编译中包含任何DSO模块,则mod_so会被自动包含进核心。
# 如果希望核心能够装载DSO,但不实际编译任何DSO模块,则需明确指定"--enable-so=static"

./configure --prefix=/usr/local/apache --enable-so --enable-mods-shared=most --enable-rewrite --enable-forward # 实例编译

--with-mpm=worker # 已worker方式运行
--with-apxs=/usr/local/apache/bin/apxs # 制作apache的动态模块DSO rpm包 httpd-devel #编译模块 apxs -i -a -c mod_foo.c
--enable-so # 让Apache可以支持DSO模式
--enable-mods-shared=most # 告诉编译器将所有标准模块都动态编译为DSO模块
--enable-rewrite # 支持地址重写功能
--enable-module=most # 用most可以将一些不常用的,不在缺省常用模块中的模块编译进来
--enable-mods-shared=all # 意思是动态加载所有模块,如果去掉-shared话,是静态加载所有模块
--enable-expires # 可以添加文件过期的限制,有效减轻服务器压力,缓存在用户端,有效期内不会再次访问服务器,除非按f5刷新,但也导致文件更新不及时
--enable-deflate # 压缩功能,网页可以达到40%的压缩,节省带宽成本,但会对cpu压力有一点提高
--enable-headers # 文件头信息改写,压缩功能需要
--disable-MODULE # 禁用MODULE模块(仅用于基本模块)
--enable-MODULE=shared # 将MODULE编译为DSO(可用于所有模块)
--enable-mods-shared=MODULE-LIST # 将MODULE-LIST中的所有模块都编译成DSO(可用于所有模块)
--enable-modules=MODULE-LIST # 将MODULE-LIST静态连接进核心(可用于所有模块)

# 上述 MODULE-LIST 可以是:
1、用引号界定并且用空格分隔的模块名列表 --enable-mods-shared='headers rewrite dav'
2、"most"(大多数模块) --enable-mods-shared=most
3、"all"(所有模块)

}

转发{

#针对非80端口的请求处理
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*) [L,R]

RewriteCond %{HTTP_HOST} ^ss.aa.com [NC]
RewriteRule ^(.*) [L,R=301]
#RewriteRule 只对?前处理,所以会把?后的都保留下来
#在转发后地址后加?即可取消RewriteRule保留的字符
#R的含义是redirect,即重定向,该请求不会再被apache交给后端处理,而是直接返回给浏览器进行重定向跳转。301是返回的http状态码,具体可以参考http rfc文档,跳转都是3XX。
#L是last,即最后一个rewrite规则,如果请求被此规则命中,将不会继续再向下匹配其他规则。

}

}

mysql源码安装{

groupadd mysql
useradd mysql -g mysql -M -s /bin/false
tar zxvf mysql-5.0.22.tar.gz
cd mysql-5.0.22
./configure --prefix=/usr/local/mysql
--with-client-ldflags=-all-static
--with-mysqld-ldflags=-all-static
--with-mysqld-user=mysql
--with-extra-charsets=all
--with-unix-socket-path=/var/tmp/mysql.sock
make && make install
# 生成mysql用户数据库和表文件,在安装包中输入
scripts/mysql_install_db --user=mysql
vi ~/.bashrc
export PATH="$PATH: /usr/local/mysql/bin"
# 配置文件,有large,medium,small三个,根据机器性能选择
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
cd /usr/local
chmod 750 mysql -R
chgrp mysql mysql -R
chown mysql mysql/var -R
cp /usr/local/mysql/libexec/mysqld mysqld.old
ln -s /usr/local/mysql/bin/mysql /sbin/mysql
ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin
ln -s -f /usr/local/mysql/bin/mysqld_safe /etc/rc.d/rc3.d/S15mysql5
ln -s -f /usr/local/mysql/bin/mysqld_safe /etc/rc.d/rc0.d/K15mysql5

}

mysql常用命令{

./mysql/bin/mysqld_safe --user=mysql & # 启动mysql服务
./mysql/bin/mysqladmin -uroot -p -S ./mysql/data/mysql.sock shutdown # 停止mysql服务
mysqlcheck -uroot -p -S mysql.sock --optimize --databases account # 检查、修复、优化MyISAM表
mysqlbinlog slave-relay-bin.000001 # 查看二进制日志(报错加绝对路径)
mysqladmin -h myhost -u root -p create dbname # 创建数据库

flush privileges; # 刷新
show databases; # 显示所有数据库
use dbname; # 打开数据库
show tables; # 显示选中数据库中所有的表
desc tables; # 查看表结构
drop database name; # 删除数据库
drop table name; # 删除表
create database name; # 创建数据库
select 列名称 from 表名称; # 查询
show grants for repl; # 查看用户权限
show processlist; # 查看mysql进程
select user(); # 查看所有用户
show slave statusG; # 查看主从状态
show variables; # 查看所有参数变量
show status; # 运行状态
show table status # 查看表的引擎状态
drop table if exists user # 表存在就删除
create table if not exists user # 表不存在就创建
select host,user,password from user; # 查询用户权限 先use mysql
create table ka(ka_id varchar(6),qianshu int); # 创建表
SHOW VARIABLES LIKE 'character_set_%'; # 查看系统的字符集和排序方式的设定
show variables like '%timeout%'; # 查看超时(wait_timeout)
delete from user where user=''; # 删除空用户
delete from user where user='sss' and host='localhost' ; # 删除用户
drop user 'sss'@'localhost'; # 使用此方法删除用户更为靠谱
ALTER TABLE mytable ENGINE = MyISAM ; # 改变现有的表使用的存储引擎
SHOW TABLE STATUS from 库名 where Name='表名'; # 查询表引擎
CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB # 创建表指定存储引擎的类型(MyISAM或INNODB)
grant replication slave on *.* to '用户'@'%' identified by '密码'; # 创建主从复制用户
ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction); # 添加索引
alter table name add column accountid(列名) int(11) NOT NULL(字段不为空); # 插入字段
update host set monitor_state='Y',hostname='xuesong' where ip='192.168.1.1'; # 更新数据

自增表{

create table oldBoy (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(30) NOT NULL, age integer , sex CHAR(15) ); # 创建自增表
insert into oldBoy(name,age,sex) values(%s,%s,%s) # 自增插入数据

}

登录mysql的命令{

# 格式: mysql -h 主机地址 -u 用户名 -p 用户密码
mysql -h110.110.110.110 -P3306 -uroot -p
mysql -uroot -p -S /data1/mysql5/data/mysql.sock -A --default-character-set=GBK

}

shell执行mysql命令{

mysql -u root -p'123' xuesong < file.sql # 针对指定库执行sql文件中的语句,好处不需要转义特殊符号,一条语句可以换行.不指定库执行时语句中需要先use
mysql -u$username -p$passwd -h$dbhost -P$dbport -A -e "
use $dbname;
delete from data where date=('$date1');
" # 执行多条mysql命令
mysql -uroot -p -S mysql.sock -e "use db;alter table gift add column accountid int(11) NOT NULL;flush privileges;" # 不登陆mysql插入字段

}

备份数据库{

mysqldump -h host -u root -p --default-character-set=utf8 dbname >dbname_backup.sql # 不包括库名,还原需先创建库,在use
mysqldump -h host -u root -p --database --default-character-set=utf8 dbname >dbname_backup.sql # 包括库名,还原不需要创建库
/bin/mysqlhotcopy -u root -p # mysqlhotcopy只能备份MyISAM引擎
mysqldump -u root -p -S mysql.sock --default-character-set=utf8 dbname table1 table2 > /data/db.sql # 备份表
mysqldump -uroot -p123 -d database > database.sql # 备份数据库结构

innobackupex --user=root --password="" --defaults-file=/data/mysql5/data/my_3306.cnf --socket=/data/mysql5/data/mysql.sock --slave-info --stream=tar --tmpdir=/data/dbbackup/temp /data/dbbackup/ 2>/data/dbbackup/dbbackup.log | gzip 1>/data/dbbackup/db50.tar.gz # xtrabackup备份需单独安装软件 优点: 速度快,压力小,可直接恢复主从复制

}

还原数据库{

mysql -h host -u root -p dbname < dbname_backup.sql
source 路径.sql # 登陆mysql后还原sql文件

}

赋权限{

# 指定IP: $IP 本机: localhost 所有IP地址: % # 通常指定多条
grant all on zabbix.* to user@"$IP"; # 对现有账号赋予权限
grant select on database.* to user@"%" Identified by "passwd"; # 赋予查询权限(没有用户,直接创建)
grant all privileges on database.* to user@"$IP" identified by 'passwd'; # 赋予指定IP指定用户所有权限(不允许对当前库给其他用户赋权限)
grant all privileges on database.* to user@"localhost" identified by 'passwd' with grant option; # 赋予本机指定用户所有权限(允许对当前库给其他用户赋权限)
grant select, insert, update, delete on database.* to user@'ip'identified by "passwd"; # 开放管理操作指令
revoke all on *.* from user@localhost; # 回收权限

}

更改密码{

update user set password=password('passwd') where user='root'
mysqladmin -u root password 'xuesong'

}

mysql忘记密码后重置{

cd /data/mysql5
/data/mysql5/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
use mysql;
update user set password=password('123123') where user='root';

}

mysql主从复制失败恢复{

slave stop;
reset slave;
change master to master_host='10.10.10.110',master_port=3306,master_user='repl',master_password='repl',master_log_file='master-bin.000010',master_log_pos=107,master_connect_retry=60;
slave start;

}

sql语句使用变量{

use xuesong;
set @a=concat('my',weekday(curdate())); # 组合时间变量
set @sql := concat('CREATE TABLE IF NOT EXISTS ',@a,'( id INT(11) NOT NULL )'); # 组合sql语句
select @sql; # 查看语句
prepare create_tb from @sql; # 准备
execute create_tb; # 执行

}

检测mysql主从复制延迟{

1、在从库定时执行更新主库中的一个timeout数值
2、同时取出从库中的timeout值对比判断从库与主库的延迟

}

mysql慢查询{

开启慢查询日志{

# 配置文件 /etc/my.conf
[mysqld]
log-slow-queries=/var/lib/mysql/slowquery.log # 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log
long_query_time=5 # 记录超过的时间,默认为10s
log-queries-not-using-indexes # log下来没有使用索引的query,可以根据情况决定是否开启 可不加
log-long-format # 如果设置了,所有没有使用索引的查询也将被记录 可不加
# 直接修改生效
show variables like "%slow%"; # 查看慢查询状态
set global slow_query_log='ON'; # 开启慢查询日志 变量可能不同,看上句查询出来的变量

}

mysqldumpslow慢查询日志查看{

-s # 是order的顺序,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序
-t # 是top n的意思,即为返回前面多少条的数据
-g # 后边可以写一个正则匹配模式,大小写不敏感的

mysqldumpslow -s c -t 20 host-slow.log # 访问次数最多的20个sql语句
mysqldumpslow -s r -t 20 host-slow.log # 返回记录集最多的20个sql
mysqldumpslow -t 10 -s t -g "left join" host-slow.log # 按照时间返回前10条里面含有左连接的sql语句

show global status like '%slow%'; # 查看现在这个session有多少个慢查询
show variables like '%slow%'; # 查看慢查询日志是否开启,如果slow_query_log和log_slow_queries显示为on,说明服务器的慢查询日志已经开启
show variables like '%long%'; # 查看超时阀值
desc select * from wei where text='xishizhaohua'G; # 扫描整张表 tepe:ALL 没有使用索引 key:NULL
create index text_index on wei(text); # 创建索引

}

}

mysql操作次数查询{

select * from information_schema.global_status;

com_select
com_delete
com_insert
com_update

}

}

mongodb{

一、启动{

# 不启动认证
./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/
# 启动认证
./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/ --auth

# 配置文件方式启动
cat /opt/mongodb/mongodb.conf
port=27017 # 端口号
fork=true # 以守护进程的方式运行,创建服务器进程
auth=true # 开启用户认证
logappend=true # 日志采用追加方式
logpath=/opt/mongodb/mongodb.log # 日志输出文件路径
dbpath=/opt/mongodb/data/ # 数据库路径
shardsvr=true # 设置是否分片
maxConns=600 # 数据库的最大连接数
./mongod -f /opt/mongodb/mongodb.conf

# 其他参数
bind_ip # 绑定IP 使用mongo登录需要指定对应IP
journal # 开启日志功能,降低单机故障的恢复时间,取代dur参数
syncdelay # 系统同步刷新磁盘的时间,默认60秒
directoryperdb # 每个db单独存放目录,建议设置.与mysql独立表空间类似
repairpath # 执行repair时的临时目录.如果没开启journal,出现异常重启,必须执行repair操作
# mongodb没有参数设置内存大小.使用os mmap机制缓存数据文件,在数据量不超过内存的情况下,效率非常高.数据量超过系统可用内存会影响写入性能

}

二、关闭{

# 方法一:登录mongodb
./mongo
use admin
db.shutdownServer()

# 方法:kill传递信号 两种皆可
kill -2 pid
kill -15 pid

}

三、开启认证与用户管理{

./mongo # 先登录
use admin # 切换到admin库
db.addUser("root","123456") # 创建用户
db.addUser('zhansan','pass',true) # 如果用户的readOnly为true那么这个用户只能读取数据,添加一个readOnly用户zhansan
./mongo 127.0.0.1:27017/mydb -uroot -p123456 # 再次登录,只能针对用户所在库登录
#虽然是超级管理员,但是admin不能直接登录其他数据库,否则报错
#Fri Nov 22 15:03:21.886 Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:228
show collections # 查看链接状态 再次登录使用如下命令,显示错误未经授权
db.system.users.find(); # 查看创建用户信息
db.system.users.remove({user:"zhansan"}) # 删除用户

#恢复密码只需要重启mongodb 不加--auth参数

}

四、登录{

192.168.1.5:28017 # http登录后可查看状态
./mongo # 默认登录后打开 test 库
./mongo 192.168.1.5:27017/databaseName # 直接连接某个库 不存在则创建 启动认证需要指定对应库才可登录

}

五、查看状态{

#登录后执行命令查看状态
db.runCommand({"serverStatus":1})
globalLock # 表示全局写入锁占用了服务器多少时间(微秒)
mem # 包含服务器内存映射了多少数据,服务器进程的虚拟内存和常驻内存的占用情况(MB)
indexCounters # 表示B树在磁盘检索(misses)和内存检索(hits)的次数.如果这两个比值开始上升,就要考虑添加内存了
backgroudFlushing # 表示后台做了多少次fsync以及用了多少时间
opcounters # 包含每种主要擦撞的次数
asserts # 统计了断言的次数

#状态信息从服务器启动开始计算,如果过大就会复位,发送复位,所有计数都会复位,asserts中的roolovers值增加

#mongodb自带的命令
./mongostat
insert #每秒插入量
query #每秒查询量
update #每秒更新量
delete #每秒删除量
locked #锁定量
qr|qw #客户端查询排队长度(读|写)
ar|aw #活跃客户端量(读|写)
conn #连接数
time #当前时间

}

六、常用命令{

db.listCommands() # 当前MongoDB支持的所有命令(同样可通过运行命令db.runCommand({"listCommands" : `1})来查询所有命令)

db.runCommand({"buildInfo" : 1}) # 返回MongoDB服务器的版本号和服务器OS的相关信息。
db.runCommand({"collStats" : 集合名}) # 返回该集合的统计信息,包括数据大小,已分配存储空间大小,索引的大小等。
db.runCommand({"distinct" : 集合名, "key" : 键, "query" : 查询文档}) # 返回特定文档所有符合查询文档指定条件的文档的指定键的所有不同的值。
db.runCommand({"dropDatabase" : 1}) # 清空当前数据库的信息,包括删除所有的集合和索引。
db.runCommand({"isMaster" : 1}) # 检查本服务器是主服务器还是从服务器。
db.runCommand({"ping" : 1}) # 检查服务器链接是否正常。即便服务器上锁,该命令也会立即返回。
db.runCommand({"repaireDatabase" : 1}) # 对当前数据库进行修复并压缩,如果数据库特别大,这个命令会非常耗时。
db.runCommand({"serverStatus" : 1}) # 查看这台服务器的管理统计信息。
# 某些命令必须在admin数据库下运行,如下两个命令:
db.runCommand({"renameCollection" : 集合名, "to":集合名}) # 对集合重命名,注意两个集合名都要是完整的集合命名空间,如foo.bar, 表示数据库foo下的集合bar。
db.runCommand({"listDatabases" : 1}) # 列出服务器上所有的数据库

}

七、进程控制{

db.currentOp() # 查看活动进程
db.$cmd.sys.inprog.findOne() # 查看活动进程 与上面一样
opid # 操作进程号
op # 操作类型(查询更新)
ns # 命名空间,指操作的是哪个对象
query # 如果操作类型是查询,这里将显示具体的查询内容
lockType # 锁的类型,指明是读锁还是写锁

db.killOp(opid值) # 结束进程
db.$cmd.sys.killop.findOne({op:opid值}) # 结束进程

}

八、备份还原{

./mongoexport -d test -c t1 -o t1.dat # 导出JSON格式
-c # 指明导出集合
-d # 使用库
./mongoexport -d test -c t1 -csv -f num -o t1.dat # 导出csv格式
-csv # 指明导出csv格式
-f # 指明需要导出那些例

db.t1.drop() # 登录后删除数据
./mongoimport -d test -c t1 -file t1.dat # mongoimport还原JSON格式
./mongoimport -d test -c t1 -type csv --headerline -file t1.dat # mongoimport还原csv格式数据
--headerline # 指明不导入第一行 因为第一行是列名

./mongodump -d test -o /bak/mongodump # mongodump数据备份
./mongorestore -d test --drop /bak/mongodump/* # mongorestore恢复
--drop #恢复前先删除
db.t1.find() #查看

# mongodump 虽然能不停机备份,但市区了获取实时数据视图的能力,使用fsync命令能在运行时复制数据目录并且不会损坏数据
# fsync会强制服务器将所有缓冲区的数据写入磁盘.配合lock还阻止对数据库的进一步写入,知道释放锁为止
# 备份在从库上备份,不耽误读写还能保证实时快照备份
db.runCommand({"fsync":1,"lock":1}) # 执行强制更新与写入锁
db.$cmd.sys.unlock.findOne() # 解锁
db.currentOp() # 查看解锁是否正常

}

九、修复{

# 当停电或其他故障引起不正常关闭时,会造成部分数据损坏丢失
./mongod --repair # 修复操作:启动时候加上 --repair
# 修复过程:将所有文档导出,然后马上导入,忽略无效文档.完成后重建索引。时间较长,会丢弃损坏文档
# 修复数据还能起到压缩数据库的作用
db.repairDatabase() # 运行中的mongodb可使用 repairDatabase 修复当前使用的数据库
{"repairDatabase":1} # 通过驱动程序

}

十、python使用mongodb{

原文:

easy_install pymongo # 安装(python2.7+)
import pymongo
connection=pymongo.Connection('localhost',27017) # 创建连接
db = connection.test_database # 切换数据库
collection = db.test_collection # 获取collection
# db和collection都是延时创建的,在添加Document时才真正创建

文档添加, _id自动创建
import datetime
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts = db.posts
posts.insert(post)
ObjectId('...')

批量插入
new_posts = [{"author": "Mike",
"text": "Another post!",
"tags": ["bulk", "insert"],
"date": datetime.datetime(2009, 11, 12, 11, 14)},
{"author": "Eliot",
"title": "MongoDB is fun",
"text": "and pretty easy too!",
"date": datetime.datetime(2009, 11, 10, 10, 45)}]
posts.insert(new_posts)
[ObjectId('...'), ObjectId('...')]

获取所有collection
db.collection_names() # 相当于SQL的show tables

获取单个文档
posts.find_one()

查询多个文档
for post in posts.find():
post

加条件的查询
posts.find_one({"author": "Mike"})

高级查询
posts.find({"date": {"$lt": "d"}}).sort("author")

统计数量
posts.count()

加索引
from pymongo import ASCENDING, DESCENDING
posts.create_index([("date", DESCENDING), ("author", ASCENDING)])

查看查询语句的性能
posts.find({"date": {"$lt": "d"}}).sort("author").explain()["cursor"]
posts.find({"date": {"$lt": "d"}}).sort("author").explain()["nscanned"]

}

}

JDK安装{

chmod 744 jdk-1.7.0_79-linux-i586.bin
./jdk-1.7.0_79-linux-i586.bin
vi /etc/profile # 添加环境变量
JAVA_HOME=/usr/java/jdk1.7.0_79
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH CLASSPATH

. /etc/profile # 加载新的环境变量
jps -ml # 查看java进程
}

redis动态加内存{

./redis-cli -h 10.10.10.11 -p 6401
save # 保存当前快照
config get * # 列出所有当前配置
config get maxmemory # 查看指定配置
config set maxmemory 15360000000 # 动态修改最大内存配置参数

}

nfs{

# 依赖rpc服务通信 portmap[centos5] 或 rpcbind[centos6]
yum install nfs-utils portmap # centos5安装
yum install nfs-utils rpcbind # centos6安装

vim /etc/exports # 配置文件
# sync # 同步写入
# async # 暂存并非直接写入
# no_root_squash # 开放用户端使用root身份操作
# root_squash # 使用者身份为root则被压缩成匿名使用,即nobody,相对安全
# all_squash # 所有NFS的使用者身份都被压缩为匿名
/data/images 10.10.10.0/24(rw,sync,no_root_squash)

service portmap restart # 重启centos5的nfs依赖的rpc服务
service rpcbind restart # 重启centos6的nfs依赖的rpc服务
service nfs restart # 重启nfs服务 确保依赖 portmap 或 rpcbind 服务已启动
service nfs reload # 重载NFS服务配置文件
showmount -e # 服务端查看自己共享的服务
showmount -a # 显示已经与客户端连接上的目录信息
showmount -e 10.10.10.3 # 列出服务端可供使用的NFS共享 客户端测试能否访问nfs服务
mount -t nfs 10.10.10.3:/data/images/ /data/img # 挂载nfs 如果延迟影响大加参数 noac

# 服务端的 portmap 或 rpcbind 被停止后,nfs仍然工作正常,但是umout财会提示: not found / mounted or server not reachable 重启服务器的portmap 或 rpcbind 也无济于事。 nfs也要跟着重启,否则nfs工作仍然是不正常的。
# 同时已挂载会造成NFS客户端df卡住和挂载目录无法访问。请先用 mount 查看当前挂载情况,记录挂载信息,在强制卸载挂载目录,重新挂载
umount -f /data/img/ # 强制卸载挂载目录 如还不可以 umount -l /data/img/

nfsstat -c # 客户机发送和拒绝的RPC和NFS调用数目的信息
nfsstat -cn # 显示和打印与客户机NFS调用相关的信息
nfsstat -r # 显示和打印客户机和服务器的与RPC调用相关的信息
nfsstat –s # 显示关于服务器接收和拒绝的RPC和NFS调用数目的信息

}

hdfs{
hdfs --help # 所有参数

hdfs dfs -help # 运行文件系统命令在Hadoop文件系统
hdfs dfs -ls /logs # 查看
hdfs dfs -ls /user/ # 查看用户
hdfs dfs -cat
hdfs dfs -df
hdfs dfs -du
hdfs dfs -rm
hdfs dfs -tail

hdfs dfsadmin -help # hdfs集群节点管理
hdfs dfsadmin -report # 基本的文件系统统计信息
}

}

5 网络{

rz # 通过ssh上传小文件
sz # 通过ssh下载小文件
ifconfig eth0 down # 禁用网卡
ifconfig eth0 up # 启用网卡
ifup eth0:0 # 启用网卡
mii-tool em1 # 查看网线是否连接
traceroute www.baidu.com # 测试跳数
vi /etc/resolv.conf # 设置DNS nameserver IP 定义DNS服务器的IP地址
nslookup www.moon.com # 解析域名IP
dig -x www.baidu.com # 解析域名IP
dig +short txt hacker.wp.dg.cx # 通过 DNS 来读取 Wikipedia 的hacker词条
host -t txt hacker.wp.dg.cx # 通过 DNS 来读取 Wikipedia 的hacker词条
tcpdump tcp port 22 # 抓包
lynx # 文本上网
wget -P 路径 -O 重命名 http地址 # 下载 包名:wgetrc -q 安静
dhclient eth1 # 自动获取IP
mtr -r www.baidu.com # 测试网络链路节点响应时间 # trace ping 结合
ipcalc -m "$ip" -p "$num" # 根据IP和主机最大数计算掩码
curl -I www.baidu.com # 查看网页http头
curl -s www.baidu.com # 不显示进度
queryperf -d list -s DNS_IP -l 2 # BIND自带DNS压力测试 [list 文件格式:www.turku.fi A]
telnet ip port # 测试端口是否开放,有些服务可直接输入命令得到返回状态
echo "show " |nc $ip $port # 适用于telnet一类登录得到命令返回
nc -l -p port # 监听指定端口
nc -nv -z 10.10.10.11 1080 |grep succeeded # 检查主机端口是否开放
curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} $URL # 检查页面状态
curl -d "user=xuesong&pwd=123" # 提交web页面表单 需查看表单提交地址
curl -s # 通过IP138取本机出口外网IP
rsync -avzP -e "ssh -p 22" /dir user@$IP:/dir # 同步目录 # --delete 无差同步 删除目录下其它文件
sshpass -p "$passwd" rsync -avzP -e "ssh -p 22" /dir user@$IP:/dir/ # 指定密码避免交互同步目录
ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0 # 增加逻辑IP地址
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁ping
net rpc shutdown -I IP_ADDRESS -U username%password # 远程关掉一台WINDOWS机器
wget --random-wait -r -p -e robots=off -U Mozilla www.example.com # 递归方式下载整个网站

网卡流量查看{

watch more /proc/net/dev # 实时监控流量文件系统 累计值
iptraf # 网卡流量查看工具
nethogs -d 5 eth0 eth1 # 按进程实时统计网络流量 epel源nethogs

sar {
-n参数有6个不同的开关: DEV | EDEV | NFS | NFSD | SOCK | ALL
DEV显示网络接口信息
EDEV显示关于网络错误的统计数据
NFS统计活动的NFS客户端的信息
NFSD统计NFS服务器的信息
SOCK显示套 接字信息
ALL显示所有5个开关

sar -n DEV 1 10

rxpck/s # 每秒钟接收的数据包
txpck/s # 每秒钟发送的数据包
rxbyt/s # 每秒钟接收的字节数
txbyt/s # 每秒钟发送的字节数
rxcmp/s # 每秒钟接收的压缩数据包
txcmp/s # 每秒钟发送的压缩数据包
rxmcst/s # 每秒钟接收的多播数据包

}

}

netstat{

# 几十万并发的情况下netstat会没有响应,建议使用 ss 命令
-a # 显示所有连接中的Socket
-t # 显示TCP连接
-u # 显示UDP连接
-n # 显示所有已建立的有效连接
netstat -anlp # 查看链接
netstat -r # 查看路由表
}

ss{

# netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多
ss -s # 列出当前socket详细信息
ss -l # 显示本地打开的所有端口
ss -pl # 显示每个进程具体打开的socket
ss -ant # 显示所有TCP socket
ss -u -a # 显示所有UDP Socekt
ss dst 192.168.119.113 # 匹配远程地址
ss dst 192.168.119.113:http # 匹配远程地址和端口号
ss dst 192.168.119.113:3844 # 匹配远程地址和端口号
ss src 192.168.119.103:16021 # 匹配本地地址和端口号
ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有已建立的SMTP连接
ss -o state established '( dport = :http or sport = :http )' # 显示所有已建立的HTTP连接
ss -x src /tmp/.X11-unix/* # 找出所有连接X服务器的进程

}

并发数查看{

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV # 正在等待处理的请求
ESTABLISHED # 正常数据传输状态,既当前并发数
TIME_WAIT # 处理完毕,等待超时结束的请求
CLOSE_WAIT # 客户端异常关闭,没有完成4次挥手 如大量可能存在攻击行为

}

ssh{

ssh -p 22 user@192.168.1.209 # 从linux ssh登录另一台linux
ssh -p 22 root@192.168.1.209 CMD # 利用ssh操作远程主机
scp -P 22 文件 root@ip:/目录 # 把本地文件拷贝到远程主机
sshpass -p '密码' ssh -n root@$IP "echo hello" # 指定密码远程操作
ssh -o StrictHostKeyChecking=no $IP # ssh连接不提示yes
ssh -t "su -" # 指定伪终端 客户端以交互模式工作
scp root@192.168.1.209:远程目录 本地目录 # 把远程指定文件拷贝到本地
ssh -N -L2001:remotehost:80 user@somemachine # 用SSH创建端口转发通道
ssh -t host_A ssh host_B # 嵌套使用SSH
ssh -t -p 22 $user@$Ip /bin/su - root -c {$Cmd}; # 远程su执行命令 Cmd=""/sbin/ifconfig eth0""
ssh-keygen -t rsa # 生成密钥
ssh-copy-id -i xuesong@10.10.10.133 # 传送key
vi $HOME/.ssh/authorized_keys # 公钥存放位置
sshfs name@server:/path/to/folder /path/to/mount/point # 通过ssh挂载远程主机上的文件夹
fusermount -u /path/to/mount/point # 卸载ssh挂载的目录
ssh user@host cat /path/to/remotefile | diff /path/to/localfile - # 用DIFF对比远程文件跟本地文件
su - user -c "ssh user@192.168.1.1 "echo -e aa |mail -s test mail@163.com"" # 切换用户登录远程发送邮件

SSH反向连接{

# 外网A要控制内网B

ssh -NfR 1234:localhost:2223 user1@123.123.123.123 -p22 # 将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射
ss -ant # 这时在A主机上sshd会listen本地1234端口
# LISTEN 0 128 127.0.0.1:1234 *:*
ssh localhost -p1234 # 在A主机连接本地1234端口

}
}

网卡配置文件{

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.1.255
HWADDR=00:0C:29:3F:E1:EA
IPADDR=192.168.1.55
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.1.1
#ARPCHECK=no # 进制arp检查

}

route {

route # 查看路由表
route add default gw 192.168.1.1 dev eth0 # 添加默认路由
route add -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 添加静态路由网关
route del -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 删除静态路由网关

}

静态路由{

vim /etc/sysconfig/static-routes
any net 192.168.12.0/24 gw 192.168.0.254
any net 192.168.13.0/24 gw 192.168.0.254

}

解决ssh链接慢{

sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config
sed -i '/#UseDNS yes/aUseDNS no' /etc/ssh/sshd_config
/etc/init.d/sshd restart

}

ftp上传{

ftp -i -v -n $HOST <<END
user $USERNAME $PASSWORD
cd /ftp
mkdir data
cd data
mput *.tar.gz
bye
END

}

nmap{

nmap -PT 192.168.1.1-111 # 先ping在扫描主机开放端口
nmap -O 192.168.1.1 # 扫描出系统内核版本
nmap -sV 192.168.1.1-111 # 扫描端口的软件版本
nmap -sS 192.168.1.1-111 # 半开扫描(通常不会记录日志)
nmap -P0 192.168.1.1-111 # 不ping直接扫描
nmap -d 192.168.1.1-111 # 详细信息
nmap -D 192.168.1.1-111 # 无法找出真正扫描主机(隐藏IP)
nmap -p 20-30,139,60000- # 端口范围 表示:扫描20到30号端口,139号端口以及所有大于60000的端口
nmap -P0 -sV -O -v 192.168.30.251 # 组合扫描(不ping、软件版本、内核版本、详细信息)

# 不支持windows的扫描(可用于判断是否是windows)
nmap -sF 192.168.1.1-111
nmap -sX 192.168.1.1-111
nmap -sN 192.168.1.1-111

}

流量切分线路{

# 程序判断进入IP线路,设置服务器路由规则控制返回
vi /etc/iproute2/rt_tables
#添加一条策略
252 bgp2 #注意策略的序号顺序
ip route add default via 第二个出口上线IP(非默认网关) dev eth1 table bgp2
ip route add from 本机第二个ip table bgp2
#查看
ip route list table 252
ip rule list
#成功后将语句添加开机启动

}

snmp{

snmptranslate .1.3.6.1.2.1.1.3.0 # 查看映射关系
DISMAN-EVENT-MIB::sysUpTimeInstance
snmpdf -v 1 -c public localhost # SNMP监视远程主机的磁盘空间
snmpnetstat -v 2c -c public -a 192.168.6.53 # SNMP获取指定IP的所有开放端口状态
snmpwalk -v 2c -c public 10.152.14.117 .1.3.6.1.2.1.1.3.0 # SNMP获取主机启动时间
# MIB安装(ubuntu)
# sudo apt-get install snmp-mibs-downloader
# sudo download-mibs
snmpwalk -v 2c -c public 10.152.14.117 sysUpTimeInstance # SNMP通过MIB库获取主机启动时间

}

}

6 磁盘{

df -Ph # 查看硬盘容量
df -T # 查看磁盘分区格式
df -i # 查看inode节点 如果inode用满后无法创建文件
du -h 目录 # 检测目录下所有文件大小
du -sh * # 显示当前目录中子目录的大小
mount -l # 查看分区挂载情况
fdisk -l # 查看磁盘分区状态
fdisk /dev/hda3 # 分区
mkfs -t ext3 /dev/hda3 # 格式化分区
fsck -y /dev/sda6 # 对文件系统修复
lsof |grep delete # 释放进程占用磁盘空间 列出进程后,查看文件是否存在,不存在则kill掉此进程
tmpwatch -afv 10 /tmp # 删除10小时内未使用的文件 勿在重要目录使用
cat /proc/filesystems # 查看当前系统支持文件系统
mount -o remount,rw / # 修改只读文件系统为读写
iotop # 磁盘IO占用情况排序 yum install iotop
smartctl -H /dev/sda # 检测硬盘状态 # yum install smartmontools
smartctl -i /dev/sda # 检测硬盘信息
smartctl -a /dev/sda # 检测所有信息
e2label /dev/sda5 # 查看卷标
e2label /dev/sda5 new-label # 创建卷标
ntfslabel -v /dev/sda8 new-label # NTFS添加卷标
tune2fs -j /dev/sda # ext2分区转ext3分区
tune2fs -l /dev/sda # 查看文件系统信息
mke2fs -b 2048 /dev/sda5 # 指定索引块大小
dumpe2fs -h /dev/sda5 # 查看超级块的信息
mount -t iso9660 /dev/dvd /mnt # 挂载光驱
mount -t ntfs-3g /dev/sdc1 /media/yidong # 挂载ntfs硬盘
mount -t nfs 10.0.0.3:/opt/images/ /data/img # 挂载nfs 需要重载 /etc/init.d/nfs reload 重启需要先启动 portmap 服务
mount -o loop /software/rhel4.6.iso /mnt/ # 挂载镜像文件

磁盘IO性能检测{

iostat -x 1 10

% user # 显示了在用户级(应用程序)执行时生成的 CPU 使用率百分比。
% system # 显示了在系统级(内核)执行时生成的 CPU 使用率百分比。
% idle # 显示了在 CPU 空闲并且系统没有未完成的磁盘 I/O 请求时的时间百分比。
% iowait # 显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。

rrqm/s # 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s # 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s # 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s # 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s # 每秒读扇区数。即 delta(rsect)/s
wsec/s # 每秒写扇区数。即 delta(wsect)/s
rkB/s # 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)
wkB/s # 每秒写K字节数。是 wsect/s 的一半。(需要计算)
avgrq-sz # 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz # 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await # 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm # 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util # 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)

IO性能衡量标准{

1、 如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
2、 idle 小于70% IO压力就较大了,一般读取速度有较多的wait.
3、 同时可以结合 vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
4、 svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加. await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式. 如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU
5、 队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。

}

}

创建swap文件方法{

dd if=/dev/zero of=/swap bs=1024 count=4096000 # 创建一个足够大的文件
# count的值等于1024 x 你想要的文件大小, 4096000是4G
mkswap /swap # 把这个文件变成swap文件
swapon /swap # 启用这个swap文件
/swap swap swap defaults 0 0 # 在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行
cat /proc/swaps # 查看swap
swapoff -a # 关闭swap
swapon -a # 开启swap

本文由澳门在线威尼斯官方发布于电脑操作,转载请注明出处:适合所有菜鸟学习和老手回顾,很实用的Linux

关键词:

上一篇:没有了

下一篇:epoll全面讲解,从实现到应用