shell手册--笨鸟巨制

============================================================================================================================

09年,鸟人刚接触linux环境,用ssh终端连上服务器,两眼一黑(啥命令也不会).....

每次把成老师在我电脑上操作的命令用history找到记录下来,避免重复问他相同的问题...

后来把工作中用到的新命令、从《shell编程..》学到的用法也记录下来...

于是,一个临时的txt文件变成了现在这个样子(日常命令几乎都可以搜到)....

============================================================================================================================

#! /bin/sh
Shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。

shell注释-->
    A、方法一
  :<   ....注释内容
    'BLOCK
  B、方法二
  :<<'BLOCK
  ....注释内容
  BLOCK'
  C、方法三

  :<<'
    ....注释内容
    '
  以上三种方法都是通过在:<
  
  BLOCK为Here Documents中的定义符号可以随意起名,只要前后匹配就行了

    更帅的方法:
    cat <<"EOF" > /dev/null
    this
    is
    a
    multi-
    line
    comment
    EOF
    或者:
    : cat <<"EOF"
    this
    is
    a
    multi-
    line
    comment
    EOF        

<--shell注释

eval的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理。
eval echo "\$$#"  输出最后一个参数,不用eval的话只能输出$number,还不是$number中存储的数据


getopts一般格式为:
getopts option_string OPTION 将所有以连字符开头的参数作为变量与option_string对比,如果匹配成功,变量设置成OPTION的值,如果未发现匹配字符,把?设置成其值
getopts ahfvc: OPTION    选项a、h、f、v可以不加实际值进行传递,而选项c必须取

sort -u -n xx.log |wc -l

 du -sh * | sort -h  #sort -h --human-numeric-sort
              compare human readable numbers (e.g., 2K 1G)

ls /home/mysql/bigman/wom_weibo_sina* | xargs du -cb  统计指定文件的总大小
vi 中添加和去除行号
显示行号    :set number     或 :set nu
去除行号    :set nonumber  或  :set nonu

vi中水平分页编辑 :vsplit another_file
vi中竖直分页编辑 :sp another_file
上述两种,用ctrl+w+w进行切换 ctrl+w再加hjkl方向键可以选择tab页

 

vi中用标签页编辑 :

:tabe[dit] another_file  

向后切换 {num}gt  => gt3gt  4gt 5gt (带数字的是以第一个标签页为基准,而不是当前标签页为基准)

:tabn[ext] {num} =>:tabnext 2;:tabnext

向前切换 {num}gT => gT 3gT4gT 5gT (带数据的是以当前标签页为基准,不是以第一个标签页为基准)

:tabN[ext] {num} =>:tabNext 2;:tabNext

切到第一个标签页 :tabfir[st]

切到最后一个标签页 :tabl[ast]

把当前标签页移到第N个标签页之后 :tabm[ove] [N] 

对所有标签页执行命令 :tabd[o] {cmd}

关闭标签页 :tabc[lose] {num}

关闭其他所有标签页 :tabonly

关闭所有标签页:qa

把复制(yank)的文本粘贴到文件中用p就行了(要粘贴到上一行用P),那么如果要粘贴到:命令行里面呢--> ctrl+r " 

 

一次性打开多个文件用标签页编辑 vi -p one_file anther_file third_file

有时候文件过多,一次没法全部打开(vim -p 默认一次最多打开9或10个),可以用set tabpagemax=30修改默认的最大tab页限制,或者:

:tab ball         show each buffer in a tab (up to 'tabpagemax' tabs)

:tab help         open a new help window in its own tab page

:n          编辑下一个文档。
:2n        编辑下两个文档。
:N          编辑上一个文档。注意,该方法只能用于同时打开多个文档。
:e 文档名        这是在进入vim后,不离开 vim 的情形下打开其他文档。
:e# 或 Ctrl+ˆ      编辑上一个文档,用于两个文档相互交换编辑时使用。?# 代表的是编辑前一次编辑的文档
:files 或 :buffers 或 :ls     可以列出目前 缓冲区 中的所有文档。加号 + 表示 缓冲区已经被修改过了。#代表上一次编辑的文档,%是目前正在编辑中的文档
:b 文档名或编号      移至该文档。
:f  或 Ctrl+g     显示当前正在编辑的文档名称。
:f 檔名         改变编辑中的文档名。(file)

想要grep在代码目录中查找目标片段,并编辑所有命中的文件? grep -rn 'Utils' . | awk -F: '{print $1}' |sort -u | tr '\n' ' '  对于结果,执行vim -p即可

vim查看一个正在被其他进程修改的文件时需要reload文件,:e

vi中执行shell命令 :!your_cmd  这样可以用:!ls :!gcc 等等 很方便

在普通模式下,可使用 yaw  命令复制当前光标所在单词,用daw删除光标所在单词

bash下用!your_cmd_header可以调用上一个以这个开头的命令,比如你签名用了yum search xx,现在!yum就可以调用这个命令

和上面类似的命令是ctrl+r,输入命令头...(mysql命令行也有这个功能,只是mysql在没找到想要sql而非预期SQL把命令行占据时不能用ctrl+c取消,应该用ctrl+a,ctrl+k,Linux下命令行一般不是vim兼容的就是emacs兼容的)

 

ctrl+a  跳到mysql命令行开头

 

ctrl+u  从光标位置删到行首

ctrl+k  从光标位置删到行末

 

crtl+v列的virtual模式
v是行的virtual模式
在vi里面 gd是找定义位置或当前文件第一次出现的位置 可以用于高亮文本(类似于/sss查找)
在vi里面 shift+k可以直接打开当前函数的man 1页面

 

