shell实例手册 1文件{ touch file # 创建空白文件 rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制) dos2unix # windows文本转linux文本 unix2dos # linux文本转windows文本 enca filename # 查看编码 安装 yum install -y enca md5sum # 查看md5值 ln 源文件 目标文件 # 硬链接 ln -s 源文件 目标文件 # 符号连接 readlink -f /data # 查看连接真实目录 cat file | nl |less # 查看上下翻页且显示行号 q退出 head # 查看文件开头内容 head -c 10m # 截取文件中10M内容 split -C 10M # 将文件切割大小为10M tail -f file # 查看结尾 监视日志文件 file # 检查文件类型 umask # 更改默认权限 uniq # 删除重复的行 uniq -c # 重复的行出现次数 uniq -u # 只显示不重复行 paste a b # 将两个文件合并用tab键分隔开 paste -d'+' a b # 将两个文件合并指定'+'符号隔开 paste -s a # 将多行数据合并到一行用tab键隔开 chattr +i /etc/passwd # 设置不可改变位 more # 向下分面器 locate 字符串 # 搜索 wc -l file # 查看行数 cp filename{,.bak} # 快速备份一个文件 \cp a b # 拷贝不提示 既不使用别名 cp -i rev # 将行中的字符逆序排列 comm -12 2 3 # 行和行比较匹配 iconv -f gbk -t utf8 原.txt > 新.txt # 转换编码 rename 原模式 目标模式 文件 # 重命名 可正则 watch -d -n 1 'df; ls -FlAt /path' # 实时某个目录下查看最新改动过的文件 cp -v /dev/dvd /rhel4.6.iso9660 # 制作镜像 diff suzu.c suzu2.c > sz.patch # 制作补丁 patch suzu.c < sz.patch # 安装补丁 sort排序{ -t # 指定排序时所用的栏位分隔字符 -n # 依照数值的大小排序 -r # 以相反的顺序来排序 -f # 排序时,将小写字母视为大写字母 -d # 排序时,处理英文字母、数字及空格字符外,忽略其他的字符 -c # 检查文件是否已经按照顺序排序 -b # 忽略每行前面开始处的空格字符 -M # 前面3个字母依照月份的缩写进行排序 -k # 指定域 -m # 将几个排序好的文件进行合并 +- # 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。 -o # 将排序后的结果存入指定的文 sort -n # 按数字排序 sort -nr # 按数字倒叙 sort -u # 过滤重复行 sort -m a.txt c.txt # 将两个文件内容整合到一起 sort -n -t' ' -k 2 -k 3 a.txt # 第二域相同,将从第三域进行升降处理 sort -n -t':' -k 3r a.txt # 以:为分割域的第三域进行倒叙排列 sort -k 1.3 a.txt # 从第三个字母起进行排序 sort -t" " -k 2n -u a.txt # 以第二域进行排序,如果遇到重复的,就删除 } find查找{ # linux文件无创建时间 # Access 使用时间 # Modify 内容修改时间 # Change 状态改变时间(权限、属主) # 时间默认以24小时为单位,当前时间到向前24小时为0天,向前48-72小时为2天 # -and 且 匹配两个条件 参数可以确定时间范围 -mtime +2 -and -mtime -4 # -or 或 匹配任意一个条件 find /etc -name http # 按文件名查找 find . -type f # 查找某一类型文件 find / -perm # 按照文件权限查找 find / -user # 按照文件属主查找 find / -group # 按照文件所属的组来查找文件 find / -atime -n # 文件使用时间在N天以内 find / -atime +n # 文件使用时间在N天以前 find / -mtime -n # 文件内容改变时间在N天以内 find / -mtime +n # 文件内容改变时间在N天以前 find / -ctime +n # 文件状态改变时间在N天前 find / -ctime -n # 文件状态改变时间在N天内 find / -size +1000000c -print # 查找文件长度大于1M字节的文件 find /etc -name "passwd*" -exec grep "xuesong" {} \; # 按名字查找文件传递给-exec后命令 find . -name 't*' -exec basename {} \; # 查找文件名,不取路径 find . -type f -name "err*" -exec rename err ERR {} \; # 批量改名(查找err 替换为 ERR {}文件 find 路径 -name *name1* -or -name *name2* # 查找任意一个关键字 } vim编辑器{ gconf-editor # 配置编辑器 /etc/vimrc # 配置文件路径 vim +24 file # 打开文件定位到指定行 vim file1 file2 # 打开多个文件 vim -O2 file1 file2 # 垂直分屏 vim -on file1 file2 # 水平分屏 sp filename # 上下分割打开新文件 vsp filename # 左右分割打开新文件 Ctrl+W [操作] # 多个文件间操作 大写W # 操作: 关闭当前窗口c 屏幕高度一样= 增加高度+ 移动光标所在屏 右l 左h 上k 下j 中h 下一个w :n # 编辑下一个文件 :2n # 编辑下二个文件 :N # 编辑前一个文件 :rew # 回到首文件 :set nu # 打开行号 :set nonu # 取消行号 200G # 跳转到200 :nohl # 取消高亮 :set autoindent # 设置自动缩进 :set ff # 查看文本格式 :set binary # 改为unix格式 ctrl+ U # 向前翻页 ctrl+ D # 向后翻页 %s/字符1/字符2/g # 全部替换 X # 文档加密 } 归档解压缩{ tar zxvpf gz.tar.gz -C 放到指定目录 包中的目录 # 解包tar.gz 不指定目录则全解压 tar zcvpf /$path/gz.tar.gz * # 打包gz 注意*最好用相对路径 tar zcf /$path/gz.tar.gz * # 打包正确不提示 tar ztvpf gz.tar.gz # 查看gz tar xvf 1.tar -C 目录 # 解包tar tar -cvf 1.tar * # 打包tar tar tvf 1.tar # 查看tar tar -rvf 1.tar 文件名 # 给tar追加文件 tar --exclude=/home/dmtsai -zcvf myfile.tar.gz /home/* /etc # 打包/home, /etc ,但排除 /home/dmtsai tar -N "2005/06/01" -zcvf home.tar.gz /home # 在 /home 当中,比 2005/06/01 新的文件才备份 tar -zcvfh home.tar.gz /home # 打包目录中包括连接目录 zgrep 字符 1.gz # 查看压缩包中文件字符行 bzip2 -dv 1.tar.bz2 # 解压bzip2 bzip2 -v 1.tar # bzip2压缩 bzcat # 查看bzip2 gzip A # 直接压缩文件 # 压缩后源文件消失 gunzip A.gz # 直接解压文件 # 解压后源文件消失 gzip -dv 1.tar.gz # 解压gzip到tar gzip -v 1.tar # 压缩tar到gz unzip zip.zip # 解压zip zip zip.zip * # 压缩zip # rar3.6下载: http://www.rarsoft.com/rar/rarlinux-3.6.0.tar.gz rar a rar.rar *.jpg # 压缩文件为rar包 unrar x rar.rar # 解压rar包 7z a 7z.7z * # 7z压缩 7z e 7z.7z # 7z解压 } 文件ACL权限控制{ getfacl 1.test # 查看文件ACL权限 setfacl -R -m u:xuesong:rw- 1.test # 对文件增加用户的读写权限 -R 递归 } svn更新代码{ --force # 强制覆盖 /usr/bin/svn --username user --password passwd co $Code ${SvnPath}src/ # 检出整个项目 /usr/bin/svn --username user --password passwd export $Code$File ${SvnPath}src/$File # 导出个别文件 /usr/bin/svn --username user --password passwd export -r 版本号 svn路径 本地路径 --force # 导出指定版本 } 恢复rm删除的文件{ # debugfs针对 ext2 # ext3grep针对 ext3 # extundelete针对 ext4 df -T # 首先查看磁盘分区格式 umount /data/ # 卸载挂载,数据丢失请首先卸载挂载,或重新挂载只读 ext3grep /dev/sdb1 --ls --inode 2 # 记录信息继续查找目录下文件inode信息 ext3grep /dev/sdb1 --ls --inode 131081 # 此处是inode ext3grep /dev/sdb1 --restore-inode 49153 # 记录下inode信息开始恢复目录 } openssl{ openssl rand 15 -base64 # 口令生成 openssl sha1 filename # 哈希算法校验文件 openssl md5 filename # MD5校验文件 openssl base64 filename.txt # base64编码/解码文件(发送邮件附件之类功能会可以使用) openssl base64 -d filename.bin # base64编码/解码二进制文件 openssl enc -aes-128-cbc filename.aes-128-cbc # 加密文档 # 推荐使用的加密算法是bf(Blowfish)和-aes-128-cbc(运行在CBC模式的128位密匙AES加密算法),加密强度有保障 openssl enc -d -aes-128-cbc -in filename.aes-128-cbc > filename # 解密文档 } } 2软件{ rpm{ rpm -ivh lynx # rpm安装 rpm -e lynx # 卸载包 rpm -e lynx --nodeps # 强制卸载 rpm -qa # 查看所有安装的rpm包 rpm -qa | grep lynx # 查找包是否安装 rpm -ql # 软件包路径 rpm -Uvh # 升级包 rpm --test lynx # 测试 rpm -qc # 软件包配置文档 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 # 导入rpm的签名信息 } yum{ yum list # 查找所有列表 yum install 包名 # 安装包和依赖包 yum -y update # 升级所有包版本,依赖关系,系统版本内核都升级 yum -y update 软件包名 # 升级指定的软件包 yum -y upgrade # 不改变软件设置更新软件,系统版本升级,内核不改变 yum search mail # yum搜索相关包 yum grouplist # 软件包组 yum -y groupinstall "Virtualization" # 安装软件包组 } yum扩展源{ # 包下载地址:http://download.fedoraproject.org/pub/epel # 选择版本 wget http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm rpm -Uvh epel-release-5-4.noarch.rpm } 自定义yum源{ find /etc/yum.repos.d -name "*.repo" -exec mv {} {}.bak \; vim /etc/yum.repos.d/yum.repo [yum] #http baseurl=http://10.0.0.1/centos5.5 #挂载iso #mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/ #本地 #baseurl=file:///data/iso/ enable=1 #导入key rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 } 编译{ 源码安装{ ./configure --help # 查看所有编译参数 ./configure --prefix=/usr/local/ # 配置参数 make # 编译 make install # 安装包 make clean # 清除编译结果 } perl程序编译{ perl Makefile.PL make make test make install } python程序编译{ python file.py # 源码包编译安装 python setup.py build python setup.py install } 编译c程序{ gcc -g hello.c -o hello } } } 3系统{ wall # 给其它用户发消息 whereis ls # 查找命令的目录 which # 查看当前要执行的命令所在的路径 clear # 清空整个屏幕 reset # 重新初始化屏幕 cal # 显示月历 echo -n 123456 | md5sum # md5加密 mkpasswd # 随机生成密码 -l位数 -C大小 -c小写 -d数字 -s特殊字符 netstat -anlp | grep port # 是否打开了某个端口 ntpdate stdtime.gov.hk # 同步时间 tzselect # 选择时区 #+8=(5 9 1 1) # (TZ='Asia/Shanghai'; export TZ)括号内写入 /etc/profile /sbin/hwclock -w # 保存到硬件 /etc/shadow # 账户影子文件 LANG=en # 修改语言 vim /etc/sysconfig/i18n # 修改编码 LANG="en_US.UTF-8" export LC_ALL=C # 强制字符集 vi /etc/hosts # 查询静态主机名 alias # 别名 watch uptime # 监测命令动态刷新 ipcs -a # 查看Linux系统当前单个共享内存段的最大值 lsof |grep /lib # 查看加载库文件 ldconfig # 动态链接库管理命令 dist-upgrade # 会改变配置文件,改变旧的依赖关系,改变系统版本 /boot/grub/grub.conf # grub启动项配置 ps -mp # 查看某进程的线程数 受 max user processes 限制 sysctl -a # 查看当前所有系统内核参数 sysctl -p # 修改内核参数/etc/sysctl.conf,让/etc/rc.d/rc.sysinit读取生效 grep Hugepagesize /proc/meminfo # 内存分页大小 mkpasswd -l 8 -C 2 -c 2 -d 4 -s 0 # 随机生成指定类型密码 echo 1 > /proc/sys/net/ipv4/tcp_syncookies # 使TCP SYN Cookie 保护生效 # "SYN Attack"是一种拒绝服务的攻击方式 grep Swap /proc/25151/smaps |awk '{a+=$2}END{print a}' # 查询某pid使用的swap大小 开机启动脚本顺序{ /etc/profile /etc/profile.d/*.sh ~/bash_profile ~/.bashrc /etc/bashrc } 进程管理{ ps -eaf # 查看所有进程 kill -9 PID # 强制终止某个PID进程 kill -15 PID # 安全退出 需程序内部处理信号 cmd & # 命令后台运行 nohup cmd & # 后台运行不受shell退出影响 ctrl+z # 将前台放入后台(暂停) jobs # 查看后台运行程序 bg 2 # 启动后台暂停进程 fg 2 # 调回后台进程 pstree # 进程树 vmstat 1 9 # 每隔一秒报告系统性能信息9次 sar # 查看cpu等状态 lsof file # 显示打开指定文件的所有进程 lsof -i:32768 # 查看端口的进程 renice +1 180 # 把180号进程的优先级加1 ps{ ps aux |grep -v USER | sort -nk +4 | tail # 显示消耗内存最多的10个运行中的进程,以内存使用量排序.cpu +3 # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND %CPU # 进程的cpu占用率 %MEM # 进程的内存占用率 VSZ # 进程虚拟大小,单位K(即总占用内存大小,包括真实内存和虚拟内存) RSS # 进程使用的驻留集大小即实际物理内存大小 START # 进程启动时间和日期 占用的虚拟内存大小 = VSZ - RSS } top{ 前五行是系统整体的统计信息。 第一行: 任务队列信息,同 uptime 命令的执行结果。内容如下: 01:06:48 当前时间 up 1:22 系统运行时间,格式为时:分 1 user 当前登录用户数 load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 第二、三行:为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下: Tasks: 29 total 进程总数 1 running 正在运行的进程数 28 sleeping 睡眠的进程数 0 stopped 停止的进程数 0 zombie 僵尸进程数 Cpu(s): 0.3% us 用户空间占用CPU百分比 1.0% sy 内核空间占用CPU百分比 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 98.7% id 空闲CPU百分比 0.0% wa 等待输入输出的CPU时间百分比 0.0% hi 0.0% si 第四、五行:为内存信息。内容如下: Mem: 191272k total 物理内存总量 173656k used 使用的物理内存总量 17616k free 空闲内存总量 22052k buffers 用作内核缓存的内存量 Swap: 192772k total 交换区总量 0k used 使用的交换区总量 192772k free 空闲交换区总量 123988k cached 缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。 相应的内存再次被换出时可不必再对交换区写入。 进程信息区,各列的含义如下: # 显示各个进程的详细信息 序号 列名 含义 a PID 进程id b PPID 父进程id c RUSER Real user name d UID 进程所有者的用户id e USER 进程所有者的用户名 f GROUP 进程所有者的组名 g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ? h PR 优先级 i NI nice值。负值表示高优先级,正值表示低优先级 j P 最后使用的CPU,仅在多CPU环境下有意义 k %CPU 上次更新到现在的CPU时间占用百分比 l TIME 进程使用的CPU时间总计,单位秒 m TIME+ 进程使用的CPU时间总计,单位1/100秒 n %MEM 进程使用的物理内存百分比 o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。 q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA r CODE 可执行代码占用的物理内存大小,单位kb s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb t SHR 共享内存大小,单位kb u nFLT 页面错误次数 v nDRT 最后一次写入到现在,被修改过的页面数。 w S 进程状态。 D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 x COMMAND 命令名/命令行 y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名 z Flags 任务标志,参考 sched.h } 列出正在占用swap的进程{ #!/bin/bash echo -e "PID\t\tSwap\t\tProc_Name" # 拿出/proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息) for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]` do # 让进程释放swap的方法只有一个:就是重启该进程。或者等其自动释放。放 # 如果进程会自动释放,那么我们就不会写脚本来找他了,找他都是因为他没有自动释放。 # 所以我们要列出占用swap并需要重启的进程,但是init这个进程是系统里所有进程的祖先进程 # 重启init进程意味着重启系统,这是万万不可以的,所以就不必检测他了,以免对系统造成影响。 if [ $pid -eq 1 ];then continue;fi grep -q "Swap" /proc/$pid/smaps 2>/dev/null if [ $? -eq 0 ];then swap=$(grep Swap /proc/$pid/smaps \ | gawk '{ sum+=$2;} END{ print sum }') proc_name=$(ps aux | grep -w "$pid" | grep -v grep \ | awk '{ for(i=11;i>/var/spool/cron/root # 直接将命令写入周期任务 crontab -l # 查看自动周期性任务 crontab -r # 删除自动周期性任务 cron.deny和cron.allow # 禁止或允许用户使用周期任务 service crond start|stop|restart # 启动自动周期性服务 } date{ date -s 20091112 # 设日期 date -s 18:30:50 # 设时间 date -d "7 days ago" +%Y%m%d # 7天前日期 date -d "5 minute ago" +%H:%M # 5分钟前时间 date -d "1 month ago" +%Y%m%d # 一个月前 date +%Y-%m-%d -d '20110902' # 日期格式转换 date +%Y-%m-%d_%X # 日期和时间 date +%N # 纳秒 date -d "2012-08-13 14:00:23" +%s # 换算成秒计算(1970年至今的秒数) date -d "@1363867952" +%Y-%m-%d-%T # 将时间戳换算成日期 date -d "1970-01-01 UTC 1363867952 seconds" +%Y-%m-%d-%T # 将时间戳换算成日期 date -d "`awk -F. '{print $1}' /proc/uptime` second ago" +"%Y-%m-%d %H:%M:%S" # 格式化系统启动时间(多少秒前) 硬件时钟与系统时钟同步:# hwclock --hctosys(hc代表硬件时间,sys代表系统时间) 系统时钟和硬件时钟同步:(让系统的时间同步到硬件时钟) # hwclock –systohc } 最大连接数{ ulimit -SHn 65535 # 最大文件句柄数,最大打开文件数(等同最大连接数) ulimit -a # 查看 /etc/security/limits.conf # 进程最大打开文件数 # nofile 可以被理解为是文件句柄数 文件描述符 还有socket数 * soft nofile 65535 * hard nofile 65535 # 最大进程数 # ps -mp 查看某进程的线程数 * soft nproc 65535 * hard nproc 65535 # 如果/etc/security/limits.d/有配置文件,将会覆盖/etc/security/limits.conf里的配置 # 即/etc/security/limits.d/的配置文件里就不要有同样的参量设置 /etc/security/limits.d/90-nproc.conf # centos6.3的最大进程数文件 * soft nproc 65535 * hard nproc 65535 } sudo{ echo myPassword | sudo -S ls /tmp # 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备 visudo # sudo命令权限添加 用户 别名(可用all)=NOPASSWD:命令1,命令2 wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart UserName ALL=(ALL) ALL peterli ALL=(ALL) NOPASSWD:/sbin/service Defaults requiretty # sudo不允许后台运行,注释此行既允许 Defaults !visiblepw # sudo不允许远程,去掉!既允许 } grub开机启动项添加{ vim /etc/grub.conf title ms-dos rootnoverify (hd0,0) chainloader +1 } stty{ #stty时一个用来改变并打印终端行设置的常用命令 stty iuclc # 在命令行下禁止输出大写 stty -iuclc # 恢复输出大写 stty olcuc # 在命令行下禁止输出小写 stty -olcuc # 恢复输出小写 stty size # 打印出终端的行数和列数 stty eof "string" # 改变系统默认ctrl+D来表示文件的结束 stty -echo # 禁止回显 stty echo # 打开回显 stty -echo;read;stty echo;read # 测试禁止回显 stty igncr # 忽略回车符 stty -igncr # 恢复回车符 stty erase '#' # 将#设置为退格字符 stty erase '^?' # 恢复退格字符 定时输入{ timeout_read(){ timeout=$1 old_stty_settings=`stty -g` # save current settings stty -icanon min 0 time 100 # set 10seconds,not 100seconds eval read varname # =read $varname stty "$old_stty_settings" # recover settings } read -t 10 varname # 更简单的方法就是利用read命令的-t选项 } 检测用户按键{ #!/bin/bash old_tty_settings=$(stty -g) # 保存老的设置(为什么?). stty -icanon Keypress=$(head -c1) # 或者使用$(dd bs=1 count=1 2> /dev/null) echo "Key pressed was \""$Keypress"\"." stty "$old_tty_settings" # 恢复老的设置. exit 0 } } iptables{ 内建三个表:nat mangle 和 filter filter预设规则表,有INPUT、FORWARD 和 OUTPUT 三个规则链 vi /etc/sysconfig/iptables # 配置文件 INPUT # 进入 FORWARD # 转发 OUTPUT # 出去 ACCEPT # 将封包放行 REJECT # 拦阻该封包 DROP # 丢弃封包不予处理 -A # 在所选择的链(INPUT等)末添加一条或更多规则 -D # 删除一条 -E # 修改 -p # tcp、udp、icmp 0相当于所有all !取反 -P # 设置缺省策略(与所有链都不匹配强制使用此策略) -s # IP/掩码 (IP/24) 主机名、网络名和清楚的IP地址 !取反 -j # 目标跳转,立即决定包的命运的专用内建目标 -i # 进入的(网络)接口 [名称] eth0 -o # 输出接口[名称] -m # 模块 --sport # 源端口 --dport # 目标端口 iptables -F # 将防火墙中的规则条目清除掉 # 注意: iptables -P INPUT ACCEPT iptables-restore < 规则文件 # 导入防火墙规则 /etc/init.d/iptables save # 保存防火墙设置 /etc/init.d/iptables restart # 重启防火墙服务 iptables -L -n # 查看规则 iptables -t nat -nL # 查看转发 iptables实例{ iptables -L INPUT # 列出某规则链中的所有规则 iptables -X allowed # 删除某个规则链 ,不加规则链,清除所有非内建的 iptables -Z INPUT # 将封包计数器归零 iptables -N allowed # 定义新的规则链 iptables -P INPUT DROP # 定义过滤政策 iptables -A INPUT -s 192.168.1.1 # 比对封包的来源IP # ! 192.168.0.0/24 ! 反向对比 iptables -A INPUT -d 192.168.1.1 # 比对封包的目的地IP iptables -A INPUT -i eth0 # 比对封包是从哪片网卡进入 iptables -A FORWARD -o eth0 # 比对封包要从哪片网卡送出 eth+表示所有的网卡 iptables -A INPUT -p tcp # -p ! tcp 排除tcp以外的udp、icmp。-p all所有类型 iptables -D INPUT 8 # 从某个规则链中删除一条规则 iptables -D INPUT --dport 80 -j DROP # 从某个规则链中删除一条规则 iptables -R INPUT 8 -s 192.168.0.1 -j DROP # 取代现行规则 iptables -I INPUT 8 --dport 80 -j ACCEPT # 插入一条规则 iptables -A INPUT -i eth0 -j DROP # 其它情况不允许 iptables -A INPUT -p tcp -s IP -j DROP # 禁止指定IP访问 iptables -A INPUT -p tcp -s IP --dport port -j DROP # 禁止指定IP访问端口 iptables -A INPUT -s IP -p tcp --dport port -j ACCEPT # 允许在IP访问指定端口 iptables -A INPUT -p tcp --dport 22 -j DROP # 禁止使用某端口 iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP # 禁止icmp端口 iptables -A INPUT -i eth0 -p icmp -j DROP # 禁止icmp端口 iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP # 阻止所有没有经过你系统授权的TCP连接 iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT # IP包流量限制 iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT # 除192.168.62.1外,禁止其它人ping我的主机 iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent --update --seconds 5 --hitcount 20 --rttl --name WEB --rsource -j DROP # 可防御cc攻击(未测试) } iptables配置实例文件{ # Generated by iptables-save v1.2.11 on Fri Feb 9 12:10:37 2007 *filter :INPUT ACCEPT [637:58967] :FORWARD DROP [0:0] :OUTPUT ACCEPT [5091:1301533] # 允许的IP或IP段访问 建议多个 -A INPUT -s 127.0.0.1 -p tcp -j ACCEPT -A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT # 开放对外开放端口 -A INPUT -p tcp --dport 80 -j ACCEPT # 指定某端口针对IP开放 -A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT # 拒绝所有协议(INPUT允许) -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP # 允许已建立的或相关连的通行 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 拒绝ping -A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Fri Feb 9 12:10:37 2007 } iptables配置实例{ # 允许某段IP访问任何端口 iptables -A INPUT -s 192.168.0.3/24 -p tcp -j ACCEPT # 设定预设规则 (拒绝所有的数据包,再允许需要的,如只做WEB服务器.还是推荐三个链都是DROP) iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 注意: 直接设置这三条会掉线 # 开启22端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 如果OUTPUT 设置成DROP的,要写上下面一条 iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT # 注:不写导致无法SSH.其他的端口一样,OUTPUT设置成DROP的话,也要添加一条链 # 如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链 iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT # 做WEB服务器,开启80端口 ,其他同理 iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 做邮件服务器,开启25,110端口 iptables -A INPUT -p tcp --dport 110 -j ACCEPT iptables -A INPUT -p tcp --dport 25 -j ACCEPT # 允许icmp包通过,允许ping iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话) iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话) # 允许loopback!(不然会导致DNS无法正常关闭等问题) IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP) IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP) } 添加网段转发{ # 例如通过vpn上网 echo 1 > /proc/sys/net/ipv4/ip_forward # 在内核里打开ip转发功能 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE # 添加网段转发 iptables -t nat -A POSTROUTING -s 10.0.0.0/255.0.0.0 -o eth0 -j SNAT --to 192.168.10.158 # 原IP网段经过哪个网卡IP出去 iptables -t nat -nL # 查看转发 } 端口映射{ # 内网通过有外网IP的机器映射端口 # 内网主机添加路由 route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.20.111 # 内网需要添加默认网关,并且网关开启转发 # 网关主机 echo 1 > /proc/sys/net/ipv4/ip_forward # 在内核里打开ip转发功能 iptables -t nat -A PREROUTING -d 外网IP -p tcp --dport 9999 -j DNAT --to 10.10.20.55:22 # 进入 iptables -t nat -A POSTROUTING -s 10.10.20.0/24 -j SNAT --to 外网IP # 转发回去 iptables -t nat -nL # 查看转发 } } } 4服务{ /etc/init.d/sendmail start # 启动服务 /etc/init.d/sendmail stop # 关闭服务 /etc/init.d/sendmail status # 查看服务当前状态 /date/mysql/bin/mysqld_safe --user=mysql & # 启动mysql后台运行 vi /etc/rc.d/rc.local # 开机启动执行 可用于开机启动脚本 /etc/rc.d/rc3.d/S55sshd # 开机启动和关机关闭服务连接 # S开机start K关机stop 55级别 后跟服务名 ln -s -f /date/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd # 将启动程序脚本连接到开机启动目录 ipvsadm -ln # lvs查看后端负载机并发 ipvsadm -C # lvs清除规则 xm list # 查看xen虚拟主机列表 virsh # 虚拟化(xen\kvm)管理工具 yum groupinstall Virtual* ./bin/httpd -M # 查看httpd加载模块 httpd -t -D DUMP_MODULES # rpm包httpd查看加载模块 echo 内容| /bin/mail -s "标题" 收件箱 -f 发件人 # 发送邮件 "`echo "内容"|iconv -f utf8 -t gbk`" | /bin/mail -s "`echo "标题"|iconv -f utf8 -t gbk`" 收件箱 # 解决邮件乱码 /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # 检测nagios配置文件 chkconfig{ chkconfig 服务名 on|off|set # 设置非独立服务启状态 chkconfig --level 35 httpd off # 让服务不自动启动 chkconfig --level 35 httpd on # 让服务自动启动 35指的是运行级别 chkconfig --list # 查看所有服务的启动状态 chkconfig --list |grep httpd # 查看某个服务的启动状态 chkconfig –-list [服务名称] # 查看服务的状态 } httpd{ 编译参数{ # so模块用来提供DSO支持的apache核心模块 # 如果编译中包含任何DSO模块,则mod_so会被自动包含进核心。 # 如果希望核心能够装载DSO,但不实际编译任何DSO模块,则需明确指定"--enable-so=static" ./configure --prefix=/usr/local/apache --enable-so --enable-mods-shared=most --enable-rewrite --enable-forward # 实例编译 --with-mpm=worker # 已worker方式运行 --with-apxs=/usr/local/apache/bin/apxs # 制作apache的动态模块DSO rpm包 httpd-devel #编译模块 apxs -i -a -c mod_foo.c --enable-so # 让Apache可以支持DSO模式 --enable-mods-shared=most # 告诉编译器将所有标准模块都动态编译为DSO模块 --enable-rewrite # 支持地址重写功能 --enable-module=most # 用most可以将一些不常用的,不在缺省常用模块中的模块编译进来 --enable-mods-shared=all # 意思是动态加载所有模块,如果去掉-shared话,是静态加载所有模块 --enable-expires # 可以添加文件过期的限制,有效减轻服务器压力,缓存在用户端,有效期内不会再次访问服务器,除非按f5刷新,但也导致文件更新不及时 --enable-deflate # 压缩功能,网页可以达到40%的压缩,节省带宽成本,但会对cpu压力有一点提高 --enable-headers # 文件头信息改写,压缩功能需要 --disable-MODULE # 禁用MODULE模块(仅用于基本模块) --enable-MODULE=shared # 将MODULE编译为DSO(可用于所有模块) --enable-mods-shared=MODULE-LIST # 将MODULE-LIST中的所有模块都编译成DSO(可用于所有模块) --enable-modules=MODULE-LIST # 将MODULE-LIST静态连接进核心(可用于所有模块) # 上述 MODULE-LIST 可以是: 1、用引号界定并且用空格分隔的模块名列表 --enable-mods-shared='headers rewrite dav' 2、"most"(大多数模块) --enable-mods-shared=most 3、"all"(所有模块) } 转发{ #针对非80端口的请求处理 RewriteCond %{SERVER_PORT} !^80$ RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R] RewriteCond %{HTTP_HOST} ^ss.aa.com [NC] RewriteRule ^(.*) http://www.aa.com/so/$1/0/p0? [L,R=301] #RewriteRule 只对?前处理,所以会把?后的都保留下来 #在转发后地址后加?即可取消RewriteRule保留的字符 #R的含义是redirect,即重定向,该请求不会再被apache交给后端处理,而是直接返回给浏览器进行重定向跳转。301是返回的http状态码,具体可以参考http rfc文档,跳转都是3XX。 #L是last,即最后一个rewrite规则,如果请求被此规则命中,将不会继续再向下匹配其他规则。 } } mysql源码安装{ groupadd mysql useradd mysql -g mysql -M -s /bin/false tar zxvf mysql-5.0.22.tar.gz cd mysql-5.0.22 ./configure --prefix=/usr/local/mysql \ --with-client-ldflags=-all-static \ --with-mysqld-ldflags=-all-static \ --with-mysqld-user=mysql \ --with-extra-charsets=all \ --with-unix-socket-path=/var/tmp/mysql.sock make && make install # 生成mysql用户数据库和表文件,在安装包中输入 scripts/mysql_install_db --user=mysql vi ~/.bashrc export PATH="$PATH: /usr/local/mysql/bin" # 配置文件,有large,medium,small三个,根据机器性能选择 cp support-files/my-medium.cnf /etc/my.cnf cp support-files/mysql.server /etc/init.d/mysqld chmod 700 /etc/init.d/mysqld cd /usr/local chmod 750 mysql -R chgrp mysql mysql -R chown mysql mysql/var -R cp /usr/local/mysql/libexec/mysqld mysqld.old ln -s /usr/local/mysql/bin/mysql /sbin/mysql ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin ln -s -f /usr/local/mysql/bin/mysqld_safe /etc/rc.d/rc3.d/S15mysql5 ln -s -f /usr/local/mysql/bin/mysqld_safe /etc/rc.d/rc0.d/K15mysql5 } mysql常用命令{ ./mysql/bin/mysqld_safe --user=mysql & # 启动mysql服务 ./mysql/bin/mysqladmin -uroot -p -S ./mysql/data/mysql.sock shutdown # 停止mysql服务 mysqlcheck -uroot -p -S mysql.sock --optimize --databases account # 检查、修复、优化MyISAM表 mysqlbinlog slave-relay-bin.000001 # 查看二进制日志(报错加绝对路径) mysqladmin -h myhost -u root -p create dbname # 创建数据库 flush privileges; # 刷新 show databases; # 显示所有数据库 use dbname; # 打开数据库 show tables; # 显示选中数据库中所有的表 desc tables; # 查看表结构 drop database name; # 删除数据库 drop table name; # 删除表 create database name; # 创建数据库 select 列名称 from 表名称; # 查询 show grants for repl; # 查看用户权限 show processlist; # 查看mysql进程 select user(); # 查看所有用户 show slave status\G; # 查看主从状态 show variables; # 查看所有参数变量 show table status # 查看表的引擎状态 drop table if exists user # 表存在就删除 create table if not exists user # 表不存在就创建 select host,user,password from user; # 查询用户权限 先use mysql create table ka(ka_id varchar(6),qianshu int); # 创建表 SHOW VARIABLES LIKE 'character_set_%'; # 查看系统的字符集和排序方式的设定 show variables like '%timeout%'; # 查看超时(wait_timeout) delete from user where user=''; # 删除空用户 delete from user where user='sss' and host='localhost' ; # 删除用户 ALTER TABLE mytable ENGINE = MyISAM ; # 改变现有的表使用的存储引擎 SHOW TABLE STATUS from 库名 where Name='表名'; # 查询表引擎 CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB # 创建表指定存储引擎的类型(MyISAM或INNODB) grant replication slave on *.* to '用户'@'%' identified by '密码'; # 创建主从复制用户 ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction); # 添加索引 alter table name add column accountid(列名) int(11) NOT NULL(字段不为空); # 插入字段 update host set monitor_state='Y',hostname='xuesong' where ip='192.168.1.1'; # 更新数据 自增表{ create table oldBoy (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(30) NOT NULL, age integer , sex CHAR(15) ); # 创建自增表 insert into oldBoy(name,age,sex) values(%s,%s,%s) # 自增插入数据 } 登录mysql的命令{ # 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 mysql -h110.110.110.110 -P3306 -uroot -p mysql -uroot -p -S /data1/mysql5/data/mysql.sock -A --default-character-set=GBK } shell执行mysql命令{ mysql -u root -p'123' xuesong < file.sql # 针对指定库执行sql文件中的语句,好处不需要转义特殊符号,一条语句可以换行.不指定库执行时语句中需要先use mysql -u$username -p$passwd -h$dbhost -P$dbport -A -e " use $dbname; delete from data where date=('$date1'); " # 执行多条mysql命令 mysql -uroot -p -S mysql.sock -e "use db;alter table gift add column accountid int(11) NOT NULL;flush privileges;" # 不登陆mysql插入字段 } 备份数据库{ mysqldump -h host -u root -p --default-character-set=utf8 dbname >dbname_backup.sql # 不包括库名,还原需先创建库,在use mysqldump -h host -u root -p --database --default-character-set=utf8 dbname >dbname_backup.sql # 包括库名,还原不需要创建库 /bin/mysqlhotcopy -u root -p # mysqlhotcopy只能备份MyISAM引擎 mysqldump -u root -p -S mysql.sock --default-character-set=utf8 dbname table1 table2 > /data/db.sql # 备份表 mysqldump -uroot -p123 -d database > database.sql # 备份数据库结构 innobackupex --user=root --password="" --defaults-file=/data/mysql5/data/my_3306.cnf --socket=/data/mysql5/data/mysql.sock --slave-info --stream=tar --tmpdir=/data/dbbackup/temp /data/dbbackup/ 2>/data/dbbackup/dbbackup.log | gzip 1>/data/dbbackup/db50.tar.gz # xtrabackup备份需单独安装软件 优点: 速度快,压力小,可直接恢复主从复制 } 还原数据库{ mysql -h host -u root -p dbname < dbname_backup.sql source 路径.sql # 登陆mysql后还原sql文件 } 赋权限{ # 指定IP: $IP 本机: localhost 所有IP地址: % # 通常指定多条 grant all on zabbix.* to user@"$IP"; # 对现有账号赋予权限 grant select on database.* to user@"%" Identified by "passwd"; # 赋予查询权限(没有用户,直接创建) grant all privileges on database.* to user@"$IP" identified by 'passwd'; # 赋予指定IP指定用户所有权限(不允许对当前库给其他用户赋权限) grant all privileges on database.* to user@"localhost" identified by 'passwd' with grant option; # 赋予本机指定用户所有权限(允许对当前库给其他用户赋权限) grant select, insert, update, delete on database.* to user@'ip'identified by "passwd"; # 开放管理操作指令 revoke all on *.* from user@localhost; # 回收权限 } 更改密码{ update user set password=password('passwd') where user='root' mysqladmin -u root password 'xuesong' } mysql忘记密码后重置{ cd /data/mysql5 /data/mysql5/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking & update user set password=password('123123') where user='root'; } mysql主从复制失败恢复{ slave stop; reset slave; change master to master_host='10.10.10.110',master_port=3306,master_user='repl',master_password='repl',master_log_file='master-bin.000010',master_log_pos=107,master_connect_retry=60; slave start; } sql语句使用变量{ use xuesong; set @a=concat('my',weekday(curdate())); # 组合时间变量 set @sql := concat('CREATE TABLE IF NOT EXISTS ',@a,'( id INT(11) NOT NULL )'); # 组合sql语句 select @sql; # 查看语句 prepare create_tb from @sql; # 准备 execute create_tb; # 执行 } 检测mysql主从复制延迟{ 1、在从库定时执行更新主库中的一个timeout数值 2、同时取出从库中的timeout值对比判断从库与主库的延迟 } mysql慢查询{ 开启慢查询日志{ log-slow-queries=/var/lib/mysql/slowquery.log # 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log long_query_time=2 # 记录超过的时间,默认为10s log-queries-not-using-indexes # log下来没有使用索引的query,可以根据情况决定是否开启 可不加 log-long-format # 如果设置了,所有没有使用索引的查询也将被记录 可不加 } mysqldumpslow慢查询日志查看{ -s # 是order的顺序,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序 -t # 是top n的意思,即为返回前面多少条的数据 -g # 后边可以写一个正则匹配模式,大小写不敏感的 mysqldumpslow -s c -t 20 host-slow.log # 访问次数最多的20个sql语句 mysqldumpslow -s r -t 20 host-slow.log # 返回记录集最多的20个sql mysqldumpslow -t 10 -s t -g "left join" host-slow.log # 按照时间返回前10条里面含有左连接的sql语句 show global status like '%slow%'; # 查看现在这个session有多少个慢查询 show variables like '%slow%'; # 查看慢查询日志是否开启,如果slow_query_log和log_slow_queries显示为on,说明服务器的慢查询日志已经开启 show variables like '%long%'; # 查看超时阀值 desc select * from wei where text='xishizhaohua'\G; # 扫描整张表 tepe:ALL 没有使用索引 key:NULL create index text_index on wei(text); # 创建索引 } } } mongodb{ 一、启动{ # 不启动认证 ./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/ # 启动认证 ./mongod --port 27017 --fork --logpath=/opt/mongodb/mongodb.log --logappend --dbpath=/opt/mongodb/data/ --auth # 配置文件方式启动 cat /opt/mongodb/mongodb.conf port=27017 # 端口号 fork=true # 以守护进程的方式运行,创建服务器进程 auth=true # 开启用户认证 logappend=true # 日志采用追加方式 logpath=/opt/mongodb/mongodb.log # 日志输出文件路径 dbpath=/opt/mongodb/data/ # 数据库路径 shardsvr=true # 设置是否分片 maxConns=600 # 数据库的最大连接数 ./mongod -f /opt/mongodb/mongodb.conf # 其他参数 bind_ip # 绑定IP 使用mongo登录需要指定对应IP journal # 开启日志功能,降低单机故障的恢复时间,取代dur参数 syncdelay # 系统同步刷新磁盘的时间,默认60秒 directoryperdb # 每个db单独存放目录,建议设置.与mysql独立表空间类似 repairpath # 执行repair时的临时目录.如果没开启journal,出现异常重启,必须执行repair操作 # mongodb没有参数设置内存大小.使用os mmap机制缓存数据文件,在数据量不超过内存的情况下,效率非常高.数据量超过系统可用内存会影响写入性能 } 二、关闭{ # 方法一:登录mongodb ./mongo use admin db.shutdownServer() # 方法:kill传递信号 两种皆可 kill -2 pid kill -15 pid } 三、开启认证与用户管理{ ./mongo # 先登录 use admin # 切换到admin库 db.addUser("root","123456") # 创建用户 db.addUser('zhansan','pass',true) # 如果用户的readOnly为true那么这个用户只能读取数据,添加一个readOnly用户zhansan ./mongo 127.0.0.1:27017/mydb -uroot -p123456 # 再次登录,只能针对用户所在库登录 #虽然是超级管理员,但是admin不能直接登录其他数据库,否则报错 #Fri Nov 22 15:03:21.886 Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:228 show collections # 查看链接状态 再次登录使用如下命令,显示错误未经授权 db.system.users.find(); # 查看创建用户信息 db.system.users.remove({user:"zhansan"}) # 删除用户 #恢复密码只需要重启mongodb 不加--auth参数 } 四、登录{ 192.168.1.5:28017 # http登录后可查看状态 ./mongo # 默认登录后打开 test 库 ./mongo 192.168.1.5:27017/databaseName # 直接连接某个库 不存在则创建 启动认证需要指定对应库才可登录 } 五、查看状态{ #登录后执行命令查看状态 db.runCommand({"serverStatus":1}) globalLock # 表示全局写入锁占用了服务器多少时间(微秒) mem # 包含服务器内存映射了多少数据,服务器进程的虚拟内存和常驻内存的占用情况(MB) indexCounters # 表示B树在磁盘检索(misses)和内存检索(hits)的次数.如果这两个比值开始上升,就要考虑添加内存了 backgroudFlushing # 表示后台做了多少次fsync以及用了多少时间 opcounters # 包含每种主要擦撞的次数 asserts # 统计了断言的次数 #状态信息从服务器启动开始计算,如果过大就会复位,发送复位,所有计数都会复位,asserts中的roolovers值增加 #mongodb自带的命令 ./mongostat insert #每秒插入量 query #每秒查询量 update #每秒更新量 delete #每秒删除量 locked #锁定量 qr|qw #客户端查询排队长度(读|写) ar|aw #活跃客户端量(读|写) conn #连接数 time #当前时间 } 六、常用命令{ db.listCommands() # 当前MongoDB支持的所有命令(同样可通过运行命令db.runCommand({"listCommands" : `1})来查询所有命令) db.runCommand({"buildInfo" : 1}) # 返回MongoDB服务器的版本号和服务器OS的相关信息。 db.runCommand({"collStats" : 集合名}) # 返回该集合的统计信息,包括数据大小,已分配存储空间大小,索引的大小等。 db.runCommand({"distinct" : 集合名, "key" : 键, "query" : 查询文档}) # 返回特定文档所有符合查询文档指定条件的文档的指定键的所有不同的值。 db.runCommand({"dropDatabase" : 1}) # 清空当前数据库的信息,包括删除所有的集合和索引。 db.runCommand({"isMaster" : 1}) # 检查本服务器是主服务器还是从服务器。 db.runCommand({"ping" : 1}) # 检查服务器链接是否正常。即便服务器上锁,该命令也会立即返回。 db.runCommand({"repaireDatabase" : 1}) # 对当前数据库进行修复并压缩,如果数据库特别大,这个命令会非常耗时。 db.runCommand({"serverStatus" : 1}) # 查看这台服务器的管理统计信息。 # 某些命令必须在admin数据库下运行,如下两个命令: db.runCommand({"renameCollection" : 集合名, "to":集合名}) # 对集合重命名,注意两个集合名都要是完整的集合命名空间,如foo.bar, 表示数据库foo下的集合bar。 db.runCommand({"listDatabases" : 1}) # 列出服务器上所有的数据库 } 七、进程控制{ db.currentOp() # 查看活动进程 db.$cmd.sys.inprog.findOne() # 查看活动进程 与上面一样 opid # 操作进程号 op # 操作类型(查询\更新) ns # 命名空间,指操作的是哪个对象 query # 如果操作类型是查询,这里将显示具体的查询内容 lockType # 锁的类型,指明是读锁还是写锁 db.killOp(opid值) # 结束进程 db.$cmd.sys.killop.findOne({op:opid值}) # 结束进程 } 八、备份还原{ ./mongoexport -d test -c t1 -o t1.dat # 导出JSON格式 -c # 指明导出集合 -d # 使用库 ./mongoexport -d test -c t1 -csv -f num -o t1.dat # 导出csv格式 -csv # 指明导出csv格式 -f # 指明需要导出那些例 db.t1.drop() # 登录后删除数据 ./mongoimport -d test -c t1 -file t1.dat # mongoimport还原JSON格式 ./mongoimport -d test -c t1 -type csv --headerline -file t1.dat # mongoimport还原csv格式数据 --headerline # 指明不导入第一行 因为第一行是列名 ./mongodump -d test -o /bak/mongodump # mongodump数据备份 ./mongorestore -d test --drop /bak/mongodump/* # mongorestore恢复 --drop #恢复前先删除 db.t1.find() #查看 # mongodump 虽然能不停机备份,但市区了获取实时数据视图的能力,使用fsync命令能在运行时复制数据目录并且不会损坏数据 # fsync会强制服务器将所有缓冲区的数据写入磁盘.配合lock还阻止对数据库的进一步写入,知道释放锁为止 # 备份在从库上备份,不耽误读写还能保证实时快照备份 db.runCommand({"fsync":1,"lock":1}) # 执行强制更新与写入锁 db.$cmd.sys.unlock.findOne() # 解锁 db.currentOp() # 查看解锁是否正常 } 九、修复{ # 当停电或其他故障引起不正常关闭时,会造成部分数据损坏丢失 ./mongod --repair # 修复操作:启动时候加上 --repair # 修复过程:将所有文档导出,然后马上导入,忽略无效文档.完成后重建索引。时间较长,会丢弃损坏文档 # 修复数据还能起到压缩数据库的作用 db.repairDatabase() # 运行中的mongodb可使用 repairDatabase 修复当前使用的数据库 {"repairDatabase":1} # 通过驱动程序 } 十、python使用mongodb{ 原文: http://blog.nosqlfan.com/html/2989.html easy_install pymongo # 安装(python2.7+) import pymongo connection=pymongo.Connection('localhost',27017) # 创建连接 db = connection.test_database # 切换数据库 collection = db.test_collection # 获取collection # db和collection都是延时创建的,在添加Document时才真正创建 文档添加, _id自动创建 import datetime post = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.datetime.utcnow()} posts = db.posts posts.insert(post) ObjectId('...') 批量插入 new_posts = [{"author": "Mike", "text": "Another post!", "tags": ["bulk", "insert"], "date": datetime.datetime(2009, 11, 12, 11, 14)}, {"author": "Eliot", "title": "MongoDB is fun", "text": "and pretty easy too!", "date": datetime.datetime(2009, 11, 10, 10, 45)}] posts.insert(new_posts) [ObjectId('...'), ObjectId('...')] 获取所有collection db.collection_names() # 相当于SQL的show tables 获取单个文档 posts.find_one() 查询多个文档 for post in posts.find(): post 加条件的查询 posts.find_one({"author": "Mike"}) 高级查询 posts.find({"date": {"$lt": "d"}}).sort("author") 统计数量 posts.count() 加索引 from pymongo import ASCENDING, DESCENDING posts.create_index([("date", DESCENDING), ("author", ASCENDING)]) 查看查询语句的性能 posts.find({"date": {"$lt": "d"}}).sort("author").explain()["cursor"] posts.find({"date": {"$lt": "d"}}).sort("author").explain()["nscanned"] } } JDK安装{ chmod 744 jdk-1_5_0_14-linux-i586.bin ./jdk-1_5_0_14-linux-i586.bin vi /etc/profile # 添加环境变量 export JAVA_HOME=/usr/local/jdk1.5.0_14 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin . /etc/profile jps -ml # 查看java进程 } } 5网络{ rz # 通过ssh上传小文件 sz # 通过ssh下载小文件 ifconfig eth0 down # 禁用网卡 ifconfig eth0 up # 启用网卡 ifup eth0:0 # 启用网卡 mii-tool em1 # 查看网线是否连接 traceroute www.baidu.com # 测试跳数 vi /etc/resolv.conf # 设置DNS nameserver IP 定义DNS服务器的IP地址 nslookup www.moon.com # 解析域名IP dig -x www.baidu.com # 解析域名IP dig +short txt hacker.wp.dg.cx # 通过 DNS 来读取 Wikipedia 的hacker词条 host -t txt hacker.wp.dg.cx # 通过 DNS 来读取 Wikipedia 的hacker词条 tcpdump tcp port 22 # 抓包 lynx # 文本上网 wget -P 路径 http地址 # 下载 包名:wgetrc dhclient eth1 # 自动获取IP mtr -r www.baidu.com # 测试网络链路节点响应时间 # trace ping 结合 ipcalc -m "$ip" -p "$num" # 根据IP和主机最大数计算掩码 curl -I www.baidu.com # 查看网页http头 curl -s www.baidu.com # 不显示进度 queryperf -d list -s DNS_IP -l 2 # BIND自带DNS压力测试 [list 文件格式:www.turku.fi A] telnet ip port # 测试端口是否开放,有些服务可直接输入命令得到返回状态 echo "show " |nc $ip $port # 适用于telnet一类登录得到命令返回 curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} $URL # 检查页面状态 curl -d "user=xuesong&pwd=123" http://www.abc.cn/Result # 提交web页面表单 需查看表单提交地址 rsync -avzP -e "ssh -p 22" /dir user@$IP:/dir # 同步目录 # --delete 无差同步 删除目录下其它文件 sshpass -p "$passwd" rsync -avzP -e "ssh -p 22" /dir user@$IP:/dir/ # 指定密码避免交互同步目录 ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0 # 增加逻辑IP地址 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁ping net rpc shutdown -I IP_ADDRESS -U username%password # 远程关掉一台WINDOWS机器 wget --random-wait -r -p -e robots=off -U Mozilla www.example.com # 递归方式下载整个网站 网卡流量查看{ watch more /proc/net/dev # 实时监控流量文件系统 累计值 iptraf # 网卡流量查看工具 nethogs -d 5 eth0 eth1 # 按进程实时统计网络流量 epel源nethogs sar { -n参数有6个不同的开关: DEV | EDEV | NFS | NFSD | SOCK | ALL DEV显示网络接口信息 EDEV显示关于网络错误的统计数据 NFS统计活动的NFS客户端的信息 NFSD统计NFS服务器的信息 SOCK显示套 接字信息 ALL显示所有5个开关 sar -n DEV 1 10 rxpck/s # 每秒钟接收的数据包 txpck/s # 每秒钟发送的数据包 rxbyt/s # 每秒钟接收的字节数 txbyt/s # 每秒钟发送的字节数 rxcmp/s # 每秒钟接收的压缩数据包 txcmp/s # 每秒钟发送的压缩数据包 rxmcst/s # 每秒钟接收的多播数据包 } } netstat{ # 几十万并发的情况下netstat会没有响应,建议使用 ss 命令 -a # 显示所有连接中的Socket -t # 显示TCP连接 -u # 显示UDP连接 -n # 显示所有已建立的有效连接 netstat -anlp # 查看链接 netstat -r # 查看路由表 } ss{ # netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多 ss -s # 列出当前socket详细信息 ss -l # 显示本地打开的所有端口 ss -pl # 显示每个进程具体打开的socket ss -t -a # 显示所有tcp socket ss -u -a # 显示所有的UDP Socekt ss dst 192.168.119.113 # 匹配远程地址 ss dst 192.168.119.113:http # 匹配远程地址和端口号 ss dst 192.168.119.113:3844 # 匹配远程地址和端口号 ss src 192.168.119.103:16021 # 匹配本地地址和端口号 ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有已建立的SMTP连接 ss -o state established '( dport = :http or sport = :http )' # 显示所有已建立的HTTP连接 ss -x src /tmp/.X11-unix/* # 找出所有连接X服务器的进程 } 并发数查看{ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' SYN_RECV # 正在等待处理的请求 ESTABLISHED # 正常数据传输状态,既当前并发数 TIME_WAIT # 处理完毕,等待超时结束的请求 } ssh{ ssh -p 22 user@192.168.1.209 # 从linux ssh登录另一台linux ssh -p 22 root@192.168.1.209 CMD # 利用ssh操作远程主机 scp -P 22 文件 root@ip:/目录 # 把本地文件拷贝到远程主机 sshpass -p '密码' ssh -n root@$IP "echo hello" # 指定密码远程操作 ssh -o StrictHostKeyChecking=no $IP # ssh连接不提示yes ssh -t "su -" # 指定伪终端 客户端以交互模式工作 scp root@192.168.1.209:远程目录 本地目录 # 把远程指定文件拷贝到本地 ssh -N -L2001:remotehost:80 user@somemachine # 用SSH创建端口转发通道 ssh -t host_A ssh host_B # 嵌套使用SSH ssh -t -p 22 $user@$Ip /bin/su - root -c {$Cmd}; # 远程su执行命令 Cmd="\"/sbin/ifconfig eth0\"" ssh-keygen -t rsa # 生成密钥 ssh-copy-id -i xuesong@10.10.10.133 # 传送key vi $HOME/.ssh/authorized_keys # 公钥存放位置 sshfs name@server:/path/to/folder /path/to/mount/point # 通过ssh挂载远程主机上的文件夹 fusermount -u /path/to/mount/point # 卸载ssh挂载的目录 ssh user@host cat /path/to/remotefile | diff /path/to/localfile - # 用DIFF对比远程文件跟本地文件 su - user -c "ssh user@192.168.1.1 \"echo -e aa |mail -s test mail@163.com\"" # 切换用户登录远程发送邮件 SSH反向连接{ # 外网A要控制内网B ssh -NfR 1234:localhost:2223 user1@123.123.123.123 -p22 # 将A主机的1234端口和B主机的2223端口绑定,相当于远程端口映射 ss -ant # 这时在A主机上sshd会listen本地1234端口 # LISTEN 0 128 127.0.0.1:1234 *:* ssh localhost -p1234 # 在A主机连接本地1234端口 } } 网卡配置文件{ vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none BROADCAST=192.168.1.255 HWADDR=00:0C:29:3F:E1:EA IPADDR=192.168.1.55 NETMASK=255.255.255.0 NETWORK=192.168.1.0 ONBOOT=yes TYPE=Ethernet GATEWAY=192.168.1.1 } route { route # 查看路由表 route add default gw 192.168.1.1 dev eth0 # 添加默认路由 route add -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 添加静态路由网关 route del -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 删除静态路由网关 } 解决ssh链接慢{ sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config sed -i '/#UseDNS yes/a\UseDNS no' /etc/ssh/sshd_config /etc/init.d/sshd restart } ftp上传{ ftp -i -v -n $HOST } 特殊字符{ http://en.wikipedia.org/wiki/Ascii_table ^H \010 \b ^M \015 \r 匹配特殊字符: ctrl+V ctrl不放在按H或M 即可输出^H,用于匹配 } } 流程结构{ if判断{ if [ $a == $b ] then echo "等于" else echo "不等于" fi } case分支选择{ case $xs in 0) echo "0" ;; 1) echo "1" ;; *) echo "其他" ;; esac } while循环{ # while true 等同 while : # 读文件为整行读入 num=1 while [ $num -lt 10 ] do echo $num ((num=$num+2)) done ########################### grep a a.txt | while read a do echo $a done ########################### while read a do echo $a done < a.txt } for循环{ # 读文件已空格分隔 w=`awk -F ":" '{print $1}' c` for d in $w do $d done ########################### for ((i=0;i6?5:8)) # 判断两个值满足条件的赋值给变量 $1 $2 $* # 位置参数 *代表所有 env # 查看环境变量 env | grep "name" # 查看定义的环境变量 set # 查看环境变量和本地变量 read name # 输入变量 readonly name # 把name这个变量设置为只读变量,不允许再次设置 readonly # 查看系统存在的只读文件 export name # 变量name由本地升为环境 export name="RedHat" # 直接定义name为环境变量 export Stat$nu=2222 # 变量引用变量赋值 unset name # 变量清除 export -n name # 去掉只读变量 shift # 用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1 name + 0 # 将字符串转换为数字 number " " # 将数字转换成字符串 数组{ A=(a b c def) # 将变量定义为数組 ${#A[*]} # 数组个数 ${A[*]} # 数组所有元素,大字符串 ${A[@]} # 数组所有元素,类似列表可迭代 ${A[2]} # 脚本的一个参数或数组第三位 } 定义变量类型{ declare 或 typeset -r 只读(readonly一样) -i 整形 -a 数组 -f 函数 -x export declare -i n=0 } 系统变量{ $0 # 脚本启动名(包括路径) $n # 第n个参数,n=1,2,…9 $* # 所有参数列表(不包括脚本本身) $@ # 所有参数列表(独立字符串) $# # 参数个数(不包括脚本本身) $$ # 当前程式的PID $! # 执行上一个指令的PID $? # 执行上一个指令的返回值 } 变量引用技巧{ ${name:+value} # 如果设置了name,就把value显示,未设置则为空 ${name:-value} # 如果设置了name,就显示它,未设置就显示value ${name:?value} # 未设置提示用户错误信息value ${name:=value} # 如未设置就把value设置并显示 ${#A} # 可得到变量中字节 ${A:4:9} # 取变量中第4位到后面9位 ${A/www/http} # 取变量并且替换每行第一个关键字 ${A//www/http} # 取变量并且全部替换每行关键字 定义了一个变量: file=/dir1/dir2/dir3/my.file.txt ${file#*/} # 去掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt ${file##*/} # 去掉最后一条 / 及其左边的字串:my.file.txt ${file#*.} # 去掉第一个 . 及其左边的字串:file.txt ${file##*.} # 去掉最后一个 . 及其左边的字串:txt ${file%/*} # 去掉最后条 / 及其右边的字串:/dir1/dir2/dir3 ${file%%/*} # 去掉第一条 / 及其右边的字串:(空值) ${file%.*} # 去掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file ${file%%.*} # 去掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my # # 是去掉左边(在键盘上 # 在 $ 之左边) # % 是去掉右边(在键盘上 % 在 $ 之右边) # 单一符号是最小匹配﹔两个符号是最大匹配 } } test条件判断{ # 符号 [ ] 等同 test命令 expression为字符串操作{ -n str # 字符串str是否不为空 -z str # 字符串str是否为空 } expression为文件操作{ -a # 并且,两条件为真 -b # 是否块文件 -p # 文件是否为一个命名管道 -c # 是否字符文件 -r # 文件是否可读 -d # 是否一个目录 -s # 文件的长度是否不为零 -e # 文件是否存在 -S # 是否为套接字文件 -f # 是否普通文件 -x # 文件是否可执行,则为真 -g # 是否设置了文件的 SGID 位 -u # 是否设置了文件的 SUID 位 -G # 文件是否存在且归该组所有 -w # 文件是否可写,则为真 -k # 文件是否设置了的粘贴位 -t fd # fd 是否是个和终端相连的打开的文件描述符(fd 默认为 1) -o # 或,一个条件为真 -O # 文件是否存在且归该用户所有 ! # 取反 } expression为整数操作{ expr1 -a expr2 # 如果 expr1 和 expr2 评估为真,则为真 expr1 -o expr2 # 如果 expr1 或 expr2 评估为真,则为真 } 两值比较{ 整数 字符串 -lt < # 小于 -gt > # 大于 -le = # 大于或等于 -eq == # 等于 -ne != # 不等于 } test 10 -lt 5 # 判断大小 echo $? # 查看上句test命令返回状态 # 结果0为真,1为假 test -n "hello" # 判断字符串长度是否为0 [ $? -eq 0 ] && echo "success" || exit # 判断成功提示,失败则退出 } 重定向{ # 标准输出 stdout 和 标准错误 stderr 标准输入stdin cmd 1> fiel # 把 标准输出 重定向到 file 文件中 cmd > file 2>&1 # 把 标准输出 和 标准错误 一起重定向到 file 文件中 cmd 2> file # 把 标准错误 重定向到 file 文件中 cmd 2>> file # 把 标准错误 重定向到 file 文件中(追加) cmd >> file 2>&1 # 把 标准输出 和 标准错误 一起重定向到 file 文件中(追加) cmd < file >file2 # cmd 命令以 file 文件作为 stdin(标准输入),以 file2 文件作为 标准输出 cat file # 以读写的方式打开 file cmd < file cmd # 命令以 file 文件作为 stdin cmd &n # 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出 ' txt # 精确匹配字符串 grep -i "a" txt # 大小写敏感 grep "a[bB]" txt # 同时匹配大小写 grep '[0-9]\{3\}' txt # 查找0-9重复三次的所在行 grep -E "word1|word2|word3" file # 任意条件匹配 grep word1 file | grep word2 |grep word3 # 同时匹配三个 echo quan@163.com |grep -Po '(?
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?