Linux 笔记
1 文件{ 2 3 ls -rtl # 按时间倒叙列出所有目录和文件 ll -rt 4 touch file # 创建空白文件 5 rm -rf dirname # 不提示删除非空目录(-r:递归删除 -f强制) 6 dos2unix # windows文本转linux文本 7 unix2dos # linux文本转windows文本 8 enca filename # 查看编码 安装 yum install -y enca 9 md5sum # 查看md5值 10 ln sourcefile newfile # 硬链接 11 ln -s sourcefile newfile # 符号连接 12 readlink -f /data # 查看连接真实目录 13 cat file | nl |less # 查看上下翻页且显示行号 q退出 14 head # 查看文件开头内容 15 head -c 10m # 截取文件中10M内容 16 split -C 10M # 将文件切割大小为10M -C按行 17 tail -f file # 查看结尾 监视日志文件 18 tail -F file # 监视日志并重试, 针对文件被mv的情况可以持续读取 19 file # 检查文件类型 20 umask # 更改默认权限 21 uniq # 删除重复的行 22 uniq -c # 重复的行出现次数 23 uniq -u # 只显示不重复行 24 paste a b # 将两个文件合并用tab键分隔开 25 paste -d'+' a b # 将两个文件合并指定'+'符号隔开 26 paste -s a # 将多行数据合并到一行用tab键隔开 27 chattr +i /etc/passwd # 不得任意改变文件或目录 -i去掉锁 -R递归 28 more # 向下分面器 29 locate aaa # 搜索 30 wc -l file # 查看行数 31 cp filename{,.bak} # 快速备份一个文件 32 \cp a b # 拷贝不提示 既不使用别名 cp -i 33 rev # 将行中的字符逆序排列 34 comm -12 2 3 # 行和行比较匹配 35 echo "10.45aa" |cksum # 字符串转数字编码,可做校验,也可用于文件校验 36 iconv -f gbk -t utf8 source.txt > new.txt # 转换编码 37 xxd /boot/grub/stage1 # 16进制查看 38 hexdump -C /boot/grub/stage1 # 16进制查看 39 rename source new file # 重命名 可正则 40 watch -d -n 1 'df; ls -FlAt /path' # 实时某个目录下查看最新改动过的文件 41 cp -v /dev/dvd /rhel4.6.iso9660 # 制作镜像 42 diff suzu.c suzu2.c > sz.patch # 制作补丁 43 patch suzu.c < sz.patch # 安装补丁 44 45 sort排序{ 46 47 -t # 指定排序时所用的栏位分隔字符 48 -n # 依照数值的大小排序 49 -r # 以相反的顺序来排序 50 -f # 排序时,将小写字母视为大写字母 51 -d # 排序时,处理英文字母、数字及空格字符外,忽略其他的字符 52 -c # 检查文件是否已经按照顺序排序 53 -b # 忽略每行前面开始处的空格字符 54 -M # 前面3个字母依照月份的缩写进行排序 55 -k # 指定域 56 -m # 将几个排序好的文件进行合并 57 -T # 指定临时文件目录,默认在/tmp 58 -o # 将排序后的结果存入指定的文 59 60 sort -n # 按数字排序 61 sort -nr # 按数字倒叙 62 sort -u # 过滤重复行 63 sort -m a.txt c.txt # 将两个文件内容整合到一起 64 sort -n -t' ' -k 2 -k 3 a.txt # 第二域相同,将从第三域进行升降处理 65 sort -n -t':' -k 3r a.txt # 以:为分割域的第三域进行倒叙排列 66 sort -k 1.3 a.txt # 从第三个字母起进行排序 67 sort -t" " -k 2n -u a.txt # 以第二域进行排序,如果遇到重复的,就删除 68 69 } 70 71 find查找{ 72 73 # linux文件无创建时间 74 # Access 使用时间 75 # Modify 内容修改时间 76 # Change 状态改变时间(权限、属主) 77 # 时间默认以24小时为单位,当前时间到向前24小时为0天,向前48-72小时为2天 78 # -and 且 匹配两个条件 参数可以确定时间范围 -mtime +2 -and -mtime -4 79 # -or 或 匹配任意一个条件 80 81 find /etc -name "*http*" # 按文件名查找 82 find . -type f # 查找某一类型文件 83 find / -perm # 按照文件权限查找 84 find / -user # 按照文件属主查找 85 find / -group # 按照文件所属的组来查找文件 86 find / -atime -n # 文件使用时间在N天以内 87 find / -atime +n # 文件使用时间在N天以前 88 find / -mtime +n # 文件内容改变时间在N天以前 89 find / -ctime +n # 文件状态改变时间在N天前 90 find / -mmin +30 # 按分钟查找内容改变 91 find / -size +1000000c -print # 查找文件长度大于1M字节的文件 92 find /etc -name "*passwd*" -exec grep "xuesong" {} \; # 按名字查找文件传递给-exec后命令 93 find . -name 't*' -exec basename {} \; # 查找文件名,不取路径 94 find . -type f -name "err*" -exec rename err ERR {} \; # 批量改名(查找err 替换为 ERR {}文件 95 find path -name *name1* -or -name *name2* # 查找任意一个关键字 96 97 } 98 99 vim编辑器{ 100 101 # 常用配置 102 set smartindent 103 set tabstop=4 104 set shiftwidth=4 105 set expandtab 106 set softtabstop=4 107 set noautoindent 108 set nosmartindent 109 set paste 110 set clipboard=unnamed 111 112 gconf-editor # 配置编辑器 113 /etc/vimrc # 配置文件路径 114 vim +24 file # 打开文件定位到指定行 115 vim file1 file2 # 打开多个文件 116 vim -r file # 恢复上次异常关闭的文件 .file.swp 117 vim -O2 file1 file2 # 垂直分屏 118 vim -on file1 file2 # 水平分屏 119 Ctrl+ U # 向前翻页 120 Ctrl+ D # 向后翻页 121 Ctrl+ww # 在窗口间切换 122 Ctrl+w +or-or= # 增减高度 123 :sp filename # 上下分割打开新文件 124 :vs filename # 左右分割打开新文件 125 :set nu # 打开行号 126 :set nonu # 取消行号 127 :nohl # 取消高亮 128 :set paste # 取消缩进 129 :set autoindent # 设置自动缩进 130 :set ff # 查看文本格式 131 :set binary # 改为unix格式 132 :%s/str/newstr/g # 全部替换 133 :200 # 跳转到200 1 文件头 134 G # 跳到行尾 135 dd # 删除当前行 并复制 可直接p粘贴 136 11111dd # 删除11111行,可用来清空文件 137 r # 替换单个字符 138 R # 替换多个字符 139 u # 撤销上次操作 140 * # 全文匹配当前光标所在字符串 141 $ # 行尾 142 0 # 行首 143 X # 文档加密 144 v = # 自动格式化代码 145 Ctrl+v # 可视模式 146 Ctrl+v I ESC # 多行操作 147 Ctrl+v s ESC # 批量取消注释 148 149 } 150 151 归档解压缩{ 152 153 tar zxvpf gz.tar.gz dir # 解包指定tar.gz中的内容 不指定目录则全解压 154 tar zcvpf /$path/gz.tar.gz * # 打包gz 注意*最好用相对路径 155 tar zcf /$path/gz.tar.gz * # 打包正确不提示 156 tar ztvpf gz.tar.gz # 查看gz 157 tar xvf 1.tar -C dir # 解包tar 放到指定目录 158 tar -cvf 1.tar * # 打包tar 159 tar tvf 1.tar # 查看tar 160 tar -rvf 1.tar filename # 给tar追加文件 161 tar --exclude=/home/dmtsai --exclude=*.tar -zcvf myfile.tar.gz /home/* /etc # 打包/home, /etc ,但排除 /home/dmtsai 162 tar -N "2005/06/01" -zcvf home.tar.gz /home # 在 /home 当中,比 2005/06/01 新的文件才备份 163 tar -zcvfh home.tar.gz /home # 打包目录中包括连接目录 164 tar zcf - ./ | ssh root@IP "tar zxf - -C /xxxx" # 一边压缩一边解压 165 zgrep str 1.gz # 查看压缩包中文件字符行 166 bzip2 -dv 1.tar.bz2 # 解压bzip2 167 bzip2 -v 1.tar # bzip2压缩 168 bzcat # 查看bzip2 169 gzip file # 直接压缩文件 # 压缩后源文件消失 170 gunzip file.gz # 直接解压文件 # 解压后源文件消失 171 gzip -r dir/ # 递归压缩目录 172 gzip -r -d dir/ # 递归解压目录 173 gzip -dv 1.tar.gz # 解压gzip到tar 174 gzip -v 1.tar # 压缩tar到gz 175 unzip zip.zip # 解压zip 176 zip zip.zip * # 压缩zip 177 rar a rar.rar *.jpg # 压缩文件为rar包 178 unrar x rar.rar # 解压rar包 179 180 } 181 182 文件ACL权限控制{ 183 184 getfacl 1.test # 查看文件ACL权限 185 setfacl -R -m u:xuesong:rw- 1.test # 对文件增加用户的读写权限 -R 递归 186 187 } 188 189 svn{ 190 191 --force # 强制覆盖 192 /usr/bin/svn --username user --password passwd co $Code ${SvnPath}src/ # 检出整个项目 193 /usr/bin/svn --username user --password passwd up $Code ${SvnPath}src/ # 更新项目 194 /usr/bin/svn --username user --password passwd export $Code$File ${SvnPath}src/$File # 导出个别文件 195 /usr/bin/svn --username user --password passwd export -r 版本号 svn路径 本地路径 --force # 导出指定版本 196 197 } 198 199 git{ 200 201 git clone git@10.10.10.10:gittest.git ./gittest/ # 克隆项目到指定目录 202 git clone -b develop --depth=1 http://git.a.com/d.git # 克隆指定分支 克隆一层 203 git status # Show the working tree(工作树) status 204 git log -n 1 --stat # 查看最后一次日志文件 205 git branch -a # 列出远程跟踪分支(remote-tracking branches)和本地分支 206 git checkout developing # 切换到developing分支 207 git checkout -b release # 切换分支没有从当前分支创建 208 git checkout -b release origin/master # 从远程分支创建本地镜像分支 209 git push origin --delete release # 从远端删除分区,服务端有可能设置保护不允许删除 210 git push origin release # 把本地分支提交到远程 211 git pull # 更新项目 需要cd到项目目录中 212 git fetch -f -p # 抓取远端代码但不合并到当前 213 git reset --hard origin/master # 和远端同步分支 214 git add . # 更新所有文件 215 git commit -m "gittest up" # 提交操作并添加备注 216 git push # 正式提交到远程git服务器 217 git push [-u origin master] # 正式提交到远程git服务器(master分支) 218 git tag [-a] dev-v-0.11.54 [-m 'fix #67'] # 创建tag,名为dev-v-0.11.54,备注fix #67 219 git tag -l dev-v-0.11.54 # 查看tag(dev-v-0.11.5) 220 git push origin --tags # 提交tag 221 git reset --hard # 本地恢复整个项目 222 git rm -r -n --cached ./img # -n执行命令时,不会删除任何文件,而是展示此命令要删除的文件列表预览 223 git rm -r --cached ./img # 执行删除命令 需要commit和push让远程生效 224 git init --bare smc-content-check.git # 初始化新git项目 需要手动创建此目录并给git用户权限 chown -R git:git smc-content-check.git 225 git config --global credential.helper store # 记住密码 226 git config [--global] user.name "your name" # 设置你的用户名, 希望在一个特定的项目中使用不同的用户或e-mail地址, 不要--global选项 227 git config [--global] user.email "your email" # 设置你的e-mail地址, 每次Git提交都会使用该信息 228 git config [--global] user.name # 查看用户名 229 git config [--global] user.email # 查看用户e-mail 230 git config --global --edit # 编辑~/.gitconfig(User-specific)配置文件, 值优先级高于/etc/gitconfig(System-wide) 231 git config --edit # 编辑.git/config(Repository specific)配置文件, 值优先级高于~/.gitconfig 232 git cherry-pick <commit id> # 用于把另一个本地分支的commit修改应用到当前分支 需要push到远程 233 git log --pretty=format:'%h: %s' 9378b62..HEAD # 查看指定范围更新操作 commit id 234 git config --global core.ignorecase false # 设置全局大小写敏感 235 git ls-remote --heads origin refs/heads/test # 查看 236 237 从远端拉一份新的{ 238 # You have not concluded your merge (MERGE_HEAD exists) git拉取失败 239 git fetch --hard origin/master 240 git reset --hard origin/master 241 } 242 243 删除远程分支并新建{ 244 git checkout master 245 git branch -r -d origin/test # 删除远程分支 但有时候并没有删除 可以尝试使用下面的语句 246 git push origin :test # 推送一个空分支到远程分支,相当于删除远程分支 247 git branch -d test # 删除本地test分支, -D 强制 248 git branch -a |grep test 249 git checkout -b test 250 git push origin test 251 252 git reset --hard origin/test 253 } 254 255 迁移git项目{ 256 git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done 257 git fetch --all 258 git pull --all 259 git remote set-url origin git@git.github.cn:server/gw.git 260 git push --all 261 } 262 } 263 264 恢复rm删除的文件{ 265 266 # debugfs针对 ext2 # ext3grep针对 ext3 # extundelete针对 ext4 267 df -T # 首先查看磁盘分区格式 268 umount /data/ # 卸载挂载,数据丢失请首先卸载挂载,或重新挂载只读 269 ext3grep /dev/sdb1 --ls --inode 2 # 记录信息继续查找目录下文件inode信息 270 ext3grep /dev/sdb1 --ls --inode 131081 # 此处是inode 271 ext3grep /dev/sdb1 --restore-inode 49153 # 记录下inode信息开始恢复目录 272 273 } 274 275 openssl{ 276 277 openssl rand 15 -base64 # 口令生成 278 openssl sha1 filename # 哈希算法校验文件 279 openssl md5 filename # MD5校验文件 280 openssl base64 filename.txt # base64编码/解码文件(发送邮件附件之类功能会可以使用) 281 openssl base64 -d filename.bin # base64编码/解码二进制文件 282 openssl enc -aes-128-cbc filename.aes-128-cbc # 加密文档 283 # 推荐使用的加密算法是bf(Blowfish)和-aes-128-cbc(运行在CBC模式的128位密匙AES加密算法),加密强度有保障 284 openssl enc -d -aes-128-cbc -in filename.aes-128-cbc > filename # 解密文档 285 286 } 287 288 }
1 2. 软件{ 2 3 rpm{ 4 5 rpm -ivh lynx # rpm安装 6 rpm -e lynx # 卸载包 7 rpm -e lynx --nodeps # 强制卸载 8 rpm -qa # 查看所有安装的rpm包 9 rpm -qa | grep lynx # 查找包是否安装 10 rpm -ql # 软件包路径 11 rpm -Uvh # 升级包 12 rpm --test lynx # 测试 13 rpm -qc # 软件包配置文档 14 rpm --initdb # 初始化rpm 数据库 15 rpm --rebuilddb # 重建rpm数据库 在rpm和yum无响应的情况使用 先 rm -f /var/lib/rpm/__db.00* 在重建 16 17 } 18 19 yum{ 20 21 yum list # 所有软件列表 22 yum install 包名 # 安装包和依赖包 23 yum -y update # 升级所有包版本,依赖关系,系统版本内核都升级 24 yum -y update 软件包名 # 升级指定的软件包 25 yum -y upgrade # 不改变软件设置更新软件,系统版本升级,内核不改变 26 yum search mail # yum搜索相关包 27 yum grouplist # 软件包组 28 yum -y groupinstall "Virtualization" # 安装软件包组 29 repoquery -ql gstreamer # 不安装软件查看包含文件 30 yum clean all # 清除var下缓存 31 32 } 33 34 yum使用epel源{ 35 36 # 包下载地址: http://download.fedoraproject.org/pub/epel # 选择版本5\6\7 37 rpm -Uvh http://mirrors.hustunique.com/epel//6/x86_64/epel-release-6-8.noarch.rpm 38 39 # 自适配版本 40 yum install epel-release 41 42 } 43 44 自定义yum源{ 45 46 find /etc/yum.repos.d -name "*.repo" -exec mv {} {}.bak \; 47 48 vim /etc/yum.repos.d/yum.repo 49 [yum] 50 #http 51 baseurl=http://10.0.0.1/centos5.5 52 #挂载iso 53 #mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/ 54 #本地 55 #baseurl=file:///data/iso/ 56 enable=1 57 58 #导入key 59 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 60 61 } 62 63 编译{ 64 65 源码安装{ 66 67 ./configure --help # 查看所有编译参数 68 ./configure --prefix=/usr/local/ # 配置参数 69 make # 编译 70 # make -j 8 # 多线程编译,速度较快,但有些软件不支持 71 make install # 安装包 72 make clean # 清除编译结果 73 74 } 75 76 perl程序编译{ 77 78 perl Makefile.PL 79 make 80 make test 81 make install 82 83 } 84 85 python程序编译{ 86 87 python file.py 88 89 # 源码包编译安装 90 python setup.py build 91 python setup.py install 92 93 } 94 95 编译c程序{ 96 97 gcc -g hello.c -o hello 98 99 } 100 101 } 102 103 }
1 3. 系统{ 2 3 wall # 给其它用户发消息 4 whereis ls # 搜索程序名,而且只搜索二进制文件 5 which # 查找命令是否存在,及存放位置 6 locate # 不是实时查找,查找的结果不精确,但查找速度很快 每天更新 /var/lib/locatedb 7 clear # 清空整个屏幕 8 reset # 重新初始化屏幕 9 cal # 显示月历 10 echo -n 123456 | md5sum # md5加密 11 mkpasswd # 随机生成密码 -l位数 -C大小 -c小写 -d数字 -s特殊字符 12 netstat -ntupl | grep port # 是否打开了某个端口 13 ntpdate cn.pool.ntp.org # 同步时间, pool.ntp.org: public ntp time server for everyone(http://www.pool.ntp.org/zh/) 14 tzselect # 选择时区 #+8=(5 9 1 1) # (TZ='Asia/Shanghai'; export TZ)括号内写入 /etc/profile 15 /sbin/hwclock -w # 时间保存到硬件 16 /etc/shadow # 账户影子文件 17 LANG=en # 修改语言 18 vim /etc/sysconfig/i18n # 修改编码 LANG="en_US.UTF-8" 19 export LC_ALL=C # 强制字符集 20 vi /etc/hosts # 查询静态主机名 21 alias # 别名 22 watch uptime # 监测命令动态刷新 监视 23 ipcs -a # 查看Linux系统当前单个共享内存段的最大值 24 ldconfig # 动态链接库管理命令 25 ldd `which cmd` # 查看命令的依赖库 26 dist-upgrade # 会改变配置文件,改变旧的依赖关系,改变系统版本 27 /boot/grub/grub.conf # grub启动项配置 28 ps -mfL <PID> # 查看指定进程启动的线程 线程数受 max user processes 限制 29 ps uxm |wc -l # 查看当前用户占用的进程数 [包括线程] max user processes 30 top -p PID -H # 查看指定PID进程及线程 31 lsof |wc -l # 查看当前文件句柄数使用数量 open files 32 lsof |grep /lib # 查看加载库文件 33 sysctl -a # 查看当前所有系统内核参数 34 sysctl -p # 修改内核参数/etc/sysctl.conf,让/etc/rc.d/rc.sysinit读取生效 35 strace -p pid # 跟踪系统调用 36 ps -eo "%p %C %z %a"|sort -k3 -n # 把进程按内存使用大小排序 37 strace uptime 2>&1|grep open # 查看命令打开的相关文件 38 grep Hugepagesize /proc/meminfo # 内存分页大小 39 mkpasswd -l 8 -C 2 -c 2 -d 4 -s 0 # 随机生成指定类型密码 40 echo 1 > /proc/sys/net/ipv4/tcp_syncookies # 使TCP SYN Cookie 保护生效 # "SYN Attack"是一种拒绝服务的攻击方式 41 grep Swap /proc/25151/smaps |awk '{a+=$2}END{print a}' # 查询某pid使用的swap大小 42 redir --lport=33060 --caddr=10.10.10.78 --cport=3306 # 端口映射 yum安装 用supervisor守护 43 44 开机启动脚本顺序{ 45 46 /etc/profile 47 /etc/profile.d/*.sh 48 ~/bash_profile 49 ~/.bashrc 50 /etc/bashrc 51 52 } 53 54 进程管理{ 55 56 ps -eaf # 查看所有进程 57 kill -9 PID # 强制终止某个PID进程 58 kill -15 PID # 安全退出 需程序内部处理信号 59 cmd & # 命令后台运行 60 nohup cmd & # 后台运行不受shell退出影响 61 ctrl+z # 将前台放入后台(暂停) 62 jobs # 查看后台运行程序 63 bg 2 # 启动后台暂停进程 64 fg 2 # 调回后台进程 65 pstree # 进程树 66 vmstat 1 9 # 每隔一秒报告系统性能信息9次 67 sar # 查看cpu等状态 68 lsof file # 显示打开指定文件的所有进程 69 lsof -i:32768 # 查看端口的进程 70 renice +1 180 # 把180号进程的优先级加1 71 exec sh a.sh # 子进程替换原来程序的pid, 避免supervisor无法强制杀死进程 72 73 ps{ 74 75 ps aux |grep -v USER | sort -nk +4 | tail # 显示消耗内存最多的10个运行中的进程,以内存使用量排序.cpu +3 76 # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 77 %CPU # 进程的cpu占用率 78 %MEM # 进程的内存占用率 79 VSZ # 进程虚拟大小,单位K(即总占用内存大小,包括真实内存和虚拟内存) 80 RSS # 进程使用的驻留集大小即实际物理内存大小 81 START # 进程启动时间和日期 82 占用的虚拟内存大小 = VSZ - RSS 83 84 ps -eo pid,lstart,etime,args # 查看进程启动时间 85 86 } 87 88 top{ 89 90 前五行是系统整体的统计信息。 91 第一行: 任务队列信息,同 uptime 命令的执行结果。内容如下: 92 01:06:48 当前时间 93 up 1:22 系统运行时间,格式为时:分 94 1 user 当前登录用户数 95 load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。 96 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 97 98 第二、三行:为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下: 99 Tasks: 29 total 进程总数 100 1 running 正在运行的进程数 101 28 sleeping 睡眠的进程数 102 0 stopped 停止的进程数 103 0 zombie 僵尸进程数 104 Cpu(s): 0.3% us 用户空间占用CPU百分比 105 1.0% sy 内核空间占用CPU百分比 106 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 107 98.7% id 空闲CPU百分比 108 0.0% wa 等待输入输出的CPU时间百分比 109 0.0% hi 110 0.0% si 111 112 第四、五行:为内存信息。内容如下: 113 Mem: 191272k total 物理内存总量 114 173656k used 使用的物理内存总量 115 17616k free 空闲内存总量 116 22052k buffers 用作内核缓存的内存量 117 Swap: 192772k total 交换区总量 118 0k used 使用的交换区总量 119 192772k free 空闲交换区总量 120 123988k cached 缓冲的交换区总量。 121 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 122 该数值即为这些内容已存在于内存中的交换区的大小。 123 相应的内存再次被换出时可不必再对交换区写入。 124 125 进程信息区,各列的含义如下: # 显示各个进程的详细信息 126 127 序号 列名 含义 128 a PID 进程id 129 b PPID 父进程id 130 c RUSER Real user name 131 d UID 进程所有者的用户id 132 e USER 进程所有者的用户名 133 f GROUP 进程所有者的组名 134 g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ? 135 h PR 优先级 136 i NI nice值。负值表示高优先级,正值表示低优先级 137 j P 最后使用的CPU,仅在多CPU环境下有意义 138 k %CPU 上次更新到现在的CPU时间占用百分比 139 l TIME 进程使用的CPU时间总计,单位秒 140 m TIME+ 进程使用的CPU时间总计,单位1/100秒 141 n %MEM 进程使用的物理内存百分比 142 o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES 143 p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。 144 q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA 145 r CODE 可执行代码占用的物理内存大小,单位kb 146 s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb 147 t SHR 共享内存大小,单位kb 148 u nFLT 页面错误次数 149 v nDRT 最后一次写入到现在,被修改过的页面数。 150 w S 进程状态。 151 D=不可中断的睡眠状态 152 R=运行 153 S=睡眠 154 T=跟踪/停止 155 Z=僵尸进程 父进程在但并不等待子进程 156 x COMMAND 命令名/命令行 157 y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名 158 z Flags 任务标志,参考 sched.h 159 160 } 161 162 列出正在占用swap的进程{ 163 164 #!/bin/bash 165 echo -e "PID\t\tSwap\t\tProc_Name" 166 # 拿出/proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息) 167 for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]` 168 do 169 # 让进程释放swap的方法只有一个:就是重启该进程。或者等其自动释放。放 170 # 如果进程会自动释放,那么我们就不会写脚本来找他了,找他都是因为他没有自动释放。 171 # 所以我们要列出占用swap并需要重启的进程,但是init这个进程是系统里所有进程的祖先进程 172 # 重启init进程意味着重启系统,这是万万不可以的,所以就不必检测他了,以免对系统造成影响。 173 if [ $pid -eq 1 ];then continue;fi 174 grep -q "Swap" /proc/$pid/smaps 2>/dev/null 175 if [ $? -eq 0 ];then 176 swap=$(grep Swap /proc/$pid/smaps \ 177 | gawk '{ sum+=$2;} END{ print sum }') 178 proc_name=$(ps aux | grep -w "$pid" | grep -v grep \ 179 | awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}') 180 if [ $swap -gt 0 ];then 181 echo -e "${pid}\t${swap}\t${proc_name}" 182 fi 183 fi 184 done | sort -k2 -n | awk -F'\t' '{ 185 pid[NR]=$1; 186 size[NR]=$2; 187 name[NR]=$3; 188 } 189 END{ 190 for(id=1;id<=length(pid);id++) 191 { 192 if(size[id]<1024) 193 printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]); 194 else if(size[id]<1048576) 195 printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]); 196 else 197 printf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]); 198 } 199 }' 200 201 } 202 203 linux操作系统提供的信号{ 204 205 kill -l # 查看linux提供的信号 206 trap "echo aaa" 2 3 15 # shell使用 trap 捕捉退出信号 207 208 # 发送信号一般有两种原因: 209 # 1(被动式) 内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号 210 # 2(主动式) 通过系统调用kill来向指定进程发送信号 211 # 进程结束信号 SIGTERM 和 SIGKILL 的区别: SIGTERM 比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。 212 # 如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。 213 214 SIGHUP 1 A # 终端挂起或者控制进程终止 215 SIGINT 2 A # 键盘终端进程(如control+c) 216 SIGQUIT 3 C # 键盘的退出键被按下 217 SIGILL 4 C # 非法指令 218 SIGABRT 6 C # 由abort(3)发出的退出指令 219 SIGFPE 8 C # 浮点异常 220 SIGKILL 9 AEF # Kill信号 立刻停止 221 SIGSEGV 11 C # 无效的内存引用 222 SIGPIPE 13 A # 管道破裂: 写一个没有读端口的管道 223 SIGALRM 14 A # 闹钟信号 由alarm(2)发出的信号 224 SIGTERM 15 A # 终止信号,可让程序安全退出 kill -15 225 SIGUSR1 30,10,16 A # 用户自定义信号1 226 SIGUSR2 31,12,17 A # 用户自定义信号2 227 SIGCHLD 20,17,18 B # 子进程结束自动向父进程发送SIGCHLD信号 228 SIGCONT 19,18,25 # 进程继续(曾被停止的进程) 229 SIGSTOP 17,19,23 DEF # 终止进程 230 SIGTSTP 18,20,24 D # 控制终端(tty)上按下停止键 231 SIGTTIN 21,21,26 D # 后台进程企图从控制终端读 232 SIGTTOU 22,22,27 D # 后台进程企图从控制终端写 233 234 缺省处理动作一项中的字母含义如下: 235 A 缺省的动作是终止进程 236 B 缺省的动作是忽略此信号,将该信号丢弃,不做处理 237 C 缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。 238 D 缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用) 239 E 信号不能被捕获 240 F 信号不能被忽略 241 } 242 243 系统性能状态{ 244 245 vmstat 1 9 246 247 r # 等待执行的任务数。当这个值超过了cpu线程数,就会出现cpu瓶颈。 248 b # 等待IO的进程数量,表示阻塞的进程。 249 swpd # 虚拟内存已使用的大小,如大于0,表示机器物理内存不足,如不是程序内存泄露,那么该升级内存。 250 free # 空闲的物理内存的大小 251 buff # 已用的buff大小,对块设备的读写进行缓冲 252 cache # cache直接用来记忆我们打开的文件,给文件做缓冲,(把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。) 253 inact # 非活跃内存大小,即被标明可回收的内存,区别于free和active -a选项时显示 254 active # 活跃的内存大小 -a选项时显示 255 si # 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露,要查找耗内存进程解决掉。 256 so # 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。 257 bi # 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte 258 bo # 块设备每秒发送的块数量,例如读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。 259 in # 每秒CPU的中断次数,包括时间中断。in和cs这两个值越大,会看到由内核消耗的cpu时间会越多 260 cs # 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用。 261 us # 用户进程执行消耗cpu时间(user time) us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施 262 sy # 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。 263 id # 空闲 CPU时间,一般来说,id + us + sy = 100,一般认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。 264 wt # 等待IOCPU时间。Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。 265 266 如果 r 经常大于4,且id经常少于40,表示cpu的负荷很重。 267 如果 pi po 长期不等于0,表示内存不足。 268 如果 b 队列经常大于3,表示io性能不好。 269 270 } 271 272 } 273 274 日志管理{ 275 276 history # 历时命令默认1000条 277 HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 让history命令显示具体时间 278 history -c # 清除记录命令 279 cat $HOME/.bash_history # 历史命令记录文件 280 lastb -a # 列出登录系统失败的用户相关信息 清空二进制日志记录文件 echo > /var/log/btmp 281 last # 查看登陆过的用户信息 清空二进制日志记录文件 echo > /var/log/wtmp 默认打开乱码 282 who /var/log/wtmp # 查看登陆过的用户信息 283 lastlog # 用户最后登录的时间 284 tail -f /var/log/messages # 系统日志 285 tail -f /var/log/secure # ssh日志 286 287 } 288 289 man{ 290 man 2 read # 查看read函数的文档 291 1 使用者在shell中可以操作的指令或可执行档 292 2 系统核心可呼叫的函数与工具等 293 3 一些常用的函数(function)与函数库(library),大部分是C的函数库(libc) 294 4 装置档案的说明,通常在/dev下的档案 295 5 设定档或者是某些档案的格式 296 6 游戏games 297 7 惯例与协定等,例如linux档案系统、网络协定、ascll code等说明 298 8 系统管理员可用的管理指令 299 9 跟kernel有关的文件 300 } 301 302 selinux{ 303 304 sestatus -v # 查看selinux状态 305 getenforce # 查看selinux模式 306 setenforce 0 # 设置selinux为宽容模式(可避免阻止一些操作) 307 semanage port -l # 查看selinux端口限制规则 308 semanage port -a -t http_port_t -p tcp 8000 # 在selinux中注册端口类型 309 vi /etc/selinux/config # selinux配置文件 310 SELINUX=enfoceing # 关闭selinux 把其修改为 SELINUX=disabled 311 312 } 313 314 查看剩余内存{ 315 316 free -m 317 #-/+ buffers/cache: 6458 1649 318 #6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器) 319 #linux会利用所有的剩余内存作为缓存,所以要保证linux运行速度,就需要保证内存的缓存大小 320 321 } 322 323 系统信息{ 324 325 uname -a # 查看Linux内核版本信息 326 cat /proc/version # 查看内核版本 327 cat /etc/issue # 查看系统版本 328 lsb_release -a # 查看系统版本 需安装 centos-release 329 locale -a # 列出所有语系 330 locale # 当前环境变量中所有编码 331 hwclock # 查看时间 332 who # 当前在线用户 333 w # 当前在线用户 334 whoami # 查看当前用户名 335 logname # 查看初始登陆用户名 336 uptime # 查看服务器启动时间 337 sar -n DEV 1 10 # 查看网卡网速流量 338 dmesg # 显示开机信息 339 lsmod # 查看内核模块 340 341 } 342 343 硬件信息{ 344 345 more /proc/cpuinfo # 查看cpu信息 346 lscpu # 查看cpu信息 347 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 查看cpu型号和逻辑核心数 348 getconf LONG_BIT # cpu运行的位数 349 cat /proc/cpuinfo | grep 'physical id' |sort| uniq -c # 物理cpu个数 350 cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l # 结果大于0支持64位 351 cat /proc/cpuinfo|grep flags # 查看cpu是否支持虚拟化 pae支持半虚拟化 IntelVT 支持全虚拟化 352 more /proc/meminfo # 查看内存信息 353 dmidecode # 查看全面硬件信息 354 dmidecode | grep "Product Name" # 查看服务器型号 355 dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range # 查看内存插槽 356 cat /proc/mdstat # 查看软raid信息 357 cat /proc/scsi/scsi # 查看Dell硬raid信息(IBM、HP需要官方检测工具) 358 lspci # 查看硬件信息 359 lspci|grep RAID # 查看是否支持raid 360 lspci -vvv |grep Ethernet # 查看网卡型号 361 lspci -vvv |grep Kernel|grep driver # 查看驱动模块 362 modinfo tg2 # 查看驱动版本(驱动模块) 363 ethtool -i em1 # 查看网卡驱动版本 364 ethtool em1 # 查看网卡带宽 365 366 } 367 368 终端快捷键{ 369 370 Ctrl+A # 行前 371 Ctrl+E # 行尾 372 Ctrl+S # 终端锁屏 373 Ctrl+Q # 解锁屏 374 Ctrl+D # 退出 375 376 } 377 378 开机启动模式{ 379 380 vi /etc/inittab 381 id:3:initdefault: # 3为多用户命令 382 #ca::ctrlaltdel:/sbin/shutdown -t3 -r now # 注释此行 禁止 ctrl+alt+del 关闭计算机 383 384 } 385 386 终端提示显示{ 387 388 echo $PS1 # 环境变量控制提示显示 389 PS1='[\u@ \H \w \A \@#]\$' 390 PS1='[\u@\h \W]\$' 391 export PS1='[\[\e[32m\]\[\e[31m\]\u@\[\e[36m\]\h \w\[\e[m\]]\$ ' # 高亮显示终端 392 393 } 394 395 定时任务{ 396 397 at 5pm + 3 days /bin/ls # 单次定时任务 指定三天后下午5:00执行/bin/ls 398 399 crontab -e # 编辑周期任务 400 #分钟 小时 天 月 星期 命令或脚本 401 1,30 1-3/2 * * * 命令或脚本 >> file.log 2>&1 402 echo "40 7 * * 2 /root/sh">>/var/spool/cron/work # 普通用户可直接写入定时任务 403 crontab -l # 查看自动周期性任务 404 crontab -r # 删除自动周期性任务 405 cron.deny和cron.allow # 禁止或允许用户使用周期任务 406 service crond start|stop|restart # 启动自动周期性服务 407 * * * * * echo "d" >>d$(date +\%Y\%m\%d).log # 让定时任务直接生成带日期的log 需要转义% 408 409 } 410 411 date{ 412 413 星期日[SUN] 星期一[MON] 星期二[TUE] 星期三[WED] 星期四[THU] 星期五[FRI] 星期六[SAT] 414 一月[JAN] 二月[FEB] 三月[MAR] 四月[APR] 五月[MAY] 六月[JUN] 七月[JUL] 八月[AUG] 九月[SEP] 十月[OCT] 十一月[NOV] 十二月[DEC] 415 416 date -s 20091112 # 设日期 417 date -s 18:30:50 # 设时间 418 date -d "7 days ago" +%Y%m%d # 7天前日期 419 date -d "5 minute ago" +%H:%M # 5分钟前时间 420 date -d "1 month ago" +%Y%m%d # 一个月前 421 date -d '1 days' +%Y-%m-%d # 一天后 422 date -d '1 hours' +%H:%M:%S # 一小时后 423 date +%Y-%m-%d -d '20110902' # 日期格式转换 424 date +%Y-%m-%d_%X # 日期和时间 425 date +%N # 纳秒 426 date -d "2012-08-13 14:00:23" +%s # 换算成秒计算(1970年至今的秒数) 427 date -d "@1363867952" +%Y-%m-%d-%T # 将时间戳换算成日期 428 date -d "1970-01-01 UTC 1363867952 seconds" +%Y-%m-%d-%T # 将时间戳换算成日期 429 date -d "`awk -F. '{print $1}' /proc/uptime` second ago" +"%Y-%m-%d %H:%M:%S" # 格式化系统启动时间(多少秒前) 430 431 } 432 433 limits.conf{ 434 435 ulimit -SHn 65535 # 临时设置文件描述符大小 进程最大打开文件柄数 还有socket最大连接数, 等同配置 nofile 436 ulimit -SHu 65535 # 临时设置用户最大进程数 437 ulimit -a # 查看 438 439 /etc/security/limits.conf 440 441 # 文件描述符大小 open files 442 # lsof |wc -l 查看当前文件句柄数使用数量 443 * soft nofile 16384 # 设置太大,进程使用过多会把机器拖死 444 * hard nofile 32768 445 446 # 用户最大进程数 max user processes 447 # echo $((`ps uxm |wc -l`-`ps ux |wc -l`)) 查看当前用户占用的进程数 [包括线程] 448 user soft nproc 16384 449 user hard nproc 32768 450 451 # 如果/etc/security/limits.d/有配置文件,将会覆盖/etc/security/limits.conf里的配置 452 # 即/etc/security/limits.d/的配置文件里就不要有同样的参量设置 453 /etc/security/limits.d/90-nproc.conf # centos6.3的默认这个文件会覆盖 limits.conf 454 user soft nproc 16384 455 user hard nproc 32768 456 457 sysctl -p # 修改配置文件后让系统生效 458 459 } 460 461 随机分配端口范围{ 462 463 # 本机连其它端口用的 464 echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range 465 466 } 467 468 百万长链接设置{ 469 470 # 内存消耗需要较大 471 vim /root/.bash_profile 472 # 添加如下2行,退出bash重新登陆 473 # 一个进程不能使用超过NR_OPEN文件描述符 474 echo 20000500 > /proc/sys/fs/nr_open 475 # 当前用户最大文件数 476 ulimit -n 10000000 477 478 } 479 480 core崩溃文件查看{ 481 482 gdb core.13844 483 bt # 查看函数调用信息(堆栈) 484 485 } 486 487 488 libc.so故障修复{ 489 490 # 由于升级glibc导致libc.so不稳定,突然报错,幸好还有未退出的终端 491 grep: error while loading shared libraries: /lib64/libc.so.6: ELF file OS ABI invalid 492 493 # 看看当前系统有多少版本 libc.so 494 ls /lib64/libc-[tab] 495 496 # 更改环境变量指向其他 libc.so 文件测试 497 export LD_PRELOAD=/lib64/libc-2.7.so # 如果不改变LD_PRELOAD变量,ln不能用,需要使用 /sbin/sln 命令做链接 498 499 # 当前如果好使了,在执行下面强制替换软链接。如不好使,测试其他版本的libc.so文件 500 ln -f -s /lib64/libc-2.7.so /lib64/libc.so.6 501 502 } 503 504 无法分配内存 { 505 506 fork: Cannot allocate memory 507 508 # 报错不一定是内存不够用,进程数或者线程数满了也会报这个错误, 可以适当增加 kernel.pid_max 的值, 509 cat /proc/sys/kernel/pid_max # 默认3.2w 510 511 } 512 513 sudo{ 514 515 echo myPassword | sudo -S ls /tmp # 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备 516 visudo # sudo命令权限添加 /etc/sudoers 517 用户 别名(可用all)=NOPASSWD:命令1,命令2 518 user ALL=NOPASSWD:/bin/su # 免root密码切换root身份 519 wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart 520 UserName ALL=(ALL) ALL 521 UserName ALL=(ALL) NOPASSWD: ALL 522 peterli ALL=(ALL) NOPASSWD:/sbin/service 523 Defaults requiretty # sudo不允许后台运行,注释此行既允许 524 Defaults !visiblepw # sudo不允许远程,去掉!既允许 525 526 } 527 528 grub开机启动项添加{ 529 530 vim /etc/grub.conf 531 title ms-dos 532 rootnoverify (hd0,0) 533 chainloader +1 534 535 } 536 537 stty{ 538 539 #stty时一个用来改变并打印终端行设置的常用命令 540 541 stty iuclc # 在命令行下禁止输出大写 542 stty -iuclc # 恢复输出大写 543 stty olcuc # 在命令行下禁止输出小写 544 stty -olcuc # 恢复输出小写 545 stty size # 打印出终端的行数和列数 546 stty eof "string" # 改变系统默认ctrl+D来表示文件的结束 547 stty -echo # 禁止回显 548 stty echo # 打开回显 549 stty -echo;read;stty echo;read # 测试禁止回显 550 stty igncr # 忽略回车符 551 stty -igncr # 恢复回车符 552 stty erase '#' # 将#设置为退格字符 553 stty erase '^?' # 恢复退格字符 554 555 定时输入{ 556 557 timeout_read(){ 558 timeout=$1 559 old_stty_settings=`stty -g` # save current settings 560 stty -icanon min 0 time 100 # set 10seconds,not 100seconds 561 eval read varname # =read $varname 562 stty "$old_stty_settings" # recover settings 563 } 564 565 read -t 10 varname # 更简单的方法就是利用read命令的-t选项 566 567 } 568 569 检测用户按键{ 570 571 #!/bin/bash 572 old_tty_settings=$(stty -g) # 保存老的设置(为什么?). 573 stty -icanon 574 Keypress=$(head -c1) # 或者使用$(dd bs=1 count=1 2> /dev/null) 575 echo "Key pressed was \""$Keypress"\"." 576 stty "$old_tty_settings" # 恢复老的设置. 577 exit 0 578 579 } 580 581 } 582 583 iptables{ 584 585 内建三个表:nat mangle 和 filter 586 filter预设规则表,有INPUT、FORWARD 和 OUTPUT 三个规则链 587 vi /etc/sysconfig/iptables # 配置文件 588 INPUT # 进入 589 FORWARD # 转发 590 OUTPUT # 出去 591 ACCEPT # 将封包放行 592 REJECT # 拦阻该封包 593 DROP # 丢弃封包不予处理 594 -A # 在所选择的链(INPUT等)末添加一条或更多规则 595 -D # 删除一条 596 -E # 修改 597 -p # tcp、udp、icmp 0相当于所有all !取反 598 -P # 设置缺省策略(与所有链都不匹配强制使用此策略) 599 -s # IP/掩码 (IP/24) 主机名、网络名和清楚的IP地址 !取反 600 -j # 目标跳转,立即决定包的命运的专用内建目标 601 -i # 进入的(网络)接口 [名称] eth0 602 -o # 输出接口[名称] 603 -m # 模块 604 --sport # 源端口 605 --dport # 目标端口 606 607 iptables -F # 将防火墙中的规则条目清除掉 # 注意: iptables -P INPUT ACCEPT 608 iptables-restore < 规则文件 # 导入防火墙规则 609 /etc/init.d/iptables save # 保存防火墙设置 610 /etc/init.d/iptables restart # 重启防火墙服务 611 iptables -L -n # 查看规则 612 iptables -t nat -nL # 查看转发 613 614 iptables实例{ 615 616 iptables -L INPUT # 列出某规则链中的所有规则 617 iptables -X allowed # 删除某个规则链 ,不加规则链,清除所有非内建的 618 iptables -Z INPUT # 将封包计数器归零 619 iptables -N allowed # 定义新的规则链 620 iptables -P INPUT DROP # 定义过滤政策 621 iptables -A INPUT -s 192.168.1.1 # 比对封包的来源IP # ! 192.168.0.0/24 ! 反向对比 622 iptables -A INPUT -d 192.168.1.1 # 比对封包的目的地IP 623 iptables -A INPUT -i eth0 # 比对封包是从哪片网卡进入 624 iptables -A FORWARD -o eth0 # 比对封包要从哪片网卡送出 eth+表示所有的网卡 625 iptables -A INPUT -p tcp # -p ! tcp 排除tcp以外的udp、icmp。-p all所有类型 626 iptables -D INPUT 8 # 从某个规则链中删除一条规则 627 iptables -D INPUT --dport 80 -j DROP # 从某个规则链中删除一条规则 628 iptables -R INPUT 8 -s 192.168.0.1 -j DROP # 取代现行规则 629 iptables -I INPUT 8 --dport 80 -j ACCEPT # 插入一条规则 630 iptables -A INPUT -i eth0 -j DROP # 其它情况不允许 631 iptables -A INPUT -p tcp -s IP -j DROP # 禁止指定IP访问 632 iptables -A INPUT -p tcp -s IP --dport port -j DROP # 禁止指定IP访问端口 633 iptables -A INPUT -s IP -p tcp --dport port -j ACCEPT # 允许在IP访问指定端口 634 iptables -A INPUT -p tcp --dport 22 -j DROP # 禁止使用某端口 635 iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP # 禁止icmp端口 636 iptables -A INPUT -i eth0 -p icmp -j DROP # 禁止icmp端口 637 iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP # 阻止所有没有经过你系统授权的TCP连接 638 iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT # IP包流量限制 639 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我的主机 640 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攻击(未测试) 641 642 } 643 644 iptables配置实例文件{ 645 646 # Generated by iptables-save v1.2.11 on Fri Feb 9 12:10:37 2007 647 *filter 648 :INPUT ACCEPT [637:58967] 649 :FORWARD DROP [0:0] 650 :OUTPUT ACCEPT [5091:1301533] 651 # 允许的IP或IP段访问 建议多个 652 -A INPUT -s 127.0.0.1 -p tcp -j ACCEPT 653 -A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT 654 # 开放对外开放端口 655 -A INPUT -p tcp --dport 80 -j ACCEPT 656 # 指定某端口针对IP开放 657 -A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT 658 # 拒绝所有协议(INPUT允许) 659 -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP 660 # 允许已建立的或相关连的通行 661 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 662 # 拒绝ping 663 -A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable 664 COMMIT 665 # Completed on Fri Feb 9 12:10:37 2007 666 667 } 668 669 iptables配置实例{ 670 671 # 允许某段IP访问任何端口 672 iptables -A INPUT -s 192.168.0.3/24 -p tcp -j ACCEPT 673 # 设定预设规则 (拒绝所有的数据包,再允许需要的,如只做WEB服务器.还是推荐三个链都是DROP) 674 iptables -P INPUT DROP 675 iptables -P FORWARD DROP 676 iptables -P OUTPUT ACCEPT 677 # 注意: 直接设置这三条会掉线 678 # 开启22端口 679 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 680 # 如果OUTPUT 设置成DROP的,要写上下面一条 681 iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT 682 # 注:不写导致无法SSH.其他的端口一样,OUTPUT设置成DROP的话,也要添加一条链 683 # 如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链 684 iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT 685 # 做WEB服务器,开启80端口 ,其他同理 686 iptables -A INPUT -p tcp --dport 80 -j ACCEPT 687 # 做邮件服务器,开启25,110端口 688 iptables -A INPUT -p tcp --dport 110 -j ACCEPT 689 iptables -A INPUT -p tcp --dport 25 -j ACCEPT 690 # 允许icmp包通过,允许ping 691 iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话) 692 iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话) 693 # 允许loopback!(不然会导致DNS无法正常关闭等问题) 694 IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP) 695 IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP) 696 697 } 698 699 centos6的iptables基本配置{ 700 *filter 701 :INPUT ACCEPT [0:0] 702 :FORWARD ACCEPT [0:0] 703 :OUTPUT ACCEPT [0:0] 704 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 705 -A INPUT -p icmp -j ACCEPT 706 -A INPUT -i lo -j ACCEPT 707 -A INPUT -s 222.186.135.61 -p tcp -j ACCEPT 708 -A INPUT -p tcp --dport 80 -j ACCEPT 709 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 710 -A INPUT -j REJECT --reject-with icmp-host-prohibited 711 -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP 712 -A FORWARD -j REJECT --reject-with icmp-host-prohibited 713 COMMIT 714 } 715 716 添加网段转发{ 717 718 # 例如通过vpn上网 719 echo 1 > /proc/sys/net/ipv4/ip_forward # 在内核里打开ip转发功能 720 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE # 添加网段转发 721 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出去 722 iptables -t nat -nL # 查看转发 723 724 } 725 726 端口映射{ 727 728 # 内网通过有外网IP的机器映射端口 729 # 内网主机添加路由 730 route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.20.111 # 内网需要添加默认网关,并且网关开启转发 731 # 网关主机 732 echo 1 > /proc/sys/net/ipv4/ip_forward # 在内核里打开ip转发功能 733 iptables -t nat -A PREROUTING -d 外网IP -p tcp --dport 9999 -j DNAT --to 10.10.20.55:22 # 进入 734 iptables -t nat -A POSTROUTING -s 10.10.20.0/24 -j SNAT --to 外网IP # 转发回去 735 iptables -t nat -nL # 查看转发 736 737 } 738 739 } 740 741 }
1 4. 服务{ 2 3 /etc/init.d/sendmail start # 启动服务 4 /etc/init.d/sendmail stop # 关闭服务 5 /etc/init.d/sendmail status # 查看服务当前状态 6 /date/mysql/bin/mysqld_safe --user=mysql & # 启动mysql后台运行 7 /bin/systemctl restart mysqld.service # centos7启动服务 8 vi /etc/rc.d/rc.local # 开机启动执行 可用于开机启动脚本 9 /etc/rc.d/rc3.d/S55sshd # 开机启动和关机关闭服务连接 # S开机start K关机stop 55级别 后跟服务名 10 ln -s -f /date/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd # 将启动程序脚本连接到开机启动目录 11 ipvsadm -ln # lvs查看后端负载机并发 12 ipvsadm -C # lvs清除规则 13 xm list # 查看xen虚拟主机列表 14 virsh # 虚拟化(xen\kvm)管理工具 yum groupinstall Virtual* 15 ./bin/httpd -M # 查看httpd加载模块 16 httpd -t -D DUMP_MODULES # rpm包httpd查看加载模块 17 echo 内容| /bin/mail -s "标题" 收件箱 -f 发件人 # 发送邮件 18 "`echo "内容"|iconv -f utf8 -t gbk`" | /bin/mail -s "`echo "标题"|iconv -f utf8 -t gbk`" 收件箱 # 解决邮件乱码 19 /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # 检测nagios配置文件 20 21 chkconfig{ 22 23 chkconfig service on|off|set # 设置非独立服务启状态 24 chkconfig --level 35 httpd off # 让服务不自动启动 25 chkconfig --level 35 httpd on # 让服务自动启动 35指的是运行级别 26 chkconfig --list # 查看所有服务的启动状态 27 chkconfig --list |grep httpd # 查看某个服务的启动状态 28 chkconfig –-list [service] # 查看服务的状态 29 30 } 31 32 systemctl{ 33 34 systemctl is-active *.service # 查看服务是否运行 35 systemctl is-enabled *.service # 查询服务是否开机启动 36 systemctl mask *.service # 注销指定服务 37 systemctl unmask cups.service # 取消注销cups服务 38 systemctl enable *.service # 开机运行服务 39 systemctl disable *.service # 取消开机运行 40 systemctl start *.service # 启动服务 41 systemctl stop *.service # 停止服务 42 systemctl restart *.service # 重启服务 43 systemctl reload *.service # 重新加载服务配置文件 44 systemctl status *.service # 查询服务运行状态 45 systemctl --failed # 显示启动失败的服务 46 systemctl poweroff # 系统关机 47 systemctl reboot # 重新启动 48 systemctl rescue # 强制进入救援模式 49 systemctl emergency # 强制进入紧急救援模式 50 systemctl list-dependencies # 查看当前运行级别target(mult-user)启动了哪些服务 51 systemctl list-unit-files # 查看开机启动的状态 52 journalctl -r -u elasticsearch.service # 查看日志 r倒序 u服务名 53 /etc/systemd/system/falcon-agent.service 54 [Unit] 55 Description=This is zuiyou monitor agent 56 After=network.target remote-fs.target nss-lookup.target 57 58 [Service] 59 User= root 60 Type=simple 61 PIDFile=/opt/falcon-agent/var/app.pid 62 ExecStartPre=/usr/bin/rm -f /opt/falcon-agent/var/app.pid 63 ExecStart=/opt/falcon-agent/control start 64 ExecReload=/bin/kill -s HUP $MAINPID 65 KillMode=process 66 KillSignal=SIGQUIT 67 TimeoutStopSec=5 68 PrivateTmp=true 69 Restart=always 70 LimitNOFILE=infinity 71 72 [Install] 73 WantedBy=multi-user.target 74 75 systemctl daemon-reload # 加载配置 76 77 } 78 79 80 nginx{ 81 82 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 83 84 groupadd nginx 85 useradd nginx -g nginx -M -s /sbin/nologin 86 87 mkdir -p /opt/nginx-tmp 88 89 wget http://labs.frickle.com/files/ngx_cache_purge-1.6.tar.gz 90 tar fxz ngx_cache_purge-1.6.tar.gz 91 # ngx_cache_purge 清除指定url缓存 92 # 假设一个URL为 http://192.168.12.133/test.txt 93 # 通过访问 http://192.168.12.133/purge/test.txt 就可以清除该URL的缓存。 94 95 tar zxvpf nginx-1.4.4.tar.gz 96 cd nginx-1.4.4 97 98 # ./configure --help 99 # --with # 默认不加载 需指定编译此参数才使用 100 # --without # 默认加载,可用此参数禁用 101 # --add-module=path # 添加模块的路径 102 # --add-module=/opt/ngx_module_upstream_check \ # nginx 代理状态页面 103 # ngx_module_upstream_check 编译前需要打对应版本补丁 patch -p1 < /opt/nginx_upstream_check_module/check_1.2.6+.patch 104 # --add-module=/opt/ngx_module_memc \ # 将请求页面数据存放在 memcached中 105 # --add-module=/opt/ngx_module_lua \ # 支持lua脚本 yum install lua-devel lua 106 107 ./configure \ 108 --user=nginx \ 109 --group=nginx \ 110 --prefix=/usr/local/nginx \ 111 --with-http_ssl_module \ 112 --with-http_realip_module \ 113 --with-http_gzip_static_module \ 114 --with-http_stub_status_module \ 115 --add-module=/opt/ngx_cache_purge-1.6 \ 116 --http-client-body-temp-path=/opt/nginx-tmp/client \ 117 --http-proxy-temp-path=/opt/nginx-tmp/proxy \ 118 --http-fastcgi-temp-path=/opt/nginx-tmp/fastcgi \ 119 --http-uwsgi-temp-path=/opt/nginx-tmp/uwsgi \ 120 --http-scgi-temp-path=/opt/nginx-tmp/scgi 121 122 make && make install 123 124 /usr/local/nginx/sbin/nginx –t # 检查Nginx配置文件 但并不执行 125 /usr/local/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf # 检查Nginx配置文件 126 /usr/local/nginx/sbin/nginx # 启动nginx 127 /usr/local/nginx/sbin/nginx -s reload # 重载配置 128 /usr/local/nginx/sbin/nginx -s stop # 关闭nginx服务 129 130 } 131 132 elasticsearch{ 133 134 vim /etc/sysctl.conf 135 vm.max_map_count = 262144 136 137 vim /etc/security/limits.conf 138 * soft memlock unlimited 139 * hard memlock unlimited 140 sysctl -p 141 142 curl 'localhost:9200/_cat/health?v' # 健康检查 143 curl 'localhost:9200/_cat/nodes?v' # 获取集群的节点列表 144 curl 'localhost:9200/_cat/indices?v' # 列出所有索引 145 curl 127.0.0.1:9200/indexname -XDELETE # 删除索引 146 curl -XGET http://localhost:9200/_cat/shards # 查看分片 147 curl '127.0.0.1:9200/_cat/indices' # 查分片同步 unassigned_shards # 没同步完成 148 149 } 150 151 152 mysql常用命令{ 153 154 # mysql 可视化工具 MySQL Workbench 155 156 mysqlcheck -uroot -p -S mysql.sock --optimize --databases account # 检查、修复、优化MyISAM表 157 mysqlbinlog slave-relay-bin.000001 # 查看二进制日志 158 mysqladmin -h myhost -u root -p create dbname # 创建数据库 159 160 flush privileges; # 刷新 161 show databases; # 显示所有数据库 162 use dbname; # 打开数据库 163 show tables; # 显示选中数据库中所有的表 164 desc tables; # 查看表结构 165 drop database name; # 删除数据库 166 drop table name; # 删除表 167 create database name; # 创建数据库 168 select column from table; # 查询 169 show processlist; # 查看mysql进程 170 show full processlist; # 显示进程全的语句 171 select user(); # 查看所有用户 172 show slave status\G; # 查看主从状态 173 show variables; # 查看所有参数变量 174 show status; # 运行状态 175 show table status # 查看表的引擎状态 176 show grants for user@'%' # 查看用户权限 177 drop table if exists user # 表存在就删除 178 create table if not exists user # 表不存在就创建 179 select host,user,password from user; # 查询用户权限 先use mysql 180 create table ka(ka_id varchar(6),qianshu int); # 创建表 181 show variables like 'character_set_%'; # 查看系统的字符集和排序方式的设定 182 show variables like '%timeout%'; # 查看超时相关参数 183 delete from user where user=''; # 删除空用户 184 delete from user where user='sss' and host='localhost' ; # 删除用户 185 drop user 'sss'@'localhost'; # 使用此方法删除用户更为靠谱 186 ALTER TABLE mytable ENGINE = MyISAM ; # 改变现有的表使用的存储引擎 187 SHOW TABLE STATUS from dbname where Name='tablename'; # 查询表引擎 188 mysql -uroot -p -A -ss -h10.10.10.5 -e "show databases;" # shell中获取数据不带表格 -ss参数 189 CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB # 创建表指定存储引擎的类型(MyISAM或INNODB) 190 grant replication slave on *.* to 'user'@'%' identified by 'pwd'; # 创建主从复制用户 191 ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction); # 添加索引 192 alter table name add column accountid(column) int(11) NOT NULL(column); # 插入字段 193 update host set monitor_state='Y',hostname='xuesong' where ip='192.168.1.1'; # 更新数据 194 select * from information_schema.processlist where command!='sleep'; # 查看当前进程 195 select * from atable where name='on' AND t<15 AND host LIKE '10%' limit 1,10; # 多条件查询 196 show create database ops_deploy; # 查看数据库编码 197 show create table updatelog; # 查看数据库表编码 198 alter database ops_deploy CHARACTER SET utf8; # 修改数据库编码 199 alter table `updatelog` default character set utf8; # 修改表编码 200 alter table `updatelog` convert to character set utf8; # 修改一张表的所有字段的编码格式 201 202 自增表{ 203 204 create table xuesong (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(30) NOT NULL, age integer , sex CHAR(15) ); # 创建自增表 205 insert into xuesong(name,age,sex) values(%s,%s,%s) # 自增插入数据 206 207 } 208 209 登录mysql的命令{ 210 211 # 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 212 mysql -h110.110.110.110 -P3306 -uroot -p 213 mysql -uroot -p -S /data1/mysql5/data/mysql.sock -A --default-character-set=GBK 214 215 } 216 217 shell执行mysql命令{ 218 219 mysql -u root -p'123' xuesong < file.sql # 针对指定库执行sql文件中的语句,好处不需要转义特殊符号,一条语句可以换行.不指定库执行时语句中需要先use 220 mysql -u$username -p$passwd -h$dbhost -P$dbport -A -e " 221 use $dbname; 222 delete from data where date=('$date1'); 223 " # 执行多条mysql命令 224 mysql -uroot -p -S mysql.sock -e "use db;alter table gift add column accountid int(11) NOT NULL;flush privileges;" 2>&1 |grep -v Warning # 不登陆mysql插入字段 225 226 } 227 228 229 mysql字符集相关{ 230 231 show variables like '%character%'; # 查看数据库中设置字符集的参数 232 # character_set_client、character_set_connection 以及 character_set_results 这几个参数都是客户端的设置 233 # character_set_system、character_set_server 以及 character_set_database 是指服务器端的设置。 234 # 而对于这三个服务器端的参数来说的优先级是: 235 # 列级字符集 > 表级字符集 > character_set_database > character_set_server > character_set_system 236 237 show global variables like '%char%'; #查看RDS实例字符集相关参数设置 238 show global variables like 'coll%'; #查看当前会话字符序相关参数设置 239 show character set; #查看实例支持的字符集 240 show collation; #查看实例支持的字符序 241 show create table table_name \G #查看表字符集设置 242 show create database database_name \G #查看数据库字符集设置 243 show create procedure procedure_name \G #查看存储过程字符集设置 244 show procedure status \G #查看存储过程字符集设置 245 alter database db_name default charset utf8; #修改数据库的字符集 246 create database db_name character set utf8; #创建数据库时指定字符集 247 alter table tab_name default charset utf8 collate utf8_general_ci; #修改表字符集和字符序 248 249 # 下面三条sql 分别将库 dbsdq , 表 tt2 , 表 tt2 中的 c2 列修改为utf8mb4 字符集 250 alter database dbsdq character set utf8mb4 collate utf8mb4_unicode_ci; 251 use dbsdq; 252 alter table tt2 character set utf8mb4 collate utf8mb4_unicode_ci; 253 alter table tt2 modify c2 varchar(10) character set utf8mb4; 254 # 修改列时,当前列中的所有行都会立即转化为新的字符集; 255 # alter table 会对表加元数据锁 256 257 } 258 259 备份数据库{ 260 261 mysqldump -h host -u root -p --default-character-set=utf8 dbname >dbname_backup.sql # 不包括库名,还原需先创建库,在use 262 mysqldump -h host -u root -p --database --default-character-set=utf8 dbname >dbname_backup.sql # 包括库名,还原不需要创建库 263 /bin/mysqlhotcopy -u root -p # mysqlhotcopy只能备份MyISAM引擎 264 mysqldump -u root -p -S mysql.sock --default-character-set=utf8 dbname table1 table2 > /data/db.sql # 备份表 265 mysqldump -uroot -p123 -d database > database.sql # 备份数据库结构 266 267 # 最小权限备份 268 grant select on db_name.* to dbbackup@"localhost" Identified by "passwd"; 269 # --single-transaction InnoDB有时间戳 只备份开始那一刻的数据,备份过程中的数据不会备份 270 mysqldump -hlocalhost -P 3306 -u dbbackup --single-transaction -p"passwd" --database dbname >dbname.sql 271 272 # xtrabackup备份需单独安装软件 优点: 速度快,压力小,可直接恢复主从复制 273 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 274 275 } 276 277 还原数据库{ 278 279 mysql -h host -u root -p dbname < dbname_backup.sql 280 source 路径.sql # 登陆mysql后还原sql文件 281 282 } 283 284 赋权限{ 285 286 # 指定IP: $IP 本机: localhost 所有IP地址: % # 通常指定多条 287 grant all on zabbix.* to user@"$IP"; # 对现有账号赋予权限 288 grant select on database.* to user@"%" Identified by "passwd"; # 赋予查询权限(没有用户,直接创建) 289 grant all privileges on database.* to user@"$IP" identified by 'passwd'; # 赋予指定IP指定用户所有权限(不允许对当前库给其他用户赋权限) 290 grant all privileges on database.* to user@"localhost" identified by 'passwd' with grant option; # 赋予本机指定用户所有权限(允许对当前库给其他用户赋权限) 291 grant select, insert, update, delete on database.* to user@'ip'identified by "passwd"; # 开放管理操作指令 292 revoke all on *.* from user@localhost; # 回收权限 293 GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `storemisc_dev`.* TO 'user'@'192.168.%' 294 295 } 296 297 更改密码{ 298 299 update user set password=password('passwd') where user='root' 300 mysqladmin -u root password 'xuesong' 301 302 } 303 304 mysql忘记密码后重置{ 305 306 cd /data/mysql5 307 /data/mysql5/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking & 308 use mysql; 309 update user set password=password('123123') where user='root'; 310 311 } 312 313 mysql主从复制失败恢复{ 314 315 slave stop; 316 reset slave; 317 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; 318 slave start; 319 320 } 321 322 sql语句使用变量{ 323 324 use xuesong; 325 set @a=concat('my',weekday(curdate())); # 组合时间变量 326 set @sql := concat('CREATE TABLE IF NOT EXISTS ',@a,'( id INT(11) NOT NULL )'); # 组合sql语句 327 select @sql; # 查看语句 328 prepare create_tb from @sql; # 准备 329 execute create_tb; # 执行 330 331 } 332 333 检测mysql主从复制延迟{ 334 335 1、在从库定时执行更新主库中的一个timeout数值 336 2、同时取出从库中的timeout值对比判断从库与主库的延迟 337 338 } 339 340 死锁{ 341 342 show OPEN TABLES where In_use > 0; # 查看当前锁信息 343 show variables like 'innodb_print_all_deadlocks'; # 查看当前死锁参数 344 set global innodb_print_all_deadlocks = 1; # 设置死锁信息保存到错误日志 345 innodb_print_all_deadlocks = 1 # conf配置 346 347 } 348 349 mysql慢查询{ 350 351 select * from information_schema.processlist where command in ('Query') and time >5\G # 查询操作大于5S的进程 352 353 开启慢查询日志{ 354 355 # 配置文件 /etc/my.conf 356 [mysqld] 357 log-slow-queries=/var/lib/mysql/slowquery.log # 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log 358 long_query_time=5 # 记录超过的时间,默认为10s 建议0.5S 359 log-queries-not-using-indexes # log下来没有使用索引的query,可以根据情况决定是否开启 可不加 360 log-long-format # 如果设置了,所有没有使用索引的查询也将被记录 可不加 361 # 直接修改生效 362 show variables like "%slow%"; # 查看慢查询状态 363 set global slow_query_log='ON'; # 开启慢查询日志 变量可能不同,看上句查询出来的变量 364 365 } 366 367 mysqldumpslow慢查询日志查看{ 368 369 -s # 是order的顺序,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序 370 -t # 是top n的意思,即为返回前面多少条的数据 371 -g # 后边可以写一个正则匹配模式,大小写不敏感的 372 373 mysqldumpslow -s c -t 20 host-slow.log # 访问次数最多的20个sql语句 374 mysqldumpslow -s r -t 20 host-slow.log # 返回记录集最多的20个sql 375 mysqldumpslow -t 10 -s t -g "left join" host-slow.log # 按照时间返回前10条里面含有左连接的sql语句 376 377 show global status like '%slow%'; # 查看现在这个session有多少个慢查询 378 show variables like '%slow%'; # 查看慢查询日志是否开启,如果slow_query_log和log_slow_queries显示为on,说明服务器的慢查询日志已经开启 379 show variables like '%long%'; # 查看超时阀值 380 desc select * from wei where text='xishizhaohua'\G; # 扫描整张表 tepe:ALL 没有使用索引 key:NULL 381 create index text_index on wei(text); # 创建索引 382 383 } 384 385 Percona Toolkit 慢日志分析工具 386 387 } 388 389 mysql操作次数查询{ 390 391 select * from information_schema.global_status; 392 393 com_select 394 com_delete 395 com_insert 396 com_update 397 398 } 399 400 } 401 402 mongodb{ 403 404 # mongo可视管理工具 studio 3t 405 406 一、启动{ 407 408 # 不启动认证 409 ./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/ 410 # 启动认证 411 ./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/ --auth 412 413 # 配置文件方式启动 414 cat /opt/mongodb/mongodb.conf 415 port=27017 # 端口号 416 fork=true # 以守护进程的方式运行,创建服务器进程 417 auth=true # 开启用户认证 418 logappend=true # 日志采用追加方式 419 logpath=/opt/mongodb/mongodb.log # 日志输出文件路径 420 dbpath=/opt/mongodb/data/ # 数据库路径 421 shardsvr=true # 设置是否分片 422 maxConns=600 # 数据库的最大连接数 423 ./mongod -f /opt/mongodb/mongodb.conf 424 425 # 其他参数 426 bind_ip # 绑定IP 使用mongo登录需要指定对应IP 427 journal # 开启日志功能,降低单机故障的恢复时间,取代dur参数 428 syncdelay # 系统同步刷新磁盘的时间,默认60秒 429 directoryperdb # 每个db单独存放目录,建议设置.与mysql独立表空间类似 430 repairpath # 执行repair时的临时目录.如果没开启journal,出现异常重启,必须执行repair操作 431 # mongodb没有参数设置内存大小.使用os mmap机制缓存数据文件,在数据量不超过内存的情况下,效率非常高.数据量超过系统可用内存会影响写入性能 432 433 } 434 435 二、关闭{ 436 437 # 方法一:登录mongodb 438 ./mongo 439 use admin 440 db.shutdownServer() 441 442 # 方法:kill传递信号 两种皆可 443 kill -2 pid 444 kill -15 pid 445 446 } 447 448 三、开启认证与用户管理{ 449 450 ./mongo # 先登录 451 use admin # 切换到admin库 452 db.addUser("root","123456") # 创建用户 453 db.addUser('zhansan','pass',true) # 如果用户的readOnly为true那么这个用户只能读取数据,添加一个readOnly用户zhansan 454 ./mongo 127.0.0.1:27017/mydb -uroot -p123456 # 再次登录,只能针对用户所在库登录 455 #虽然是超级管理员,但是admin不能直接登录其他数据库,否则报错 456 #Fri Nov 22 15:03:21.886 Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:228 457 show collections # 查看链接状态 再次登录使用如下命令,显示错误未经授权 458 db.system.users.find(); # 查看创建用户信息 459 db.system.users.remove({user:"zhansan"}) # 删除用户 460 461 #恢复密码只需要重启mongodb 不加--auth参数 462 463 } 464 465 四、登录{ 466 467 192.168.1.5:28017 # http登录后可查看状态 468 mongo # 默认登录后打开 test 库 469 mongo 192.168.1.5:27017/databaseName # 直接连接某个库 不存在则创建 启动认证需要指定对应库才可登录 470 471 } 472 473 五、查看状态{ 474 475 #登录后执行命令查看状态 476 db.runCommand({"serverStatus":1}) 477 globalLock # 表示全局写入锁占用了服务器多少时间(微秒) 478 mem # 包含服务器内存映射了多少数据,服务器进程的虚拟内存和常驻内存的占用情况(MB) 479 indexCounters # 表示B树在磁盘检索(misses)和内存检索(hits)的次数.如果这两个比值开始上升,就要考虑添加内存了 480 backgroudFlushing # 表示后台做了多少次fsync以及用了多少时间 481 opcounters # 包含每种主要擦撞的次数 482 asserts # 统计了断言的次数 483 484 #状态信息从服务器启动开始计算,如果过大就会复位,发送复位,所有计数都会复位,asserts中的roolovers值增加 485 486 #mongodb自带的命令 487 ./mongostat 488 insert #每秒插入量 489 query #每秒查询量 490 update #每秒更新量 491 delete #每秒删除量 492 locked #锁定量 493 qr|qw #客户端查询排队长度(读|写) 494 ar|aw #活跃客户端量(读|写) 495 conn #连接数 496 time #当前时间 497 498 mongostat -h 127.0.0.1 --port 27047 --authenticationDatabase admin -u zadmin -p Keaphh9e # 查看mongo状态 499 mongotop -h 127.0.0.1 --port 27047 --authenticationDatabase admin -u zadmin -p Keaphh9e # 查看mongo集合的统计数据 500 501 } 502 503 六、常用命令{ 504 505 db.listCommands() # 当前MongoDB支持的所有命令(同样可通过运行命令db.runCommand({"listCommands" : `1})来查询所有命令) 506 507 db.runCommand({"buildInfo" : 1}) # 返回MongoDB服务器的版本号和服务器OS的相关信息 508 db.runCommand({"collStats" : tablename}) # 返回该集合的统计信息,包括数据大小,已分配存储空间大小,索引的大小等 509 db.runCommand({"dropDatabase" : 1}) # 清空当前数据库的信息,包括删除所有的集合和索引 510 db.runCommand({"isMaster" : 1}) # 检查本服务器是主服务器还是从服务器 511 db.runCommand({"ping" : 1}) # 检查服务器链接是否正常。即便服务器上锁,该命令也会立即返回 512 db.runCommand({"repaireDatabase" : 1}) # 对当前数据库进行修复并压缩,如果数据库特别大,这个命令会非常耗时 513 db.runCommand({"serverStatus" : 1}) # 查看这台服务器的管理统计信息 514 # 某些命令必须在admin数据库下运行,如下两个命令: 515 db.runCommand({"renameCollection" : 集合名, "to":集合名}) # 对集合重命名,注意两个集合名都要是完整的集合命名空间,如foo.bar, 表示数据库foo下的集合bar。 516 db.runCommand({"listDatabases" : 1}) # 列出服务器上所有的数据库 517 518 mongo 172.20.20.1:27072/mdb --eval "db.tb.count();" # shell执行mongo语句 519 mongo --host 172.20.20.1 --port 27049 520 521 rs.config(); # 查看集群配置 522 rs.status(); # 查看集群节点的状态 523 db.currentOp() # 获取当前正在执行的操作,可对应命令链接到ip:port 524 db.runCommand( { logRotate : 1 } ) # 日志轮转 525 rs.slaveOk() # 设置从库shell可读 526 rs.addArb("172.16.10.199:27020"); # 添加仲裁节点 527 rs.add({host: "10.2.2.2:27047", priority: 0, hidden: true}) # 添加从节点 hidden true隐藏节点[priority必须为0] false不隐藏 528 rs.remove("172.20.80.216:27047"); # 删除节点 529 rs.stepDown(120) # 主库上执行切换为从,120秒后切换回主 530 show dbs # 查询db 531 use post # 选择db 532 show tables # 查看文档列表 533 db.tb.drop() # 删除集合 需要权限 534 db.tb.remove({}) # 删除所有数据 535 db.tb.count() # 查询文档条数 536 db.tb.find() # 查看文档内容 537 db.tb.find({_id:37530555}) # 查询指定id 538 db.tb.find().sort({_id:-1}).limit(1) # 查询文档最后一条 539 db.tb.find({"processed" : {"$ne" : true}}).limit(1); # 字段不为 true 540 db.tb.find({"processed" : {"$eq" : true}}).limit(1); # 字段为 true 541 db.tb.find({"processed" : {"$exists" : false}}).limit(1); # 字段不存在 542 543 db.tb.ensureIndex({"status":1}, {background:true}) # 后台加索引 544 db.tb.getIndexes() # 查看索引 545 db.tb.ensureIndex({"c_type":1},{backgrounnd:true}) # 后台添加索引 1正向 -1反向 546 db.tb.dropIndex({"c_type":1}); # 删除索引 547 548 } 549 550 七、进程控制{ 551 552 db.currentOp() # 查看活动进程 553 db.$cmd.sys.inprog.findOne() # 查看活动进程 与上面一样 554 opid # 操作进程号 555 op # 操作类型(查询\更新) 556 ns # 命名空间,指操作的是哪个对象 557 query # 如果操作类型是查询,这里将显示具体的查询内容 558 lockType # 锁的类型,指明是读锁还是写锁 559 560 db.killOp(opid值) # 结束进程 561 db.$cmd.sys.killop.findOne({op:opid值}) # 结束进程 562 563 } 564 565 八、备份还原{ 566 # mongodump 虽然能不停机备份,但是为了获取实时数据视图的能力,使用fsync命令能在运行时复制数据目录并且不会损坏数据 567 # fsync会强制服务器将所有缓冲区的数据写入磁盘.配合lock还阻止对数据库的进一步写入,知道释放锁为止 568 db.runCommand({"fsync":1,"lock":1}) # 执行强制更新与写入锁 569 db.$cmd.sys.unlock.findOne() # 解锁 570 db.currentOp() # 查看解锁是否正常 571 572 mongoexport -d test -c t1 -o t1.dat # 导出JSON格式 573 -c # 指明导出集合 574 -d # 使用库 575 mongoexport -d test -c t1 -csv -f num -o t1.dat # 导出csv格式 576 -csv # 指明导出csv格式 577 -f # 指明需要导出那些例 578 579 mongoimport -d test -c t1 -file t1.dat # mongoimport还原JSON格式 580 mongoimport -d test -c t1 -type csv --headerline -file t1.dat # mongoimport还原csv格式数据 581 --headerline # 指明不导入第一行 因为第一行是列名 582 583 mongodump -d test -o /bak/mongodump # mongodump数据备份 584 mongorestore -d test --drop /bak/mongodump/* # mongorestore恢复 585 --drop # 恢复前先删除 586 --gzip # 压缩 587 588 # 备份一个表 589 # --excludeCollection string # 排除指定的集合 要排除多个,使用多个 590 mongodump --host 127.0.0.1:27080 -d dbname -c tablename -o /data/reports/ 591 mongodump --host 127.0.0.1:27080 -d dbname -c tablename -o /data/reports/reports -u root -p tAvaa5yNUE --authenticationDatabase admin 592 593 # 恢复一个表 594 mongorestore --host 127.0.0.1:27080 -d dbname -c tablename --drop --dir=/data/reports/tablename.bson 595 596 # 在线拷贝一个库 597 db.copyDatabase(fromdb, todb, fromhost, username, password, mechanism) 598 db.copyDatabase('mate','mate', '172.16.255.176:27047') 599 600 } 601 602 九、修复{ 603 604 # 当停电或其他故障引起不正常关闭时,会造成部分数据损坏丢失 605 mongod --repair # 修复操作:启动时候加上 --repair 606 # 修复过程:将所有文档导出,然后马上导入,忽略无效文档.完成后重建索引。时间较长,会丢弃损坏文档 607 # 修复数据还能起到压缩数据库的作用 608 db.repairDatabase() # 运行中的mongodb可使用 repairDatabase 修复当前使用的数据库 609 {"repairDatabase":1} # 通过驱动程序 610 611 } 612 613 十、python使用mongodb{ 614 615 原文: http://blog.nosqlfan.com/html/2989.html 616 617 easy_install pymongo # python2.7+ 618 import pymongo 619 connection=pymongo.Connection('localhost',27017) # 创建连接 620 db = connection.test_database # 切换数据库 621 collection = db.test_collection # 获取collection 622 # db和collection都是延时创建的,在添加Document时才真正创建 623 624 文档添加, _id自动创建 625 import datetime 626 post = {"author": "Mike", 627 "text": "My first blog post!", 628 "tags": ["mongodb", "python", "pymongo"], 629 "date": datetime.datetime.utcnow()} 630 posts = db.posts 631 posts.insert(post) 632 ObjectId('...') 633 634 批量插入 635 new_posts = [{"author": "Mike", 636 "text": "Another post!", 637 "tags": ["bulk", "insert"], 638 "date": datetime.datetime(2009, 11, 12, 11, 14)}, 639 {"author": "Eliot", 640 "title": "MongoDB is fun", 641 "text": "and pretty easy too!", 642 "date": datetime.datetime(2009, 11, 10, 10, 45)}] 643 posts.insert(new_posts) 644 [ObjectId('...'), ObjectId('...')] 645 646 获取所有collection 647 db.collection_names() # 相当于SQL的show tables 648 649 获取单个文档 650 posts.find_one() 651 652 查询多个文档 653 for post in posts.find(): 654 post 655 656 加条件的查询 657 posts.find_one({"author": "Mike"}) 658 659 高级查询 660 posts.find({"date": {"$lt": "d"}}).sort("author") 661 662 统计数量 663 posts.count() 664 665 加索引 666 from pymongo import ASCENDING, DESCENDING 667 posts.create_index([("date", DESCENDING), ("author", ASCENDING)]) 668 669 查看查询语句的性能 670 posts.find({"date": {"$lt": "d"}}).sort("author").explain()["cursor"] 671 posts.find({"date": {"$lt": "d"}}).sort("author").explain()["nscanned"] 672 673 } 674 675 } 676 677 JDK安装{ 678 679 vim /etc/profile.d/jdk.sh 680 export JAVA_HOME=/usr/local/jdk1.8.0_151 681 export PATH=$JAVA_HOME/bin:$PATH 682 683 . /etc/profile # 加载新的环境变量 684 jps -ml # 查看java进程 685 jstat -gc 18381 1s 30 # 查看java进程gc情况 686 } 687 688 redis动态加内存{ 689 690 ./redis-cli -h 10.10.10.11 -p 6401 691 save # 保存当前快照 692 config get * # 列出所有当前配置 693 config get maxmemory # 查看指定配置 694 config set maxmemory 15360000000 # 动态修改最大内存配置参数 695 696 } 697 698 nfs{ 699 700 # 依赖rpc服务通信 portmap[centos5] 或 rpcbind[centos6] 701 yum install nfs-utils portmap # centos5安装 702 yum install nfs-utils rpcbind # centos6安装 703 704 vim /etc/exports # 配置文件 705 # sync # 同步写入 706 # async # 暂存并非直接写入 707 # no_root_squash # 开放用户端使用root身份操作 708 # root_squash # 使用者身份为root则被压缩成匿名使用,即nobody,相对安全 709 # all_squash # 所有NFS的使用者身份都被压缩为匿名 710 /data/images 10.10.10.0/24(rw,sync,no_root_squash) 711 712 service portmap restart # 重启centos5的nfs依赖的rpc服务 713 service rpcbind restart # 重启centos6的nfs依赖的rpc服务 714 service nfs restart # 重启nfs服务 确保依赖 portmap 或 rpcbind 服务已启动 715 service nfs reload # 重载NFS服务配置文件 716 showmount -e # 服务端查看自己共享的服务 717 showmount -a # 显示已经与客户端连接上的目录信息 718 showmount -e 10.10.10.3 # 列出服务端可供使用的NFS共享 客户端测试能否访问nfs服务 719 mount -t nfs 10.10.10.3:/data/images/ /data/img # 挂载nfs 如果延迟影响大加参数 noac 720 721 # 服务端的 portmap 或 rpcbind 被停止后,nfs仍然工作正常,但是umout财会提示: not found / mounted or server not reachable 重启服务器的portmap 或 rpcbind 也无济于事。 nfs也要跟着重启,否则nfs工作仍然是不正常的。 722 # 同时已挂载会造成NFS客户端df卡住和挂载目录无法访问。请先用 mount 查看当前挂载情况,记录挂载信息,在强制卸载挂载目录,重新挂载 723 umount -f /data/img/ # 强制卸载挂载目录 如还不可以 umount -l /data/img/ 724 725 nfsstat -c # 客户机发送和拒绝的RPC和NFS调用数目的信息 726 nfsstat -cn # 显示和打印与客户机NFS调用相关的信息 727 nfsstat -r # 显示和打印客户机和服务器的与RPC调用相关的信息 728 nfsstat –s # 显示关于服务器接收和拒绝的RPC和NFS调用数目的信息 729 730 } 731 732 hdfs{ 733 hdfs --help # 所有参数 734 735 hdfs dfs -help # 运行文件系统命令在Hadoop文件系统 736 hdfs dfs -ls /logs # 查看 737 hdfs dfs -ls /user/ # 查看用户 738 hdfs dfs -cat 739 hdfs dfs -df 740 hdfs dfs -du 741 hdfs dfs -rm 742 hdfs dfs -tail 743 hdfs dfs –put localSrc dest # 上传文件 744 745 hdfs dfsadmin -help # hdfs集群节点管理 746 hdfs dfsadmin -report # 基本的文件系统统计信息 747 } 748 749 }
1 5. 网络{ 2 3 rz # 通过ssh上传小文件 4 sz # 通过ssh下载小文件 5 ifconfig eth0 down # 禁用网卡 6 ifconfig eth0 up # 启用网卡 7 ifup eth0:0 # 启用网卡 8 mii-tool em1 # 查看网线是否连接 9 traceroute www.baidu.com # 测试跳数 10 vi /etc/resolv.conf # 设置DNS nameserver IP 定义DNS服务器的IP地址 11 nslookup www.moon.com # 解析域名IP 12 dig -x www.baidu.com # 解析域名IP 13 dig +trace -t A domainname # 跟踪dns 14 dig +short txt hacker.wp.dg.cx # 通过 DNS 来读取 Wikipedia 的hacker词条 15 host -t txt hacker.wp.dg.cx # 通过 DNS 来读取 Wikipedia 的hacker词条 16 lynx # 文本上网 17 wget -P path -O name url # 下载 包名:wgetrc -q 安静 -c 续传 18 dhclient eth1 # 自动获取IP 19 mtr -r www.baidu.com # 测试网络链路节点响应时间 # trace ping 结合 20 ipcalc -m "$ip" -p "$num" # 根据IP和主机最大数计算掩码 21 curl -I www.baidu.com # 查看网页http头 22 curl -s www.baidu.com # 不显示进度 23 queryperf -d list -s DNS_IP -l 2 # BIND自带DNS压力测试 [list 文件格式:www.turku.fi A] 24 telnet ip port # 测试端口是否开放,有些服务可直接输入命令得到返回状态 25 echo "show " |nc $ip $port # 适用于telnet一类登录得到命令返回 26 nc -l -p port # 监听指定端口 27 nc -nv -z 10.10.10.11 1080 |grep succeeded # 检查主机端口是否开放 28 curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} $URL # 检查页面状态 29 curl -X POST -d "user=xuesong&pwd=123" http://www.abc.cn/Result # 提交POST请求 30 curl -s http://20140507.ip138.com/ic.asp # 通过IP138取本机出口外网IP 31 curl http://IP/ -H "X-Forwarded-For: ip" -H "Host: www.ttlsa.com" # 连到指定IP的响应主机,HTTPserver只看 Host字段 32 ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0 # 增加逻辑IP地址 33 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁ping 34 net rpc shutdown -I IP_ADDRESS -U username%password # 远程关掉一台WINDOWS机器 35 wget --random-wait -r -p -e robots=off -U Mozilla www.example.com # 递归方式下载整个网站 36 sshpass -p "$pwd" rsync -avzP /dir user@$IP:/dir/ # 指定密码避免交互同步目录 37 rsync -avzP --delete /dir/ user@$IP:/dir/ # 无差同步目录 可以快速清空大目录,末尾带/同步目录 38 rsync -avzP -e "ssh -p 22 -e -o StrictHostKeyChecking=no" /dir user@$IP:/dir # 指定ssh参数同步 39 40 抓包{ 41 42 -i eth1 # 只抓经过接口eth1的包 43 -t # 不显示时间戳 44 -s 0 # 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包 45 -c 100 # 只抓取100个数据包 46 dst port ! 22 # 不抓取目标端口是22的数据包 47 tcpdump tcp port 22 # 抓包 48 tcpdump -n -vv udp port 53 # 抓udp的dns包 并显示ip 49 tcpdump port 10001 -A -s0 # 完整显示ascii数据包 50 tcpdump -i any host x.x.x.x -s 0 -w /tmp/cap.pcap # 对端ip 51 tcpdump -i any -s 0 host 172.20.81.107 or host 172.16.3.72 -C 50 -W 5 -w /tmp/20190122ng.cap 52 53 } 54 55 56 一次短链接失败故障定位{ 57 58 # php和python程序调用接口,通过阿里云slb,到后端nginx,偶尔超时,后端nginx无请求,怀疑没到nginx,但通过检查,无法与nginx建立tcp链接 59 ss -nl |grep :80 # 查看 accept 队列值,短连接应该大一点 60 watch -n 1 'nstat -z -t 1 | grep -e TcpActiveOpens -e TcpExtListenOverflows -e TcpAttemptFails -e TcpPassiveOpen -e TcpExtTCPSynRetrans -e TcpRetransSegs -e TcpOutSegs -e TcpInSegs' 61 62 TcpAttemptFails TCP建立链接失败,包括前后端 63 TcpExtTCPSynRetrans TCP向后端建立链接失败 64 65 66 # nginx 和内核都需要调整才生效,程序监听端口,需要加socket参数 67 listen 10.87.128.29:51528 default_server backlog=4096; 68 69 70 https://m.aliyun.com/yunqi/articles/118472?spm=5176.8091938.0.0.11e86ccF4oOeZ 71 } 72 73 网卡流量查看{ 74 75 watch more /proc/net/dev # 实时监控流量文件系统 累计值 76 iptraf # 网卡流量查看工具 77 nethogs -d 5 eth0 eth1 # 按进程实时统计网络流量 epel源nethogs 78 iftop -i eth0 -n -P # 实时流量监控 79 80 sar { 81 -n参数有6个不同的开关: DEV | EDEV | NFS | NFSD | SOCK | ALL 82 DEV显示网络接口信息 83 EDEV显示关于网络错误的统计数据 84 NFS统计活动的NFS客户端的信息 85 NFSD统计NFS服务器的信息 86 SOCK显示套 接字信息 87 ALL显示所有5个开关 88 89 sar -n DEV 1 10 90 91 rxpck/s # 每秒钟接收的数据包 92 txpck/s # 每秒钟发送的数据包 93 rxbyt/s # 每秒钟接收的字节数 94 txbyt/s # 每秒钟发送的字节数 95 rxcmp/s # 每秒钟接收的压缩数据包 96 txcmp/s # 每秒钟发送的压缩数据包 97 rxmcst/s # 每秒钟接收的多播数据包 98 99 } 100 101 } 102 103 netstat{ 104 105 # 几十万并发的情况下netstat会没有响应,建议使用 ss 命令 106 -a # 显示所有连接中的Socket 107 -t # 显示TCP连接 108 -u # 显示UDP连接 109 -n # 显示所有已建立的有效连接 110 netstat -anlp # 查看链接 111 netstat -tnlp # 只查看tcp监听端口 112 netstat -r # 查看路由表 113 } 114 115 ss{ 116 117 # netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多 118 ss -s # 列出当前socket详细信息 119 ss -l # 显示本地打开的所有端口 120 ss -tnlp # 显示每个进程具体打开的socket 121 ss -ant # 显示所有TCP socket 122 ss -u -a # 显示所有UDP Socekt 123 ss dst 192.168.119.113 # 匹配远程地址 124 ss dst 192.168.119.113:http # 匹配远程地址和端口号 125 ss dst 192.168.119.113:3844 # 匹配远程地址和端口号 126 ss src 192.168.119.103:16021 # 匹配本地地址和端口号 127 ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有已建立的SMTP连接 128 ss -o state established '( dport = :http or sport = :http )' # 显示所有已建立的HTTP连接 129 ss -x src /tmp/.X11-unix/* # 找出所有连接X服务器的进程 130 131 } 132 133 并发数查看{ 134 135 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 136 SYN_RECV # 正在等待处理的请求 137 ESTABLISHED # 正常数据传输状态,既当前并发数 138 TIME_WAIT # 处理完毕,等待超时结束的请求 139 CLOSE_WAIT # 客户端异常关闭,没有完成4次挥手 如大量可能存在攻击行为 140 141 } 142 143 ssh{ 144 145 ssh -p 22 user@192.168.1.209 # 从linux ssh登录另一台linux 146 ssh -p 22 root@192.168.1.209 CMD # 利用ssh操作远程主机 147 scp -P 22 file root@ip:/dir # 把本地文件拷贝到远程主机 148 scp -l 100000 file root@ip:/dir # 传输文件到远程,限制速度100M 149 sshpass -p 'pwd' ssh -n root@$IP "echo hello" # 指定密码远程操作 150 ssh -o StrictHostKeyChecking=no $IP # ssh连接不提示yes 151 ssh -t "su -" # 指定伪终端 客户端以交互模式工作 152 scp root@192.168.1.209:/RemoteDir /localDir # 把远程指定文件拷贝到本地 153 pscp -h host.ip /a.sh /opt/sbin/ # 批量传输文件 154 ssh -N -L2001:remotehost:80 user@somemachine # 用SSH创建端口转发通道 155 ssh -t host_A ssh host_B # 嵌套使用SSH 156 ssh -t -p 22 $user@$Ip /bin/su - root -c {$Cmd}; # 远程su执行命令 Cmd="\"/sbin/ifconfig eth0\"" 157 ssh-keygen -t rsa # 生成密钥 158 ssh-copy-id -i xuesong@10.10.10.133 # 传送key 159 vi $HOME/.ssh/authorized_keys # 公钥存放位置 160 sshfs name@server:/path/to/folder /path/to/mount/point # 通过ssh挂载远程主机上的文件夹 161 fusermount -u /path/to/mount/point # 卸载ssh挂载的目录 162 ssh user@host cat /path/to/remotefile | diff /path/to/localfile - # 用DIFF对比远程文件跟本地文件 163 su - user -c "ssh user@192.168.1.1 \"echo -e aa |mail -s test mail@163.com\"" # 切换用户登录远程发送邮件 164 pssh -h ip.txt -i uptime # 批量执行ssh yum install pssh 165 166 SSH反向连接{ 167 168 # 外网A要控制内网B 169 170 ssh -NfR 1234:localhost:2223 user1@123.123.123.123 -p22 # 将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射 171 ss -ant # 这时在A主机上sshd会listen本地1234端口 172 # LISTEN 0 128 127.0.0.1:1234 *:* 173 ssh localhost -p1234 # 在A主机连接本地1234端口 174 175 } 176 } 177 178 网卡配置文件{ 179 180 vi /etc/sysconfig/network-scripts/ifcfg-eth0 181 182 DEVICE=eth0 183 BOOTPROTO=none 184 BROADCAST=192.168.1.255 185 HWADDR=00:0C:29:3F:E1:EA 186 IPADDR=192.168.1.55 187 NETMASK=255.255.255.0 188 NETWORK=192.168.1.0 189 ONBOOT=yes 190 TYPE=Ethernet 191 GATEWAY=192.168.1.1 192 #ARPCHECK=no # 进制arp检查 193 194 } 195 196 route { 197 198 route # 查看路由表 199 route add default gw 192.168.1.1 dev eth0 # 添加默认路由 200 route add -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 添加静态路由网关 201 route del -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 删除静态路由网关 202 203 } 204 205 静态路由{ 206 207 vim /etc/sysconfig/static-routes 208 any net 192.168.12.0/24 gw 192.168.0.254 209 any net 192.168.13.0/24 gw 192.168.0.254 210 211 } 212 213 解决ssh链接慢{ 214 215 sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config 216 sed -i '/#UseDNS yes/a\UseDNS no' /etc/ssh/sshd_config 217 /etc/init.d/sshd reload 218 219 } 220 221 nmap{ 222 223 nmap -PT 192.168.1.1-111 # 先ping在扫描主机开放端口 224 nmap -O 192.168.1.1 # 扫描出系统内核版本 225 nmap -sV 192.168.1.1-111 # 扫描端口的软件版本 226 nmap -sS 192.168.1.1-111 # 半开扫描(通常不会记录日志) 227 nmap -P0 192.168.1.1-111 # 不ping直接扫描 228 nmap -d 192.168.1.1-111 # 详细信息 229 nmap -D 192.168.1.1-111 # 无法找出真正扫描主机(隐藏IP) 230 nmap -p 20-30,139,60000- # 端口范围 表示:扫描20到30号端口,139号端口以及所有大于60000的端口 231 nmap -P0 -sV -O -v 192.168.30.251 # 组合扫描(不ping、软件版本、内核版本、详细信息) 232 233 # 不支持windows的扫描(可用于判断是否是windows) 234 nmap -sF 192.168.1.1-111 235 nmap -sX 192.168.1.1-111 236 nmap -sN 192.168.1.1-111 237 238 } 239 240 流量切分线路{ 241 242 # 程序判断进入IP线路,设置服务器路由规则控制返回 243 vi /etc/iproute2/rt_tables 244 #添加一条策略 245 252 bgp2 #注意策略的序号顺序 246 ip route add default via 第二个出口上线IP(非默认网关) dev eth1 table bgp2 247 ip route add from 本机第二个ip table bgp2 248 #查看 249 ip route list table 252 250 ip rule list 251 #成功后将语句添加开机启动 252 253 } 254 255 snmp{ 256 257 snmptranslate .1.3.6.1.2.1.1.3.0 # 查看映射关系 258 DISMAN-EVENT-MIB::sysUpTimeInstance 259 snmpdf -v 1 -c public localhost # SNMP监视远程主机的磁盘空间 260 snmpnetstat -v 2c -c public -a 192.168.6.53 # SNMP获取指定IP的所有开放端口状态 261 snmpwalk -v 2c -c public 10.152.14.117 .1.3.6.1.2.1.1.3.0 # SNMP获取主机启动时间 262 # MIB安装(ubuntu) 263 # sudo apt-get install snmp-mibs-downloader 264 # sudo download-mibs 265 snmpwalk -v 2c -c public 10.152.14.117 sysUpTimeInstance # SNMP通过MIB库获取主机启动时间 266 267 } 268 269 TC流量控制{ 270 271 # 针对ip段下载速率控制 272 tc qdisc del dev eth0 root handle 1: # 删除控制1: 273 tc qdisc add dev eth0 root handle 1: htb r2q 1 # 添加控制1: 274 tc class add dev eth0 parent 1: classid 1:1 htb rate 12mbit ceil 15mbit # 设置速率 275 tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 10.10.10.1/24 flowid 1:1 # 指定ip段控制规则 276 277 # 检查命令 278 tc -s -d qdisc show dev eth0 279 tc class show dev eth0 280 tc filter show dev eth0 281 282 限制上传下载{ 283 284 tc qdisc del dev tun0 root 285 tc qdisc add dev tun0 root handle 2:0 htb 286 tc class add dev tun0 parent 2:1 classid 2:10 htb rate 30kbps 287 tc class add dev tun0 parent 2:2 classid 2:11 htb rate 30kbps 288 tc qdisc add dev tun0 parent 2:10 handle 1: sfq perturb 1 289 tc filter add dev tun0 protocol ip parent 2:0 u32 match ip dst 10.18.0.0/24 flowid 2:10 290 tc filter add dev tun0 parent ffff: protocol ip u32 match ip src 10.18.0.0/24 police rate 30kbps burst 10k drop flowid 2:11 291 292 293 tc qdisc del dev tun0 root # 删除原有策略 294 tc qdisc add dev tun0 root handle 2:0 htb # 定义最顶层(根)队列规则,并指定 default 类别编号,为网络接口 eth1 绑定一个队列,类型为 htb,并指定了一个 handle 句柄 2:0 用于标识它下面的子类 295 tc class add dev tun0 parent 2:1 classid 2:10 htb rate 30kbps # 设置一个规则速度是30kbps 296 tc class add dev tun0 parent 2:2 classid 2:11 htb rate 30kbps 297 tc qdisc add dev tun0 parent 2:10 handle 1: sfq perturb 1 # 调用随机公平算法 298 tc filter add dev tun0 protocol ip parent 2:0 u32 match ip dst 10.18.0.0/24 flowid 2:10 # 规则2:10应用在目标地址上,即下载 299 tc filter add dev tun0 parent ffff: protocol ip u32 match ip src 10.18.0.0/24 police rate 30kbps burst 10k drop flowid 2:11 # 上传限速 300 301 } 302 303 } 304 305 }
1 6. 磁盘{ 2 3 df -Ph # 查看硬盘容量 4 df -T # 查看磁盘分区格式 5 df -i # 查看inode节点 如果inode用满后无法创建文件 6 du -h dir # 检测目录下所有文件大小 7 du -sh * # 显示当前目录中子目录的大小 8 mount -l # 查看分区挂载情况 9 fdisk -l # 查看磁盘分区状态 10 fdisk /dev/hda3 # 分区 11 mkfs -t ext4 /dev/hda3 # 格式化分区 12 fsck -y /dev/sda6 # 对文件系统修复 13 lsof |grep delete # 释放进程占用磁盘空间 列出进程后,查看文件是否存在,不存在则kill掉此进程 14 tmpwatch -afv 10 /tmp # 删除10小时内未使用的文件 勿在重要目录使用 15 cat /proc/filesystems # 查看当前系统支持文件系统 16 mount -o remount,rw / # 修改只读文件系统为读写 17 iotop # 进程占用磁盘IO情况 yum install iotop 18 smartctl -H /dev/sda # 检测硬盘状态 # yum install smartmontools 19 smartctl -i /dev/sda # 检测硬盘信息 20 smartctl -a /dev/sda # 检测所有信息 21 e2label /dev/sda5 # 查看卷标 22 e2label /dev/sda5 new-label # 创建卷标 23 ntfslabel -v /dev/sda8 new-label # NTFS添加卷标 24 tune2fs -j /dev/sda # ext2分区转ext3分区 25 tune2fs -l /dev/sda # 查看文件系统信息 26 mke2fs -b 2048 /dev/sda5 # 指定索引块大小 27 dumpe2fs -h /dev/sda5 # 查看超级块的信息 28 mount -t iso9660 /dev/dvd /mnt # 挂载光驱 29 mount -t ntfs-3g /dev/sdc1 /media/yidong # 挂载ntfs硬盘 30 mount -t nfs 10.0.0.3:/opt/images/ /data/img # 挂载nfs 需要重载 /etc/init.d/nfs reload 重启需要先启动 portmap 服务 31 mount -o loop /software/rhel4.6.iso /mnt/ # 挂载镜像文件 32 33 磁盘IO性能检测{ 34 35 iostat -x 1 10 36 37 % user # 显示了在用户级(应用程序)执行时生成的 CPU 使用率百分比。 38 % system # 显示了在系统级(内核)执行时生成的 CPU 使用率百分比。 39 % idle # 显示了在 CPU 空闲并且系统没有未完成的磁盘 I/O 请求时的时间百分比。 40 % iowait # 显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。 41 42 rrqm/s # 每秒进行 merge 的读操作数目。即 delta(rmerge)/s 43 wrqm/s # 每秒进行 merge 的写操作数目。即 delta(wmerge)/s 44 r/s # 每秒完成的读 I/O 设备次数。即 delta(rio)/s 45 w/s # 每秒完成的写 I/O 设备次数。即 delta(wio)/s 46 rsec/s # 每秒读扇区数。即 delta(rsect)/s 47 wsec/s # 每秒写扇区数。即 delta(wsect)/s 48 rkB/s # 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算) 49 wkB/s # 每秒写K字节数。是 wsect/s 的一半。(需要计算) 50 avgrq-sz # 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio) 51 avgqu-sz # 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。 52 await # 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio) 53 svctm # 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio) 54 %util # 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒) 55 56 IO性能衡量标准{ 57 58 1、 如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 59 2、 idle 小于70% IO压力就较大了,一般读取速度有较多的wait. 60 3、 同时可以结合 vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高) 61 4、 svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加. await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式. 如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU 62 5、 队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。 63 64 } 65 66 } 67 68 iotop{ 69 70 # 监视进程磁盘I/O 71 72 yum install iotop 73 74 -o # 只显示有io操作的进程 75 -b # 批量显示,无交互,主要用作记录到文件。 76 -n NUM # 显示NUM次,主要用于非交互式模式。 77 -d SEC # 间隔SEC秒显示一次。 78 -p PID # 监控的进程pid。 79 -u USER # 监控的进程用户。 80 81 # 左右箭头:改变排序方式,默认是按IO排序。 82 r # 改变排序顺序。 83 o # 只显示有IO输出的进程。 84 p # 进程/线程的显示方式的切换。 85 a # 显示累积使用量。 86 q # 退出。 87 88 } 89 90 创建swap文件方法{ 91 92 dd if=/dev/zero of=/swap bs=1024 count=4096000 # 创建一个足够大的文件 93 # count的值等于1024 x 你想要的文件大小, 4096000是4G 94 mkswap /swap # 把这个文件变成swap文件 95 swapon /swap # 启用这个swap文件 96 /swap swap swap defaults 0 0 # 在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行 97 cat /proc/swaps # 查看swap 98 swapoff -a # 关闭swap 99 swapon -a # 开启swap 100 101 } 102 103 新硬盘挂载{ 104 105 fdisk /dev/sdc 106 p # 打印分区 107 d # 删除分区 108 n # 创建分区,(一块硬盘最多4个主分区,扩展占一个主分区位置。p主分区 e扩展) 109 w # 保存退出 110 mkfs.ext4 -L 卷标 /dev/sdc1 # 格式化相应分区 111 mount /dev/sdc1 /mnt # 挂载 112 vi /etc/fstab # 添加开机挂载分区 113 LABEL=/data /data ext4 defaults 1 2 # 用卷标挂载 114 /dev/sdb1 /data4 ext4 defaults 1 2 # 用真实分区挂载 115 /dev/sdb2 /data4 ext4 noatime,defaults 1 2 116 117 第一个数字"1"该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0 118 第二个数字"2"该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0 119 当以 noatime 选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。由于写操作相对读来说要更消耗系统资源,所以这样设置可以明显提高服务器的性能.wtime信息仍然有效,任何时候文件被写,该信息仍被更新。 120 121 mount -a # 自动加载 fstab 文件挂载,避免配置错误,系统无法重启 122 123 } 124 125 大磁盘2T和16T分区{ 126 127 parted /dev/sdb # 针对磁盘分区 128 (parted) mklabel gpt # 设置为 gpt 129 (parted) print 130 (parted) mkpart primary 0KB 22.0TB # 指定分区大小 131 Is this still acceptable to you? 132 Yes/No? Yes 133 Ignore/Cancel? Ignore 134 (parted) print 135 Model: LSI MR9271-8i (scsi) 136 Disk /dev/sdb: 22.0TB 137 Sector size (logical/physical): 512B/512B 138 Partition Table: gpt 139 Number Start End Size File system Name Flags 140 1 17.4kB 22.0TB 22.0TB primary 141 (parted) quit 142 143 mkfs.ext4 /dev/sdb1 # e2fsprogs升级后支持大于16T硬盘 144 145 # 大于16T的单个分区ext4格式化报错,需要升级e2fsprogs 146 Size of device /dev/sdb1 too big to be expressed in 32 bits using a blocksize of 4096. 147 148 yum -y install xfsprogs 149 mkfs.xfs -f /dev/sdb1 # 大于16T单个分区也可以使用XFS分区,但inode占用很大,对大量的小文件支持不太好 150 151 } 152 153 阿里云扩容磁盘{ 154 155 # 进入ECS 本实例磁盘,勾选在线扩容, 选择扩容磁盘 156 yum install cloud-utils-growpart 157 yum install xfsprogs 158 df -h # 查看目前分区大小 159 fdisk -l # 查看磁盘设备 160 growpart /dev/vda 1 # 扩容分区 如果没有分区,默认整块,不需要执行 161 resize2fs /dev/vda1 # 扩容文件系统 ext4文件系统 162 xfs_growfs /dev/vda1 # 扩容文件系统 xfs文件系统 163 df -h # 再查看分区大小,是否扩容 164 165 } 166 167 raid原理与区别{ 168 169 raid0至少2块硬盘.吞吐量大,性能好,同时读写,但损坏一个就完蛋 170 raid1至少2块硬盘.相当镜像,一个存储,一个备份.安全性比较高.但是性能比0弱 171 raid5至少3块硬盘.分别存储校验信息和数据,坏了一个根据校验信息能恢复 172 raid6至少4块硬盘.两个独立的奇偶系统,可坏两块磁盘,写性能非常差 173 174 } 175 176 }
1 7. 用户{ 2 3 users # 显示所有的登录用户 4 groups # 列出当前用户和他所属的组 5 who -q # 显示所有的登录用户 6 groupadd # 添加组 7 useradd user # 建立用户 8 passwd username # 修改密码 9 userdel -r # 删除帐号及家目录 10 chown -R user:group # 修改目录拥有者(R递归) 11 chown y\.li:mysql # 修改所有者用户中包含点"." 12 umask # 设置用户文件和目录的文件创建缺省屏蔽值 13 chgrp # 修改用户组 14 finger # 查找用户显示信息 15 echo "xuesong" | passwd user --stdin # 非交互修改密码 16 useradd -g www -M -s /sbin/nologin www # 指定组并不允许登录的用户,nologin允许使用服务 17 useradd -g www -M -s /bin/false www # 指定组并不允许登录的用户,false最为严格 18 useradd -d /data/song -g song song # 创建用户并指定家目录和组 19 usermod -l newuser olduser # 修改用户名 20 usermod -g user group # 修改用户所属组 21 usermod -d dir -m user # 修改用户家目录 22 usermod -G group user # 将用户添加到附加组 23 gpasswd -d user group # 从组中删除用户 24 su - user -c " #cmd1; " # 切换用户执行 25 26 恢复密码{ 27 28 # 即进入单用户模式: 在linux出现grub后,在安装的系统上面按"e",然后出现grub的配置文件,按键盘移动光标到第二行"Ker……",再按"e",然后在这一行的结尾加上:空格 single或者空格1回车,然后按"b"重启,就进入了"单用户模式" 29 } 30 31 特殊权限{ 32 33 s或 S (SUID):对应数值4 34 s或 S (SGID):对应数值2 35 t或 T :对应数值1 36 大S:代表拥有root权限,但是没有执行权限 37 小s:拥有特权且拥有执行权限,这个文件可以访问系统任何root用户可以访问的资源 38 T或T(Sticky):/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件 39 40 } 41 42 }
1 8. 脚本{ 2 3 #!/bin/sh # 在脚本第一行脚本头 # sh为当前系统默认shell,可指定为bash等shell 4 shopt # 显示和设置shell中的行为选项 5 sh -x # 执行过程 6 sh -n # 检查语法 7 set -e # 若指令传回值不等于0,则立即退出shell 8 (a=bbk) # 括号创建子shell运行 9 basename /a/b/c # 从全路径中保留最后一层文件名或目录 10 dirname # 取路径 11 $RANDOM # 随机数 12 $$ # 进程号 13 source FileName # 在当前bash环境下读取并执行FileName中的命令 # 等同 . FileName 14 sleep 5 # 间隔睡眠5秒 15 trap # 在接收到信号后将要采取的行动 16 trap "" 2 3 # 禁止ctrl+c 17 $PWD # 当前目录 18 $HOME # 家目录 19 $OLDPWD # 之前一个目录的路径 20 cd - # 返回上一个目录路径 21 local ret # 局部变量 22 yes # 重复打印 23 yes |rm -i * # 自动回答y或者其他 24 ls -p /home # 区分目录和文件夹 25 ls -d /home/ # 查看匹配完整路径 26 time a.sh # 测试程序执行时间 27 echo -n aa;echo bb # 不换行执行下一句话 将字符串原样输出 28 echo -e "s\tss\n\n\n" # 使转义生效 29 echo $a | cut -c2-6 # 取字符串中字元 30 echo {a,b,c}{a,b,c}{a,b,c} # 排列组合(括号内一个元素分别和其他括号内元素组合) 31 echo $((2#11010)) # 二进制转10进制 32 echo aaa | tee file # 打印同时写入文件 默认覆盖 -a追加 33 echo {1..10} # 打印10个字符 34 printf '%10s\n'|tr " " a # 打印10个字符 35 pwd | awk -F/ '{ print $2 }' # 返回目录名 36 tac file |sed 1,3d|tac # 倒置读取文件 # 删除最后3行 37 tail -3 file # 取最后3行 38 outtmp=/tmp/$$`date +%s%N`.outtmp # 临时文件定义 39 :(){ :|:& };: # fork炸弹,系统执行海量的进程,直到系统僵死 40 echo -e "\e[32mcolour\e[0m" # 打印颜色 41 echo -e "\033[32mcolour\033[m" # 打印颜色 42 echo -e "\033[0;31mL\033[0;32mO\033[0;33mV\033[0;34mE\t\033[0;35mY\033[0;36mO\033[0;32mU\e[m" # 打印颜色 43 44 正则表达式{ 45 46 ^ # 行首定位 47 $ # 行尾定位 48 . # 匹配除换行符以外的任意字符 49 * # 匹配0或多个重复字符 50 + # 重复一次或更多次 51 ? # 重复零次或一次 52 ? # 结束贪婪因子 .*? 表示最小匹配 53 [] # 匹配一组中任意一个字符 54 [^] # 匹配不在指定组内的字符 55 \ # 用来转义元字符 56 < # 词首定位符(支持vi和grep) <love 57 > # 词尾定位符(支持vi和grep) love> 58 x\{m\} # 重复出现m次 59 x\{m,\} # 重复出现至少m次 60 x\{m,n\} # 重复出现至少m次不超过n次 61 X? # 匹配出现零次或一次的大写字母 X 62 X+ # 匹配一个或多个字母 X 63 () # 括号内的字符为一组 64 (ab|de)+ # 匹配一连串的(最少一个) abc 或 def;abc 和 def 将匹配 65 [[:alpha:]] # 代表所有字母不论大小写 66 [[:lower:]] # 表示小写字母 67 [[:upper:]] # 表示大写字母 68 [[:digit:]] # 表示数字字符 69 [[:digit:][:lower:]] # 表示数字字符加小写字母 70 71 元字符{ 72 73 \d # 匹配任意一位数字 74 \D # 匹配任意单个非数字字符 75 \w # 匹配任意单个字母数字下划线字符,同义词是 [:alnum:] 76 \W # 匹配非数字型的字符 77 78 } 79 80 字符类:空白字符{ 81 82 \s # 匹配任意的空白符 83 \S # 匹配非空白字符 84 \b # 匹配单词的开始或结束 85 \n # 匹配换行符 86 \r # 匹配回车符 87 \t # 匹配制表符 88 \b # 匹配退格符 89 \0 # 匹配空值字符 90 91 } 92 93 字符类:锚定字符{ 94 95 \b # 匹配字边界(不在[]中时) 96 \B # 匹配非字边界 97 \A # 匹配字符串开头 98 \Z # 匹配字符串或行的末尾 99 \z # 只匹配字符串末尾 100 \G # 匹配前一次m//g离开之处 101 102 } 103 104 捕获{ 105 106 (exp) # 匹配exp,并捕获文本到自动命名的组里 107 (?<name>exp) # 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) 108 (?:exp) # 匹配exp,不捕获匹配的文本,也不给此分组分配组号 109 110 } 111 112 零宽断言{ 113 114 (?=exp) # 匹配exp前面的位置 115 (?<=exp) # 匹配exp后面的位置 116 (?!exp) # 匹配后面跟的不是exp的位置 117 (?<!exp) # 匹配前面不是exp的位置 118 (?#comment) # 注释不对正则表达式的处理产生任何影响,用于注释 119 120 } 121 122 特殊字符{ 123 124 http://en.wikipedia.org/wiki/Ascii_table 125 ^H \010 \b 126 ^M \015 \r 127 匹配特殊字符: ctrl+V ctrl不放在按H或M 即可输出^H,用于匹配 128 129 } 130 131 } 132 133 流程结构{ 134 135 if判断{ 136 137 if [ $a == $b ] 138 then 139 echo "等于" 140 else 141 echo "不等于" 142 fi 143 144 } 145 146 case分支选择{ 147 148 case $xs in 149 0) echo "0" ;; 150 1) echo "1" ;; 151 *) echo "其他" ;; 152 esac 153 154 } 155 156 while循环{ 157 158 # while true 等同 while : 159 # 读文件为整行读入 160 num=1 161 while [ $num -lt 10 ] 162 do 163 echo $num 164 ((num=$num+2)) 165 done 166 ########################### 167 grep a a.txt | while read a 168 do 169 echo $a 170 done 171 ########################### 172 while read a 173 do 174 echo $a 175 done < a.txt 176 177 } 178 179 for循环{ 180 181 # 读文件已空格分隔 182 w=`awk -F ":" '{print $1}' c` 183 for d in $w 184 do 185 $d 186 done 187 ########################### 188 for ((i=0;i<${#o[*]};i++)) 189 do 190 echo ${o[$i]} 191 done 192 193 } 194 195 until循环{ 196 197 # 当command不为0时循环 198 until command 199 do 200 body 201 done 202 203 } 204 205 流程控制{ 206 207 break N # 跳出几层循环 208 continue N # 跳出几层循环,循环次数不变 209 continue # 重新循环次数不变 210 211 } 212 213 } 214 215 变量{ 216 217 A="a b c def" # 将字符串复制给变量 218 A=`cmd` # 将命令结果赋给变量 219 A=$(cmd) # 将命令结果赋给变量 220 eval a=\$$a # 间接调用 221 i=2&&echo $((i+3)) # 计算后打印新变量结果 222 i=2&&echo $[i+3] # 计算后打印新变量结果 223 a=$((2>6?5:8)) # 判断两个值满足条件的赋值给变量 224 $1 $2 $* # 位置参数 *代表所有 225 env # 查看环境变量 226 env | grep "name" # 查看定义的环境变量 227 set # 查看环境变量和本地变量 228 read name # 输入变量 229 readonly name # 把name这个变量设置为只读变量,不允许再次设置 230 readonly # 查看系统存在的只读文件 231 export name # 变量name由本地升为环境 232 export name="RedHat" # 直接定义name为环境变量 233 export Stat$nu=2222 # 变量引用变量赋值 234 unset name # 变量清除 235 export -n name # 去掉只读变量 236 shift # 用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1 237 name + 0 # 将字符串转换为数字 238 number " " # 将数字转换成字符串 239 a='ee';b='a';echo ${!b} # 间接引用name变量的值 240 : ${a="cc"} # 如果a有值则不改变,如果a无值则赋值a变量为cc 241 242 数组{ 243 244 A=(a b c def) # 将变量定义为数組 245 ${#A[*]} # 数组个数 246 ${A[*]} # 数组所有元素,大字符串 247 ${A[@]} # 数组所有元素,类似列表可迭代 248 ${A[2]} # 脚本的一个参数或数组第三位 249 250 } 251 252 定义变量类型{ 253 254 declare 或 typeset 255 -r 只读(readonly一样) 256 -i 整形 257 -a 数组 258 -f 函数 259 -x export 260 declare -i n=0 261 262 } 263 264 系统变量{ 265 266 $0 # 脚本启动名(包括路径) 267 $n # 第n个参数,n=1,2,…9 268 $* # 所有参数列表(不包括脚本本身) 269 $@ # 所有参数列表(独立字符串) 270 $# # 参数个数(不包括脚本本身) 271 $$ # 当前程式的PID 272 $! # 执行上一个指令的PID 273 $? # 执行上一个指令的返回值 274 275 } 276 277 变量引用技巧{ 278 279 ${name:+value} # 如果设置了name,就把value显示,未设置则为空 280 ${name:-value} # 如果设置了name,就显示它,未设置就显示value 281 ${name:?value} # 未设置提示用户错误信息value 282 ${name:=value} # 如未设置就把value设置并显示<写入本地中> 283 ${#A} # 可得到变量中字节 284 ${A:4:9} # 取变量中第4位到后面9位 285 ${A:(-1)} # 倒叙取最后一个字符 286 ${A/www/http} # 取变量并且替换每行第一个关键字 287 ${A//www/http} # 取变量并且全部替换每行关键字 288 289 定义了一个变量: file=/dir1/dir2/dir3/my.file.txt 290 ${file#*/} # 去掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt 291 ${file##*/} # 去掉最后一条 / 及其左边的字串:my.file.txt 292 ${file#*.} # 去掉第一个 . 及其左边的字串:file.txt 293 ${file##*.} # 去掉最后一个 . 及其左边的字串:txt 294 ${file%/*} # 去掉最后条 / 及其右边的字串:/dir1/dir2/dir3 295 ${file%%/*} # 去掉第一条 / 及其右边的字串:(空值) 296 ${file%.*} # 去掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file 297 ${file%%.*} # 去掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my 298 # # 是去掉左边(在键盘上 # 在 $ 之左边) 299 # % 是去掉右边(在键盘上 % 在 $ 之右边) 300 # 单一符号是最小匹配﹔两个符号是最大匹配 301 302 } 303 304 } 305 306 test条件判断{ 307 308 # 符号 [ ] 等同 test命令 309 310 expression为字符串操作{ 311 312 -n str # 字符串str是否不为空 313 -z str # 字符串str是否为空 314 315 } 316 317 expression为文件操作{ 318 319 -a # 并且,两条件为真 320 -b # 是否块文件 321 -p # 文件是否为一个命名管道 322 -c # 是否字符文件 323 -r # 文件是否可读 324 -d # 是否一个目录 325 -s # 文件的长度是否不为零 326 -e # 文件是否存在 327 -S # 是否为套接字文件 328 -f # 是否普通文件 329 -x # 文件是否可执行,则为真 330 -g # 是否设置了文件的 SGID 位 331 -u # 是否设置了文件的 SUID 位 332 -G # 文件是否存在且归该组所有 333 -w # 文件是否可写,则为真 334 -k # 文件是否设置了的粘贴位 335 -t fd # fd 是否是个和终端相连的打开的文件描述符(fd 默认为 1) 336 -o # 或,一个条件为真 337 -O # 文件是否存在且归该用户所有 338 ! # 取反 339 340 } 341 342 expression为整数操作{ 343 344 expr1 -a expr2 # 如果 expr1 和 expr2 评估为真,则为真 345 expr1 -o expr2 # 如果 expr1 或 expr2 评估为真,则为真 346 347 } 348 349 两值比较{ 350 351 整数 字符串 352 -lt < # 小于 353 -gt > # 大于 354 -le <= # 小于或等于 355 -ge >= # 大于或等于 356 -eq == # 等于 357 -ne != # 不等于 358 359 } 360 361 test 10 -lt 5 # 判断大小 362 echo $? # 查看上句test命令返回状态 # 结果0为真,1为假 363 test -n "hello" # 判断字符串长度是否为0 364 [ $? -eq 0 ] && echo "success" || exit # 判断成功提示,失败则退出 365 366 } 367 368 重定向{ 369 370 # 标准输出 stdout 和 标准错误 stderr 标准输入stdin 371 cmd 1> fiel # 把 标准输出 重定向到 file 文件中 372 cmd > file 2>&1 # 把 标准输出 和 标准错误 一起重定向到 file 文件中 373 cmd 2> file # 把 标准错误 重定向到 file 文件中 374 cmd 2>> file # 把 标准错误 重定向到 file 文件中(追加) 375 cmd >> file 2>&1 # 把 标准输出 和 标准错误 一起重定向到 file 文件中(追加) 376 cmd < file >file2 # cmd 命令以 file 文件作为 stdin(标准输入),以 file2 文件作为 标准输出 377 cat <>file # 以读写的方式打开 file 378 cmd < file cmd # 命令以 file 文件作为 stdin 379 cmd << delimiter 380 cmd; #从 stdin 中读入,直至遇到 delimiter 分界符 381 delimiter 382 383 >&n # 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出 384 <&n # 标准输入复制自文件描述符 n 385 <&- # 关闭标准输入(键盘) 386 >&- # 关闭标准输出 387 n<&- # 表示将 n 号输入关闭 388 n>&- # 表示将 n 号输出关闭 389 390 } 391 392 运算符{ 393 394 $[]等同于$(()) # $[]表示形式告诉shell求中括号中的表达式的值 395 ~var # 按位取反运算符,把var中所有的二进制为1的变为0,为0的变为1 396 var\<<str # 左移运算符,把var中的二进制位向左移动str位,忽略最左端移出的各位,最右端的各位上补上0值,每做一次按位左移就有var乘2 397 var>>str # 右移运算符,把var中所有的二进制位向右移动str位,忽略最右移出的各位,最左的各位上补0,每次做一次右移就有实现var除以2 398 var&str # 与比较运算符,var和str对应位,对于每个二进制来说,如果二都为1,结果为1.否则为0 399 var^str # 异或运算符,比较var和str对应位,对于二进制来说如果二者互补,结果为1,否则为0 400 var|str # 或运算符,比较var和str的对应位,对于每个二进制来说,如二都该位有一个1或都是1,结果为1,否则为0 401 402 运算符优先级{ 403 级别 运算符 说明 404 1 =,+=,-=,/=,%=,*=,&=,^=,|=,<<=,>>= # 赋值运算符 405 2 || # 逻辑或 前面不成功执行 406 3 && # 逻辑与 前面成功后执行 407 4 | # 按位或 408 5 ^ # 按位异或 409 6 & # 按位与 410 7 ==,!= # 等于/不等于 411 8 <=,>=,<,> # 小于或等于/大于或等于/小于/大于 412 9 \<<,>> # 按位左移/按位右移 (无转意符号) 413 10 +,- # 加减 414 11 *,/,% # 乘,除,取余 415 12 ! ,~ # 逻辑非,按位取反或补码 416 13 -,+ # 正负 417 } 418 419 } 420 421 数学运算{ 422 423 $(( )) # 整数运算 424 + - * / ** # 分別为 "加、減、乘、除、密运算" 425 & | ^ ! # 分別为 "AND、OR、XOR、NOT" 运算 426 % # 余数运算 427 428 let{ 429 430 let # 运算 431 let x=16/4 432 let x=5**5 433 434 } 435 436 expr{ 437 438 expr 14 % 9 # 整数运算 439 SUM=`expr 2 \* 3` # 乘后结果赋值给变量 440 LOOP=`expr $LOOP + 1` # 增量计数(加循环即可) LOOP=0 441 expr length "bkeep zbb" # 计算字串长度 442 expr substr "bkeep zbb" 4 9 # 抓取字串 443 expr index "bkeep zbb" e # 抓取第一个字符数字串出现的位置 444 expr 30 / 3 / 2 # 运算符号有空格 445 expr bkeep.doc : '.*' # 模式匹配(可以使用expr通过指定冒号选项计算字符串中字符数) 446 expr bkeep.doc : '\(.*\).doc' # 在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名 447 448 数值测试{ 449 450 #如果试图计算非整数,则会返回错误 451 rr=3.4 452 expr $rr + 1 453 expr: non-numeric argument 454 rr=5 455 expr $rr + 1 456 6 457 458 } 459 460 } 461 462 bc{ 463 464 echo "m^n"|bc # 次方计算 465 seq -s '+' 1000 |bc # 从1加到1000 466 seq 1 1000 |tr "\n" "+"|sed 's/+$/\n/'|bc # 从1加到1000 467 } 468 469 } 470 471 grep{ 472 473 -c # 显示匹配到得行的数目,不显示内容 474 -h # 不显示文件名 475 -i # 忽略大小写 476 -l # 只列出匹配行所在文件的文件名 477 -n # 在每一行中加上相对行号 478 -s # 无声操作只显示报错,检查退出状态 479 -v # 反向查找 480 -e # 使用正则表达式 481 -w # 精确匹配 482 -wc # 精确匹配次数 483 -o # 查询所有匹配字段 484 -P # 使用perl正则表达式 485 -A3 # 打印匹配行和下三行 486 -B3 # 打印匹配行和上三行 487 -C3 # 打印匹配行和上下三行 488 489 grep -v "a" txt # 过滤关键字符行 490 grep -w 'a\>' txt # 精确匹配字符串 491 grep -i "a" txt # 大小写敏感 492 grep "a[bB]" txt # 同时匹配大小写 493 grep '[0-9]\{3\}' txt # 查找0-9重复三次的所在行 494 grep -E "word1|word2|word3" file # 任意条件匹配 495 grep word1 file | grep word2 |grep word3 # 同时匹配三个 496 echo quan@163.com |grep -Po '(?<=@.).*(?=.$)' # 零宽断言截取字符串 # 63.co 497 echo "I'm singing while you're dancing" |grep -Po '\b\w+(?=ing\b)' # 零宽断言匹配 498 echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' |grep -Po '(?<=:).*?(?=d)' # 取出d前面数字 # ?为最小匹配 499 echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' | grep -Po '[-0-9.]+' # 取出d前面数字 # ?为最小匹配 500 echo '["mem",ok],["hardware",false],["filesystem",false]' |grep -Po '[^"]+(?=",false)' # 取出false前面的字母 501 echo '["mem",ok],["hardware",false],["filesystem",false]' |grep -Po '\w+",false'|grep -Po '^\w+' # 取出false前面的字母 502 503 grep用于if判断{ 504 505 if echo abc | grep "a" > /dev/null 2>&1 506 then 507 echo "abc" 508 else 509 echo "null" 510 fi 511 512 } 513 514 } 515 516 tr{ 517 518 -c # 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII 519 -d # 删除字符串1中所有输入字符 520 -s # 删除所有重复出现字符序列,只保留第一个:即将重复出现字符串压缩为一个字符串 521 [a-z] # a-z内的字符组成的字符串 522 [A-Z] # A-Z内的字符组成的字符串 523 [0-9] # 数字串 524 \octal # 一个三位的八进制数,对应有效的ASCII字符 525 [O*n] # 表示字符O重复出现指定次数n。因此[O*2]匹配OO的字符串 526 527 tr中特定控制字符表达方式{ 528 529 \a Ctrl-G \007 # 铃声 530 \b Ctrl-H \010 # 退格符 531 \f Ctrl-L \014 # 走行换页 532 \n Ctrl-J \012 # 新行 533 \r Ctrl-M \015 # 回车 534 \t Ctrl-I \011 # tab键 535 \v Ctrl-X \030 536 537 } 538 539 tr A-Z a-z # 将所有大写转换成小写字母 540 tr " " "\n" # 将空格替换为换行 541 tr -s "[\012]" < plan.txt # 删除空行 542 tr -s ["\n"] < plan.txt # 删除空行 543 tr -s "[\015]" "[\n]" < file # 删除文件中的^M,并代之以换行 544 tr -s "[\r]" "[\n]" < file # 删除文件中的^M,并代之以换行 545 tr -s "[:]" "[\011]" < /etc/passwd # 替换passwd文件中所有冒号,代之以tab键 546 tr -s "[:]" "[\t]" < /etc/passwd # 替换passwd文件中所有冒号,代之以tab键 547 echo $PATH | tr ":" "\n" # 增加显示路径可读性 548 1,$!tr -d '\t' # tr在vi内使用,在tr前加处理行范围和感叹号('$'表示最后一行) 549 tr "\r" "\n"<macfile > unixfile # Mac -> UNIX 550 tr "\n" "\r"<unixfile > macfile # UNIX -> Mac 551 tr -d "\r"<dosfile > unixfile # DOS -> UNIX Microsoft DOS/Windows 约定,文本的每行以回车字符(\r)并后跟换行符(\n)结束 552 awk '{ print $0"\r" }'<unixfile > dosfile # UNIX -> DOS:在这种情况下,需要用awk,因为tr不能插入两个字符来替换一个字符 553 554 } 555 556 seq{ 557 558 # 不指定起始数值,则默认为 1 559 -s # 选项主要改变输出的分格符, 预设是 \n 560 -w # 等位补全,就是宽度相等,不足的前面补 0 561 -f # 格式化输出,就是指定打印的格式 562 563 seq 10 100 # 列出10-100 564 seq 1 10 |tac # 倒叙列出 565 seq -s '+' 90 100 |bc # 从90加到100 566 seq -f 'dir%g' 1 10 | xargs mkdir # 创建dir1-10 567 seq -f 'dir%03g' 1 10 | xargs mkdir # 创建dir001-010 568 569 } 570 571 trap{ 572 573 信号 说明 574 HUP(1) # 挂起,通常因终端掉线或用户退出而引发 575 INT(2) # 中断,通常因按下Ctrl+C组合键而引发 576 QUIT(3) # 退出,通常因按下Ctrl+\组合键而引发 577 ABRT(6) # 中止,通常因某些严重的执行错误而引发 578 ALRM(14) # 报警,通常用来处理超时 579 TERM(15) # 终止,通常在系统关机时发送 580 581 trap捕捉到信号之后,可以有三种反应方式: 582 1、执行一段程序来处理这一信号 583 2、接受信号的默认操作 584 3、忽视这一信号 585 586 第一种形式的trap命令在shell接收到 signal list 清单中数值相同的信号时,将执行双引号中的命令串: 587 trap 'commands' signal-list # 单引号,要在shell探测到信号来的时候才执行命令和变量的替换,时间一直变 588 trap "commands" signal-list # 双引号,shell第一次设置信号的时候就执行命令和变量的替换,时间不变 589 590 } 591 592 awk{ 593 594 # 默认是执行打印全部 print $0 595 # 1为真 打印$0 596 # 0为假 不打印 597 598 -F # 改变FS值(分隔符) 599 ~ # 域匹配 600 == # 变量匹配 601 !~ # 匹配不包含 602 = # 赋值 603 != # 不等于 604 += # 叠加 605 606 \b # 退格 607 \f # 换页 608 \n # 换行 609 \r # 回车 610 \t # 制表符Tab 611 \c # 代表任一其他字符 612 613 -F"[ ]+|[%]+" # 多个空格或多个%为分隔符 614 [a-z]+ # 多个小写字母 615 [a-Z] # 代表所有大小写字母(aAbB...zZ) 616 [a-z] # 代表所有大小写字母(ab...z) 617 [:alnum:] # 字母数字字符 618 [:alpha:] # 字母字符 619 [:cntrl:] # 控制字符 620 [:digit:] # 数字字符 621 [:graph:] # 非空白字符(非空格、控制字符等) 622 [:lower:] # 小写字母 623 [:print:] # 与[:graph:]相似,但是包含空格字符 624 [:punct:] # 标点字符 625 [:space:] # 所有的空白字符(换行符、空格、制表符) 626 [:upper:] # 大写字母 627 [:xdigit:] # 十六进制的数字(0-9a-fA-F) 628 [[:digit:][:lower:]] # 数字和小写字母(占一个字符) 629 630 631 内建变量{ 632 $n # 当前记录的第 n 个字段,字段间由 FS 分隔 633 $0 # 完整的输入记录 634 ARGC # 命令行参数的数目 635 ARGIND # 命令行中当前文件的位置 ( 从 0 开始算 ) 636 ARGV # 包含命令行参数的数组 637 CONVFMT # 数字转换格式 ( 默认值为 %.6g) 638 ENVIRON # 环境变量关联数组 639 ERRNO # 最后一个系统错误的描述 640 FIELDWIDTHS # 字段宽度列表 ( 用空格键分隔 ) 641 FILENAME # 当前文件名 642 FNR # 同 NR ,但相对于当前文件 643 FS # 字段分隔符 ( 默认是任何空格 ) 644 IGNORECASE # 如果为真(即非 0 值),则进行忽略大小写的匹配 645 NF # 当前记录中的字段数(列) 646 NR # 当前行数 647 OFMT # 数字的输出格式 ( 默认值是 %.6g) 648 OFS # 输出字段分隔符 ( 默认值是一个空格 ) 649 ORS # 输出记录分隔符 ( 默认值是一个换行符 ) 650 RLENGTH # 由 match 函数所匹配的字符串的长度 651 RS # 记录分隔符 ( 默认是一个换行符 ) 652 RSTART # 由 match 函数所匹配的字符串的第一个位置 653 SUBSEP # 数组下标分隔符 ( 默认值是 /034) 654 BEGIN # 先处理(可不加文件参数) 655 END # 结束时处理 656 } 657 658 内置函数{ 659 gsub(r,s) # 在整个$0中用s替代r 相当于 sed 's///g' 660 gsub(r,s,t) # 在整个t中用s替代r 661 index(s,t) # 返回s中字符串t的第一位置 662 length(s) # 返回s长度 663 match(s,r) # 测试s是否包含匹配r的字符串 664 split(s,a,fs) # 在fs上将s分成序列a 665 sprint(fmt,exp) # 返回经fmt格式化后的exp 666 sub(r,s) # 用$0中最左边最长的子串代替s 相当于 sed 's///' 667 substr(s,p) # 返回字符串s中从p开始的后缀部分 668 substr(s,p,n) # 返回字符串s中从p开始长度为n的后缀部分 669 } 670 671 awk判断{ 672 awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' # 条件判断 括号代表if语句判断 "?"代表then ":"代表else 673 awk '{max=($1>$2)? $1 : $2; print max}' # 条件判断 如果$1大于$2,max值为为$1,否则为$2 674 awk '{if ( $6 > 50) print $1 " Too high" ;\ 675 else print "Range is OK"}' file 676 awk '{if ( $6 > 50) { count++;print $3 } \ 677 else { x+5; print $2 } }' file 678 } 679 680 awk循环{ 681 awk '{i = 1; while ( i <= NF ) { print NF, $i ; i++ } }' file 682 awk '{ for ( i = 1; i <= NF; i++ ) print NF,$i }' file 683 } 684 685 awk '/Tom/' file # 打印匹配到得行 686 awk '/^Tom/{print $1}' # 匹配Tom开头的行 打印第一个字段 687 awk '$1 !~ /ly$/' # 显示所有第一个字段不是以ly结尾的行 688 awk '$3 <40' # 如果第三个字段值小于40才打印 689 awk '$4==90{print $5}' # 取出第四列等于90的第五列 690 awk '/^(no|so)/' test # 打印所有以模式no或so开头的行 691 awk '$3 * $4 > 500' # 算术运算(第三个字段和第四个字段乘积大于500则显示) 692 awk '{print NR" "$0}' # 加行号 693 awk '/tom/,/suz/' # 打印tom到suz之间的行 694 awk '{a+=$1}END{print a}' # 列求和 695 awk 'sum+=$1{print sum}' # 将$1的值叠加后赋给sum 696 awk '{a+=$1}END{print a/NR}' # 列求平均值 697 awk '!s[$1 $3]++' file # 根据第一列和第三列过滤重复行 698 awk -F'[ :\t]' '{print $1,$2}' # 以空格、:、制表符Tab为分隔符 699 awk '{print "'"$a"'","'"$b"'"}' # 引用外部变量 700 awk '{if(NR==52){print;exit}}' # 显示第52行 701 awk '/关键字/{a=NR+2}a==NR {print}' # 取关键字下第几行 702 awk 'gsub(/liu/,"aaaa",$1){print $0}' # 只打印匹配替换后的行 703 ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}' # 提取时间,空格不固定 704 awk '{$1="";$2="";$3="";print}' # 去掉前三列 705 echo aada:aba|awk '/d/||/b/{print}' # 匹配两内容之一 706 echo aada:abaa|awk -F: '$1~/d/||$2~/b/{print}' # 关键列匹配两内容之一 707 echo Ma asdas|awk '$1~/^[a-Z][a-Z]$/{print }' # 第一个域匹配正则 708 echo aada:aaba|awk '/d/&&/b/{print}' # 同时匹配两条件 709 awk 'length($1)=="4"{print $1}' # 字符串位数 710 awk '{if($2>3){system ("touch "$1)}}' # 执行系统命令 711 awk '{sub(/Mac/,"Macintosh",$0);print}' # 用Macintosh替换Mac 712 awk '{gsub(/Mac/,"MacIntosh",$1); print}' # 第一个域内用Macintosh替换Mac 713 awk -F '' '{ for(i=1;i<NF+1;i++)a+=$i ;print a}' # 多位数算出其每位数的总和.比如 1234, 得到 10 714 awk '{ i=$1%10;if ( i == 0 ) {print i}}' # 判断$1是否整除(awk中定义变量引用时不能带 $ ) 715 awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}' # 列求最大值 设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束 716 awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}' # 求最小值 717 awk '{if(A)print;A=0}/regexp/{A=1}' # 查找字符串并将匹配行的下一行显示出来,但并不显示匹配行 718 awk '/regexp/{print A}{A=$0}' # 查找字符串并将匹配行的上一行显示出来,但并不显示匹配行 719 awk '{if(!/mysql/)gsub(/1/,"a");print $0}' # 将1替换成a,并且只在行中未出现字串mysql的情况下替换 720 awk 'BEGIN{srand();fr=int(100*rand());print fr;}' # 获取随机数 721 awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}' # 从第3行开始,每7行显示一次 722 awk '{if(NF<1){print i;i=0} else {i++;print $0}}' # 显示空行分割各段的行数 723 echo +null:null |awk -F: '$1!~"^+"&&$2!="null"{print $0}' # 关键列同时匹配 724 awk -v RS=@ 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}' # 指定记录分隔符 725 awk '{b[$1]=b[$1]$2}END{for(i in b){print i,b[i]}}' # 列叠加 726 awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}' # 求余数 727 awk '{b=a;a=$1; if(NR>1){print a-b}}' # 当前行减上一行 728 awk '{a[NR]=$1}END{for (i=1;i<=NR;i++){print a[i]-a[i-1]}}' # 当前行减上一行 729 awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}' # END只打印最后的结果,END块里面处理数组内容 730 awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' # $2的总和 $2总和除个数(平均值) 731 awk -v a=0 -F 'B' '{for (i=1;i<NF;i++){ a=a+length($i)+1;print a }}' # 打印所以B的所在位置 732 awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' file # 将date值赋给d,并将d设置为数组mon,打印mon数组中第2个元素 733 awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' # 截取字符串(substr使用) 734 awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' # 匹配字符串(index使用) 735 awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' # 正则表达式匹配查找(match使用) 736 awk '{for(i=1;i<=4;i++)printf $i""FS; for(y=10;y<=13;y++) printf $y""FS;print ""}' # 打印前4列和后4列 737 awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}' # 乘法口诀 738 awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' # 字符串分割(split使用) 739 awk '{if (system ("grep "$2" tmp/* > /dev/null 2>&1") == 0 ) {print $1,"Y"} else {print $1,"N"} }' a # 执行系统命令判断返回状态 740 awk '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] " ";print ""}}' # 将多行转多列 741 netstat -an|awk -v A=$IP -v B=$PORT 'BEGIN{print "Clients\tGuest_ip"}$4~A":"B{split($5,ip,":");a[ip[1]]++}END{for(i in a)print a[i]"\t"i|"sort -nr"}' # 统计IP连接个数 742 cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'\''"$1"'\'\,'""'\''"$2"'\'\,'""'\''"$3"'\'\)\;'"}' >>insert_1.txt # 处理sql语句 743 awk 'BEGIN{printf "what is your name?";getline name < "/dev/tty" } $1 ~name {print "FOUND" name " on line ", NR "."} END{print "see you," name "."}' file # 两文件匹配 744 745 取本机IP{ 746 /sbin/ifconfig |awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print $2}' 747 /sbin/ifconfig |awk '/inet/&&$2!~"127.0.0.1"{split($2,a,":");print a[2]}' 748 /sbin/ifconfig |awk -v RS='inet addr:' '$1!="eth0"&&$1!="127.0.0.1"{print $1}'|awk '{printf"%s|",$0}' 749 /sbin/ifconfig |awk '{printf("line %d,%s\n",NR,$0)}' # 指定类型(%d数字,%s字符) 750 } 751 752 查看磁盘空间{ 753 df -h|awk -F"[ ]+|%" '$5>14{print $5}' 754 df -h|awk 'NR!=1{if ( NF == 6 ) {print $5} else if ( NF == 5) {print $4} }' 755 df -h|awk 'NR!=1 && /%/{sub(/%/,"");print $(NF-1)}' 756 df -h|sed '1d;/ /!N;s/\n//;s/ \+/ /;' #将磁盘分区整理成一行 可直接用 df -P 757 } 758 759 排列打印{ 760 awk 'END{printf "%-10s%-10s\n%-10s%-10s\n%-10s%-10s\n","server","name","123","12345","234","1234"}' txt 761 awk 'BEGIN{printf "|%-10s|%-10s|\n|%-10s|%-10s|\n|%-10s|%-10s|\n","server","name","123","12345","234","1234"}' 762 awk 'BEGIN{ 763 print " *** 开 始 *** "; 764 print "+-----------------+"; 765 printf "|%-5s|%-5s|%-5s|\n","id","name","ip"; 766 } 767 $1!=1 && NF==4{printf "|%-5s|%-5s|%-5s|\n",$1,$2,$3" "$11} 768 END{ 769 print "+-----------------+"; 770 print " *** 结 束 *** " 771 }' txt 772 } 773 774 awk经典题{ 775 分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,也就是计算每个url的总访问大小 776 说明:本题生产环境应用:这个功能可以用于IDC网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化或裁剪该图片,压缩js等措施。 777 本题需要输出三个指标: 【被访问次数】 【访问次数*单个被访问文件大小】 【文件名(带URL)】 778 测试数据 779 59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 780 781 awk '{array_num[$7]++;array_size[$7]+=$10}END{for(i in array_num) {print array_num[i]" "array_size[i]" "i}}' 782 } 783 784 awk练习题{ 785 786 wang 4 787 cui 3 788 zhao 4 789 liu 3 790 liu 3 791 chang 5 792 li 2 793 794 1 通过第一个域找出字符长度为4的 795 2 当第二列值大于3时,创建空白文件,文件名为当前行第一个域$1 (touch $1) 796 3 将文档中 liu 字符串替换为 hong 797 4 求第二列的和 798 5 求第二列的平均值 799 6 求第二列中的最大值 800 7 将第一列过滤重复后,列出每一项,每一项的出现次数,每一项的大小总和 801 802 1、字符串长度 803 awk 'length($1)=="4"{print $1}' 804 2、执行系统命令 805 awk '{if($2>3){system ("touch "$1)}}' 806 3、gsub(/r/,"s",域) 在指定域(默认$0)中用s替代r (sed 's///g') 807 awk '{gsub(/liu/,"hong",$1);print $0}' a.txt 808 4、列求和 809 awk '{a+=$2}END{print a}' 810 5、列求平均值 811 awk '{a+=$2}END{print a/NR}' 812 awk '{a+=$2;b++}END{print a,a/b}' 813 6、列求最大值 814 awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}' 815 7、将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和 816 awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}' 817 } 818 819 awk处理复杂日志{ 820 6.19: 821 DHB_014_号百总机服务业务日报:广州 到达数异常! 822 DHB_023_号百漏话提醒日报:珠海 到达数异常! 823 6.20: 824 DHB_014_号百总机服务业务日报:广州 到达数异常!到 825 826 awk -F '[_ :]+' 'NF>2{print $4,$1"_"$2,b |"sort";next}{b=$1}' 827 828 # 当前行NF小于等于2 只针对{print $4,$1"_"$2,b |"sort";next} 有效 即 6.19:行跳过此操作, {b=$1} 仍然执行 829 # 当前行NF大于2 执行到 next 强制跳过本行,即跳过后面的 {b=$1} 830 831 广州 DHB_014 6.19 832 } 833 } 834 835 sed{ 836 837 # 先读取资料、存入模式空间、对其进行编辑、再输出、再用下一行替换模式空间内容 838 # 调试工具sedsed (参数 -d) http://aurelio.net/sedsed/sedsed-1.0 839 840 -n # 输出由编辑指令控制(取消默认的输出,必须与编辑指令一起配合) 841 -i # 直接对文件操作 842 -e # 多重编辑 843 -r # 正则可不转移特殊字符 844 845 b # 跳过匹配的行 846 p # 打印 847 d # 删除 848 s # 替换 849 g # 配合s全部替换 850 i # 行前插入 851 a # 行后插入 852 r # 读 853 y # 转换 854 q # 退出 855 856 & # 代表查找的串内容 857 * # 任意多个 前驱字符(前导符) 858 ? # 0或1个 最小匹配 没加-r参数需转义 \? 859 $ # 最后一行 860 .* # 匹配任意多个字符 861 \(a\) # 保存a作为标签1(\1) 862 863 模式空间{ 864 865 # 模式空间(两行两行处理) 模式匹配的范围,一般而言,模式空间是输入文本中某一行,但是可以通过使用N函数把多于一行读入模式空间 866 # 暂存空间里默认存储一个空行 867 n # 读入下一行(覆盖上一行) 868 h # 把模式空间里的行拷贝到暂存空间 869 H # 把模式空间里的行追加到暂存空间 870 g # 用暂存空间的内容替换模式空间的行 871 G # 把暂存空间的内容追加到模式空间的行后 872 x # 将暂存空间的内容于模式空间里的当前行互换 873 ! # 对其前面的要匹配的范围取反 874 D # 删除当前模式空间中直到并包含第一个换行符的所有字符(/.*/匹配模式空间中所有内容,匹配到就执行D,没匹配到就结束D) 875 N # 追加下一个输入行到模式空间后面并在第二者间嵌入一个换行符,改变当前行号码,模式匹配可以延伸跨域这个内嵌换行 876 p # 打印模式空间中的直到并包含第一个换行的所有字符 877 878 } 879 880 标签函数{ 881 882 : lable # 建立命令标记,配合b,t函数使用跳转 883 b lable # 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。 884 t labe # 判断分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令出,或者到脚本末尾。与b函数不同在于t在执行跳转前会先检查其前一个替换命令是否成功,如成功,则执行跳转。 885 886 sed -e '{:p1;/A/s/A/AA/;/B/s/B/BB/;/[AB]\{10\}/b;b p1;}' # 文件内容第一行A第二行B:建立标签p1;两个替换函数(A替换成AA,B替换成BB)当A或者B达到10个以后调用b,返回 887 echo 'sd f f [a b c cddd eee]' | sed ':n;s#\(\[[^ ]*\) *#\1#;tn' # 标签函数t使用方法,替换[]里的空格 888 echo "198723124.03"|sed -r ':a;s/([0-9]+)([0-9]{3})/\1,\2/;ta' # 每三个字符加一个逗号 889 890 } 891 892 引用外部变量{ 893 894 sed -n ''$a',10p' 895 sed -n ""$a",10p" 896 897 } 898 899 sed 10q # 显示文件中的前10行 (模拟"head") 900 sed -n '$=' # 计算行数(模拟 "wc -l") 901 sed -n '5,/^no/p' # 打印从第5行到以no开头行之间的所有行 902 sed -i "/^$f/d" a # 删除匹配行 903 sed -i '/aaa/,$d' # 删除匹配行到末尾 904 sed -i "s/=/:/" c # 直接对文本替换 905 sed -i "/^pearls/s/$/j/" # 找到pearls开头在行尾加j 906 sed '/1/,/3/p' file # 打印1和3之间的行 907 sed -n '1p' file # 取出指定行 908 sed '5i\aaa' file # 在第5行之前插入行 909 sed '5a\aaa' file # 在第5行之后抽入行 910 echo a|sed -e '/a/i\b' # 在匹配行前插入一行 911 echo a|sed -e '/a/a\b' # 在匹配行后插入一行 912 echo a|sed 's/a/&\nb/g' # 在匹配行后插入一行 913 seq 10| sed -e{1,3}'s/./a/' # 匹配1和3行替换 914 sed -n '/regexp/!p' # 只显示不匹配正则表达式的行 915 sed '/regexp/d' # 只显示不匹配正则表达式的行 916 sed '$!N;s/\n//' # 将每两行连接成一行 917 sed '/baz/s/foo/bar/g' # 只在行中出现字串"baz"的情况下将"foo"替换成"bar" 918 sed '/baz/!s/foo/bar/g' # 将"foo"替换成"bar",并且只在行中未出现字串"baz"的情况下替换 919 echo a|sed -e 's/a/#&/g' # 在a前面加#号 920 sed 's/foo/bar/4' # 只替换每一行中的第四个字串 921 sed 's/\(.*\)foo/\1bar/' # 替换每行最后一个字符串 922 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个字符串 923 sed 's/[0-9][0-9]$/&5' # 在以[0-9][0-9]结尾的行后加5 924 sed -n ' /^eth\|em[01][^:]/{n;p;}' # 匹配多个关键字 925 sed -n -r ' /eth|em[01][^:]/{n;p;}' # 匹配多个关键字 926 echo -e "1\n2"|xargs -i -t sed 's/^/1/' {} # 同时处理多个文件 927 sed '/west/,/east/s/$/*VACA*/' # 修改west和east之间的所有行,在结尾处加*VACA* 928 sed 's/[^1-9]*\([0-9]\+\).*/\1/' # 取出第一组数字,并且忽略掉开头的0 929 sed -n '/regexp/{g;1!p;};h' # 查找字符串并将匹配行的上一行显示出来,但并不显示匹配行 930 sed -n ' /regexp/{n;p;}' # 查找字符串并将匹配行的下一行显示出来,但并不显示匹配行 931 sed -n 's/\(mar\)got/\1ianne/p' # 保存\(mar\)作为标签1 932 sed -n 's/\([0-9]\+\).*\(t\)/\2\1/p' # 保存多个标签 933 sed -i -e '1,3d' -e 's/1/2/' # 多重编辑(先删除1-3行,在将1替换成2) 934 sed -e 's/@.*//g' -e '/^$/d' # 删除掉@后面所有字符,和空行 935 sed -n -e "{s/^ *[0-9]*//p}" # 打印并删除正则表达式的那部分内容 936 echo abcd|sed 'y/bd/BE/' # 匹配字符替换 937 sed '/^#/b;y/y/P/' 2 # 非#号开头的行替换字符 938 sed '/suan/r readfile' # 找到含suan的行,在后面加上读入的文件内容 939 sed -n '/no/w writefile' # 找到含no的行,写入到指定文件中 940 sed '/regex/G' # 在匹配式样行之后插入一空行 941 sed '/regex/{x;p;x;G;}' # 在匹配式样行之前和之后各插入一空行 942 sed 'n;d' # 删除所有偶数行 943 sed 'G;G' # 在每一行后面增加两空行 944 sed '/^$/d;G' # 在输出的文本中每一行后面将有且只有一空行 945 sed 'n;n;n;n;G;' # 在每5行后增加一空白行 946 sed -n '5~5p' # 只打印行号为5的倍数 947 seq 1 30|sed '5~5s/.*/a/' # 倍数行执行替换 948 sed -n '3,${p;n;n;n;n;n;n;}' # 从第3行开始,每7行显示一次 949 sed -n 'h;n;G;p' # 奇偶调换 950 seq 1 10|sed '1!G;h;$!d' # 倒叙排列 951 ls -l|sed -n '/^.rwx.*/p' # 查找属主权限为7的文件 952 sed = filename | sed 'N;s/\n/\t/' # 为文件中的每一行进行编号(简单的左对齐方式) 953 sed 's/^[ \t]*//' # 将每一行前导的"空白字符"(空格,制表符)删除,使之左对齐 954 sed 's/^[ \t]*//;s/[ \t]*$//' # 将每一行中的前导和拖尾的空白字符删除 955 sed '/{abc,def\}\/\[111,222]/s/^/00000/' # 匹配需要转行的字符: } / [ 956 echo abcd\\nabcde |sed 's/\\n/@/g' |tr '@' '\n' # 将换行符转换为换行 957 cat tmp|awk '{print $1}'|sort -n|sed -n '$p' # 取一列最大值 958 sed -n '{s/^[^\/]*//;s/\:.*//;p}' /etc/passwd # 取用户家目录(匹配不为/的字符和匹配:到结尾的字符全部删除) 959 sed = filename | sed 'N;s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # 对文件中的所有行编号(行号在左,文字右端对齐) 960 /sbin/ifconfig |sed 's/.*inet addr:\(.*\) Bca.*/\1/g' |sed -n '/eth/{n;p}' # 取所有IP 961 962 修改keepalive配置剔除后端服务器{ 963 964 sed -i '/real_server.*10.0.1.158.*8888/,+8 s/^/#/' keepalived.conf 965 sed -i '/real_server.*10.0.1.158.*8888/,+8 s/^#//' keepalived.conf 966 967 } 968 969 模仿rev功能{ 970 971 echo 123 |sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//;' 972 /\n/!G; # 没有\n换行符,要执行G,因为保留空间中为空,所以在模式空间追加一空行 973 s/\(.\)\(.*\n\)/&\2\1/; # 标签替换 &\n23\n1$ (关键在于& ,可以让后面//匹配到空行) 974 //D; # D 命令会引起循环删除模式空间中的第一部分,如果删除后,模式空间中还有剩余行,则返回 D 之前的命令,重新执行,如果 D 后,模式空间中没有任何内容,则将退出。 //D 匹配空行执行D,如果上句s没有匹配到,//也无法匹配到空行, "//D;"命令结束 975 s/.//; # D结束后,删除开头的 \n 976 977 } 978 979 } 980 981 xargs{ 982 983 # 命令替换 984 -t 先打印命令,然后再执行 985 -i 用每项替换 {} 986 find / -perm +7000 | xargs ls -l # 将前面的内容,作为后面命令的参数 987 seq 1 10 |xargs -i date -d "{} days " +%Y-%m-%d # 列出10天日期 988 989 } 990 991 dialog菜单{ 992 993 # 默认将所有输出用 stderr 输出,不显示到屏幕 使用参数 --stdout 可将选择赋给变量 994 # 退出状态 0正确 1错误 995 996 窗体类型{ 997 --calendar # 日历 998 --checklist # 允许你显示一个选项列表,每个选项都可以被单独的选择 (复选框) 999 --form # 表单,允许您建立一个带标签的文本字段,并要求填写 1000 --fselect # 提供一个路径,让你选择浏览的文件 1001 --gauge # 显示一个表,呈现出完成的百分比,就是显示出进度条。 1002 --infobox # 显示消息后,(没有等待响应)对话框立刻返回,但不清除屏幕(信息框) 1003 --inputbox # 让用户输入文本(输入框) 1004 --inputmenu # 提供一个可供用户编辑的菜单(可编辑的菜单框) 1005 --menu # 显示一个列表供用户选择(菜单框) 1006 --msgbox(message) # 显示一条消息,并要求用户选择一个确定按钮(消息框) 1007 --password # 密码框,显示一个输入框,它隐藏文本 1008 --pause # 显示一个表格用来显示一个指定的暂停期的状态 1009 --radiolist # 提供一个菜单项目组,但是只有一个项目,可以选择(单选框) 1010 --tailbox # 在一个滚动窗口文件中使用tail命令来显示文本 1011 --tailboxbg # 跟tailbox类似,但是在background模式下操作 1012 --textbox # 在带有滚动条的文本框中显示文件的内容 (文本框) 1013 --timebox # 提供一个窗口,选择小时,分钟,秒 1014 --yesno(yes/no) # 提供一个带有yes和no按钮的简单信息框 1015 } 1016 1017 窗体参数{ 1018 --separate-output # 对于chicklist组件,输出结果一次输出一行,得到结果不加引号 1019 --ok-label "提交" # 确定按钮名称 1020 --cancel-label "取消" # 取消按钮名称 1021 --title "标题" # 标题名称 1022 --stdout # 将所有输出用 stdout 输出 1023 --backtitle "上标" # 窗体上标 1024 --no-shadow # 去掉窗体阴影 1025 --menu "菜单名" 20 60 14 # 菜单及窗口大小 1026 --clear # 完成后清屏操作 1027 --no-cancel # 不显示取消项 1028 --insecure # 使用星号来代表每个字符 1029 --begin <y> <x> # 指定对话框左上角在屏幕的上的做坐标 1030 --timeout <秒> # 超时,返回的错误代码255,如果用户在指定的时间内没有给出相应动作,就按超时处理 1031 --defaultno # 使选择默认为no 1032 --default-item <str> # 设置在一份清单,表格或菜单中的默认项目。通常在框中的第一项是默认 1033 --sleep 5 # 在处理完一个对话框后静止(延迟)的时间(秒) 1034 --max-input size # 限制输入的字符串在给定的大小之内。如果没有指定,默认是2048 1035 --keep-window # 退出时不清屏和重绘窗口。当几个组件在同一个程序中运行时,对于保留窗口内容很有用的 1036 } 1037 1038 dialog --title "Check me" --checklist "Pick Numbers" 15 25 3 1 "one" "off" 2 "two" "on" # 多选界面[方括号] 1039 dialog --title "title" --radiolist "checklist" 20 60 14 tag1 "item1" on tag2 "item2" off # 单选界面(圆括号) 1040 dialog --title "title" --menu "MENU" 20 60 14 tag1 "item1" tag2 "item2" # 单选界面 1041 dialog --title "Installation" --backtitle "Star Linux" --gauge "Linux Kernel" 10 60 50 # 进度条 1042 dialog --title "标题" --backtitle "Dialog" --yesno "说明" 20 60 # 选择yes/no 1043 dialog --title "公告标题" --backtitle "Dialog" --msgbox "内容" 20 60 # 公告 1044 dialog --title "hey" --backtitle "Dialog" --infobox "Is everything okay?" 10 60 # 显示讯息后立即离开 1045 dialog --title "hey" --backtitle "Dialog" --inputbox "Is okay?" 10 60 "yes" # 输入对话框 1046 dialog --title "Array 30" --backtitle "All " --textbox /root/txt 20 75 # 显示文档内容 1047 dialog --title "Add" --form "input" 12 40 4 "user" 1 1 "" 1 15 15 0 "name" 2 1 "" 2 15 15 0 # 多条输入对话框 1048 dialog --title "Password" --insecure --passwordbox "请输入密码" 10 35 # 星号显示输入--insecure 1049 dialog --stdout --title "日历" --calendar "请选择" 0 0 9 1 2010 # 选择日期 1050 dialog --title "title" --menu "MENU" 20 60 14 tag1 "item1" tag2 "item2" 2>tmp # 取到结果放到文件中(以标准错误输出结果) 1051 a=`dialog --title "title" --stdout --menu "MENU" 20 60 14 tag1 "item1" tag2 "item2"` # 选择操作赋给变量(使用标准输出) 1052 1053 dialog菜单实例{ 1054 while : 1055 do 1056 clear 1057 menu=`dialog --title "title" --stdout --menu "MENU" 20 60 14 1 system 2 custom` 1058 [ $? -eq 0 ] && echo "$menu" || exit # 判断dialog执行,取消退出 1059 while : 1060 do 1061 case $menu in 1062 1) 1063 list="1a "item1" 2a "item2"" # 定义菜单列表变量 1064 ;; 1065 2) 1066 list="1b "item3" 2b "item4"" 1067 ;; 1068 esac 1069 result=`dialog --title "title" --stdout --menu "MENU" 20 60 14 $list` 1070 [ $? -eq 0 ] && echo "$result" || break # 判断dialog执行,取消返回菜单,注意:配合上层菜单循环 1071 read 1072 done 1073 done 1074 } 1075 1076 } 1077 1078 select菜单{ 1079 1080 # 输入项不在菜单自动会提示重新输入 1081 select menuitem in pick1 pick2 pick3 退出 1082 do 1083 echo $menuitem 1084 case $menuitem in 1085 退出) 1086 exit 1087 ;; 1088 *) 1089 select area in area1 area2 area3 返回 1090 do 1091 echo $area 1092 case $area in 1093 返回) 1094 break 1095 ;; 1096 *) 1097 echo "对$area操作" 1098 ;; 1099 esac 1100 done 1101 ;; 1102 esac 1103 done 1104 1105 } 1106 1107 shift{ 1108 1109 ./cs.sh 1 2 3 1110 #!/bin/sh 1111 until [ $# -eq 0 ] 1112 do 1113 echo "第一个参数为: $1 参数个数为: $#" 1114 #shift 命令执行前变量 $1 的值在shift命令执行后不可用 1115 shift 1116 done 1117 1118 } 1119 1120 getopts给脚本加参数{ 1121 1122 #!/bin/sh 1123 while getopts :ab: name 1124 do 1125 case $name in 1126 a) 1127 aflag=1 1128 ;; 1129 b) 1130 bflag=1 1131 bval=$OPTARG 1132 ;; 1133 \?) 1134 echo "USAGE:`basename $0` [-a] [-b value]" 1135 exit 1 1136 ;; 1137 esac 1138 done 1139 if [ ! -z $aflag ] ; then 1140 echo "option -a specified" 1141 echo "$aflag" 1142 echo "$OPTIND" 1143 fi 1144 if [ ! -z $bflag ] ; then 1145 echo "option -b specified" 1146 echo "$bflag" 1147 echo "$bval" 1148 echo "$OPTIND" 1149 fi 1150 echo "here $OPTIND" 1151 shift $(($OPTIND -1)) 1152 echo "$OPTIND" 1153 echo " `shift $(($OPTIND -1))` " 1154 1155 } 1156 1157 tclsh{ 1158 1159 set foo "a bc" # 定义变量 1160 set b {$a}; # 转义 b的值为" $a " ,而不是变量结果 1161 set a 3; incr a 3; # 数字的自增. 将a加3,如果要减3,则为 incr a –3; 1162 set c [expr 20/5]; # 计算 c的值为4 1163 puts $foo; # 打印变量 1164 set qian(123) f; # 定义数组 1165 set qian(1,1,1) fs; # 多维数组 1166 parray qian; # 打印数组的所有信息 1167 string length $qian; # 将返回变量qian的长度 1168 string option string1 string2; # 字符相关串操作 1169 # option 的操作选项: 1170 # compare 按照字典的排序方式进行比较。根据string1 <,=,>string2分别返回-1,0,1 1171 # first 返回string2中第一次出现string1的位置,如果没有出现string1则返回-1 1172 # last 和first相反 1173 # trim 从string1中删除开头和结尾的出现在string2中的字符 1174 # tolower 返回string1中的所有字符被转换为小写字符后的新字符串 1175 # toupper 返回string1中的所有字符串转换为大写后的字符串 1176 # length 返回string1的长度 1177 set a 1;while {$a < 3} { set a [incr a 1;]; };puts $a # 判断变量a小于3既循环 1178 for {initialization} {condition} {increment} {body} # 初始化变量,条件,增量,具体操作 1179 for {set i 0} {$i < 10} {incr i} {puts $i;} # 将打印出0到9 1180 if { 表达式 } { 1181 #运算; 1182 } else { 1183 #其他运算; 1184 } 1185 switch $x { 1186 字符串1 { 操作1 ;} 1187 字符串2 { 操作2 ;} 1188 } 1189 foreach element {0 m n b v} { 1190 # 将在一组变元中进行循环,并且每次都将执行他的循环体 1191 switch $element { 1192 # 判断element的值 1193 } 1194 } 1195 1196 expect交互{ 1197 1198 exp_continue # 多个spawn命令时并行 1199 interact # 执行完成后保持交互状态,把控制权交给控制台 1200 expect "password:" # 判断关键字符 1201 send "passwd\r" # 执行交互动作,与手工输入密码的动作等效。字符串结尾加"\r" 1202 1203 ssh后sudo{ 1204 1205 #!/bin/bash 1206 #sudo注释下行允许后台运行 1207 #Defaults requiretty 1208 #sudo去掉!允许远程 1209 #Defaults !visiblepw 1210 1211 /usr/bin/expect -c ' 1212 set timeout 5 1213 spawn ssh -o StrictHostKeyChecking=no xuesong1@192.168.42.128 "sudo grep xuesong1 /etc/passwd" 1214 expect { 1215 "passphrase" { 1216 send_user "sshkey\n" 1217 send "xuesong\r"; 1218 expect { 1219 "sudo" { 1220 send_user "sudo\n" 1221 send "xuesong\r" 1222 interact 1223 } 1224 eof { 1225 send_user "sudo eof\n" 1226 } 1227 } 1228 } 1229 "password:" { 1230 send_user "ssh\n" 1231 send "xuesong\r"; 1232 expect { 1233 "sudo" { 1234 send_user "sudo\n" 1235 send "xuesong\r" 1236 interact 1237 } 1238 eof { 1239 send_user "sudo eof\n" 1240 } 1241 } 1242 } 1243 "sudo" { 1244 send_user "sudo\n" 1245 send "xuesong\r" 1246 interact 1247 } 1248 eof { 1249 send_user "ssh eof\n" 1250 } 1251 } 1252 ' 1253 1254 } 1255 1256 ssh执行命令操作{ 1257 1258 /usr/bin/expect -c " 1259 proc jiaohu {} { 1260 send_user expect_start 1261 expect { 1262 password { 1263 send ${RemotePasswd}\r; 1264 send_user expect_eof 1265 expect { 1266 \"does not exist\" { 1267 send_user expect_failure 1268 exit 10 1269 } 1270 password { 1271 send_user expect_failure 1272 exit 5 1273 } 1274 Password { 1275 send ${RemoteRootPasswd}\r; 1276 send_user expect_eof 1277 expect { 1278 incorrect { 1279 send_user expect_failure 1280 exit 6 1281 } 1282 eof 1283 } 1284 } 1285 eof 1286 } 1287 } 1288 passphrase { 1289 send ${KeyPasswd}\r; 1290 send_user expect_eof 1291 expect { 1292 \"does not exist\" { 1293 send_user expect_failure 1294 exit 10 1295 } 1296 passphrase{ 1297 send_user expect_failure 1298 exit 7 1299 } 1300 Password { 1301 send ${RemoteRootPasswd}\r; 1302 send_user expect_eof 1303 expect { 1304 incorrect { 1305 send_user expect_failure 1306 exit 6 1307 } 1308 eof 1309 } 1310 } 1311 eof 1312 } 1313 } 1314 Password { 1315 send ${RemoteRootPasswd}\r; 1316 send_user expect_eof 1317 expect { 1318 incorrect { 1319 send_user expect_failure 1320 exit 6 1321 } 1322 eof 1323 } 1324 } 1325 \"No route to host\" { 1326 send_user expect_failure 1327 exit 4 1328 } 1329 \"Invalid argument\" { 1330 send_user expect_failure 1331 exit 8 1332 } 1333 \"Connection refused\" { 1334 send_user expect_failure 1335 exit 9 1336 } 1337 \"does not exist\" { 1338 send_user expect_failure 1339 exit 10 1340 } 1341 1342 \"Connection timed out\" { 1343 send_user expect_failure 1344 exit 11 1345 } 1346 timeout { 1347 send_user expect_failure 1348 exit 3 1349 } 1350 eof 1351 } 1352 } 1353 set timeout $TimeOut 1354 switch $1 { 1355 Ssh_Cmd { 1356 spawn ssh -t -p $Port -o StrictHostKeyChecking=no $RemoteUser@$Ip /bin/su - root -c \\\"$Cmd\\\" 1357 jiaohu 1358 } 1359 Ssh_Script { 1360 spawn scp -P $Port -o StrictHostKeyChecking=no $ScriptPath $RemoteUser@$Ip:/tmp/${ScriptPath##*/}; 1361 jiaohu 1362 spawn ssh -t -p $Port -o StrictHostKeyChecking=no $RemoteUser@$Ip /bin/su - root -c \\\"/bin/sh /tmp/${ScriptPath##*/}\\\" ; 1363 jiaohu 1364 } 1365 Scp_File { 1366 spawn scp -P $Port -o StrictHostKeyChecking=no -r $ScpPath $RemoteUser@$Ip:${ScpRemotePath}; 1367 jiaohu 1368 } 1369 } 1370 " 1371 state=`echo $?` 1372 1373 } 1374 1375 交互双引号引用较长变量{ 1376 1377 #!/bin/bash 1378 RemoteUser=xuesong12 1379 Ip=192.168.1.2 1380 RemotePasswd=xuesong 1381 Cmd="/bin/echo "$PubKey" > "$RemoteKey"/authorized_keys" 1382 1383 /usr/bin/expect -c " 1384 set timeout 10 1385 spawn ssh -o StrictHostKeyChecking=no $RemoteUser@$Ip {$Cmd}; 1386 expect { 1387 password: { 1388 send_user RemotePasswd\n 1389 send ${RemotePasswd}\r; 1390 interact; 1391 } 1392 eof { 1393 send_user eof\n 1394 } 1395 } 1396 " 1397 1398 } 1399 1400 telnet交互{ 1401 1402 #!/bin/bash 1403 Ip="10.0.1.53" 1404 a="\{\'method\'\:\'doLogin\'\,\'params\'\:\{\'uName\'\:\'bobbietest\'\}" 1405 /usr/bin/expect -c" 1406 set timeout 15 1407 spawn telnet ${Ip} 8000 1408 expect "Escape" 1409 send "${a}\\r" 1410 expect { 1411 -re "\"err.*none\"" { 1412 exit 0 1413 } 1414 timeout { 1415 exit 1 1416 } 1417 eof { 1418 exit 2 1419 } 1420 } 1421 " 1422 echo $? 1423 1424 } 1425 1426 模拟ssh登录{ 1427 #好处:可加载环境变量 1428 1429 #!/bin/bash 1430 Ip='192.168.1.6' # 循环就行 1431 RemoteUser='user' # 普通用户 1432 RemotePasswd='userpasswd' # 普通用户的密码 1433 RemoteRootPasswd='rootpasswd' 1434 /usr/bin/expect -c " 1435 set timeout -1 1436 spawn ssh -t -p $Port -o StrictHostKeyChecking=no $RemoteUser@$Ip 1437 expect { 1438 password { 1439 send_user RemotePasswd 1440 send ${RemotePasswd}\r; 1441 expect { 1442 \"does not exist\" { 1443 send_user \"root user does not exist\n\" 1444 exit 10 1445 } 1446 password { 1447 send_user \"user passwd error\n\" 1448 exit 5 1449 } 1450 Last { 1451 send \"su - batch\n\" 1452 expect { 1453 Password { 1454 send_user RemoteRootPasswd 1455 send ${RemoteRootPasswd}\r; 1456 expect { 1457 \"]#\" { 1458 send \"sh /tmp/update.sh update\n \" 1459 expect { 1460 \"]#\" { 1461 send_user ${Ip}_Update_Done\n 1462 } 1463 eof 1464 } 1465 } 1466 } 1467 } 1468 } 1469 } 1470 } 1471 } 1472 \"No route to host\" { 1473 send_user \"host not found\n\" 1474 exit 4 1475 } 1476 \"Invalid argument\" { 1477 send_user \"incorrect parameter\n\" 1478 exit 8 1479 } 1480 \"Connection refused\" { 1481 send_user \"invalid port parameters\n\" 1482 exit 9 1483 } 1484 \"does not exist\" { 1485 send_user \"root user does not exist\" 1486 exit 10 1487 } 1488 timeout { 1489 send_user \"connection timeout \n\" 1490 exit 3 1491 } 1492 eof 1493 } 1494 " 1495 state=`echo $?` 1496 1497 } 1498 1499 } 1500 1501 } 1502 1503 }
1 9. 实例{ 2 3 从1叠加到100{ 4 5 echo $[$(echo +{1..100})] 6 echo $[(100+1)*(100/2)] 7 seq -s '+' 100 |bc 8 9 } 10 11 判断参数是否为空-空退出并打印null{ 12 13 #!/bin/sh 14 echo $1 15 name=${1:?"null"} 16 echo $name 17 18 } 19 20 循环数组{ 21 22 for ((i=0;i<${#o[*]};i++)) 23 do 24 echo ${o[$i]} 25 done 26 27 } 28 29 判断路径{ 30 31 if [ -d /root/Desktop/text/123 ];then 32 echo "找到了123" 33 if [ -d /root/Desktop/text ] 34 then echo "找到了text" 35 else echo "没找到text" 36 fi 37 else echo "没找到123文件夹" 38 fi 39 40 } 41 42 找出出现次数最多{ 43 44 awk '{print $1}' file|sort |uniq -c|sort -k1r 45 46 } 47 48 判断脚本参数是否正确{ 49 50 ./test.sh -p 123 -P 3306 -h 127.0.0.1 -u root 51 #!/bin/sh 52 if [ $# -ne 8 ];then 53 echo "USAGE: $0 -u user -p passwd -P port -h host" 54 exit 1 55 fi 56 57 while getopts :u:p:P:h: name 58 do 59 case $name in 60 u) 61 mysql_user=$OPTARG 62 ;; 63 p) 64 mysql_passwd=$OPTARG 65 ;; 66 P) 67 mysql_port=$OPTARG 68 ;; 69 h) 70 mysql_host=$OPTARG 71 ;; 72 *) 73 echo "USAGE: $0 -u user -p passwd -P port -h host" 74 exit 1 75 ;; 76 esac 77 done 78 79 if [ -z $mysql_user ] || [ -z $mysql_passwd ] || [ -z $mysql_port ] || [ -z $mysql_host ] 80 then 81 echo "USAGE: $0 -u user -p passwd -P port -h host" 82 exit 1 83 fi 84 85 echo $mysql_user $mysql_passwd $mysql_port $mysql_host 86 #结果 root 123 3306 127.0.0.1 87 88 } 89 90 正则匹配邮箱{ 91 92 ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$ 93 94 } 95 96 打印表格{ 97 98 #!/bin/sh 99 clear 100 awk 'BEGIN{ 101 print "+--------------------+--------------------+"; 102 printf "|%-20s|%-20s|\n","Name","Number"; 103 print "+--------------------+--------------------+"; 104 }' 105 a=`grep "^[A-Z]" a.txt |sort +1 -n |awk '{print $1":"$2}'` 106 #cat a.txt |sort +1 -n |while read list 107 for list in $a 108 do 109 name=`echo $list |awk -F: '{print $1}'` 110 number=`echo $list |awk -F: '{print $2}'` 111 awk 'BEGIN{printf "|%-20s|%-20s|\n","'"$name"'","'"$number"'"; 112 print "+--------------------+--------------------+"; 113 }' 114 done 115 awk 'BEGIN{ 116 print " *** The End *** " 117 print " " 118 }' 119 120 } 121 122 判断日期是否合法{ 123 124 #!/bin/sh 125 while read a 126 do 127 if echo $a | grep -q "-" && date -d $a +%Y%m%d > /dev/null 2>&1 128 then 129 if echo $a | grep -e '^[0-9]\{4\}-[01][0-9]-[0-3][0-9]$' 130 then 131 break 132 else 133 echo "您输入的日期不合法,请从新输入!" 134 fi 135 else 136 echo "您输入的日期不合法,请从新输入!" 137 fi 138 done 139 echo "日期为$a" 140 141 } 142 143 打印日期段所有日期{ 144 145 #!/bin/bash 146 qsrq=20010101 147 jsrq=20010227 148 n=0 149 >tmp 150 while :;do 151 current=$(date +%Y%m%d -d"$n day $qsrq") 152 if [[ $current == $jsrq ]];then 153 echo $current >>tmp;break 154 else 155 echo $current >>tmp 156 ((n++)) 157 fi 158 done 159 rq=`awk 'NR==1{print}' tmp` 160 161 } 162 163 数学计算的小算法{ 164 165 #!/bin/sh 166 A=1 167 B=1 168 while [ $A -le 10 ] 169 do 170 SUM=`expr $A \* $B` 171 echo "$SUM" 172 if [ $A = 10 ] 173 then 174 B=`expr $B + 1` 175 A=1 176 fi 177 A=`expr $A + 1` 178 done 179 180 } 181 182 多行合并{ 183 184 sed '{N;s/\n//}' file # 将两行合并一行(去掉换行符) 185 awk '{printf(NR%2!=0)?$0" ":$0" \n"}' # 将两行合并一行 186 awk '{printf"%s ",$0}' # 将所有行合并 187 awk '{if (NR%4==0){print $0} else {printf"%s ",$0}}' file # 将4行合并为一行(可扩展) 188 189 } 190 191 横竖转换{ 192 193 cat a.txt | xargs # 列转行 194 cat a.txt | xargs -n1 # 行转列 195 196 } 197 198 竖行转横行{ 199 200 cat file|tr '\n' ' ' 201 echo $(cat file) 202 203 #!/bin/sh 204 for i in `cat file` 205 do 206 a=${a}" "${i} 207 done 208 echo $a 209 210 } 211 212 取用户的根目录{ 213 214 #! /bin/bash 215 while read name pass uid gid gecos home shell 216 do 217 echo $home 218 done < /etc/passwd 219 220 } 221 222 远程打包{ 223 224 ssh -n $ip 'find '$path' /data /opt -type f -name "*.sh" -or -name "*.py" -or -name "*.pl" |xargs tar zcvpf /tmp/data_backup.tar.gz' 225 226 } 227 228 把汉字转成encode格式{ 229 230 echo 论坛 | tr -d "\n" | xxd -i | sed -e "s/ 0x/%/g" | tr -d " ,\n" 231 %c2%db%cc%b3 232 echo 论坛 | tr -d "\n" | xxd -i | sed -e "s/ 0x/%/g" | tr -d " ,\n" | tr "[a-f]" "[A-F]" # 大写的 233 %C2%DB%CC%B3 234 235 } 236 237 把目录带有大写字母的文件名改为全部小写{ 238 239 #!/bin/bash 240 for f in *;do 241 mv $f `echo $f |tr "[A-Z]" "[a-z]"` 242 done 243 244 } 245 246 查找连续多行,在不连续的行前插入{ 247 248 #/bin/bash 249 lastrow=null 250 i=0 251 cat incl|while read line 252 do 253 i=`expr $i + 1` 254 if echo "$lastrow" | grep "#include <[A-Z].h>" 255 then 256 if echo "$line" | grep -v "#include <[A-Z].h>" 257 then 258 sed -i ''$i'i\\/\/All header files are include' incl 259 i=`expr $i + 1` 260 fi 261 fi 262 lastrow="$line" 263 done 264 265 } 266 267 查询数据库其它引擎{ 268 269 #/bin/bash 270 path1=/data/mysql/data/ 271 dbpasswd=db123 272 #MyISAM或InnoDB 273 engine=InnoDB 274 275 if [ -d $path1 ];then 276 277 dir=`ls -p $path1 |awk '/\/$/'|awk -F'/' '{print $1}'` 278 for db in $dir 279 do 280 number=`mysql -uroot -p$dbpasswd -A -S "$path1"mysql.sock -e "use ${db};show table status;" |grep -c $engine` 281 if [ $number -ne 0 ];then 282 echo "${db}" 283 fi 284 done 285 fi 286 287 } 288 289 批量修改数据库引擎{ 290 291 #/bin/bash 292 for db in test test1 test3 293 do 294 tables=`mysql -uroot -pdb123 -A -S /data/mysql/data/mysql.sock -e "use $db;show tables;" |awk 'NR != 1{print}'` 295 296 for table in $tables 297 do 298 mysql -uroot -pdb123 -A -S /data/mysql/data/mysql.sock -e "use $db;alter table $table engine=MyISAM;" 299 done 300 done 301 302 } 303 304 将shell取到的数据插入mysql数据库{ 305 306 mysql -u$username -p$passwd -h$dbhost -P$dbport -A -e " 307 use $dbname; 308 insert into data values ('','$ip','$date','$time','$data') 309 " 310 311 } 312 313 两日期间隔天数{ 314 315 D1=`date -d '20070409' +"%s"` 316 D2=`date -d '20070304 ' +"%s"` 317 D3=$(($D1 - $D2)) 318 echo $(($D3/60/60/24)) 319 320 } 321 322 while执行ssh只循环一次{ 323 324 cat - # 让cat读连接文件stdin的信息 325 seq 10 | while read line; do ssh localhost "cat -"; done # 显示的9次是被ssh吃掉的 326 seq 10 | while read line; do ssh -n localhost "cat -"; done # ssh加上-n参数可避免只循环一次 327 328 } 329 330 ssh批量执行命令{ 331 332 #版本1 333 #!/bin/bash 334 while read line 335 do 336 Ip=`echo $line|awk '{print $1}'` 337 Passwd=`echo $line|awk '{print $2}'` 338 ssh -n localhost "cat -" 339 sshpass -p "$Passwd" ssh -n -t -o StrictHostKeyChecking=no root@$Ip "id" 340 done<iplist.txt 341 342 #版本2 343 #!/bin/bash 344 Iplist=`awk '{print $1}' iplist.txt` 345 for Ip in $Iplist 346 do 347 Passwd=`awk '/'$Ip'/{print $2}' iplist.txt` 348 sshpass -p "$Passwd" ssh -n -t -o StrictHostKeyChecking=no root@$Ip "id" 349 done 350 351 } 352 353 在同一位置打印字符{ 354 355 #!/bin/bash 356 echo -ne "\t" 357 for i in `seq -w 100 -1 1` 358 do 359 echo -ne "$i\b\b\b"; # 关键\b退格 360 sleep 1; 361 done 362 363 } 364 365 多进程后台并发简易控制{ 366 367 #!/bin/bash 368 test () { 369 echo $a 370 sleep 5 371 } 372 for a in `seq 1 30` 373 do 374 test & 375 echo $! 376 ((num++)) 377 if [ $num -eq 6 ];then 378 echo "wait..." 379 wait 380 num=0 381 fi 382 done 383 wait 384 385 } 386 387 shell并发{ 388 389 #!/bin/bash 390 tmpfile=$$.fifo # 创建管道名称 391 mkfifo $tmpfile # 创建管道 392 exec 4<>$tmpfile # 创建文件标示4,以读写方式操作管道$tmpfile 393 rm $tmpfile # 将创建的管道文件清除 394 thred=4 # 指定并发个数 395 seq=(1 2 3 4 5 6 7 8 9 21 22 23 24 25 31 32 33 34 35) # 创建任务列表 396 397 # 为并发线程创建相应个数的占位 398 { 399 for (( i = 1;i<=${thred};i++ )) 400 do 401 echo; # 因为read命令一次读取一行,一个echo默认输出一个换行符,所以为每个线程输出一个占位换行 402 done 403 } >&4 # 将占位信息写入管道 404 405 for id in ${seq} # 从任务列表 seq 中按次序获取每一个任务 406 do 407 read # 读取一行,即fd4中的一个占位符 408 (./ur_command ${id};echo >&4 ) & # 在后台执行任务ur_command 并将任务 ${id} 赋给当前任务;任务执行完后在fd4种写入一个占位符 409 done <&4 # 指定fd4为整个for的标准输入 410 wait # 等待所有在此shell脚本中启动的后台任务完成 411 exec 4>&- # 关闭管道 412 413 } 414 415 shell并发函数{ 416 417 function ConCurrentCmd() 418 { 419 #进程数 420 Thread=30 421 422 #列表文件 423 CurFileName=iplist.txt 424 425 #定义fifo文件 426 FifoFile="$$.fifo" 427 428 #新建一个fifo类型的文件 429 mkfifo $FifoFile 430 431 #将fd6与此fifo类型文件以读写的方式连接起来 432 exec 6<>$FifoFile 433 rm $FifoFile 434 435 #事实上就是在文件描述符6中放置了$Thread个回车符 436 for ((i=0;i<=$Thread;i++));do echo;done >&6 437 438 #此后标准输入将来自fd5 439 exec 5<$CurFileName 440 441 #开始循环读取文件列表中的行 442 Count=0 443 while read -u5 line 444 do 445 read -u6 446 let Count+=1 447 # 此处定义一个子进程放到后台执行 448 # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行 449 # fd6中没有回车符的时候,就停在这了,从而实现了进程数量控制 450 { 451 echo $Count 452 453 #这段代码框就是执行具体的操作了 454 function 455 456 echo >&6 457 #当进程结束以后,再向fd6中追加一个回车符,即补上了read -u6减去的那个 458 } & 459 done 460 461 #等待所有后台子进程结束 462 wait 463 464 #关闭fd6 465 exec 6>&- 466 467 #关闭fd5 468 exec 5>&- 469 } 470 471 并发例子{ 472 473 #!/bin/bash 474 475 pnum=3 476 477 task () { 478 echo "$u start" 479 sleep 5 480 echo "$u done" 481 } 482 483 FifoFile="$$.fifo" 484 mkfifo $FifoFile 485 exec 6<>$FifoFile 486 rm $FifoFile 487 488 for ((i=0;i<=$pnum;i++));do echo;done >&6 489 490 for u in `seq 1 20` 491 do 492 read -u6 493 { 494 task 495 [ $? -eq 0 ] && echo "${u} 次成功" || echo "${u} 次失败" 496 echo >&6 497 } & 498 done 499 wait 500 exec 6>&- 501 502 } 503 } 504 505 函数{ 506 507 ip(){ 508 echo "a 1"|awk '$1=="'"$1"'"{print $2}' 509 } 510 web=a 511 ip $web 512 513 } 514 515 检测软件包是否存在{ 516 517 rpm -q dialog >/dev/null 518 if [ "$?" -ge 1 ];then 519 echo "install dialog,Please wait..." 520 yum -y install dialog 521 rpm -q dialog >/dev/null 522 [ $? -ge 1 ] && echo "dialog installation failure,exit" && exit 523 echo "dialog done" 524 read 525 fi 526 527 } 528 529 游戏维护菜单-修改配置文件{ 530 531 #!/bin/bash 532 533 conf=serverlist.xml 534 AreaList=`awk -F '"' '/<s/{print $2}' $conf` 535 536 select area in $AreaList 全部 退出 537 do 538 echo "" 539 echo $area 540 case $area in 541 退出) 542 exit 543 ;; 544 *) 545 select operate in "修改版本号" "添加维护中" "删除维护中" "返回菜单" 546 do 547 echo "" 548 echo $operate 549 case $operate in 550 修改版本号) 551 echo 请输入版本号 552 while read version 553 do 554 if echo $version | grep -w 10[12][0-9][0-9][0-9][0-9][0-9][0-9] 555 then 556 break 557 fi 558 echo 请从新输入正确的版本号 559 done 560 case $area in 561 全部) 562 case $version in 563 101*) 564 echo "请确认操作对 $area 体验区 $operate" 565 read 566 sed -i 's/101[0-9][0-9][0-9][0-9][0-9][0-9]/'$version'/' $conf 567 ;; 568 102*) 569 echo "请确认操作对 $area 正式区 $operate" 570 read 571 sed -i 's/102[0-9][0-9][0-9][0-9][0-9][0-9]/'$version'/' $conf 572 ;; 573 esac 574 ;; 575 *) 576 type=`awk -F '"' '/'$area'/{print $14}' $conf |cut -c1-3` 577 readtype=`echo $version |cut -c1-3` 578 if [ $type != $readtype ] 579 then 580 echo "版本号不对应,请从新操作" 581 continue 582 fi 583 584 echo "请确认操作对 $area 区 $operate" 585 read 586 587 awk -F '"' '/'$area'/{print $12}' $conf |xargs -i sed -i '/'{}'/s/10[12][0-9][0-9][0-9][0-9][0-9][0-9]/'$version'/' $conf 588 ;; 589 esac 590 ;; 591 添加维护中) 592 case $area in 593 全部) 594 echo "请确认操作对 $area 区 $operate" 595 read 596 awk -F '"' '/<s/{print $2}' $conf |xargs -i sed -i 's/'{}'/&维护中/' $conf 597 ;; 598 *) 599 echo "请确认操作对 $area 区 $operate" 600 read 601 sed -i 's/'$area'/&维护中/' $conf 602 ;; 603 esac 604 ;; 605 删除维护中) 606 case $area in 607 全部) 608 echo "请确认操作对 $area 区 $operate" 609 read 610 sed -i 's/维护中//' $conf 611 ;; 612 *) 613 echo "请确认操作对 $area 区 $operate" 614 read 615 sed -i '/'$area'/s/维护中//' $conf 616 ;; 617 esac 618 ;; 619 返回菜单) 620 break 621 ;; 622 esac 623 done 624 ;; 625 esac 626 echo "回车重新选择区" 627 done 628 629 } 630 631 keepalive剔除后端服务{ 632 633 #!/bin/bash 634 #行数请自定义,默认8行 635 if [ X$2 == X ];then 636 echo "error: IP null" 637 read 638 exit 639 fi 640 case $1 in 641 del) 642 sed -i '/real_server.*'$2'.*8888/,+8 s/^/#/' /etc/keepalived/keepalived.conf 643 /etc/init.d/keepalived reload 644 ;; 645 add) 646 sed -i '/real_server.*'$2'.*8888/,+8 s/^#//' /etc/keepalived/keepalived.conf 647 /etc/init.d/keepalived reload 648 ;; 649 *) 650 echo "Parameter error" 651 ;; 652 esac 653 654 } 655 656 抓取系统中负载最高的进程{ 657 658 #!/bin/bash 659 LANG=C 660 PATH=/sbin:/usr/sbin:/bin:/usr/bin 661 interval=1 662 length=86400 663 for i in $(seq 1 $(expr ${length} / ${interval}));do 664 date 665 LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | grep -v CPU | sort -n -r | head -20 666 date 667 LANG=C cat /proc/loadavg 668 { LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | sed -e 's/^ *//' | tr -s ' ' | grep -v CPU | sort -n -r | cut -d ' ' -f 1 | xargs -I{} echo -n "{} + " && echo ' 0'; } | bc -l 669 sleep ${interval} 670 done 671 fuser -k $0 672 673 } 674 675 申诉中国反垃圾邮件联盟黑名单{ 676 677 #!/bin/bash 678 679 IpList=`awk '$1!~"^#"&&$1!=""{print $1}' host.list` 680 681 QueryAdd='http://www.anti-spam.org.cn/Rbl/Query/Result' 682 ComplaintAdd='http://www.anti-spam.org.cn/Rbl/Getout/Submit' 683 684 CONTENT='我们是一家正规的XXX。xxxxxxx。恳请将我们的发送服务器IP移出黑名单。谢谢! 685 处理措施: 686 1.XXXX。 687 2.XXXX。' 688 CORP='abc.com' 689 WWW='www.abc.cm' 690 NAME='def' 691 MAIL='def@163.com.cn' 692 TEL='010-50000000' 693 LEVEL='0' 694 695 for Ip in $IpList 696 do 697 Status=`curl -d "IP=$Ip" $QueryAdd |grep 'Getout/ShowForm?IP=' |grep -wc '申诉脱离'` 698 if [ $Status -ge 1 ];then 699 IpStatus="黑名单中" 700 results=`curl -d "IP=${Ip}&CONTENT=${CONTENT}&CORP=${CORP}&WWW=${WWW}&NAME=${NAME}&MAIL=${MAIL}&TEL=${TEL}&LEVEL=${LEVEL}" $ComplaintAdd |grep -E '您的黑名单脱离申请已提交|该IP的脱离申请已被他人提交|申请由于近期内有被拒绝的记录'` 701 echo $results 702 if echo $results | grep '您的黑名单脱离申请已提交' > /dev/null 2>&1 703 then 704 complaint='申诉成功' 705 elif echo $results | grep '该IP的脱离申请已被他人提交' > /dev/null 2>&1 706 then 707 complaint='申诉重复' 708 elif echo $results | grep '申请由于近期内有被拒绝的记录' > /dev/null 2>&1 709 then 710 complaint='申诉拒绝' 711 else 712 complaint='异常' 713 fi 714 else 715 IpStatus='正常' 716 complaint='无需申诉' 717 fi 718 echo "$Ip $IpStatus $complaint" >> $(date +%Y%m%d_%H%M%S).log 719 done 720 721 } 722 723 Web Server in Awk{ 724 725 #gawk -f file 726 BEGIN { 727 x = 1 # script exits if x < 1 728 port = 8080 # port number 729 host = "/inet/tcp/" port "/0/0" # host string 730 url = "http://localhost:" port # server url 731 status = 200 # 200 == OK 732 reason = "OK" # server response 733 RS = ORS = "\r\n" # header line terminators 734 doc = Setup() # html document 735 len = length(doc) + length(ORS) # length of document 736 while (x) { 737 if ($1 == "GET") RunApp(substr($2, 2)) 738 if (! x) break 739 print "HTTP/1.0", status, reason |& host 740 print "Connection: Close" |& host 741 print "Pragma: no-cache" |& host 742 print "Content-length:", len |& host 743 print ORS doc |& host 744 close(host) # close client connection 745 host |& getline # wait for new client request 746 } 747 # server terminated... 748 doc = Bye() 749 len = length(doc) + length(ORS) 750 print "HTTP/1.0", status, reason |& host 751 print "Connection: Close" |& host 752 print "Pragma: no-cache" |& host 753 print "Content-length:", len |& host 754 print ORS doc |& host 755 close(host) 756 } 757 758 function Setup() { 759 tmp = "<html>\ 760 <head><title>Simple gawk server</title></head>\ 761 <body>\ 762 <p><a href=" url "/xterm>xterm</a>\ 763 <p><a href=" url "/xcalc>xcalc</a>\ 764 <p><a href=" url "/xload>xload</a>\ 765 <p><a href=" url "/exit>terminate script</a>\ 766 </body>\ 767 </html>" 768 return tmp 769 } 770 771 function Bye() { 772 tmp = "<html>\ 773 <head><title>Simple gawk server</title></head>\ 774 <body><p>Script Terminated...</body>\ 775 </html>" 776 return tmp 777 } 778 779 function RunApp(app) { 780 if (app == "xterm") {system("xterm&"); return} 781 if (app == "xcalc" ) {system("xcalc&"); return} 782 if (app == "xload" ) {system("xload&"); return} 783 if (app == "exit") {x = 0} 784 } 785 786 } 787 788 }
1 10. 经验{ 2 1.服务上线,在启动注册流量时大量报错, 下游服务摘除,重启后, 上游还用原有的链接去链接, 导致请求失败. 3 2.systemd守护的进程,在tmp下找不到对应文件, 配置安全tmp项PrivateTmp改为false PrivateTmp=false 4 3.统一服务内部调用关系,一个服务对应一个域名 5 4.统一服务服务返回的状态码,报警只需要针对5xx就可以发现问题. 6 5.在服务雪崩后,恢复服务,用户可能有大量重试,所以放流量也要小比例放流量,逐步恢复 7 }
转载于: https://github.com/liquanzhou/ops_doc