折叠(http://vim.wikia.com/wiki/Folding)

:set fdm=indent 按照同样的缩进折叠,极适合Lua,所有function都折起来了(foldmethod,默认foldmethod=manual,即用zf手动折叠;其他方式是syntaxexpr(自定义折叠规则))

zR一次性打开所有折叠

在Visual模式建立选中代码块的折叠  zf

建立折叠(对光标所在的大括号的代码块建立折叠)  zfa{

zf + 数字 + 方向键,折叠

展开折叠  zo

zO     对所在范围内所有嵌套的折叠点展开

关闭折叠  zc

zC     对所在范围内所有嵌套的折叠点进行折叠

视情况展开或关闭折叠  za

删除光标处折叠  zdr

x        删除当前光标下的字符
dw       删除光标之后的单词剩余部分(跟按w向前按照单词移动一样)

db       删除光标之前的单词剩余部分(跟按b向后按照单词移动一样)
d$       删除光标之后的该行剩余部分(跟按¥移到行末一样)

d0       删除光标之前的该行剩余部分(跟按0移到行首一样)
dd       删除当前行。

v加方向键选中内容后,可用d将选中部分删除

d + num + 方向键 向上或向下(箭头或者jk都行哦)删除num行(num去除自身以外的行数)

y 复制也有上述使用方法

 

vim设置字体颜色

[root@localhost server]# ls /usr/share/vim/vim72/colors/
blue.vim      default.vim  desert.vim   evening.vim  morning.vim  pablo.vim      README.txt  shine.vim  torte.vim
darkblue.vim  delek.vim    elflord.vim  koehler.vim  murphy.vim   peachpuff.vim  ron.vim     slate.vim  zellner.vim
[root@localhost server]# cat ~/.vimrc
:colorscheme desert

在vim已打开的状态下,用:colorscheme desert也可切换到对应的颜色方案!

对于公用的机器和用户,不想忍受别人的颜色方案可以在当前连接上建立一个别名,这样就可以自己用自己喜欢的样式了

alias vim='vim --cmd ":colorscheme desert"'

alias vim='vim --cmd ":colorscheme desert" --cmd ":set number"'

vim --cmd ":colorscheme desert" --cmd ":set number" --cmd ":set tabstop=4 shiftwidth=4 expandtab"


vim设置折叠的颜色
默认是一个灰白条,有些干扰思维,可在 $HOME/.vimrc 这样设置

:highlight Folded term=standout ctermfg=4 ctermbg=0

 

 

把vim tab的长度设成4个空格:在.vimrc中加入set tabstop=4

 

 

vim中的tab自动用四个空格替换:set tabstop=4 shiftwidth=4 expandtab

不要用空格替换tab的命令 :set noexpandtab

vim中空格(2个/4个)跟tab之间切换: :%s/    /\t/g              :%s/\t/    /g

遇到疑难可参考:http://stackoverflow.com/questions/426963/replace-tab-with-spaces-in-vimhttp://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or-linux

vim中方向键移动光标很慢:

w(word)往前按单词移动

b(back)往后按单词移动

0跳至行首(等同于home键)

 

$跳至行末(等同于end键)

%跳至对应的符号另一端,比如从{到},从(到)

'0 回到上次编辑的位置
vim +n urfile // n为行号,打开后光标定位到指定行
vim + urfile //打开文件后光标定位到最后一行

nl fileName    列出文件内容和行号(后面可以跟多个文件)
   11  ln -sf /home/team/www html 后面的是连接文件,前面的是实际文件
  185  passwd xudongsong 修改密码(此为root用法) 普通用户修改自己的密码时,只需passwd
  332  tar zvxf /tmp/ldapman.tar.gz   解压缩
      tar jvxf ffmpeg-git-01fcbdf.tar.bz2
       tar zvcf xxx.tar.gz xxx/    压缩 (想快速打包而不压缩就去掉z)
       /usr/bin/unrar x civ-server.rar  解压缩rar压缩文件

       unzip xxx.zip            解压缩zip压缩文件

       zip -r xxx.zip a.txt bDir 压缩文件

更全面的压缩、解压缩可参考这位仁兄的博客http://blog.csdn.net/zzcv_/article/details/2801582
 
  448  netstat -lntp  查看监听端口
mysql -h10.4.4.1 -u root -p --default-character-set=utf8
   562  id    显示登陆者的信息
   
    LINUX、BSD的echo需要用-n阻止自动换行、用-e提醒bash处理转义字符\ (用了-e,可以用\c阻止自动换行),系统V可以直接用\c阻止自动换行
    echo -n "hello"            阻止输出后自动换行
    echo -e "hello\tworld\c"    使得输出的转义字符生效
    echo "hello,world" > /tmp/test.log    重定向,覆盖
    echo "hello,world" >> /tmp/test.log    重定向,追加
    shell脚本前面最好加上#!/bin/bash
         因为在当前bash下用./tt.sh执行tt.sh脚本当然使用当前bash执行
         如果在python用popen("./tt.sh")执行就不一定了,可能是/bin/sh在执行脚本哦,/bisn/sh是dash不是bash。这样的话脚本里面的echo "abc\ndef"对'\n'的处理是一样的(肯定还有其他的区别,只是我栽在这个\n上面了)
    cat file1 file2
    cat file1 file2 > /tmp/allfile
    cat > /tmp/newfile        (ctrl+D结束新文件输入)
    cat -v file    显示控制字符(检查ftp从DOS传过来的文件)
    dos2unix file    把dos下的那些控制符转换成linux格式

    paste file1 file2     把两个文件的各行连在一起作为新行打印出来
    split -1 file1.txt    文件分割,按照一行一个文件分割
  611  rpm -ql httpd
[dongsong@tm4ctt143 ~]$ who
dongsong pts/0        2011-02-18 10:08 (10.4.6.120)

awk 在
awk 有很多字符串处理函数、数字处理函数、时间函数等,功能强大,用man可以看到,length(), substr(),tolower(),toupper()...
[dongsong@tm4ctt143 ~]$ who | awk '{print $1"\t"$3"\t"$2}'        awk可以控制输出那个字段(域标记从$1开始,如果用$0则表示所有域,$NF表示最后一个域$(NF-1)表示倒数第二个域)
dongsong        2011-02-18      pts/0

cat /etc/passwd | awk -F: '{print $1}'                    awk -F 是以字符分割
awk '{print $2}' data..f
 awk '{if($1=="265919437") print $1}' active_22_122999_20110209.log
awk '{if($1~/265919437/) print $1}' active_22_122999_20110209.log
awk '{if($1!~/265919437/) print $1}' active_22_122999_20110209.log
cat /tmp/debug_ips.log |sort |awk '{if($1==line){count++;} else{if(count>0) print count;count=1;} line=$1;} END {print count;}'|awk '{if($1>1) print $1}'|wc -l

[dongsong@tm4ctt143 shell_study]$ echo adsfafds|awk '{print substr($0, 1)}'
adsfafds
[dongsong@tm4ctt143 shell_study]$ echo adsfafds|awk '{print substr($0, 1, 2)}'
ad

cat /tmp/t | awk '{t=t"info[\""$2"\"],"} END {print t;}'

[dongsong@localhost kl-robot]$ echo 'entryId,pos,count,remainTime,isBinding,type' | tr ',' '\n' | awk '{t=t"info[\""$0"\"],"} END {print t;}'
info["entryId"],info["pos"],info["count"],info["remainTime"],info["isBinding"],info["type"],

两种计算字符串长度的方法,注意区别,awk取得的是准确值

[dongsong@tm4ctt143 shell_study]$ echo "sfff"|wc -c
5
[dongsong@tm4ctt143 shell_study]$ echo "sfff"|awk '{print length($0)}'
4
[dongsong@tm4ctt143 shell_study]$ read testStr
a(后面四个空格)
[dongsong@tm4ctt143 shell_study]$ echo $testStr|awk '{print length($0)}'
1
[dongsong@tm4ctt143 shell_study]$ echo $testStr|wc -c

2

grep -i 忽略大小写
tail -f api.log -n 100 | grep -e statuses__mentions -e eats 根据多个短语过滤
[dongsong@tm4ctt143 ~]$ df | awk '{print $1}'| grep -v "Filesystem"    grep -v  xx 不显示包含xx的条目
/dev/sda3
/dev/sda1
tmpfs
dongsong@tm4ctt143 ~]$ df | awk '{print $1}'| grep -v "Filesyst" | sed s'/\/dev\///g'        再用管道传过去给sed处理一下
sda3
sda1
tmpfs

[dongsong@tm4ctt143 ~]$ who | tee who.out                tee,谐音T,输出到screen的同时输出一个副本到文件中去

tee -a  #append

dongsong pts/0        2011-02-18 10:08 (10.4.6.120)

tee -a file        -a追加到文件末尾


command > filename 把把标准输出重定向到一个新文件中
command >> filename 把把标准输出重定向到一个文件中(追加)
command 1 > fielname 把把标准输出重定向到一个文件中
command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把把标准错误重定向到一个文件中
command 2 >> filename 把把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename >filename2 把c o m m a n d命令以f i l e n a m e文件作为标准输入,以f i l e n a m e 2文件
作为标准输出
command < filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符
command <&m 把把文件描述符m作为标准输入
command >&m 把把标准输出重定向到文件描述符m中
command <&- 把关闭标准输入

> file                创建一个长度为0的文件

command< [dongsong@tm4ctt143 ~]$ read var1 << hello
> look
> hello
[dongsong@tm4ctt143 ~]$ echo $var1
look
  777  netstat -a
    ls -l | grep ^d                只显示目录文件
  972  histpry |less
  973  touch hello.php
        <以下可以在 linux与unix shell编程指南 002.pdf 中找到>
       touch -t 05042140 test.txt 创建一个更改时间是5月4号21:90的文件
       find . -newer test.txt    寻找比test.txt更新的文件
       find . -newer !test.txt    与上面相反
       find . -type d    查找当前目录下的目录
       find . ! -type d | sort 查找当前目录下除目录以外的文件,后面管道加上sort是排序
       find . -type f -mtime -10 -print -mount -exec wc -l {} \;
       find . -type f -mtime -10 -print -mount |xargs wc -l    与上面等同,只是xargs一批一批的执行,exec把前面所有的当成参数一次执行()
        find . -name "*.cpp" | xargs grep "int"     在文件中查找int
    ls *.sql | grep -v 2011-11-17 | xargs rm        删除名字不含2011-11-17字样的sql文件
ifconfig
netstat -lntp
tcpdump -i lo port 389 -s 1000000 -A -vv
tcpdump -i lo -s 10000 -A -w /home/team/ddd port 389  抓包
tcpdump -i eth0 -s 10000 -A -nnn host 10.0.4.133 and port 80

tcpdump -i eth0 -nnn port 1234

-nnn是显示数字,便于直接观看结果

find . -name "*server.conf" | xargs -I {} cp {} /tmp/  对符合条件的文件做copy,-I是做替换,把管道输出东西替换到后面位置上(man xargs)。也可以尝试下面的方式

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +

 

今天(2014.7.17)遇到一个问题是系统有tcpdump但是用yum list看发现不是yum源里面的,而系统自带的这个只能打印非常简陋的信息,从yum装一个就正常了

/usr/sbin/tcpdump -i eth0 -s 1000 -nnn host 10.6.10.140 and port 5630 > /tmp/tcpdump.log  2>&1 & 

 
tcpdump -i eth0 port 1234 -w xxx.txt
-w把抓包的数据写入文件,可以在win下面用wireshark查看网络数据

netstat -lntp
stty -a
kill -s
kill -a  
kill -l
  205  gcc -o server Makefile
  206  ./server
  218  cscope -b -R *.cpp
  239  mv ../gamechat ./
  251  stty -a
  252  kill -9 进程号
  280  make deps
  281  make
  290  scripts/ctt_chatserver.sh start
  294  scripts/ctt_chatserver.sh status
  312  ./chat_client -k xdfeWscTsx434KXDscdESxm_wXd 10.4.3.143:8800
 
whereis gnome-terminal

把整个文件夹 folderTared 的内容打包成一个gz文件:
tar zvcf folderTared.tar.gz /theDir/folderTared
把压缩的gz文件恢复到指定目录下:
tar zvxf folderTared.tar.gz /theDir/

gunzip t_wiki_doc-2011-10-12.sql.gz

svn checkout ./gamechat http://10.4.3.143/subversion/gamechat/

svnserve --root /data/svn/svn --daemon 把其他仓库的svn数据目录的文件夹直接拷贝到/data/svn/svn下面,运行启动后可正常工作!

svn详细配置:http://wiki.ubuntu.org.cn/SubVersion

svn log -v | head -n 10

svn diff -r 4016:4017 connectserver.conf

chmod a+x xx/*


tail -f xxx.txt 动态显示变化着的文件

[dongsong@tm4ctt143 udplogger]$ md5sum udplogger
23ee4c96305af409d8092e2553ff4357  udplogger

  535  cat /etc/issue                        查询系统版本
   file /sbin/init                 查询系统是32位还是64位等相关信息
  541  wget http://mirror.centos.org/centos/5/os/SRPMS/glibc-2.5-34.src.rpm     下载
  543  rpm -qp glibc-2.5-34.src.rpm |less
  546  rpm -ivh glibc-2.5-34.src.rpm
  559  rpmbuild -bp SPECS/glibc.spec
  560  yum install -y audit-libs-devel        自动下载安装软件
  566  find . -name "ldconfig*"            在当前目录.寻找文件
       locate ldconfig                          全盘查找文件ldconfig
  568  vi ldconfig.c
       vi另存为 :w newFileName

  523  php -r 'fc_set("aaa", "OK");'
  524  php -r 'echo fc_get("aaa");'

  519  fg
   
  520  grep -d recurse in_pktinfo /usr/include/*
    grep -E '216|219' data..f
    ps aux|grep game|grep -v grep    

  484  cp -ar dbadmin.bak dbadmin
  496  find dbadmin -name "*.php.org" -exec rm {} \;

     nc -u 10.4.3.143 873             向143机器的873端口发送UDP数据
    nc -l 2010                监听当前机器的2010端口并显示连接建立起来后受到的数据,需要回复数据可以直接输入

    top                     查看系统状况(1cpu展开 O进入排序选择界面-->q按照内存使用排序)

    c 显示完整command

 

 

    O 选择排序的列(q内存使用排序)

 

 

    H 列出所有进程的线程,然后pstack pid(进程或者线程ID)打印线程的调用栈就知道各线程分别是什么线程了

   pstack pid 如果pid是线程ID则打印当前线程调用栈,如果是进程ID则打印其所有线程的调用栈

   top -H -p pid

   top -p pid

   top -p `ps h -o pid -C 进程名`


    top看不到所有进程,可以用top -b -d 1 -n 1 | less (-d delay延迟1秒更新,-n抓一次快照)

    pstree -p 显示系统内所有进程构成的进程树(除了用ps axo 'ppid,pid,cmd'来找进程的父进程以外还可以从进程树里面找)

      To print a process tree:
          ps -ejH
          ps axjf

       To get info about threads:
          ps -eLf
          ps axms

    僵尸进程会占用一部分内存(保存进程退出信息的结构体),可以杀掉其父进程以回收资源(当然,这样干可能会影响父进程的业务)

cat /proc/sys/kernel/shmmax        查看系统单个共享内存段最大字节数

    cat /proc/sys/kernel/shmmni        查看系统共享内存段最大个数
    cat /proc/sys/kernel/shmall        查看系统中共享内存页总数
    python                    使用linux的计算功能
    ipcs -lm                查看系统共享内存的参数
    ctrl+z                     转到后台运行
    fg                    调到前台来
    tail -f operate_push.log        动态查看文件
    tail -n 2 eee > test.php        将文件eee的最后2行输出重定向到test.php
  519  for f in `find lab -name "*.org"`; do echo ${f%.org}; done

  520  for f in `find lab -name "*.org"`; do mv $f ${f%.org}; done

[weibofengyun@localhost tfengyun_calc]$ for i in {1..5} ; do echo $i; done
1
2
3
4
5
[dongsong@tm4ctt143 ~]$ vvv="Hello world"
[dongsong@tm4ctt143 ~]$ echo ${vvv}
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvv:-xxxxx}
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvvv:-xxxxx}
xxxxx
[dongsong@tm4ctt143 ~]$ echo $vvvv

[dongsong@tm4ctt143 ~]$ echo ${vvvv}

[dongsong@tm4ctt143 ~]$ echo ${vvvv:=xxxxx}
xxxxx
[dongsong@tm4ctt143 ~]$ echo ${vvvv}
xxxxx
[dongsong@tm4ctt143 ~]$ echo ${vvva:?EEEEEEErrrrrrr}
bash: vvva: EEEEEEErrrrrrr
[dongsong@tm4ctt143 ~]$ echo ${aa:+hello}

[dongsong@tm4ctt143 ~]$ echo $aa

[dongsong@tm4ctt143 ~]$ echo ${va:+hello}

[dongsong@tm4ctt143 ~]$ echo ${vvv:+hello}
hello
[dongsong@tm4ctt143 ~]$ echo $vvv
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvv:0:4}
Hell
[dongsong@tm4ctt143 ~]$ echo ${vvv:0:2}
He
[dongsong@tm4ctt143 ~]$ echo ${vvv: -3}
rld
[dongsong@tm4ctt143 ~]$ echo ${!v*}
vvv vvvv
[dongsong@tm4ctt143 ~]$ echo ${#vvv}
11
[dongsong@tm4ctt143 ~]$ echo $vvv
Hello world
[dongsong@tm4ctt143 ~]$ vvv="a.b.php.org"
[dongsong@tm4ctt143 ~]$ vvv="/home/yy/a.b.php.org"
[dongsong@tm4ctt143 ~]$ echo ${vvv%.org}
/home/yy/a.b.php
[dongsong@tm4ctt143 ~]$ echo $vvv
/home/yy/a.b.php.org
[dongsong@tm4ctt143 ~]$ vvv="/home/yy/a.b.org.php.org"
[dongsong@tm4ctt143 ~]$ echo $vvv
/home/yy/a.b.org.php.org
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org*}
/home/yy/a.b
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org}
/home/yy/a.b.org.php
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org*}
/home/yy/a.b
[dongsong@tm4ctt143 ~]$ echo ${vvv%.org*}
/home/yy/a.b.org.php
[dongsong@tm4ctt143 ~]$ man bash

curl http://www.baidu.com 对指定url发出请求,可以-d用post方式、-G用get方式;用于测试比较方便,省去打开浏览器的麻烦

siege -f myurls.txt -t 60S [-r 100000] -d 3 -i -c 128 (128 users;3 delay )测试http性能(做压力测试时-d可指为零;内网测试机212的apache用siege和ab测试结果差不多,每秒处理2W+请求)

ab -n 10000 -c 10 http://192.168.1.212:8088/ apache提供的http测试工具

ab -v 显示参数及说明

 

 

sar -n DEV 2 5 网卡流量实时监控,2s一次,总共打印五次

 

 

sar -r 显示当天的内存(其他的见sar -h)

sar -n DEV 显示当天的网卡流量数据(这些还未写盘到/var/log/sa/sar[day],只能这样看)

 

关于sysstat

sysstat = sar + iostat + mpstat + pidstat + sadf (http://www.blackmoreops.com/2014/06/18/sysstat-sar-examples-usage/)

man sar 可以看到日志中各项指标和衡量单位的含义

设置打日志的间隔: vim /etc/cron.d/sysstat

设置日志保留的时间: vim /etc/sysconf/sysstat HISTORY

重启sysstat: service sysstat restart 或者 /etc/init.d/sysstat restart

 

ls -lhrt /var/log/sa/  查看sysstat的日志
sar -f /var/log/sa/sa13
sar -f /var/log/sa/sa13  |less

  675  sar -o data.bin 1      记录cpu等信息
  676  sar -o data2.bin 1
  677  ls
  678  sar -f data.bin      显示cpu等信息
  679  sar -f data.bin  -A | less
    stat filename         显示文件的设备号和inode
       uname -a        查看系统版本的几种方法
       cat /proc/version
       cat /etc/issue
       lsb_release     -a
    /sbin/ip     link        查看系统网卡信息的几种方法
    netstat         -i
     /sbin/ifconfig
      ls -l /proc/进程ID/fd        查看进程打开的读写的文件
  554 GLIB_CFLAGS="-I/usr/local/include" GLIB_LIBS="-L/usr/local/lib" ./configure  
  556  export CFLAGS="-I/usr/local/include"
  557  export LDFLAGS="-L/usr/local/lib"
  559  export GLIB_CFLAGS="-I/usr/local/include"
  560  export GLIB_LIBS="-L/usr/local/lib"
  569  make clean
  570  ./configure --help | less
  571  export CPPFLAGS="-I/usr/local/include"
  573  export LDFLAGS="-L/usr/local/lib"
574  export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/     设置环境变量
577  man pkg-config
$pkg-config --modversion gtk+    (查看1.2.x版本)

$pkg-config --modversion gtk+-2.0 (查看 2.x 版本)

$pkg-config --version (查看pkg-config的版本)

$pkg-config --list-all |grep gtk (查看是否安装了gtk)

env     显示所有环境变量

grep -rn 'class EkigaMainWindow' ./*
grep -d recurse TopDocs * 递归查找
pstree |grep bash
 582  vi test.c
  583  ls
  584  man gcc
  585  ls
  586  gcc -E test.c              预处理 处理头文件、宏
  587  gcc -E test.c | less
  588  gcc -S test.c             编译  生成汇编代码
  589  ls
  590  less test.s
  591  gcc -c test.c             汇编  生成目标代码
  592  ls test.o
  593  gcc -o test test.o        链接 生成可执行文件
  594  ls
  595  ./ test
  596  ./test
  597  nm test                
  598  nm test | less
  599  ldd test                列出该可执行文件加载的动态库
  600  export LD_PRELOAD=yes
  601  ./test
  602  man ld
  603  unset LD_PRELOAD
  604  ls
  605  strace test            列出动态库
  606  sudo yum install strace
  607  ls
  608  strace test
  609  readelf -h test            列出可执行文件(elf文件)的具体信息
  610  file test
  611  man readelf
  612  readelf -l test
  613  readelf -S test
  614  objdump -d test
  615  which objdump
  616  rpm -qf /usr/bin/objdump
  617  rpm -ql binutils
  618  rpm -ql binutils | | less
  619  rpm -ql binutils | less
  620  man strip
  621  man ranlib

给磁盘分区可以用fdisk -u /dev/sdb 根据提示往下走

cat /proc/partitions查看目前机器中的所有磁盘及分区情况

<下面的内容在 linux与unix shell编程指南 003.pdf>
后台运行领命:crontab at & nohup (前两个是定时执行脚本)

umask是从权限中“拿走”相应的位(具体见 linux与unix shell编程指南 001.pdf)
(系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限)
shutdown -h now 关机
halt -p         关机
[dongsong@localhost soft]$ du -sh       查看目录大小
3.5G    .
[dongsong@localhost soft]$ df -Th                查看挂载点
文件系统      类型    容量  已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
              ext3    6.7G  4.6G  1.8G  73% /
/dev/hda1     ext3     99M   12M   83M  13% /boot
tmpfs        tmpfs    252M     0  252M   0% /dev/shm
/dev/hdd5     ext3     14G  4.0G  9.2G  30% /home

[dongsong@localhost soft]$ sudo fdisk -l            查看磁盘空间
Password:

Disk /dev/hda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1044     8281507+  8e  Linux LVM

重启后自动挂载:vi /etc/fstab
  添加:/dev/sdb1 /mnt/d ext3 default 0 0

 gcc -L/usr/local/lib test_sqlite.c  -lsqlite3
 

for i in `find ./ -name "*.[ch]" -exec wc -l {} \;|cut -d ' ' -f1;`; do sum=$(($sum+$i));done  统计目录下.c .h文件行数(代码行数)

或者 find ./ |egrep "*.[ch]$|*.cpp$|*.hpp$" |xargs wc -l

find pathname -options [-print -exec -ok] (具体见 linux与unix shell编程指南 002.pdf)
find . -perm -007 数字前面有-时,只根据非零项进行筛选
find . -perm  667 数字前面没有-时,严格按照权限筛选
cut -f1,2,3
cut -f2,3,4  chat-20110122.log | grep '^100075'
ls -l proc/2345/cwd                查看进程2345运行的目录
cat cityBuild-20110118.log | grep ^5 输出以5开头的数据
xudongsong@sysdev:~$ ls | egrep "pub$|^test|2000"    正则匹配
id_rsa.pub
test.cpp
test.log
test.txt
top_3001-3500_1501-2000

-----------cp start--------------
copy 本地的档案到远程的机器上
scp /etc/lilo.conf [email protected]:/home/k
会将本地的 /etc/lilo.conf 这个档案 copy 到 net67.ee.oit.edu.tw,使用者 k 的家目录下。
copy远程机器上的档案到本地来
scp [email protected]:/etc/lilo.conf /etc
会将 net67.ee.oitdu.tw 中 /etc/lilo.conf 档案 copy 到本地的 /etc 目录下。
保持从来源 host 档案的属性
scp –p [email protected]:/etc/lilo.conf /etc

如果想使用特定端口 使用 scp –P(大写) 如 scp –P 1234 [email protected]:/etc/lilo.conf /etc


在此必须注意使用者的权限是否可读取远程上的档案,若想知道更多关于 scp 的使用方法,可去看看 scp 的使用手册。
ssh-keygen
产生公开钥 (pulib key) 和私人钥 (private key),以保障 ssh 联机的安性, 当 ssh 连 shd 服务器,会交换公开钥上,系统会检查 /etc/ssh_know_hosts 内储存的 key,如果找到客户端就用这个 key 产生一个随机产生的session key 传给服务器,两端都用这个 key 来继续完成 ssh 剩下来的阶段。

它会产生 identity.pub、identity 两个档案,私人钥存放于identity,公开钥 存放于 identity.pub 中,接下来使用 scp 将 identity.pub copy 到远程机器的家目录下.ssh下的authorized_keys。 .ssh/authorized_keys(这个 authorized_keys 档案相当于协议的 rhosts 档案),之后使用者能够不用密码去登入。RSA的认证绝对是比 rhosts 认证更来的安全可靠。想让多台机器都不输密码直接往A上拷数据,可以把这几台机器的identity.pub追加到A得authorized_keys文件后面。
执行:
scp identity.pub [email protected]:.ssh/authorized_keys

若在使用 ssh-keygen 产生钥匙对时没有输入密码,则如上所示不需输入密码即可从 net67.ee.oit.edu.tw 去登入 linux1.ee.oit.edu.tw。在此,这里输入的密码可以跟帐号的密码不同,也可以不输入密码。
-----------scp end----------------
ssh -p 7710 [email protected] -v  ssh登录
nohup ********* &     转后台运行

date +%s 在bash上输出unixtime
date --date "1 days ago" 获取一天前的时间
date +%G-%m-%d   输出2011-11-17
date -R 查看服务器时区设置

show global variables like '%time_zone%' 查看mysql时区设置
 select current_timestamp;   查看mysql当前的时间戳

编码问题:
iconv -f GB2312 -t UTF-8 NationLogInterface.h > NationLonInterface.h_utf-8 bash上对文件进行编码转换
在Vim中可以直接查看文件编码 :set fileencoding 即可显示文件编码格式

autoreconf -fi
./configure --prefix=/home/myciv/civ-server/trunk/run

linux编译问题,因为系统时间导致编译不正常:find .|xargs touch

添加sudo权限 vi /etc/sudoers

设置sudo不输入密码:sudo visudo 或者 sudo vi /etc/sudoers, 按如下修改
%admin ALL=(ALL)NOPASSWD:NOPASSWD ALL  //admin组的用户sudo所有命令都不用输入密码
%guy ALL=NOPASSWD:ALL //用户guy sudo 所有命令都不用输入密码
%guy ALL=NOPASSWD:/usr/bin/tt.sh,/usr/sbin/adduser //用户guy sudo指令命令不用输入密码


fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的
一。& 最经常被用到
   这个用在一个命令的最后,可以把这个命令放到后台执行
二。ctrl + z
     可以将一个正在前台执行的命令放到后台,并且暂停
三。jobs
     查看当前有多少在后台运行的命令
四。fg
     将后台中的命令调至前台继续运行
   如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
五。bg
     将一个在后台暂停的命令,变成继续执行
   如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)  

gdb调试core文件:
 gdb -core core.*** XXX(可执行文件)
 gdb>> bt
 gdb>> f XX(第几个栈)
 gdb>> list filename:lineNumber
 gdb>> info threads 列出线程

 gdb>> thread n 跳转到线程

gdb -p pid 切入一个进程,generate-core-file生成core文件,然后quit detach进程

 
源代码之间建立跳转链接
    ctags -R
    cscope -b -R *.cpp *.hpp
    

    ctags建立之后可以用ctrl+] 和ctrl+t进行正反向跳转(前面加上ctrl+w就可以在新tab页中显示,在bash下面之间用vi -t name可以打开函数或者变量定义的文件(功能真风骚,貌似我只用了ctags的1%)

     vim xxx.c之前要把当前路径切换到ctags所在目录去,否则找不到符号

    ctags的用法:http://oreilly.com/catalog/vi6/chapter/ch08.html#ch08_05.htm
 

    ctags的官网:http://ctags.sourceforge.net/

    ctags --c-types=+px //缺省不能对函数声明建立tag,加这个参数可以解决

   常规的对lua建立ctag: ctags --langdef=MYLUA --langmap=MYLUA:.lua --regex-MYLUA="/^.*\s*function\s*(\w+):(\w+).*$/\2/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*[0-9]+.*$/\1/e/" --regex-MYLUA="/^.*\s*function\s*(\w+)\.(\w+).*$/\2/f/" --regex-MYLUA="/^.*\s*function\s*(\w+)\s*\(.*$/\1/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*\{.*$/\1/e/" --regex-MYLUA="/^\s*module\s+\"(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*module\s+\"[a-zA-Z0-9._]+\.(\w+)\".*$/\1/m,module/" --languages=MYLUA --excmd=pattern -R .

    要对文件名也建tag的话需要增加参数 --extra=f

 要对external.createNormalMap = function (plr,mid)中的createNormarlMap建tag: --regex-MYLUA="/^.*\w+\.(\w+)\s*=\s*function\s*\(.*$/\1/f/"

 要对middleclass的类Player = class("Player")建tag: --regex-MYLUA="/^\s*(\w+)\s*=\s*class\s*\(.*$/\1/f/"

 要对middleclass的类初始化函数 function Player:initialize(...)建立tag: --regex-MYLUA="/^\s*function\s*(\w+):initialize\s*\(.*$/\1/f/"

 把全局变量加进去 --regex-MYLUA="/^\s*(\w+)\s*=/\1/f/"

ctags --langdef=MYLUA --langmap=MYLUA:.lua --regex-MYLUA="/^\s*(\w+)\s*=\s*class\s*\(.*$/\1/f/"  --regex-MYLUA="/^.*\w+\.(\w+)\s*=\s*function\s*\(.*$/\1/f/" --regex-MYLUA="/^.*\s*function\s*(\w+):(\w+).*$/\2/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*[0-9]+.*$/\1/e/" --regex-MYLUA="/^.*\s*function\s*(\w+)\.(\w+).*$/\2/f/" --regex-MYLUA="/^.*\s*function\s*(\w+)\s*\(.*$/\1/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*\{.*$/\1/e/" --regex-MYLUA="/^\s*module\s+\"(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*module\s+\"[a-zA-Z0-9._]+\.(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*function\s*(\w+):initialize\s*\(.*$/\1/f/"  --languages=MYLUA --excmd=pattern --extra=f -R .

 

find lualib-src/ service-src/ skynet-src/ connectserver/ -name "*.*" | egrep '*.c$|*.h$|*.cpp$' | xargs ctags

vim -t functionName 打开tag定义的文件,并定位到该位置
 

ctrl+w 让ctrl+]在标签页中打开

ctrl+]  跳转到定义的位置


ctrl+t 回到跳转的位置

 

 

ctrl+o 回到光标上次所在的位置

 

 

ctrl+i 前进到光标回跳前的位置

ctrl+e 保持光标不动把页面向上移动

ctrl+y 保持光标不动把页面向下移动

ctrl+f 向下滚一屏

ctrl+b向上滚一屏

ctrl+d向下滚

ctrl+u向上滚

/xxx\> 匹配以xxx结尾的单词

/\

/\ 匹配xxx单词

:set ignorecase 忽略大小写

:set noignorecase 恢复到大小写敏感

如何让ctags支持php的语法跳转:
以下命令可放到~/.bash_profile中
alias phptags='ctags --langmap=php:.engine.inc.module.theme.php  --php-kinds=cdf  --languages=php --extra=f'
以下设置放到 ~/.ctags文件中
$ cat ~/.ctags
--regex-php=/^[ \t]*[(private|public|static)( \t)]*function[ \t]+([A-Za-z0-9_]+)[ \t]*\(/\1/f, function, functions/
--regex-php=/^[ \t]*[(private|public|static)]+[ \t]+\$([A-Za-z0-9_]+)[ \t]*/\1/p, property, properties/
--regex-php=/^[ \t]*(const)[ \t]+([A-Za-z0-9_]+)[ \t]*/\2/d, const, constants/
使用时,在代码目录中:
$ phptags -R

就可以生成比较可用的tags文件了。

 

对于有多个tag文件,可以指定要使用的tag(也可以结合alias来用,或者直接放入.vimrc中,或者直接不带目标文件的启动vim然后用:命令来设置和跳转)  :set tags=$SRC/tags

vim --cmd ":set tag=.../tags"

:set tags 显示当前加载的tag文件

:tags 显示当前tag stack(tag跳转历史),更多命令可以用:help tag-commands来查看

:tag xxx 跳到xxx这个tag的位置去

:tag /^xxx 跳到以xxx打头的tag位置

:ts /^xxx 列出以xxx打头的tag

:tag /xxx 跳到包含xxx的tag位置

:ts /xxx 列出包含xxx的tag

:ts xxx

:ts[elect][!] [ident]   列出所有跟目标相符的tag

:ta[g] 功能跟ctrl+]类似

