常用Linux命令 ================================================================================= 输入命令时的快捷键: Ctrl + r reverse-i-search 根据关键字搜索历史命令 Ctrl + a 跳到命令开始 Ctrl + e 跳到命令结束 Ctrl + k 删除光标之后的命令 Ctrl + u 删除光标之前的命令 Ctrl + c 取消当前命令 Ctrl + l 清屏 ------------------------------------------ 程序运行时的快捷键: Ctrl + c 发送SIGINT信号,终止进程 Ctrl + d 发送EOF,结束当前输入 Ctrl + z 发送SIGSTOP信号,挂起进程(之后运行bg可以将进程放到后台继续执行) stty -a 查看各快捷键作用 ================================================================================= command1 ; command2 命令1后执行命令2 command1 && command2 命令1执行成功后执行命令2 command & 将命令放到后台执行 jobs 查看后台运行命令 bg 将进程放到后台继续执行(需要配合Ctrl + z) fg id 将指定job放到前台执行 command &>/dev/null & 后台运行command并且不显示任何输出 command1 $(command2) command2的输出作为command1的参数 command1 `command2` 作用同上,command2的输出作为command1的参数(~里的·) command 2>file 将command的错误输出保存至file command 2>&1 将输出信息定向到标准输出中 命令连接符: | > >> 2> & ; && ================================================================================= ls、grep、sed、awk、find、locate都支持各自的正则表达式,大部分很类似,稍有不同 ================================================================================= pidof processname 查询指定进程的pid kill pid 结束指定进程 fdisk -l 列出所有磁盘 lsblk 列出所有块设备信息 df -T 查看分区格式 du -h 查看文件实际占用 uname -a 查看系统版本(同cat /proc/version) top 资源占用 top -p 21656 -d 1 查看指定进程CPU占用(PID 21656),每1秒刷新一次 free 内存占用 vmstat 5 显示资源占用情况(CPU、内存),每5秒刷新一次 iostat -d -x /dev/sda 2 显示磁盘IO情况(2秒刷新一次) dd 创建指定大小文件 ln file newname 创建硬连接 ln -s file newname 创建软连接 unlink 删除连接 history 查看历史命令 history -c 清空历史命令 !10 执行指定历史命令 (执行第10条命令,后面可以继续跟需要添加的命令) !! 执行上一条命令 !:0 上一条命令的命令名(不包括参数,同!#) !:1 上一个命令的第一个参数(不包括前面的命令) !:2 上一个命令的第二个参数 !$ 上一个命令的最后一个参数 $? 上一个命令的返回值 ${PIPESTATUS[0]} 上一个命令中第一个命令的返回值(用于处理使用管道串联的多个命令的返回值) man 1 cmd 查看可执行程序和shell命令说明 man 2 funName 查询Linux的API说明 man 3 funName 查询标准C函数 section in man 1 Executable programs or shell commands 2 System calls (functions provided by the kernel) 3 Library calls (functions within program libraries) 4 Special files (usually found in /dev) 5 File formats and conventions eg /etc/passwd 6 Games 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) 8 System administration commands (usually only for root) 9 Kernel routines [Non standard] man -k funName 查找出现函数或结构体的具体位置(包括section) readelf -S file.so 查看ELF文件section信息 readelf -s file.so 查看ELF文件的符号表 readelf -n file.so 查看ELF文件或DEBUG文件的core notes(包括Build ID,用于debuginfo的查找) objcopy --only-keep-debug ./a.out a.out.debug 导出a.out中的debug信息至a.out.debug objcopy --strip-debug ./a.out 删除a.out中的debug信息(同strip --strip-debug ./a.out) objcopy --add-gnu-debuglink=a.out.debug ./a.out 指定a.out对应的调试信息(否则strip之后的文件无法找到对应debug信息) objdump -s -j .gnu_debuglink ./a.out 显示a.out中的指定section信息(.gnu_debuglink) ldd remote-viewer 查看动态库依赖 rpm -qf test.so 参看置顶lib属于的rpm包 tee 可以读取标准输出内容并输出至文件(同时显示),比如: make install | tee make-install.log ========================================================= vim 常用指令: 查找 / 查找字符串 ? 反向查找字符串 n 下一个 N 上一个 * 查找与当前光标下单词匹配的字符串 # 向上查找与当前光标下单词匹配的字符串 :noh 取消之前的搜索高亮 Shift+k 在man手册中查找光标下的函数或结构体 替换 :s/str1/str2 替换当前行第一个str1 :s/str1/str2/g 替换当前行所有str1 :n,$s/str1/str2/g 替换重第n行开始到结束的所有str1 使用正则表达式替换 :0,$s/echo \"Test \([a-zA-Z]\+\) fail.\"/echo -e \"\\033\[31mTest \1 fail.\\033\[0m\"/g 将文本中的所有echo "Test *** fail."替换为echo -e "\033[31mTest *** fail.\033[0m" 删除 dd 删除当前行 3dd 从当前行开始,向下删除3行 di 删除当前字符 x 删除当前字符(同di) D 从当前位置删除到行尾(同d$) dw 从当前位置到下一个单词开头 db 从当前位置到前一个单词开头 diw 删除光标上的单词(不包括空白字符) daw 删除光标上的单词(包括空白字符) diW 删除光标下的字符串(不包括空白字符) daW 删除光标下的字符串(包括空白字符) dib 删除光标下“()”内的内容(不包括小括号),同di( dab 删除光标下“()”的内容(包括小括号) diB 删除光标下“{}”内的内容(不包括大括号),同di{ daB 删除光标下“{}”的内容(包括大括号) di" 删除光标下引号内的内容 dG 从当前位置删除到文件末 dgg 从当前位置删除到文件首 cc 删除当前行并切换至INSERT模式 C 删除从光标开始至行尾的内容并切换至INSERT模式(同c$) cw 删除光标下的work,并切换为INSERT模式 J 删除当前行尾部的换行符 o 在当前行下另起一行开始输入 O 在当前行上另起一行开始输入 复制 yy 复制当前行 3yy 从当前行开始,复制3行 yw 复制从光标位置到单词结束位置 y$ 复制从光标位置到行结束 y^ 复制从光标位置到行首 ya" 复制光标下“”的内容(包括引号)(类似删除快捷键,支持各种yiw/yaw/yiW/yaW/yib/yab/yiB/yaB/yi"/ya"等操作) 选择 v 开始使用光标选择 V 选择行 y 将选择的范围复制 d 将选择的范围剪切 ctrl+v 块选择(列选择) viw 选中光标下的单词(不包括空白字符) viB 选中光标下“{}”内的内容(不包括大括号),同vi{ = 使用V选择后,按=可以格式化代码 粘贴 p 粘贴vi缓冲区中的内容 方向键 hjkl 左下上右 H M L 屏幕顶部 中间 底部 gk 在一个长行里向上一屏幕行移动(也可以用方向键代替k) gj 在一个长行里向下一屏幕行移动 10gj 在一个长行里向下移动10屏幕行 g^ 在一个长行里移动到屏幕行开始 g$ 在一个长行里移动到屏幕行结束 跳转 gg 跳转到开始 G 跳转到结尾 10gg或10G 跳转到第10行 30| 跳转到当前行第30列 fx 跳转到光标右边第一个x字符(可以使用';'或者','继续查找) 3fx 跳转到光标右边第三个x字符 Fx 跳转到光标左边第一个x字符 tx 跳转到光标右边第一个x字符前 Tx 跳转到光标左边第一个x字符后 % 跳转到对应的括号(包括大括号、中括号、小括号) ''(两次单引号) 跳转到刚才的位置(来回切换) [[ 跳转到当前函数开始位置 ][ 跳转到当前函数结束位置 ]] 跳转到下一个函数的开始位置 [] 跳转到上一个函数的结束位置 `. 跳转到最后一次修改的位置 `" 跳转到上次退出文件时的位置 :marks 显示默认跳转标识(使用`加mark跳转,比如`3) m字母 做标记(小写字母在当前文件起作用,大小字母在全局起作用,使用"`字母"跳转,例如`J) Ctrl+o 向前跳(回跳) Ctrl+i 向后跳转 Ctrl+f 向前翻页 Ctrl+b 向后翻页 cscope操作: cscope -Rbq 在源码根目录创建cscope索引文件(shell中执行的命令) :cs find {querytype} {name} 查找制定函数定义,其中querytype可以有以下类型: 0 or s: Find this C symbol 1 or g: Find this definition 2 or d: Find functions called by this function 3 or c: Find functions calling this function 4 or t: Find this text string 6 or e: Find this egrep pattern 7 or f: Find this file 8 or i: Find files #including this file :cs f g do_fork 跳转到do_fork定义处 tag ctags -R 在源码根目录创建tag索引文件(shell中执行的命令) :tag do_fork 跳转到函数定义处 Ctrl+] 跳转到函数或枚举定义处 Ctrl+t 返回上一个查找的地方 撤销 u 撤销 Ctrl+r 反撤销 Ctrl+n 自动补全 窗口操作 sp file1 水平分隔窗口打开file1(同split) vsp file2 垂直分隔窗口打开file2 Ctrl+w 按两次 切换不同窗口 :close 关闭当前窗口(彻底退出用:q) :open file3 打开file3 !ls 执行ls命令(!可以执行本地命令) :saveas file2 另存为新文件名file2 文件操作(一次打开多个文件时) :next 下一个文件 :2next 向后跳2个文件 :previous 上一个文件 :first 移动到第一个文件 :last 移动到最后一个文件 :args 显示当前文件打开参数 Ctrl+^ 在两个文件之间切换(不影响next命令的顺序) Tab页操作 :tabnew 文件名 新Tab打开文件 :tabc 关闭当前Tab :tabo 关闭其它Tab :tabs 查看所有Tab :tabp 前一个Tab :tabn 下一个Tab :tabfirst 第一个Tab :tablast 最后一个Tab gt 下一个Tab gT 上一个Tab TAB替换为空格: :set ts=4 :set expandtab :%retab! 常用指令: set number 显示行号 set autoindent 下一行和当前行缩进相同 set smartwidth 根据C语言自动缩进(配合autoindent使用) set tabstop=4 tab缩进4个空格(同set ts=4) set shiftwidth=4 自动缩进为4个空格(比如左大括号的下一行) set expandtab 输入的tab转换为空格 set showmatch 显示匹配的括号 set nowrap 长度超过屏幕时不自动换行 help wrap 查看相关帮助信息 :read filename 将filename的文件内容插入到当前光标的下一行 :read !cmd 将cmd的输出插入到当前光标的下一行 :n1,n2 write filename 将n1行-n2行的内容写入文件filename中 多行加入相同内容: Ctrl+v选择列后,按I(shift+i),输入要加入的内容,按ESC .vimrc中加入下列配置可以修改注释颜色 highlight Comment ctermfg=green guifg=green ctags插件: 扫描工程目录,生成相应的额索引文件(可用于查找、定位、自动补全等) ctags -R 将生成的tags文件放到vim编辑文件的位置 ========================================================= git命令 git init 初始化git库 git status 查看当前目录状态 git add . 添加所有文件 git commit -m "comment" 提交至本地库 git push origin branchname 将本地分支提交至远程库 git fetch 更新远程各分支信息 git merge origin/branchname 将远程的branchname分子合并至当前分支 git branch -a 查看所有分支(包括远程分支) git checkout branchname 切换至分支branchname git checkout -b branchname 创建并切换至分支branchname git checkout -b branchname origin/branchname 映射远程分支到本地的某个新分支中 git branch branchname 创建分支branchname git diff filename 查看本次文件修改内容 git diff HEAD filename 查看当前文件和HEAD中版本的区别 git diff HEAD^^ HEAD --stat 查看当前版本与两次commit之前版本差别的文件列表 git rm filename 从文件库中删除指定文件 git reset HEAD filename 将文件从暂存区中移除(相当于反add,文件内容不会变) git checkout -- filename 丢弃指定文件在工作区中的修改(回到最近一次git add时或git commit时的状态) 统计指定用户指定时间段内修改的代码量(包括添加、删除。其中${git.username}为指定用户名) git log --author="${git.username}" --after={2015-01-01} --before={2016-01-01} --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 + $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' - 统计指定用户指定时间段内提交次数 git log --author="t${git.username}" --after={2015-01-01} --before={2016-01-01} --oneline | wc -l ========================================================= 调试工具: strace ptrace ltrace dmesg systemtap iptraf 查看各个网卡网络流量信息 lsof -p pid 显示指定pid打开的所有文件 fuser -v /var/log/messages 查看当前使用messages文件的进程 fuser -k /var/filename kill所有打开/var/filename的进程 abrt-cli list 查看系统记录的崩溃信息(修改配置文件/etc/abrt/abrt-action-save-package-data.conf,将其中的OpenGPGCheck设置为no,可以捕获非GPG签名的安装包崩溃时的coredump) addr2line addr2line -e bin_filepath 地址 查找指定可执行文件指定地址对应的代码位置 addr2line -e /usr/lib64/libc-2.17.so -fCi 0x162851 输出libc中指定偏移对应的代码位置(动态库中的地址) ========================================================= systemtap命令 stap test.stp 执行指定脚本 stap -l 'kernel.function("*read")' 列出指定的probe对应的line stap -L 'kernel.function("*read")' 列出制定的probe对应的line及var ========================================================= GDB命令 break <function> 在进入指定函数时停住 break <linenum> 在指定行号停住。 break +/-offset 在当前行号的前面或后面的offset行停住。offiset为自然数。 break filename:linenum 在源文件filename的linenum行处停住。 break ... if <condition> ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i == 100,表示当i为100时停住程序。 break main if argc > 1 break test.c:34 if strlen(mystring) == 0 break 180 if (string == NULL && i < 0) break myfunc if i % (j + 3) != 0 condition 1 argc == 0 将断点1的条件改为if argc == 0 (命令中不包含if) condition 1 删除断点1中的条件 break <linespec> thread <threadno> 在特定线程中中断 break <linespec> thread <threadno> if ... 在特定线程中特定条件下中断 info b 显示所有断点信息,同"info breakpoints" delete 删除所有断点 delete breakpoint [n] 删除某个断点 disable breakpoint [n] 禁用某个断点,同"disable b n" enable breakpoint [n] 使能某个断点 info threads 查看当前可调式的所有线程 thread ID 切换至指定ID的线程 break source.c:123 thread all 在所有线程中相应的行上设置断点 set scheduler-locking off|on|step 控制线程调度方式(可以只调试当前线程,暂时不调度) catch <event>,event可以是下面的内容: throw C++抛出的异常时中断 catch C++捕捉到的异常时中断 exec 调用系统调用exec时(只在某些操作系统下有用) fork 调用系统调用fork时(只在某些操作系统下有用) vfork 调用系统调用vfork时(只在某些操作系统下有用) load 或 load <libname> 载入共享库时(只在某些操作系统下有用) unload 或 unload <libname> 卸载共享库时(只在某些操作系统下有用) watch <expr> 变量发生变化时中断 rwatch <expr> 变量被读时中断 awatch <expr> 变量值被读或被写时中断 continue 继续运行程序直到下一个断点(类似于VS里的F5) continue n 继续n次,第n+1次中断 next 逐过程步进,不会进入子函数(类似VS里的F10) next n 继续走n步,然后中断 setp 逐语句步进,会进入子函数(类似VS里的F11) until 运行至当前语句块结束 finish 运行至函数结束并跳出,并打印函数的返回值(类似VS的Shift+F11) r 运行程序 r a b c 以参数a b c运行程序 list 显示源码 list file:N 显示指定文件的指定行(会同时显示上下各5行) list n1,n2 显示n1行至n2行之间的代码 attach 12345 附加到PID为12345的进程 detach 脱离进程(防止进程在GDB退出时被结束) file /home/test 加载指定文件的符号 set args a b c 设置运行参数 bt 查看调用堆栈 up 栈帧号 栈帧上移 down 栈帧号 栈帧下移 info frame 显示栈帧详细信息 info args 显示当前栈帧函数的所有参数 info locals 显示当前栈帧中所有局部变量 info shared 查看动态库 info proc 查看进程信息 info registers 查看寄存器 info watchpoints 查看观察点 ptype 查看变量类型详细说明 whatis 查看变量类型简要说明 frame ### 跳至指定frame(可查看相应的局部变量) p val 显示变量val p (char*)val 显示val指向的字符串 p 'main.c'::g_val 显示main.c中的全局变量g_val p strlen(str) 显示str字符串的长度 x/nfu addr 查看内存数据 n 表示要显示的内存单元的个数 f 表示显示方式, 可取如下值 x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十进制格式显示无符号整型。 o 按八进制格式显示变量。 t 按二进制格式显示变量。 a 按十六进制格式显示变量。 i 指令地址格式 c 按字符格式显示变量。 f 按浮点数格式显示变量。 u 表示一个地址单元的长度 b 表示单字节 h 表示双字节 w 表示四字节 g 表示八字节 set var expr 修改变量var的值 Ctrl+x Ctrl+a 显示/关闭TUI界面 源码搜索目录相关: directory path-list 将一个或者多个源代码搜索目录加入到当前源码搜索目录列表的前面,目录之间使用空格间隔。 directory 不带参数的directory将源码搜索目录恢复为默认值。 set directories path-list 将源码目录设置为path-list,但是会补上默认目录。 show directories 显示源码搜索目录列表。 set substitute-path from to 设置目录替换规则,放置在规则列表的末端。 unset substitute-path [path] 删除path对应的替换规则,或者删除所有的替换规则。 show substitute-path [path] 显示path对应的替换规则,或者显示所有的替换规则。 相关命令行: ulimit -c unlimited 设置crash dump(程序崩溃后,会在当前目录生成dump文件core.xxxx) gdb --core=core.xxxx 使用gdb加载dump文件(之后使用"file ./a.out"加载符号文件,也可以使用下面的命令一步完成) gdb a.out core.xxxx gdb加载a.out对应的dump文件core.xxxx gdb foo 12345 附加到pid为12345的进程中 gdb -tui 以上下分屏方式显示源码和调试输出 ========================================================= 文件和目录: cd - 返回上次所在目录 cp -a /tmp/dir1 . 复制一个目录到当前工作目录(.代表当前目录) mkdir -p /tmp/dir1/dir2 创建一个目录树 rm -rf /tmp/dir1 删除一个目录及其所有子文件和子目录 ls -1 只显示文件或文件夹名 cat /etc/redhat-release 查看系统版本号 查看文件内容: cat file1 从第一个字节开始正向查看文件的内容 head -2 file1 查看一个文件的前两行 more file1 查看一个长文件的内容 tac file1 从最后一行开始反向查看一个文件的内容 tail -3 file1 查看一个文件的最后三行 od -Ax -tx1a -j100 -N50 filename 以16进制查看一个文件从100偏移之后的50字节(-tx4时,显示的实际上时DWORD,注意直接顺序) tail -f /var/log/messages 查看messages日志文件(动态更新) echo -n text 显示内容text,结束位置不换行 echo 显示空行(换行) find . -name "*.[hc]" |xargs cat|grep -v ^$|wc -l 统计当前目录下(包括子目录)h和c文件行数(不包括空行) find . -name "*.[hc]" |xargs cat|wc -l 统计当前目录下(包括子目录)h和c文件行数(包括空行) wc * -l 统计当前目录下(不包括子目录)所有文件行数 dd if=/dev/zero of=file.img bs=1M count=100 生成一个100MB的文件 dd if=/dev/zero of=file.img bs=1M seek=1000 count=0 生成一个1GB的稀疏文件 touch -m -d “2010-08-09 11:12” file1 修改指定文件的修改时间 which gcc 查找程序所在位置 whereis gcc 查找程序所在位置 服务管理: service abrtd start 启动服务 service abrtd stop 停止服务 chkconfig abrtd on 开机启动(启用、自动) chkconfig abrtd off 开机不启动(禁用) setup 可以设置很多设置,包括服务、网络等 文本处理: grep str /tmp/test 在文件 '/tmp/test' 中查找 "str" grep ^str /tmp/test 在文件 '/tmp/test' 中查找以 "str" 开始的行 grep [0-9] /tmp/test 查找 '/tmp/test' 文件中所有包含数字的行 grep str -r /tmp/* 在目录 '/tmp' 及其子目录中查找 "str" grep $'\t' /tmp/test 在文件'/tmp/test'中查找Tab grep '按Ctrl+V,再按Tab' test 在文件test中查找Tab grep -Ei "abc|def" 忽略大小写查找包含abc或def的行(忽略带小写的正则表达式) grep -E 'expr' /tmp/test 在'/tmp/test'中查找匹配正则表达式'expr'的行 grep -n "" file 显示文件file并显示行号 grep "physical id" /proc/cpuinfo | sort | uniq | wc -l 查询物理CPU个数 diff file1 file2 找出两个文件的不同处 sdiff file1 file2 以对比的方式显示两个文件的不同 hexdump -C file 以十六进制显示文件 od -t x1 file 以十六进制显示文件(可定制性较强) od -t x1 -N 128 file 以十六进制显示文件前128字节 od -t x1 -j 128 file 以十六进制显示文件128字节之后的内容 vimdiff file1 file2 使用vim显示文件不同(会使用颜色高亮) ls /proc/1785/task | xargs -i cat /proc/{}/stack 显示所有子进程的调用堆栈({}用于代替xargs分割出的内容,-i可以使用-I{}代替) 查找: find / -name file1 从 '/' 开始进入根文件系统查找文件和目录 find / -user user1 查找属于用户 'user1' 的文件和目录 find / -iname filename 忽略带小写查找文件filename find /home/user1 -name \*.bin 在目录 '/ home/user1' 中查找以 '.bin' 结尾的文件 find /usr/bin -type f -atime +100 查找在过去100天内未被使用过的执行文件 find /usr/bin -type f -mtime -10 查找在10天内被创建或者修改过的文件 find -name '*.[ch]' | xargs grep -E 'expr' 在当前目录及其子目录所有.c和.h文件中查找 'expr' find -type f -print0 | xargs -r0 grep -F 'expr' 在当前目录及其子目录的常规文件中查找 'expr' find -maxdepth 1 -type f | xargs grep -F 'expr' 在当前目录中查找 'expr' diff -Naur PathA PathB >AtoB.patch 生成Patch文件 patch -bp1 < AtoB.patch 在当前目录中应用patch文件(参数b为修改文件前备份文件) patch -RE -p1 < AtoB.patch 在当前目录中根据patch还原目录文件 locate \*.ps 寻找以 '.ps' 结尾的文件,先运行 'updatedb' 命令 locate -b "\name" 查找name文件 locate -i filename 忽略大小写查找文件 locate $(!!) | head -n 1 查找刚才命令的第一行输出文件所在位置 file $(!!) | sed -n 3p 显示刚才命令的第三行输出的文件信息 awk awk -F ":|=" '{print $2}' 以':'和'='作为分隔符分隔列,输出第二列内容 awk 'NR>1' 输出第二行及之后的内容(忽略第一行) ..... ldd UVMClient | awk '{if (substr($3,1,1) == "/") {print $3} else if (substr($1,1,1) == "/") {print $1}}' 获取ldd输出中第三列以“/”开头的第三列或以"/"开头的第一列 sed sed 's/str1/str2/g' 将内容中的所有'str1'替换为'str2' sed -i "s/echo \"Test result:fail/echo -e \"Test result: \\\\033[31mfail\\\\033[0m/g" *.sh 替换当前目录所有sh文件中的指定内容 sed -i 's/str1/str2/g' `grep "str1" -rl .` 将当前文件夹下(包括子文件夹中的文件)中所有的str1替换为str2 ..... cut cut -d ',' -f 1 删除','后的所有内容 sort ...... scp /localpath/file username@hostname:/remotepath/file 上传本地文件到远程目录 scp -r /localpath/folder username@hostname:/remotepath/file 上传本地目录到远程目录 scp username@hostname:/remotepath/file /localpath/file 下载远程文件至本地 mount -t cifs -o username=name //addr/share /mnt/share 挂载windows共享目录share至/mnt/share umount -l /mnt/mnt_dir 立即断开文件系统,所有清理以后执行(可以用于umount卡住的nfs挂载点) ssh -o ServerAliveInterval=60 username@ip 保持连接,防止自动断开 getenforce 查看当前系统seLinux是否开启 iptables -nvL --line-number 查看当前表的所有规则 iptables -A INPUT -s 192.168.1.5 -j DROP 添加一条规则,丢弃所有来自192.168.1.5的数据 iptables -D INPUT -s 192.168.1.5 -j DROP 删除之前添加的规则 iptables -D INPUT 2 删除INPUT中的第二条规则 iptables -R INPUT 3 -j ACCEPT 将INPUT中的第三条规则target改为ACCEPT /*****************************************/ 本机A建立连接机器B上的SSH信任关系 ssh-keygen -b 1024 -t rsa 本机A生成秘钥 scp ~/.ssh/id_rsa.pub root@ip:~/.ssh/id_rsa.pub 将生成的公钥拷贝到机器B中 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 机器B中将拷贝的公钥添加到authorized_keys中 如果文件authorized_keys,要保证文件权限为600(644?) 检测机器B中的配置文件:/etc/ssh/sshd_config,启用其中的下列三行: RSAAuthentication yes PublicAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 如果希望使用短登录名,可以修改~/.ssh/config,添加: Host * Host *newname HostName 192.168.9.21 User root ForwardAgent yes Compression yes 下次登录时使用 ssh newname即可登录 删除.ssh目录后,重新建立信任关系失败可能需要如下命令将私钥加入: ssh-add ~/.ssh/id_rsa /*****************************************/ 其它SSH命令: ssh-copy-id username@host 将本机SSH公钥复制到远程主机,开启无密码登录 dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp 将麦克风输出到远程计算机的扬声器上(音质比较差) ssh username@host cat /path/to/remotefile | diff /path/to/localfile - 比较本地文件和远程文件 ssh -t reachable_host ssh unreachable_host 通过reachable_host创建与unreachable_host的连接 ssh user@host cat /path/to/some/file | xclip 将远程主机中的制定文件内容复制到剪切板 /*****************************************/ 第三方工具,可以输入密码等交互式会话 expect SSH_Time_Out() { local host=192.168.9.21 local time_out=250 local command="ifconfig" local exp_cmd=$(cat << EOF spawn ssh root@$host $command set timeout $time_out expect { "*assword:" { send "123456\r"; exp_continue} "*(yes/no)?" {send "yes\r"; exp_continue} eof {exit 0} } EOF) ??? expect -c "$exp_cmd" ??? return $? } /*****************************************/ useradd name 添加用户(如果需要执行sudo的权限,需要在/etc/sudoers中添加相应用户) passwd name 设置用户密码 userdel name 删除用户 chown -R username foldername 修改整个文件夹(递归)的所有者 chgrp -R groupname foldername 修改整个文件夹(递归)的组 chown username:groupname file 同时修改文件的所有者和组 chmod u+w filename 文件添加写权限 压缩和解压: bzip2 file1 压缩 file1 bunzip2 file1.bz2 解压 file1.bz2 gzip file1 压缩 file1 gzip -9 file1 最大程度压缩 file1 gunzip file1.gz 解压 file1.gz tar -cvf archive.tar file1 把file1打包成 archive.tar (-c: 建立压缩档案;-v: 显示所有过程;-f: 使用档案名字,是必须的,是最后一个参数) tar czvf archive.tar.gz dir1 把dir1打包成archive.tar.gz tar -cvf archive.tar file1 dir1 把 file1,dir1 打包成 archive.tar tar -tf archive.tar 显示一个包中的内容 tar -xvf archive.tar 释放一个包 tar -xvf archive.tar -C /tmp 把压缩包释放到 /tmp目录下 zip file1.zip file1 创建一个zip格式的压缩包 zip -r file1.zip file1 dir1 把文件和目录压缩成一个zip格式的压缩包 unzip file1.zip 解压一个zip格式的压缩包到当前目录 unzip test.zip -d /tmp/ 解压一个zip格式的压缩包到 /tmp 目录 tar zxvf archive.tar.gz 解压tar.gz tar jxvf archive.tar.bz2 解压tar.bz2 tar Jxvf archive.tar.xz 解压tar.xz yum工具: yum -y install [package] 下载并安装一个rpm包 yum localinstall [package.rpm] 安装一个rpm包,使用你自己的软件仓库解决所有依赖关系 yum -y update 更新当前系统中安装的所有rpm包 yum update [package] 更新一个rpm包 yum remove [package] 删除一个rpm包 yum list 列出当前系统中安装的所有包 yum search [package] 在rpm仓库中搜寻软件包 yum clean [package] 清除缓存目录(/var/cache/yum)下的软件包 yum clean headers 删除所有头文件 yum clean all 删除所有缓存的包和头文件 yum whatprovides "*/g++" 查询哪些包提供指定文件 yum install ld-linux.so.2 可以根据缺少的库安装对应的包 yum install "pkgconfig(gstreamer-app-0.10)" 安装包含指定包的相关包 yum install xxx --downloadonly --downloaddir=/xxx 下载指定软件包(不安装) yum --disablerepo=\* --enablerepo=c6-media install package 在制定repo中安装package debuginfo-install package --nogpgcheck 安装package对应的debuginfo(--nogpgcheck表示检测gpg签名) rpm -ivh package 安装一个包 rpm -Uvh package 升级一个包 rpm -ev package 卸载一个包 rpm -ev --nodeps package 卸载一个包(忽略依赖) rpm -qa package 查询包信息 rpm -ql package 列出包含的文件 rpm -qpl package.rpm 列出指定rpm包中的文件 rpm -qpR package.rpm 列出指定rpm包的依赖包 rpm -qf file 查找file属于哪个rpm包 rpm2cpio xxx.rpm | cpio -div 解压一个rpm包,会解压到当前目录,最好先新建一个文件夹 rpmbuild -bp xxx.spce 解压源码并打补丁 rpmbuild -bc xxx.spce 编译rpm解压出的源码 rpmbuild --rebuild xxx.src.rpm 编译相应的rpm包 安装EPEL源 yum install http://mirrors.ustc.edu.cn/epel/7/x86_64/e/epel-release-7-5.noarch.rpm yum install http://mirrors.ustc.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm 网络: ifconfig eth0 显示一个以太网卡的配置 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 配置网卡的IP地址 ifdown eth0 禁用 'eth0' 网络设备 ifup eth0 启用 'eth0' 网络设备 iwconfig eth1 显示一个无线网卡的配置 iwlist scan 显示无线网络 ip addr show 显示网卡的IP地址 tcpdump -i br0 host 192.168.9.161 -w test.cap -s 0 抓包 netstat -antp | grep libvirtd 获取libvirtd进程监听的信息 其他: su - 切换到root权限(与su有区别) shutdown -h now 关机 shutdown -r now 重启 pstree 以树状图显示程序 man ping 查看参见手册(例如ping 命令) passwd 修改密码 df -h 显示磁盘的使用情况 cal -3 显示前一个月,当前月以及下一个月的月历 cal 10 1988 显示指定月,日期的月历 watch -d -n 1 'ls -l /var/log/hostagent | grep hostagent' 检测文件变化(-d表示监控修改,-n 1表示每秒刷新一次) date --date '1970-01-01 UTC 1427888888 seconds' 把相对于1970-01-01 00:00的秒数转换成时间,下面两个命令意义相同 date --date='@1450152602' date -d '@1450152602' date -d "2015-12-22 10:00:00" +%s 把时间字符串转为相对于1970-01-01 00:00的秒数 date "+%Y-%m-%d %H:%M:%S" 按2015-12-30 16:49:10的格式输出时间 openssl x509 -in ./ca.crt -noout -text 分析证书文件 ============================================================================================ qemu-img create -f qcow2 -o backing_file=win7.img win7_using.qcow2 15G 克隆镜像(基于母镜像的QCOW2镜像) ============================================================================================ 常用快捷键: CentOS 中可以通过系统->首选项->键盘快捷键来设置快捷键,如图所示。例如可将运行终端的快捷键设为Ctrl+Alt+T。 Ctrl + u 删除光标之前到行首的字符 Ctrl + k 删除光标之前到行尾的字符 Ctrl + c 取消当前行输入的命令,相当于Ctrl + Break Ctrl + a 光标移动到行首(ahead of line),相当于通常的Home键 Ctrl + e 光标移动到行尾(end of line) Ctrl + f 光标向前(forward)移动一个字符位置 Ctrl + b 光标往回(backward)移动一个字符位置 Ctrl + l 清屏,相当于执行clear命令 Ctrl + r 显示:号提示,根据用户输入查找相关历史命令(reverse-i-search) Ctrl + w 删除从光标位置前到当前所处单词(word)的开头 Ctrl + t 交换光标位置前的两个字符 Ctrl + y 粘贴最后一次被删除的单词 Ctrl + Alt + d 显示桌面 Alt + b 光标往回(backward)移动到前一个单词 Alt + d 删除从光标位置到当前所处单词的末尾 Alt + F2 运行 Alt + F4 关闭当前窗口 Alt + F9 最小化当前窗口 Alt + F10 最大化当前窗口 Alt + Tab 切换窗口 Alt +按住左键 移动窗口(或在最下面的任务栏滚动鼠标滑轮) [鼠标中间键] 粘贴突出显示的文本。使用鼠标左键来选择文本。把光标指向想粘贴文本的地方。点击鼠标中间键来粘贴。 [Tab] 命令行自动补全。使用 shell 提示时可使用这一方式。键入命令或文件名的前几个字符,然后按 [Tab] 键,它会自动补全命令或显示匹配键入字符的所有命令。 在桌面或文件管理器中直接按 / 就可以输入位置,打开文件管理器。 快速搜索:在 vi 或 Firefox 中直接按 / 即可进入搜索状态。 网站链接和图片可直接拖放到桌面或者目录,可以马上下载。 直接将文件管理器中的文件拖到终端中就可以在终端中得到完整的路径名。 在滚动条的空白处点击鼠标中键,屏幕即滚动到那个地方。 ============================================================================================ LVM创建LV过程: 创建PV: pvcreate /dev/sdc1 pvcreate /dev/sdd2 创建VG: vgcreate data /dev/sdc1 /dev/sdd2 激活VG: vgchange -a y data 创建PV: lvcreate -l600 data -n data01 // 600为PE个数,也支持大小,比如-L500M 创建文件系统: mkfs.ext4 /dev/data/data01 挂载文件系统: mkdir /data mount /dev/data/data01 /data /* VG中删除PV vgreduce data /dev/sdd2 VG中添加PV vgextend data /dev/sdd3 扩展LV lvextend -L+500M /dev/data/data01 // 也可以直接设定目标大小,比如-L2G 扩容文件系统 resize4fs /dev/data/data01 */ LV lvdisplay lvcreate lvremove lvextend lvreduce lvchange lvscan PV pvdisplay pvcreate pvremove pvchange pvscan VG vgdisplay vgcraete vgremove vgextend vgreduce vgchange vgscan ============================================================================================ Shell编程: 整数比较: -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a" -ge "$b" ] -lt 小于,如:if [ "$a" -lt "$b" ] -le 小于等于,如:if [ "$a" -le "$b" ] < 小于(需要双括号),如:(("$a" < "$b")) <= 小于等于(需要双括号),如:(("$a" <= "$b")) > 大于(需要双括号),如:(("$a" > "$b")) >= 大于等于(需要双括号),如:(("$a" >= "$b")) 字符串比较: = 等于,如:if [ "$a" = "$b" ] == 等于,如:if [ "$a" == "$b" ],与=等价 注意:==的功能在[[]]和[]中的行为是不同的,如下: 1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true 2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true 3 4 [ $a == z* ] # File globbing 和word splitting将会发生 5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true 一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是. 但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像. != 不等于,如:if [ "$a" != "$b" ] 。这个操作符将在[[]]结构中使用模式匹配. < 小于,在ASCII字母顺序下.如: if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ] 注意:在[]结构中"<"需要被转义. > 大于,在ASCII字母顺序下.如: if [[ "$a" > "$b" ]] if [ "$a" \> "$b" ] 注意:在[]结构中">"需要被转义. 具体参见Example 26-11来查看这个操作符应用的例子. -z 字符串为"null".就是长度为0. -n 字符串不为"null" 注意: 使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z 或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可 以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯. 文件判断: –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当pathname指定的文件或目录存在时返回真 -f 当file存在并且是正规文件时返回真 -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真 -h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效 -k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真 -p 当file存在并且是命令管道时返回为真 -r 当由pathname指定的文件或目录存在并且可读时返回为真 -s 当file存在文件大小大于0时返回真 -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真 -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的 -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真 字符串处理: ${#string} $string的长度 ${string:position} 在$string中, 从位置$position开始提取子串 ${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串 ${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串 ${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串 ${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串 ${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串 ${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring ${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring ${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring ${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring ============================================================================================ echo -e “\033[30m 黑色字 \033[0m” echo -e “\033[31m 红色字 \033[0m” echo -e “\033[32m 绿色字 \033[0m” echo -e “\033[33m 黄色字 \033[0m” echo -e “\033[34m 蓝色字 \033[0m” echo -e “\033[35m 紫色字 \033[0m” echo -e “\033[36m 天蓝字 \033[0m” echo -e “\033[37m 白色字 \033[0m” echo -e “\033[40;37m 黑底白字 \033[0m” echo -e “\033[41;37m 红底白字 \033[0m” echo -e “\033[42;37m 绿底白字 \033[0m” echo -e “\033[43;37m 黄底白字 \033[0m” echo -e “\033[44;37m 蓝底白字 \033[0m” echo -e “\033[45;37m 紫底白字 \033[0m” echo -e “\033[46;37m 天蓝底白字 \033[0m” echo -e “\033[47;30m 白底黑字 \033[0m” \33[0m 关闭所有属性 \33[1m 设置高亮度 \33[4m 下划线 \33[5m 闪烁 \33[7m 反显 \33[8m 消隐 \33[30m — \33[37m 设置前景色 \33[40m — \33[47m 设置背景色 \33[nA 光标上移n行 \33[nB 光标下移n行 \33[nC 光标右移n行 \33[nD 光标左移n行 \33[y;xH设置光标位置 \33[2J 清屏 \33[K 清除从光标到行尾的内容 \33[s 保存光标位置 \33[u 恢复光标位置 \33[?25l 隐藏光标 \33[?25h 显示光标 ============================================================================================