:po[p] 功能跟ctrl+t类似

:tn, :tp是在符号的多个定义之间跳转

 

对Python文件建ctags跳转标记

http://www.held.org.il/blog/2011/02/configuring-ctags-for-python-and-vim/

 

[root@test-22 kl-robot]# cat ~/.ctags
--python-kinds=-i
root@test-22 kl-robot]# ctags --list-kinds=python
ctags: Warning: Unsupported parameter 'i' for --python-kinds option
c  classes
f  functions
m  class members
[root@test-22 kl-robot]# ctags -R --extra=f .   
ctags: Warning: Unsupported parameter 'i' for --python-kinds option
[root@test-22 kl-robot]# ls -lhrt tags 
-rw-r--r-- 1 root root 162K 06-11 16:05 tags

 

 

 

----------------------查看系统配置-----------------------

系统

# uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue   # 查看操作系统版本
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看计算机名
# lspci -tv              # 列出所有PCI设备
# lsusb -tv              # 列出所有USB设备
# lsmod                  # 列出加载的内核模块
# env                    # 查看环境变量

资源

# free -m                # 查看内存使用量和交换区使用量
# df -h                  # 查看各分区使用情况
# du -sh <目录名>        # 查看指定目录的大小
# grep MemTotal /proc/meminfo   # 查看内存总量
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                 # 查看系统运行时间、用户数、负载

# cat /proc/loadavg      # 查看系统负载

ss -s  查看TCP连接数

磁盘和分区

# mount | column -t      # 查看挂接的分区状态
# fdisk -l               # 查看所有分区
# swapon -s              # 查看所有交换分区
# hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE       # 查看启动时IDE设备检测状况

网络

# ifconfig               # 查看所有网络接口的属性
# iptables -nL            # 查看防火墙设置(不加n的话看不到端口 )
# route -n               # 查看路由表
# netstat -lntp          # 查看所有监听端口

# netstat -antp          # 查看所有已经建立的连接

netstat -A inet -n -p   #-A协议(inet:raw tcp udp) -n显示数字端口 -p显示程序名

# netstat -s             # 查看网络统计信息

netstat -a  | grep 5630  查看跟5630端口相关的所有连接(已建立的连接以及正在监听的端口信息)


进程

# ps -ef                 # 查看所有进程
# top                    # 实时显示进程状态

查看进程是否死循环或者僵尸 R+就是死循环

 

 

ps axo "lstart,etime,stat,vsize,rss,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm,cmd" | egrep "server|cross"

rss实际内存(KB)

vsize虚拟内存(虚拟地址空间大小,new出来没有使用的内存空间都属于虚拟内存,不占实际物理内存;这个跟交换分区又不是同一个概念,交换分区是指把实际物理内存交换到磁盘上)(KB)

 

 

 

start_time 程序启动日期

 

lstart 启动的准确时间

etime 已运行时长

pgrep "lz2_mapserver|lz2_baseserver" | xargs kill -USR2 #比ps axo + 过滤更精准一点 不会被进程的命令行参数干扰。 是类似于killall的命令。

用户
# w                      # 查看活动用户
# id <用户名>            # 查看指定用户信息
# last                   # 查看用户登录日志
# cut -d: -f1 /etc/passwd   # 查看系统所有用户 (用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell)
# cut -d: -f1 /etc/group    # 查看系统所有组(组名:口令:组标识号:组内用户列表)
# crontab -l             # 查看当前用户的计划任务

服务

# chkconfig --list       # 列出所有系统服务
# chkconfig --list | grep on    # 列出所有启动的系统服务

程序

# rpm -qa                # 查看所有安装的软件包
------------------end of 查看系统配置-----------------------
------------------source命令--------------------------------
source命令的作用就是用来执行一个脚本,那么:
source a.sh 同直接执行 ./a.sh 有什么不同呢,比如你在一个脚本里export $KKK=111 ,如果你用./a.sh执行该脚本,执行完毕后,你运行 echo $KKK ,发现没有值,如果你用source来执行 ,然后再echo ,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结构并没有反应到父shell里,但是 source不同它就是在本shell中执行的,所以可以看到结果
------------------end of source命令-------------------------

使用man时可以指定不同的section来浏览,各个section意义如下:
1 - commands
2 - system calls
3 - library calls
4 - special files
5 - file formats and convertions
6 - games for linux
7 - macro packages and conventions
8 - system management commands
(man 1是shell命令,man 2是系统调用,man 3是库函数)

windows绑定host的文件:C:\WINDOWS\system32\drivers\etc

linux绑定houst的文件:/etc/hosts

---------------------------------------suid/guis-------------------------------------------------------------start---------------
suid意味着如果A用户对属于他自己的shell脚本文件设置了这种权限,那么其他用户在执行这个脚本的时候就拥有了A用户的权限。所以,如果 root用户对某一脚本设置了这一权限的话则其他用户执行该脚本的时候则拥有了root用户权限。同理,guid意味着执行相应脚本的用户则拥有了该文件所属用户组中用户的权限。
为什么使用suid/guid?
举个例子:要对数据库系统进行备份需要有系统管理权限,那么我可以写几个脚本,并设置了它们的guid,这样我指定的一些用户只要执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。
有相当一些命令也设置了suid和guid。如果想找出这些命令,可以进入/bin或/sb in目录,执行下面的命令:
$ ls -l | grep '^...s'
上面的命令是用来查找suid文件的;
$ ls -l | grep '^...s..s'
上面的命令是用来查找suid和guid的。
如何设置suid/guid?
如果希望设置suid,那么就将相应的权限位之前的那一位设置为4;如果希望设置guid,那么就将相应的权限位之前的那一位设置为2;如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2。
一旦设置了这一位,一个s将出现在x的位置上。记住:在设置suid或guid的同时,相应的执行权限位必须要被设置。例如,如果希望设置guid,那么必须要让该用户组具有执行权限。
如果想要对文件login设置suid,它当前所具有的权限为rwx rw- r-- (741),需要在使用chmod命令时在该权限数字的前面加上一个4,即chmod 4741,这将使该文件的权限变为rws rw- r--。
$ chmod 4741 login
还可以使用符号方式来设置suid/guid。如果某个文件具有这样的权限: rwx r-x r-x,那么可以这样设置其suid/guid:
chmod u+s
chmod u+g
---------------------------------------suid/guis-------------------------------------------------------------end---------------

---------------------------------------mysql------------------------------------------------------------------start------------------
select * from t_battle_mails where iStartX = 245 AND iStartY = 102 into outfile "/tmp/battlemail.txt";
load data infile "/home/myciv/login_logs/login_22_122999_20110112.log" into table t_test1 fields terminated by "\t";

select count(sActivityCode)  from t_user_info where activate = 1 and sActivityCode != '' and first_time > "2011-01-12 00:00:00" and first_time < "2011-01-12 23:59:59";
SELECT UNIX_TIMESTAMP("20110114000000");
SELECT UNIX_TIMESTAMP("2011-01-14 00:00:00");
SELECT FROM_UNIXTIME(12312689349);

datetime字段设置当前值为默认值的问题(参考http://wotf23771.iteye.com/blog/721013):
MySQL的datetime设置当前时间为默认值,由于MySQL目前字段的默认值不支持函数,所以用create_time datetime default now()的形式设置默认值是不可能的。

代替的方案是使用TIMESTAMP类型代替DATETIME类型。
CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段不会改变。
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段将会改变。即时间变为了更新时候的时间。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)如果有多个TIMESTAMP列,只有第一个自动更新。

同一个表中上述两种类型字段不能出现任意两个!

mysql> select count(*) from t_raw_img where time < NOW();   
+----------+
| count(*) |
+----------+
|     2452 |
+----------+
1 row in set (0.02 sec)

mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2012-05-02 10:35:57 |
+---------------------+
1 row in set (0.00 sec)

mysql> select count(*) from t_raw_img where time > "2012-04-27 00:00:00";
+----------+
| count(*) |
+----------+
|     2452 |
+----------+
1 row in set (0.03 sec)



mysqldump备份:mysqldump -u用户名 -p密码 -h主机 数据库 数据表 -w "sql条件" --lock-all-tables > 路径
mysqldump -h 127.0.0.1 -uroot -proot123 civ_hujiajie t_battle_mails -w "1" --lock-all-tables > /tmp/testdump.txt;

mysqldump还原:mysql -u用户名 -p密码 -h主机 数据库 < 路径
source 文件;

导出
    -t 导数据不导结构

    -d 导结构不导数据

    --replace 用replace into替代insert into

    --where="id>100 order by id limit 0,10"

     -r, --result-file=nameDirect output to a given file. This option should be used on Windows to prevent newline"\n" characters from being converted to"\r\n" carriage return/newline sequences. The result file is created and its previous  contents overwritten, even if an error occurs while generating the dump.

    -c or - complete_insert

     这个选项使得结果sql中携带列信息,不加该选项是 replace/insert into table t values(...),加了以后是replace/insert into table t(c1,c2,...) values (...)

  --compact           Give less verbose output (useful for debugging). Disables
                      structure comments and header/footer constructs.  Enables
                      options --skip-add-drop-table --skip-add-locks
                      --skip-comments --skip-disable-keys --skip-set-charset. 很多时候我们只想要inser/replace语句,其他都不要,那么这个参数可以把很多多余信息干掉

    1.导出整个数据库

  mysqldump -u 用户名 -p 数据库名 > 导出的文件名

  mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

  2.导出一个表

  mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

  mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

  3.导出一个数据库结构

  mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:wcnc_db.sql

  -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table


    4. 导出txt文件
    环境变量 path
    cmd
    mysql -uroot -proot 数据库 表名 > save path

    mysql -uroot -proot db 表名>e:/a.txt


 导入数据库 sql ,txt

1.   导入sql格式
    source 命令

  进入mysql数据库控制台,

  如mysql -u root -p

  mysql>use 数据库

  然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

  mysql>source d:wcnc_db.sql
2. txt格式
    mysql -uroot -proot db< .txt

    把查询结果直接导入另一个表中
    insert into tb2 (单据编号, 物品编号, 物品名称, 物品数量) select '10001',物品编号 ,物品名称, 物品数量 from tb1

---------------------------------------mysql------------------------------------------------------------------end------------------
元字符(正则表达式)
^ 只匹配行首
$ 只匹配行尾
* 一个单字符后紧跟*,匹配0个或多个此单字符
[] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-表示[]内字符序列范围,如用[1-5]代替[12345],[^1-5]匹配1-5以外的字符
\ 只用来屏蔽一个元字符的特殊含义。因为有时在s h e l l中一些元字符有
特殊含义。\可以使其失去应有意义
. 只匹配任意单字符
pattern\{n\} 用来匹配前面pattern出现次数。n为次数
pattern\{n,\} 含义同上,但次数最少为n
pattern\{n,m\} 含义同上,但pattern出现次数在n与m之间

tr命令的使用
tr特定控制字符的不同表达方式
速记符        含义            八进制方式
\a        Ctrl-G 铃声        \007
\b         Ctrl-H 退格符        \010
\f         Ctrl-L 走行换页        \014
\n         Ctrl-J 新行        \012
\r         Ctrl-M 回车        \015
\t         Ctrl-I tab键        \011
\v         Ctrl-X             \030

tr -s "[a-z]" < oops.txt > results.txt        去除连续重复的字符,比如“ddsssssssssss”=》“ds”
tr -s "[a-z]" < oops.txt            和上面的命令意义等同,只是输出到准备输出了
tr -s "[\n]" < oops.txt                去除换行
tr -s "[\012]" < oops.txt            和上面的命令等同
[dongsong@tm4ctt143 ~]$ echo "May Day, May Day, Going Down.." | tr "[a-z]" "[A-Z]"        小写转大写
MAY DAY, MAY DAY, GOING DOWN..
 tr "[A-Z]" "[a-z]" < oops.txt            大小到小写

使用trap命令
trap命令用于捕获指定的信号并执行预定义的命令。
其基本的语法是:
trap 'command' signal
其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。可以用kill –l命令看到系统中全部可用的信号名,捕获信号后所执行的命令可以是任何一条或多条合法的shell语句,也可以是一个函数名。
shell脚本在执行时,会产生三个所谓的“伪信号”,(之所以称之为“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的),通过使用trap命令捕获这三个“伪信号”并输出相关信息对调试非常有帮助。


shift命令每执行一次,变量的个数($#)减一,而变量值提前一位,shift number去掉number个参数

特定shell变量 还有本地变量、环境变量、位置变量的完整介绍
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的进程ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数,for循环用$@取参数可以一次得到各个参数(不需要用shift)
$- 显示shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

[dongsong@tm4ctt143 shell_study]$ expr 1 \> 0
1
[dongsong@tm4ctt143 shell_study]$ expr 1 \* 10
10

条件测试
test一般有两种格式,即:
test condition

[ c o n d i t i o n ]
使用方括号时,要注意在条件两边加上空格。
表17-1 文件状态测试
-d 目录
-s 文件长度大于0、非空
-f 正规文件
-w 可写
-L 符号连接
-u 文件有suid位设置
-r 可读
-x 可执行

-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。

[dongsong@tm4ctt143 shell_study]$ ls -lh file1.txt
-rw-rw-r-- 1 dongsong dongsong 123 Feb 25 16:43 file1.txt
[dongsong@tm4ctt143 shell_study]$ test -d file1.txt
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ [ -d file1.txt ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test -x file1.txt -a -x x_shift.sh
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test -f file1.txt -a -x x_shift.sh
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ -f file1.txt -a -x x_shift.sh ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0

测试字符串
= 两个字符串相等。
!= 两个字符串不等。
-z 空串。
-n 非空串。

[dongsong@tm4ctt143 shell_study]$ test "hello" = hello
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test "hello " = "hello"
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test "hello " != "hello"
[dongsong@tm4ctt143 shell_study]$
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test -z ""
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test -z " "
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test -n " "
[dongsong@tm4ctt143 shell_study]$ echo $?
0

测试数值
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
[dongsong@tm4ctt143 shell_study]$ test 20 -eq 30
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test 30 -eq 30
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ 20 -eq 30 ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ [ 20 -ne 30 ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -le "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -ge "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ [ "20" -lt "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -gt "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1

[dongsong@tm4ctt143 shell_study]$ LOOP=1
[dongsong@tm4ctt143 shell_study]$ echo $LOOP
1
[dongsong@tm4ctt143 shell_study]$ LOOP=`expr $LOOP + 1`
[dongsong@tm4ctt143 shell_study]$ echo $LOOP
2

expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。


注意:
    expr 自身有返回值,返回1表示成功
    $? 取命令执行结果时,0表示成功

. CheckItIsADirectory 将shell文件载入到shell中(点-空格-文件名),然后可以用set查看载入的函数,用unset可以去掉载入的函数
              也可以用这种方式把一个shell脚本加载到另一个脚本中,类似于C++中的include
              还可以把把配置文件之类的文件中的变量包含到其他脚本文件中

dd命令常用于对磁带或一般的磁带解压任务中出现的数据问题提出质疑或转换,但也可
用于创建定长文件。下面创建长度为1兆的文件m y f i l e。
dd if=/dev/zero of=myfile count=512 bs=2048

dd if=file1.txt of=file2.txt conv=lcase        大写字母换成小写字母
dd if=file1.txt of=file3.txt conv=ucase        小写字母换成大写字母

: ${_ANS:=$_DEFAULT}请教前辈这名话的意思。
如果变量_ANS为空,将变量_DEFAULT的值赋给它
最前面:是空操作 (相当于nop?)
这样shell就只对命令行处理完成赋值,其它啥也不干,去掉冒号会发现bash把$_ANS当命令进行执行并报错了


tput

tput init 使用前初始化

字符串输出-------->
名字    含义
bel    警铃
blink    闪烁模式
bold    粗体
civis    隐藏光标
clear    清屏
cnorm    不隐藏光标
cup    移动光标到屏幕位置(x,y)
el    清除到行尾
ell    清除到行首
smso    启动突出模式
rmso    停止突出模式
smul    开始下划线模式
rmul    结束下划线模式
sc    保存当前光标位置
rc    恢复光标到最后保存位置
sgr0    正常屏幕
rev    逆转视图
<---------字符串输出

数字输出----------->
名字    含义
cols    列数目
ittab    设置宽度
lines    屏幕行数
<---------数字输出

布尔输出----------->
名字    含义
chts    光标不可见
hs    具有状态行
<-----------布尔输出
echo -e ""\033[?25l" 关闭光标
echo -e "\033[?25h"

查找子串
cat /tmp/debug.log | perl -e 'while(<>) { if ($_ =~ /hd_uid=(\d+)/) { print "$1\n"; } } '  匹配每行"hd_uid="后面的数字
if [ ... ]
then
    ...
fi

exit num

case $i in
1)
    echo 1111;;
2)
    echo 2222;;
*)
    echo other;;
esac

basename 返回shell脚本名

var=$(n=1;while ((n<=$num));do echo $n;((n++));done)  双小括号表示算数运算
echo $var

>>1 2

可以把$var拿来做for循环用

整数运算:
[weibofengyun@localhost tfengyun_calc]$ ((a=a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
1
[weibofengyun@localhost tfengyun_calc]$ ((a=a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
2
[weibofengyun@localhost tfengyun_calc]$ echo $((a=a+1))
3
[weibofengyun@localhost tfengyun_calc]$ a=$((a=a+1))   
[weibofengyun@localhost tfengyun_calc]$ echo $a

4

[weibofengyun@localhost tfengyun_calc]$ a=$((a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
5
:s/procat/law/ 替换当前行第一个 procat为 law;

    :s/procat/law/g 替换当前行所有 procat为 law;

    :n,$s/procat/law/ 替换第n行开始到最后一行中每一行的第一个procat为law;

    :n,$s/procat/law/g 替换第n行开始到最后一行中每一行所有 procat为law,其中n 为数字,若n为“.”,则表示从当前行开始到最后一行;

    :.,200 s/^/xxx/g 把当前行到200行开头都加上xxx

    :%s/procat/law/(等同于 :g/procat/s//law/) 替换每一行的第一个procat为law;

    :%s/procat/law/g(等同于 :g/procat/s//law/g) 替换每一行中所有procat为law; ----->>>>>>>>>>>常用<<<<<<<<<<<<<<<<<<<<<<<---------

    :%s/procat/law/gc(等同于 :g/procat/s//law/gc) 一查询方式替换每一行中所有procat为law;

    若替换字符串中需要替换“/”,则不能使用“/”在命令中作分割符,此时可以可以使用“#”作为分隔符,当命令中出现“#”,则“/”不再被系统认作分隔符

    :s#procat/#law/# 替换当前行第一个procat/为 law/

    :%s/fields:get\w*("/fd./g 正则替换 fields:getUIntField(" fields:getStringField(" ----> fd.


     rpm -qpi rabbitmq-server-2.4.1-1.noarch.rpm

  516  yum search python26
  517  yum install python26-devel.x86_64
  518  easy_install-2.6 MySQL-python
  519  yum install myql-devel
  520  yum install mysql-devel
  521  yum install mysql-devel.x86_64
  522  easy_install-2.6 MySQL-python
 1008  rpm -qa | grep mysql
 1009  rpm -qa | grep python
 1010  rpm -ql MySQL-python
[xudongsong@zhuzhan_mg13 code_calculator]$ file filter.dic
filter.dic: UTF-8 Unicode text                              查看编码

while [ $var -qe 23 ]
while [[ $var -qe 23 ]]
while (($var<23))

diff file1 file2

diff --strip-trailing-cr file1 file2 忽略windows下行末^M和linux下行末的区别

-N  --new-file
              Treat absent files as empty. 不要放过新文件

-r 不要放过子目录

查看系统性能、磁盘io等指标的命令:
  489  vmstat -xdm 2
  490  iostat -xdm 2
  491  df -h
  492  top
  493  vmstat 2
  494  top


  495  dstat
mysql -h172.16.1.217 -usimilar -pqwer1234 similaranalysis
mysql -h172.16.1.217 -usimilar -pqwer1234 similaranalysis < result_sql_file > /dev/null    相当于在mysql命令行下执行source命令

load data infile '/tmp/result_file_00' replace into table t_results_00 fields terminated by ',' (iArticleID1,iArticleID2,iSimilar);

echo "load data infile '/tmp/result_file_$index_hex' replace into table t_results_$index_hex fields terminated by ',' (iArticleID1,iArticleID2,iSimilar);" | mysql -h172.16.1.217 -usimilar -pqwer1234 similaranalysis    相当于在mysql命令行下执行load命令

也可以用mysql -e 'xxx' (However, if the MySQL client software is installed on the remote machine, you can instead use a client command such asmysql -e "SELECT ..." >file_name to generate the file on the client host.)

MySQL replace into 有三种形式:
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...

3. replace into tbl_name set col_name=value, ...

sync是个非常好的工具用来增量备份和把网站做镜像(mirror).

1. 同步一台机子中的两个文件夹.
引用
rsync –av /path/to/source /home/nixtutor/rsync/daily
2. 同步一个机子中的文件夹到另外一台机子
引用
rsync –av /path/to/source [email protected]:/home/nixtutor/rsync/daily
3. 默认的rsync只会传输新的文件和文件增量,但是不会删除不存在的文件.如果你确实想要删除已经不存在文件,你需要加上"–delete"参数.
引用
rsync –av –delete /path/to/source [email protected]:/home/nixtutor/rsync/daily
4. 下面这个例子,我们只同步.iso文件.
引用
rsync -zrv –include="*.iso" host:/home/nixtutor /home/denny

但是如果遇到ssh不是22端口的呢?man了半天,其实很简单
rsync -zvrtopg -e ‘ssh -p 端口

 

同步报错

 

rsync: failed to set permissions on "/data jj/gameserver/startsh/conf/refreshConn.sh": Operation not permitted (1)

解决:Replace -avz with -rltvz. (The -a option is equivalent to -rlptgoD.)

 

CHANGE MASTER TO MASTER_HOST='172.16.1.217',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000224',MASTER_LOG_POS=669460601;

show create table t_titles \G;

show index from wom_comment_sina; 列出数据表的索引

cat tmp_2 | uniq -c   统计各相同行出现的次数
cat 1.txt |awk '{sum += $1};END

GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
grant all privileges on vtdc.* to [email protected] identified by ‘123′;

grant all privileges on vtsimilaranalysis.* to similar@'%' identified by 'qwer1234';

对于需要执行select into outfile 语句的用户需要授予FILE权限:GRANT FILE ON *.* TO 'XXX'@'%' IDENTIFIED BY 'XXX';

对于需要执行grant语句的用户需要授权的时候加上with grant option: grant all privileges on *.* to root@'%' identified by '123456' with grant option;

如果root密码忘记怎么办呢?可以去/etc/my.cnf中加入选项skip-grant-tables,重启mysql,用root登录进去以后直接修改mysql.user表中的数据(带skip-grant-tables选项启动的mysql不能执行grant语句),密码要用password('xxxx')加密更新到对应列

revoke all privileges on *.* from mastert@'%'; 取消授权(该用户还是可以连上Mysql,只是没有操作权限,在mysql.user表中还是可以看到该用户)

drop user weibofengyun; 删除用户(mysq.user表中该用户信息也会消失)

drop user weibofengyun@'%';

mysql授权后要flush privileges;才能生效
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
sar -n DEV 2  网卡流量
iostat -xkd 3
ALTER TABLE t_results_9c ADD INDEX ( iSimilar );
ALTER TABLE t_results_9c DROP INDEX iSimilar;
mysql -e "kill 172222"

mysqlcheck -c -r dbname tablename

等效于mysql命令行下执行repair table tablename

在大数据量load data时候为加快速度可以先把key屏蔽掉,入库完成后再开启key:
方案1:
    a.   Execute a FLUSH TABLES statement or a mysqladmin flush-tables command.

    b.    Use myisamchk --keys-used=0 -rq /path/to/db/tbl_name to remove all use of indexes for the table.

    c.    Insert data into the table with LOAD DATA INFILE. This does not update any indexes and therefore is very fast.

    d.    If you intend only to read from the table in the future, use myisampack to compress it. See Section 13.5.3.3, “Compressed Table Characteristics”.

    e.   Re-create the indexes with myisamchk -rq /path/to/db/tbl_name. This creates the index tree in memory before writing it to disk, which is much faster that updating the index during LOAD DATA INFILE because it avoids lots of disk seeks. The resulting index tree is also perfectly balanced.

    f.    Execute a FLUSH TABLES statement or a mysqladmin flush-tables command.
方案2:
    ALTER TABLE tbl_name DISABLE KEYS;
    ALTER TABLE tbl_name ENABLE KEYS;


crontab
分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期(1-7) 命令

awk字符串处理:
gsub(r,s)     在整个$0中用s替代r
gsub(r,s,t)     在整个t中用s替代r
index(s,t)     返回s中字符串t的第一位置
length(s)     返回s长度
match(s,r)     测试s是否包含匹配r的字符串
split(s,a,fs)     在fs上将s分成序列a
sprint(fmt,exp)     返回经fmt格式化后的exp
sub(r,s)     用$0中最左边最长的子串代替s
substr(s,p)     返回字符串s中从p开始的后缀部分
substr(s,p,n)     返回字符串s中从p开始长度为n的后缀部分

cat tuiguang.urlip.data.12 | awk '{url=substr($2,0,index($2,"hf=")-2); if (url!=last){print $0;} last=url;}'
 cat tuiguang.urluid.data.12 | awk '{url=substr($2,0,index($2,"hf=")-2); if (url!=last){print $1,count"-"$2,$3,$4,$5;count++;} last=url;}'>urluid.12
 cat result.txt | awk -F'\t' '{docId=$2; $1=""; $2=""; print docId,":",$0}' > new_result.txt

mysql命令行下使用load data命令时加上LOCAL选项会从命令行的客户端机器寻找数据文件,不加LOCAL选项会从server端寻找文件。

source命令是mysql客户端的功能,不是sql语句,所以source处理的sql文件只能是客户端机器上的文件

source后接的文件路径不需要用引号


strace -p 23656

 python /usr/lib64/python2.4/site-packages/jcc/__init__.py
 python /usr/lib64/python2.4/site-packages/jcc/__init__.py --jar paoding-analysis.jar --classpath lib/lucene-core-2.2.0.jar --classpath lib/commons-logging.jar --classpath lib/lucene-analyzers-2.2.0.jar --classpath lib/lucene-highlighter-2.2.0.jar --python paoding --build
 sudo python /usr/lib64/python2.4/site-packages/jcc/__init__.py --jar paoding-analysis.jar --classpath lib/lucene-core-2.2.0.jar --classpath lib/commons-logging.jar --classpath lib/lucene-analyzers-2.2.0.jar --classpath lib/lucene-highlighter-2.2.0.jar --python paoding --install
 
 bash下面寻找历史命令:ctrl+r

 某些输入状态下不能删除时可以用crtl+backspace删除

show staus; 查看状态
show status like '%Open_tables%';  打开的数据表数量

 show processlist; 查看mysql正在执行的操作(进程)

show full processlist;

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; 与上一行等效,可做过滤等操作(如下所示)

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST where USER = 'womht' and command != 'Sleep' order by time asc\G

select * from information_schema.processlist where info is not null\G

sudo mysqladmin processlist 与上述查询等效

查看Mysql执行的所有SQL语句:http://stackoverflow.com/questions/568564/how-can-i-view-live-mysql-queries

    show processlist看不到很快就结束的SQL

    慢查询日志又只能看到耗时达到阀值的SQL

    要看实时的、所有的SQL就得从general_log_file来看了,SHOW VARIABLES LIKE "general_log%"; SET GLOBAL general_log = 'ON';

show engines; 查询mysql的引擎

show variables; 查看所有的配置变量

show variables like '%log%'; 查看包含log的配置变量

上述两个mysql交互模式下的命令跟bash命令行下的如下命令等效:

$ mysqladmin variables

mysql打开log_slow_queries记录慢查询,用--log-slow-queries[=file_name] --long_query_time=# 启动mysqld

或者把这些条目添加到my.cnf,然后用/etc/init.d/mysqld启动服务也是一个效果(貌似新版本改成slow_query_log了)

参考:http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html


 sudo /sbin/tune2fs -l /dev/sda2 | grep inodes  查看剩余节点数

 rename table t_wiki_doc_text_1w to t_wiki_doc_text;  #数据表的重命名

数据表的复制怎么搞呢?(create table like可以创建一个相同结构的表!)

mysql> select * from xds;
+----+------+-----+
| id | a    | b   |
+----+------+-----+
|  1 | good | 100 |
+----+------+-----+
1 row in set (0.01 sec)
mysql> create table xds_2 like xds;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into xds_2 select * from xds;      
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> rename table xds_2 to xds_1;
Query OK, 0 rows affected (0.00 sec)

拷贝大文件命令nc,不需要加密所以比scp快
nc -l port > filename  接收方
nc destip port < filename  发送方

导出csv格式文件:
select * from t_wiki_doc_text into outfile '/data/t_wiki_doc_text' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n'; #换行有问题,会破坏csv格式
select iDocID, replace(replace(ifnull(sTitle,''),'\n',' '),'\r',' ') as title, replace(replace(ifnull(sContent,''),'\n',' '),'\r',' ') as content from t_wiki_doc_text limit 0,1000 into outfile '/data/t_wiki_doc_text' fields terminated by ',' escaped by '\\' optionally enclosed by '"' lines terminated by '\n'; #回车和换行都替换成了空格

    nc和tar可以用来快速的在两台机器之间传输文件和目录,比ftp和scp要来得简单的多。由于nc是一个超轻量的命令,所以一般busybox都会集成它。当一个linux终端,比如linux pda, 通过usblan的方式连接到另一台linux主机的时候,这样的嵌入式终端上一般不会集成ftp server, ssh server这样比较笨重的服务,这个时候, nc可能成为唯一的上传手段。  
      
    比如将机器A上的mytest目录上传到到机器 B(192.168.0.11)上,只需要:  
      
    在机器B上,用nc来监听一个端口,随便就好,只要不被占用;并且将收到的数据用tar展开。-l代表监听模式。  
    #nc -l 4444 |tar -C /target/dir -xf -  
      
    然后,在A上通过nc和 tar发送mytest目录。使用一致的4444的端口。  
    #tar -C mytest|nc 192.168.0.11 4444  


g++编译c++程序时如何解决动态库的问题
拿clucene举例,cmake、make install之后clucene动态库在/usr/local/lib/下面(libclucene_core.so),静态库在/usr/local/include/下面
编译g++ -o test test.cpp -L/usr/local/lib -lclucene_core  (把so文件的前缀lib和后缀名去掉然后用-l连接上)
运行前把动态库的位置设置到环境变量中,export LD_LIBRARY_PATH=/usr/local/lib, 然后./test即可
g++ -DTEST   加入预编译宏TEST

g++ -g         加入调试信息,可用gdb调试

 

如何避免每次都export LD_LIBRARY_PATH:

[root@localhost tutorial]# cat /etc/ld.so.conf.d/boost_python.conf
/usr/local/boost/lib/
[root@localhost tutorial]# sudo ldconfig


vim /etc/rc.local  开机启动
chkconfig --list 查看开机启动的项目,对应/etc/init.d下面的程序
/etc/rc0.d .. /etc/rc6.d 对应的是六个运行级别(runlevel)要启动的程序


samba文件共享
apt-get install samba (在ubuntu上做的共享)
vi /etc/samba/smb.conf
smbapasswd -a username
从其他机器访问: \\ip\username\

vi ~/.bashrc , add :
alias sss='ssh -p 50718'
alias sss217='ssh -p 50718 172.16.1.217'


ubuntu下安装软件 apt-get install xxx
ubuntu下查询已安装软件 aptitude search xxx
ubuntu下查询仓库里的软件 apt-cache search xxx

在ubuntu下用ctrl+alt+[f1..f6]可以打开各个tty终端,用ctrl+alt+f7是图形界面终端,用putty等连接上去的是pts终端(模拟终端,不是真正的终端)

if [ $# -lt 8 ]
then
    echo -e "\nUsage:./create_csv.sh host port user passwd db csv_file_dir docs_per_dir docs_per_file\n"
    exit 1
fi

db_host=$1
db_port=$2
db_user=$3
db_passwd=$4
db_name=$5
csv_file_dir=$6
docs_per_dir=$7
docs_per_file=$8

verf=`expr $docs_per_dir % $docs_per_file`
if [ $verf -ne 0 ]
then
    echo "$docs_per_dir%$docs_per_file != 0 "
    exit 1
fi

filename="/tmp/t_wiki_doc_text"
if [ -f $filename -o -d $filename ]
then
    echo "'$filename' exists alreadly. rm it first."
    exit 1
fi

starttime=`date`
echo "started at $starttime.."

sql="select a.DOC_ID, b.DOC_SCORE as score, replace(replace(ifnull(a.DOC_TITLE,''),'\n',' '),'\r',' ') as title, replace(replace(ifnull(a.DOC_TEXT,''),'\n',' '),'\r',' ') as content from t_wiki_doc_text as a, t_wiki_doc as b where a.DOC_ID = b.DOC_ID and b.DOC_STATE = 1  into outfile '$filename' fields terminated by ',' escaped by '\\\' optionally enclosed by '\"' lines terminated by '\n';"
echo $sql | mysql -h$db_host -P$db_port -u$db_user -p$db_passwd $db_name

endtime=`date`
echo "$endtime dump t_wiki_doc_text to '$filename' done."

if [ -d $csv_file_dir -o -f $csv_file_dir ]
then
    rm -rf $csv_file_dir
fi
mkdir $csv_file_dir

files_per_dir=`expr $docs_per_dir / $docs_per_file`
lineNum=`wc -l $filename |awk '{print $1;}'`
fileNum=`expr ${lineNum} + ${docs_per_file} - 1`
fileNum=`expr ${fileNum} / ${docs_per_file}`
dirNum=`expr ${fileNum} + ${files_per_dir} - 1`
dirNum=`expr ${dirNum} / ${files_per_dir}`

for ((i=1; i<=$fileNum; i++))
do
    dirIndex=`expr $i + $files_per_dir - 1` #1,2,3...
    dirIndex=`expr $dirIndex / $files_per_dir`
    dirNum2=`expr $dirIndex \* $docs_per_dir`
    dirNum1=`expr $dirNum2 - $docs_per_dir + 1`
    dirPath="$csv_file_dir/$dirNum1-$dirNum2"
    if [ ! -d $dirPath ]
    then
        mkdir $dirPath
    fi
    fileNum2=`expr $i \* $docs_per_file`
    fileNum1=`expr $fileNum2 - $docs_per_file + 1`
    sed -n "${fileNum1},${fileNum2}p" $filename > "$dirPath/$fileNum1-$fileNum2"
done

endtime=`date`
echo -e "$endtime cut file to small files '$csv_file_dir' done.\n"


echo " set @seqid:=0;select @seqid:=@seqid+1 as seqid,id from t_test into outfile '/tmp/t_test';" | mysql -hlocalhost -uroot -pqwer1234 test    给select的结果加上行号


---------------------------------------------------------------一个导出csv文件的小脚本,虽小却耗我不少时间------------------------------------------------------------------
set -e   设置之后,脚本出错(异常)即停止,不会继续往下执行(set +e 作用相反)

#!/bin/bash
if [ $# -lt 2 ]
then
    echo -e "\nUsage:/bash/sh $0 input('host,port,user,passwd,db,docs_per_file') output('csv_file_dir')\n"
    exit 1
fi

input=$1
output=$2

db_host=`echo $input | awk -F, '{print $1}'`
db_port=`echo $input | awk -F, '{print $2}'`
db_user=`echo $input | awk -F, '{print $3}'`
db_passwd=`echo $input | awk -F, '{print $4}'`
db_name=`echo $input | awk -F, '{print $5}'`
docs_per_file=`echo $input | awk -F, '{print $6}'`
csv_file_dir=$output

filename="/tmp/t_wiki_doc_text"
if [ -f $filename -o -d $filename ]
then
    echo "'$filename' exists alreadly. rm it first."
    exit 1
fi

starttime=`date`
echo "started at $starttime.."

sql="set @seqid:=0; select @seqid:=@seqid+1 as seqid, a.DOC_ID, b.DOC_SCORE as score, replace(replace(ifnull(a.DOC_TITLE,''),'\n',' '),'\r',' ') as title, replace(replace(ifnull(a.DOC_TEXT,''),'\n',' '),'\r',' ') as content from t_wiki_doc_text as a, t_wiki_doc as b where a.DOC_ID = b.DOC_ID and b.DOC_STATE = 1  into outfile '$filename' fields terminated by ',' escaped by '\\\' optionally enclosed by '\"' lines terminated by '\n';"
echo "$sql" | mysql -h$db_host -P$db_port -u$db_user -p$db_passwd $db_name

endtime=`date`
echo "$endtime dump t_wiki_doc_text to '$filename' done."

if [ -d $csv_file_dir -o -f $csv_file_dir ]
then
    rm -rf $csv_file_dir
fi
mkdir $csv_file_dir

lineNum=`wc -l $filename |awk '{print $1;}'`
fileNum=`expr ${lineNum} + ${docs_per_file} - 1`
fileNum=`expr ${fileNum} / ${docs_per_file}`
for ((i=1; i<=$fileNum; i++))
do
    fileNum2=`expr $i \* $docs_per_file`
    fileNum1=`expr $fileNum2 - $docs_per_file + 1`
    if [ $fileNum2 -gt $lineNum ]
    then
        fileNum2=$lineNum
    fi
    sed -n "${fileNum1},${fileNum2}p" $filename > "$csv_file_dir/$fileNum1-$fileNum2"
done

endtime=`date`
echo -e "$endtime cut file to small files '$csv_file_dir' done.\n"


if [ $# -lt 7 ]
then
    echo -e "\nUsage:./create_csv.sh host port user passwd db csv_file_dir docs_per_file\n"
    exit 1
fi

db_host=$1
db_port=$2
db_user=$3
db_passwd=$4
db_name=$5
csv_file_dir=$6
docs_per_file=$7

filename="/tmp/t_wiki_doc_text"
if [ -f $filename -o -d $filename ]
then
    echo "'$filename' exists alreadly. rm it first."
    exit 1
fi

starttime=`date`
echo "$starttime started.."
if [ -f $filename ]
then
    rm $filename
    echo "remove old file '$filename'"
fi

sql="select a.DOC_ID, b.DOC_SCORE as score, replace(replace(ifnull(a.DOC_TITLE,''),'\n',' '),'\r',' ') as title, replace(replace(ifnull(a.DOC_TEXT,''),'\n',' '),'\r',' ') as content from t_wiki_doc_text as a, t_wiki_doc as b where a.DOC_ID = b.DOC_ID and b.DOC_STATE = 1  into outfile '$filename' fields terminated by ',' escaped by '\\\' optionally enclosed by '\"' lines terminated by '\n';"
echo $sql | mysql -h$db_host -P$db_port -u$db_user -p$db_passwd $db_name

endtime=`date`
echo "$endtime dump t_wiki_doc_text to '$filename' done."

if [ -d $csv_file_dir -o -f $csv_file_dir ]
then
    rm -rf $csv_file_dir
fi
mkdir $csv_file_dir

lineCount=0
file="$csv_file_dir/1-$docs_per_file"
if [ -f $file -o -d $file ]
then
    rm -rf $file
    if [ $? -ne 0 ]
    then
        echo "rm '$file' failed."
        exit 1
    fi
fi
---------------------------------------------------------------一个导出csv文件的小脚本,虽小却耗我不少时间------------------------------------------------------------------

dpkg显示安装包的头文件以及库的路径

dpkg -L libalberta2-dev

MySQL只在认为走索引可以筛去85%以上数据的时候,才使用索引,如果达不到这个标准,索引是无意义的。
前缀索引:MySQL可以利用索引的前向部分,但不可以利用后向部分,不支持反向索引。
    例如:SELECT col2 FROM table WHERE col1=1;可以使用索引(col1,col2),但不可以使用(col2,col1).
不等比较的优化:如果索引的前向部分在WHERE中是等于,那么可以使用索引,如果索引的前向部分再WHERE中是不等比较,那么不可以为后面的等于比较使用索引
    例如:SELECT col1 FROM table WHERE col2=1 AND col3 >10;可以完全使用索引(col2,col3),但只可以使用(col3,col2)的前缀,
排序的优化:可以在条件是等于的时候继续使用索引排序,或者条件中的不等于字段就是排序字段。
    例如:SELECT col1 FROM table WHERE col2=1 AND col3>0 ORDER BY col3,可以完全使用索引(col2,col3)避免排序。但条件是col2<1 AND col3=0 ORDER BY col3时则只能使用col2排除记录,不可以用来排序。
GROUP BY/DISTINCT也是以排序为基础,优化同上。

ubuntu下alt+f2可以运行应用程序,gnome-terminal可以启动终端

sudo yum install python-setuptools
sudo easy_install virtualenv
virtualenv venv
cd venv/
bin/easy_install django

要安装的库有多个版本时,可以用easy_install PackageName==1.2.3指定版本号做安装http://peak.telecommunity.com/DevCenter/EasyInstall#changing-the-active-version

python有多个版本时候,如何用easy_install把包安装到指定的python版本中去:/usr/local/bin/python2.6 -m easy_install ThePkgName

~/venv/bin/python manage.py runserver 0.0.0.0:8000
~/venv/bin/easy_install python-memcached
~/venv/bin/python manage.py fetchfollowers --screen_name 吓人的鸟
~/venv/bin/python manage.py syncdb
~/venv/bin/python manage.py runserver 0.0.0.0:8000

python -m easy_install twisted 用easy_install把twisted库安装到指定的Python环境下(which python可以看到这条命令的python是什么环境下的python)

python程序数据库入库报错

Traceback (most recent call last):
  File "main.py", line 225, in
    (hashlib.md5(imgUrl).hexdigest(), imgUrl, database.MySQLdb.Binary(imgData)))
  File "/home/dongsong/boosencms/src/boosenspider/database.py", line 108, in execute
    affects = cursor.execute(sql, args)
  File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 174, in execute
  File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
_mysql_exceptions.OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")


解决办法:设置max_allowed_packet

[root@bogon dongsong]#
[root@bogon dongsong]# vi /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_allowed_packet=10485760

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid



不中止服务程序进程直接将日志文件移走,两种方法:

 

       1.在程序中提供对信号SIGUS1的处理程序,收到SIGUS1重新打开输出文件out.txt

          mv     out.txt     xx/xx      (inode不会改变)

         kill     SIGUS1  进程ID

 

       2.程序是别人写的,没有收到信号则重新打开文件的处理逻辑

          cp     out.txt   xx/xx (inode不会改变)

          echo   -n >out.txt 截断out.txt,out.txt的inode不会改变,内容被清空

 

 

 

ntpdate time.windows.com && hwclock -w 

ntpdate pool.ntp.org
 

linux设置时间 date -s

写入bios神马的 clock -w

linux时间校准(网络同步)ntpdate

如果是virtualBox中的linux系统,就算关闭网络时间同步可能也不行,因为virtualBox会自动根据宿主机器对虚拟系统做时间校正,这种情况可以修改实体机时间来做测试

cat /proc/partitions 查看分区信息

yum install安装的包可以用 yum remove删除
 

easy_install 安装的python包可以用easy_install -m 删除,貌似更好的方式使用pip uninstall pkg_name (http://stackoverflow.com/questions/1231688/how-do-i-remove-packages-installed-with-pythons-easy-install)

 

$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py

 


源码编译的包信息无法通过工具查询到和管理,需要自行记住安装路径,卸载时也需要手动从安装目录删除,所以应该尽量使用yum rpm apt等包管理工具

检查本地某端口是否在监听

[dongsong@bogon api]$ telnet localhost 9306
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused

rpm -ivh http://mirrors.sohu.com/fedora-epel/6/i386/epel-release-6-7.noarch.rpm 从url安装rpm包

神奇的sql,神马意思你懂的

update t_site_bbs set count = (select count(*) from t_raw_data where t_raw_data.site = t_site_bbs.site and t_raw_data.bbs = t_site_bbs.bbs) where (site,bbs) in (select site,bbs from t_raw_data)

Image包的问题

#IOError: decoder jpeg not available  
    #Fix:  
    #First remove your last install!  
    rm -rf /usr/lib/python2.4/site-packages/PIL  
    rm /usr/lib/python2.4/site-packages/PIL.pth  
    rm ~/Imaging-1.1.6  
      
    #Make sure you install at the libraries for both JPEG support and FreeType2:  
    yum install libjpeg  
    yum install libjpeg-devel  
    yum install freetype  
    yum install freetype-devel  
      
    #Get PIL again and do the install:  
    wget http://effbot.org/media/downloads/Imaging-1.1.6.tar.gz  
    tar -zxvf Imaging-1.1.6.tar  
    cd Imaging-1.1.6/  
    python setup.py build_ext -i  
      
    #Run the included test to make sure everything now works:  
    python selftest.py  
      
    #If everything worked do the real install:  
    $ python setup.py install  

create database official_boosencms CHARACTER SET utf8;

用history找到的命令可以用 !命令号 再次执行,类似于 !xxx 执行以xxx开头的上一条命令

ls -l /proc/8634/task/ 可以看到进程的线程信息

连接数决定了MySQL并发处理的能力,查看连接数
show variables like "max_connections";
把最大连接数更新到600:
set global max_connections = 200;
也可以在配置文件中改(见mysql调优,只是要重启)

set global general_log = ON; 把常规查询日志打开,所有查询都会记录到 general_log_file指定的文件中

查看memcached状态(参考http://www.xmsigh.com/node/61)

printf "stats\r\n" | nc 127.0.0.1 11211

stats | stats slabs | slabs items (more is here http://lzone.de/articles/memcached.htm)

要让mamcached的老数据不被新数据用“最近最少使用”原则挤出去,应该在启动memcached的时候加上参数-M,具体可参照memcache -h

要修改memcached的默认启动参数,可查看/etc/rc.d/init.d/memcached (/etc/rc.d/init.d等同于/etc/init.d,二者由符号链接关联在了一起)找到相关配置或配置文件路径并做修改(默认配置文件是/etc/sysconfig/memcached)

select version(); 显示mysql版本

--------------------------------------------------------------------------------------------------------------------------------------------------------------->

 wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.25a.tar.gz/from/http://cdn.mysql.com/
 tar zvxf mysql-5.5.25a.tar.gz
 cd mysql-5.5.25a
 sudo yum install cmake -y
 sudo yum install ncurses ncurses-devel -y
 sudo yum install bison -y
 rm CMakeCache.txt
 cmake -DCMAKE_INSTALL_PREFIX=/home/xudongsong/apps/mysql-5.5.25/ .
 make -j 4 #利用4核CPU提速
 make install
 cd ~/apps/mysql-5.5.25/scripts/
 ./mysql_install_db --help
 sudo ./mysql_install_db --datadir=/home/xudongsong/apps/mysql-5.5.25/data/ --user=mysql --basedir=/home/xudongsong/apps/mysql-5.5.25/ --no-defaults
 cd ../bin/
 ./mysqld --verbose --help | less
 sudo chown -R  mysql:mysql ../data
 sudo ./mysqld --no-defaults -u mysql -P3308 -h/home/xudongsong/apps/mysql-5.5.25/data/

sudo ./mysqld_safe --defaults-file=../my.cnf (相对于上一行的启动方式,更推荐这种)

<---------------------------------------------------------------------------------------------------------------------------------------------------------------源码安装mysql-5.5.25

mkfs -t ext3 /dev/sdc 磁盘格式化

mount -t ext3 /dev/sdc /data/ 挂载

vi /etc/fstab 自动挂载

/dev/sdc                /data                   ext3    defaults        0 0

后面两个数字的含义:第一个表示dump 。一个备份工具。0就表示从不备份;第2个0表示fsck检查的顺序。0表示不检查。

[dongsong@bogon python_study]$ mail -s "hello,吓人的鸟" [email protected]
hello,can you received it ?
EOT

centos安装中文输入法

sudo yum install ibus ibus-pinyin -y

系统---首选项---输入法 启动ibus输入法

cat /proc/pid/status 各参数意义(man proc)

Name 应用程序或命令的名字
State 任务的状态,运行/睡眠/僵死/
SleepAVG 任务的平均等待时间(以nanosecond为单位),交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会相应地更大一些,所以计算出来的优先级也会相应高一些。
Tgid 线程组号
Pid 任务ID
Ppid 父进程ID
TracerPid 接收跟踪该进程信息的进程的ID号
Uid Uid euid suid fsuid
Gid Gid egid sgid fsgid
FDSize 文件描述符的最大个数,file->fds
Groups
VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
VmStk(KB) 任务在用户态的栈的大小 (stack_vm)
VmExe(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE 该进程的所有页表的大小,单位:kb
Threads 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。
SigQ 待处理信号的个数
SigPnd 屏蔽位,存储了该线程的待处理信号
ShdPnd 屏蔽位,存储了该线程组的待处理信号
SigBlk 存放被阻塞的信号
SigIgn 存放被忽略的信号
SigCgt 存放被俘获到的信号
CapInh Inheritable,能被当前进程执行的程序的继承的能力
CapPrm Permitted,进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的,CapEff是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性
CapEff Effective,进程的有效能力

要使用终端的rz和sz功能上传下载文件:sudo yum install lrzsz

配置yum源(yum不好使了...):

--->start

 YumRepo Error: All mirror URLs are not using ftp, http[s] or file.  Eg. $releasever is not a valid release or hasnt been released yet/

wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
sudo rpm -ivh epel-release-6-7.noarch.rpm
yum repolist
sudo yum install yum-priorities -y
在/etc/yum.repos.d/epel.repo的epel部分加入
priority=10
yum check-update

参考:http://www.linuxmail.info/add-epel-centos-6/

<----end

查看自己的出口公网ip

Windows: tracert www.google.com

Linux: wget http://members.3322.org/dyndns/getip

           cat getip                    /*got the ip*/

局域网IP段

A类:10.0.0.0 后三位自由分配
B类:172.16.0.0 至172.31.0.0 后两位自由分配
C类:192.168.0.0 后两位自由分配

shell做文件内容替换(下述是一个文件的例子,多个文件自己用for循环)

sed 's/sinaweibo/weibo/g' ./templates/weibo/maintain/reposts.html > t.html

names=`cat /tmp/rename.txt | awk -F: '{print $1}'`;for name in $names; do sed 's/sinaweibo/weibo/g' $name > tmpfile; cp -f tmpfile $name;done;

2013-01-27成老师分享:

start--->

lsmod
modinfo
lspci
ls /sys
ls /proc
mount
runlevel                #运行级别
telinit 3                #切换运行级别
init 3
dmesg                    #系统开机信息
last                    #登录、开关机历史
ls /var/log/message        #内核和一些用户日志
ls /etc                    #系统配置
rpm -qf /etc/localtime    #查看一个文件是由哪个软件包安装的
rpm -ql glibc            #查看一个软件包安装了哪些文件

 

ldd                     #查看一个程序链接了哪些动态库

 

用nm external.so查看动态库中的符号


<-----end

查看带宽使用情况 nethogs

linux下把文件和目录用树状结构显示出来

sudo yum install tree -y

tree -d 把所有目录用树状结构显示

 

 

tree -a 把所有目录和文件用树状结构显示

 

 

tree -afsDF

tree -afsDtF

-f 打印每个文件和目录的全路径

-s 打印文件大小

-D 打印文件最后修改时间

-t 按照最后修改时间排序(默认降序,不知道咋按升序排)

-r 按照名字反序排(默认是按照名字的字母升序排)

-F 把目录后面加上/,便于区分文件和目录

-L 2 只递归两层

 

删除linux下文件结尾的^M: :%s/^M$//g  (^M要用ctrl+V,ctrl+m来输入,不能用键盘上的^和M来拼凑) 其他方式参见:http://blog.csdn.net/huganle/article/details/7821199

 

vim打开文件的时候不显示^M? 用vim -b xxx

dos2unix file也可以做上述转换

或者用vim filename, :set ff=unix


 grep -rn '^M' 2 | grep php | grep -v ".svn" | grep -v 二进制 | awk -F: '{print $1}' | uniq | xargs dos2unix

防火墙配置端口转发(/etc/sysconfig/iptables):

-A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.20.0.xxx:15672
-A POSTROUTING -p tcp -m tcp --dport 15672 -j SNAT --to-source 192.168.1.xxx

PREROUTING 是进来的, --dport :如果目的端口是80端口, DANT:目的端口,就转发到 172.。。。的15672端口

POSTROUTONG是出去的,--dport:如果目的端口是15672端口, --SNAT:改变源地址。就把源地址变成192.168.1.xxx(因为172.。。上面设置了 只有192.168.1.xxx可以访问这个15672端口)
再在211上设置端口转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward 。默认是0。每次重启都要运行这个命令。

防火墙在指定端口接受指定IP机器的tcp连接

-A INPUT -p tcp --dport 80 -j ACCEPT

 

-A INPUT -s 192.168.1.211 -p tcp --dport 15672 -j ACCEPT

 

 

经过我的试验(2014.9.12)表明:防火墙把端口访问关闭,在该端口已经建立的连接没被立马掐断,只是数据不再继续转发了,所以客户端连接应该会在没收到ping包的情况下(对我们游戏项目而言)被掐断

[root@localhost skynet]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#-A INPUT -m state --state NEW -m tcp -p tcp --dport 9999 -j ACCEPT #必须加在REJECT(也就是下面那两行)之前!否则无效!!!
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


如何确定某个端口是被什么进程占用(监听)的?lsof -i :port

[dongsong@localhost twisted]$ netstat -lntp
(No info could be read for "-p": geteuid()=500 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:35698               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 :::111                      :::*                        LISTEN      -                   
tcp        0      0 :::80                       :::*                        LISTEN      -                   
tcp        0      0 :::22                       :::*                        LISTEN      -                   
tcp        0      0 ::1:631                     :::*                        LISTEN      -                   
tcp        0      0 :::40856                    :::*                        LISTEN      -                   
[dongsong@localhost twisted]$ lsof -i :80
[dongsong@localhost twisted]$ sudo lsof -i :80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   2020   root    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2080 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2081 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2082 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2083 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2084 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2085 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2086 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2087 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)

lsof是用来列出已打开文件的

[dongsong@localhost boosencms]$ lsof | grep deleted
vim       2383  dongsong    3u      REG  253,0    12288  59742 /tmp/.tt.swp (deleted)


mutt发送邮件:
echo '哈罗,哈罗,能收到么?'| mutt -s 'debug: can you see it' [email protected]

数组:
[weibofengyun@localhost tfengyun_calc]$ arr[0]='a'
[weibofengyun@localhost tfengyun_calc]$ arr[1]='b'
[weibofengyun@localhost tfengyun_calc]$ arr[2]='c'
[weibofengyun@localhost tfengyun_calc]$ echo $arr
a
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[0]}
a
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[1]}
b
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[2]}
c
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[*]}
a b c
[weibofengyun@localhost tfengyun_calc]$ arr[10]='cccccc'
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[*]}
a b c cccccc
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[10]}
cccccc

函数:
[weibofengyun@localhost ~]$ func() { if [[ $1 != 0 ]]; then echo Good bye.; exit; fi }                    
[weibofengyun@localhost ~]$ func 0
[weibofengyun@localhost ~]$

drop table if exists tmp_user_followers_ids; 如果表存在就删除,貌似创建删除数据库、创建删除数据表都有对应语法,具体参考官方文档

查看binlog
mysqlbinlog --start-position=205222565 --stop-position=205223589 104-relay-bin.000198

od 格式化输出文件中的数据,此命令主要用来查看保存在二进制文件中的值。-c 按照字符输出

cat - getip.1 < 25.sql    #“-”表示标准输入
cat /dev/fd/0 getip.1 < 25.sql     #“/dev/fd/0”和这个等效,在c程序中也可以用/dev/fd/0作为标准输入文件来打开

Unix环境高级编程第三章的习题:
shell从左到右执行命令行,所以
a.out > outfile  2>&1
首先设置标准输出到outfile,然后执行dups将标准输出复制到描述符2(标准错误)上,其结果是将标准输出和标准错误设置为相同的文件,即描述符1和2指向相同的文件表项。
而对于命令行,
a.out 2>&1 > outfile
由于首先执行dups,所以描述符2成为终端(假设命令是交互执行的),标准输出重定向到outfile。结果是描述符1指向outfile的文件表项,描述符2指向终端的文件表项。

今天(2013.9.18)遇到一个小问题
吓人的鸟  16:17:09
为什么我用myql -P不管指定3303还是3318都进到同一个数据库去了?
成老师  16:19:35
可能用的是socket连进去的,你指定 -h 127.0.0.1 -P 3303 试试看?
吓人的鸟  16:19:43
还真是....


apache(httpd)虚拟主机配置(多个端口提供不同服务)

        DocumentRoot /var/www/html/normal
       
                Order allow,deny
                Allow from all
       




        DocumentRoot /data/weibofengyun/workspace-php/tfengyunmgr/2
        ServerName www.tfengyun.com
        ErrorLog logs/www.tfengyun.com-error_log
        CustomLog logs/www.tfengyun.com-access_log common
       
                Order allow,deny
                Allow from all
       




        DocumentRoot /data/weibofengyun/workspace-php/tfengyun140-migrant/
        ServerName vip2.tfengyun.com
        ErrorLog logs/vip2.tfengyun.com-error_log
        CustomLog logs/vip2.tfengyun.com-access_log common
       
                Order allow,deny
                Allow from all
       




同时在httpd.conf中加入
Listen 80
Listen 8080

perror error_number 显示系统错误码的信息
一个复制并修改编码的小脚本

[dongsong@localhost proj.android]$ cat copy_file.sh
#!/bin/sh
fromDir=/media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Classes/
toDir=/data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/
fromFiles=`ls $fromDir`
for fromFile in $fromFiles
do
        #echo $fromFile
        encoding=`file $fromDir$fromFile | awk '{print $2}'`
        #echo $encoding
        if [[ $encoding -eq "UTF-8"  ]]
        then
                /bin/cp -rf $fromDir$fromFile $toDir$fromFile
                echo copied file $fromDir$fromFile
        else
                iconv -f GB2312 -t UTF-8 $fromDir"$fromFile" > $toDir"$fromFile"
                echo iconved file $fromDir$fromFile
        fi
done
#/bin/cp -rf /media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Classes/* /data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/
/bin/cp -rf /media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Resources/* /data/android/cocos2d-2.0-x-2.0.3/bomb/Resources/

chown dongsong:dongsong /data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/*
chown dongsong:dongsong /data/android/cocos2d-2.0-x-2.0.3/bomb/Resources/*

 xhost +si:localuser:apache 授予apache用户访问X的权限
配置在 /etc/X11下的xinitrc.d/localuser.sh里面
ssh超时问题 http://docs.oseems.com/general/application/ssh/disable-timeout
/etc/ssh/ssh_config
客户端ServerAliveInterval 100
服务端
ClientAliveInterval 30
TCPKeepAlive yes
ClientAliveCountMax 99999
重启
sudo /etc/init.d/sshd restart

设置sshd开机自启动:
chkconfig sshd on
或者
ntsysv (图形界面,好多其他服务都可以在这里管理)

内网IP: 10.x.x.x 172.16.x.x至172.31.x.x 192.168.x.x

git提交修改的文件:(至于新建的项目,在项目首页有详细的上传说明)

[xiarendeniao@localhost aoi]$ git add TowerAoi.h test.cpp
[xiarendeniao@localhost aoi]$ git commit -m "fix bug; modify check consistency"
[master 51f5864] fix bug; modify check consistency
 2 files changed, 15 insertions(+), 9 deletions(-)
[xiarendeniao@localhost aoi]$ git push origin master             
Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 719 bytes, done.
Total 4 (delta 2), reused 0 (delta 0)
To ssh://[email protected]/xiarendeniao/pomelo-aoi.git
   c7fcad0..51f5864  master -> master

 

 

 

git恢复删除的文件:git ls-files -d | xargs git checkout --

 

[dongsong@localhost robot]$ git push origin master 
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/xiarendeniao/robot.git/info/refs
fatal: HTTP request failed
[dongsong@localhost robot]$ cat .git/config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = https://github.com/xiarendeniao/robot.git
[branch "master"]
        remote = origin
        merge = refs/heads/master
----修改 url = ...		
[dongsong@localhost robot]$ cat .git/config  
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = https://[email protected]/xiarendeniao/robot.git
[branch "master"]
        remote = origin
        merge = refs/heads/master
[dongsong@localhost robot]$ git push origin master 
(gnome-ssh-askpass:3020): Gtk-WARNING **: cannot open display: 
[dongsong@localhost robot]$ unset SSH_ASKPASS
[dongsong@localhost robot]$ git push origin master 
Password: 
Counting objects: 19, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (19/19), 8.47 KiB, done.
Total 19 (delta 0), reused 0 (delta 0)
To https://[email protected]/xiarendeniao/robot.git
 * [new branch]      master -> master

 

 

 

 

 

[root@localhost server]# cat start.sh

#!/bin/sh
waitserver() {
        while [[ 1 ]]
        do
                if [[ $1 != 0 ]]
                then
                        echo "."| nc 0.0.0.0 $1
                        if [[ $? == 0 ]]
                        then
                                break;
                        else
                                echo "server for port "$1" not listened"
                                sleep 1
                        fi
                fi
        done
}
./dbserver > dbserver.log  2>&1 &
waitserver 6666
./baseserver > baseserver.log  2>&1 &
waitserver 6530
./loginserver > loginserver.log  2>&1 &
waitserver 6430
./connectserver  > connectserver.log  2>&1 &
waitserver 5630
#./mapserver > mapserver.log  2>&1 &

valgrind -v --leak-check=full --log-file=mem-leak-check.log ./mapserver > mapserver.log  2>&1 &

(2014.8.21)新学了一招:yum whatprovides "*drm/drm.h"

编译或者按照时提示找不到某头文件,可以用这种方式找到头文件的提供方

yum grouplist
yum groupinstall “X Window System”
yum groupinstall “Desktop”
yum groupinstall “Fonts”

如何防止sudo rm -rf xx的悲剧?

[root@test-22 tmp]# cat ~/.bashrc
# .bashrc
nodel()
{
        tmp=`date '+%s'`
        if [ ! -d "/trash/$tmp" ]; then
                mkdir "/trash/$tmp"
        fi
        echo "mv $@ /trash/$tmp"
        mv $@ /trash/$tmp
}
alias rm='nodel'
[root@test-22 tmp]# which rm
alias rm='nodel'

生成core dump file:

ulimit -c unlimited

[dongsong@localhost skynet]$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7805
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

要在字符串输出中夹杂变量,需要用双引号,而不是单引号

 

[myciv@xh-4-1 sh]$ echo "sdsdf${a}"
sdsdf1111111
[myciv@xh-4-1 sh]$ echo "sdsdf$a"  
sdsdf1111111
[myciv@xh-4-1 sh]$ echo 'sdsdf$a'
sdsdf$a

 

删除文件名乱码的文件(手工无法输入文件名)

 

 

[dongsong@localhost python_study]$ ls -inum 
358391 drwxrwxr-x   2 dongsong dongsong 4.0K 11月  2 02:13 ??˦
[dongsong@localhost python_study]$ find . -inum 358391 -exec mv {} /tmp/t/ \;
[dongsong@localhost python_study]$ find . -inum 358391 -exec rm -rf {} \;

 

[root@test-22 server]# cat /bin/grep.sh  
#!/bin/sh
aimstr=$1
dirstr=$2
#echo $aimstr
#echo $dirstr
#echo '++++'
if [[ -z $dirstr ]]; then dirstr='.'; fi
grep -rn "$aimstr" $dirstr | grep -v ".svn" | grep -v './tags' | grep -v ".swp "

 

#!/bin/sh
username="xudongsong"
password=""
read -p "svn password for $username:" password
svn export --username=$username --password=$password svn://svnip:svnport/svndir/myfile.csv ./myfile.csv
python conv.py 

监控日志错误并报警

 

[dongsong@localhost server]$ cat sa.sh 
#!/bin/sh
mails[0]="[email protected]"

ps axo "pid,lstart,etime,stat,vsize,rss,euid,ruid,tty,tpgid,sess,pgrp,ppid,pcpu,comm,cmd" | egrep "xserver|yserver|zserver | grep -v 'egrep' | awk '{print $1}' | xargs kill -USR2

rfile='mailrecord'
if [ ! -f $rfile ]; then touch $rfile; fi

mfile='mailfile'
if [ ! -f $mfile ]; then touch $mfile; fi
echo -n > $mfile

logfiles=`ls -r *log`
tosend=0
for logfile in $logfiles; do
        lastline=`grep -n "$logfile" $rfile | awk -F: '{print $3}'`
        if [ -z $lastline ]; then lastline=0; fi

        lines=`grep -n 'call stack' $logfile | awk -F: '{print $1}'`
        nextline=0
        haserr=0
        for line in $lines; do
                if (($line>$lastline)); then
                        nextline=$line
                        lend=`expr $line + 10`
                        if (($haserr == 0)); then
                                haserr=1
                                echo "------$logfile-------" >> $mfile
                        fi
                        sed -n "$line,${lend}p" $logfile >> $mfile 
                        tosend=1
                fi
        done

        cat $rfile | grep -v $logfile > "${rfile}.new"
        mv "${rfile}.new" $rfile
        echo "${logfile}:${nextline}" >> $rfile
done

if (($tosend == 1)); then
        for addr in ${mails[*]}; do
                mail -s "wsjj server error" $addr < $mfile
        done
fi
rm $mfile

搜索并替换:

 

[root@test-22 kl]# function f(){ sed 's/kl-server/kl/g' $1 > /tmp/x; mv -f /tmp/x $1;}                                                              
[root@test-22 kl]# for f in `grep -rn kl-server . |awk -F: '{print $1}' | grep -e ".lua$" | sort -u `; do f $f; done                           

项目里面的编码好乱,已经告诉大家把编辑器的编码统一成utf8

 

[root@test-22 mobserver]# cat conv.sh 
#!/bin/sh
for line in `find . -name *.lua| xargs file | awk -F: '{print $1,$2}' | awk '{print $1"|"$2}'`; do
    name=`echo $line| cut -f1 -d\|`
    code=`echo $line| cut -f2 -d\|`
    if [[ $code == "ISO-8859" ]]; then
        iconv -f GB2312 -t UTF-8 $name > /tmp/utf8.tmp
        mv /tmp/utf8.tmp $name
        echo "iconved file $name"
    fi
done

 

2016.5.26

 

 

[root@test-22 mobkk-client-lua]# cat /bin/gr
#!/bin/sh
aimstr=$1
dirstr=$2
if [[ -z $dirstr ]]; then dirstr='.'; fi
grep -rn --color "$aimstr" $dirstr | grep -v ".svn" | grep -v './tags' | grep -v ".swp " | grep -v "./ctags" | grep -v "Binary file"
[root@test-22 src]# cat /bin/vv
#!/bin/sh
aimindex=$1
aimstr=$2
dirstr=$3
if [[ -z $dirstr ]]; then dirstr='.'; fi
#把shell变量传入awk的方式之一: aimindex="$aimindex"
if [[ $aimindex -lt 0 ]]; then #支持负数索引
    totalnum=`grep -rn --color "$aimstr" $dirstr | grep -v ".svn" | grep -v './tags' | grep -v ".swp " | grep -v "./ctags" | grep -v "Binary file" | wc -l`
    aimindex=$((totalnum+aimindex+1))
fi
rt=`grep -rn --color "$aimstr" $dirstr | grep -v ".svn" | grep -v './tags' | grep -v ".swp " | grep -v "./ctags" | grep -v "Binary file" | awk -F: '{if(NR==aimindex) print $1,$2}' aimindex="$aimindex"`
fname=`echo "$rt"| awk '{print $1}'`
line=`echo "$rt"| awk '{print $2}'`
vim --cmd ":colorscheme desert" --cmd ":set number" --cmd "set tabstop=4 shiftwidth=4 expandtab" $fname +$line
[root@test-22 mobkk-client-lua]# gr checkEntity  
./model/object/player_move_entity.lua:105:function MoveEntity:checkEntity(tick, pixelX, pixelZ)
./model/socket/handler/objectHandler.lua:560:                           destPlr.moveEntity:checkEntity(tickCount, x, z)
./model/socket/handler/objectHandler.lua:573:                           if not obj.moveEntity:checkEntity(tickCount, x, z) then
./model/socket/handler/objectHandler.lua:691:           obj.moveEntity:checkEntity(tickCount, pixelX, pixelZ)
[root@test-22 mobkk-client-lua]# vv 2 checkEntity
[root@test-22 skynet-robot]# cat /root/xds/test1_protect.sh
#!/bin/sh
rts=`mysql -h10.4.4.21 -uroot -proot123 --default-character-set=utf8 -e "SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST where db = 'mobkk_test1' and HOST not like '10.4.4.22%' and HOST != 'localhost'"`
#echo $rts 

date
for rt in $rts; do
    if [[ $rt != 'ID' ]]; then
        mysql -h10.4.4.21 -uroot -pxxx --default-character-set=utf8 -e "kill $rt"
        echo "kill $rt"
    fi
done

.vimrc
    :map :!gr %

    :map gr :!gr

 

expect 解决脚本执行中的交互问题

#!/usr/tcl/bin/expect

set timeout 30
set host "101.200.241.109"
set username "root"
set password "123456"

spawn ssh $username@$host
expect "*password*" {send "$password\r"}
interact

 

你可能感兴趣的:(编程语言-shell,代码库/程序片段,系统-linux)