zoukankan      html  css  js  c++  java
  • linux常用命令

    0. 获取帮助

    man cmd   // 查看cmd命令详细帮助说明

    cmd --help  // 查看cmd命令简要帮助说明

    1. 文件/目录

    pwd  显示当前目录

    cd    切换目录  

    例:cd  ~  

          回到当前用户工作目录

    例:cd ~main

          回到main用户的工作目录

    例:cd -

          回到上一次进入的目录

    ll      较详细地列出目录内容

    ls     列出目录内容

    例:ls -lih

          列出当前目录下的文件和子目录信息

    例:ls -ltr | tail -n 8

          按照修改时间降序排列(最新修改的文件排在前面),列出当前目录下的前8个文件和子目录信息

    例:ls log* -lhrt

          列出当前目录下,名称以log起头的文件和子目录的信息

    例:ls -a

         列出当前目录下的文件和子目录信息(包含隐藏部分)

    stat 查看文件或目录的所有者

    例:stat cmd.txt  查看cmd.txt文件的相关信息

    例:stat -c %U cmd.txt  获取当前目录下cmd.txt的所有者

    例:stat -c %U /home/game/test  获取/home/game/test目录的所有者

    ln    为文件在另外一个位置建立一个链接

    例:ln -sf /home/appsvr appsvrLink   // 在当前目录中建立一个名为appsvrLink的软链接(链接指向/home/appsvr)

    例:ln -f /home/expsvr expsvrLink   // 在当前目录中建立一个名为expsvrLink的硬链接(链接指向/home/expsvr)  注:可通过rm -rf expsvrLink来删除软链接

    --------------------------------

    -f : 创建链接时,先删除同名的链接
    -i : 在删除时,先进行询问
    -s : 进行软链结(symbolic link)

    链接有两种,一种被称为硬链接(Hard Link),另一种被称为软链接(符号链接,Symbolic Link)。
    建立硬链接时,链接文件和被链接文件必须位于同一个分区内,并且不能建立指向目录的硬链接。
    硬链接会在选定的位置上生成一个和源文件大小相同的文件,而软链接,只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间。
    软链接可以跨分区,并能指向目录。无论是软链接还是硬链接,文件都保持同步变化。
    硬链接:只能对文件 软链接:既可对文件,也可对目录
    用ls察看一个目录时,文件后面有一个@的符号,那就是用ln命令生成的文件,用ls -l命令去察看,可以显示链接的路径。

    --------------------------------

    dir   显示目录中内容

    lsof  列出某个进程打开的所有文件信息      更详细地请参考:Unix调试的瑞士军刀:lsof

         打开的文件可能是普通的文件,目录,NFS文件,块文件,字符文件,共享库,常规管道,明明管道,符号链接,

         Socket流,网络Socket,UNIX域Socket,以及其它更多.

    例:lsof /path/to/file   // 找出哪些进程在使用file文件

          lsof -p 24685   // 查看pid为24685的进程引用了那些文件

          lsof +D /usr/lib【lsof | grep '/usr/lib'】

            --- // 加上+D参数,lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢;慢是因为+D首先查找所有的文件,然后一次性输出

         lsof -c foo【lsof | grep foo】   // 只列出以foo开头的进程打开的文件

         lsof -i tcp   // 列出所有TCP网络连接

         lsof -i tcp:8080  // 查看8080端口被那个进程占用

         lsof -i :25   // 列出使用端口为25的进程

    rename  文件重命名   [rename 原字符串 新字符串 文件名] -- 文件名支持通配符

    例:rename "20120912" "20120913" *     // 将当前目录下的所有文件(含目录)的名称中第一次搜索到"20120912"子串,替换成"20120913"子串【非递归子目录】

         xx_20120912_xx.test   => xx_20120913_xx.test

         20120912_xx.test   => 20120913_xx.test

         xx_20120912   => xx_20120913

        20120912_xx.20120912   => 20120913_xx.20120912    // 后一个20120912不会被替换

    fdisk 查看磁盘容量&块组分配情况

    例:fdisk -l

    df    显示磁盘的相关信息

    例:df -h

          以可读性较高方式显示磁盘信息

    du  显示目录或文件的大小

    例:du -h

          以可读性较高方式显示目录和文件大小

    例:du -s * | sort -n | tail

          列出当前目录里最大的10个文件

    例:du -sh   查看当前目录大小

    chmod   变更文件或目录的权限

    例:chmod g+w /home/game/dll/test.so

          让文件或目录的所属群组对test.so文件具有可写权限

    例:chmod u+x /home/game/dll/test.so

          让文件或目录的拥有者对test.so文件具有可执行权限

    例:chmod o+r /home/game/dll/test.so

          让其他用户对test.so文件具有可读权限

    chown  修改文件或目录所属用户

    例:chown main:users *    将当前目录下的文件所属用户修改为main

    ---------------权限控制--------------

    账户相对文件对象有三种不同的角色(三种角色互斥):
    1. 拥有者
    2. 组(不包括拥有者的同组成员)
    3. 其它账户(除上面的组和拥有者之外的所有账户)

    一个文件的权限被设计成三种行为: 1. 读(r) 2. 写(w) 3. 执行(x)
    这样每一个文件对像都必须要定义一个拥有者及拥有组,
    而对于三种角色和三种权限可以用十个字母的可读方式表示,如: drwxrwxrwx,当某些权限没有的时候,相应的字母用 - 代替。
    把这个串分成4部份: d rwx rwx rwx
    第一部分:d代表是目录,- 代表是文件,l 代表是外链。
    第二部份: rwx 代表角色1(拥有者)的读、写、执行权限,没有相应权限用 - 代替字母。
    第三部份: rwx 代表角色2(该组中不包括拥有者的账户)的读、写、执行权限,没有相应权限用 - 代替字母。
    第四部份: rwx 代表角色3(其它账户)的读、写、执行权限,没有相应权限用 - 代替字母。
    示例: -rw------- :只有所有者才有读和写的权限。
             -rw-r--r-- :只有所有者才有读和写的权限,组群和其他人只有读的权限。
             -rwxr-xr-x :只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限。

    ----------------------------------

    chgrp  修改文件或目录所属群组

    例:chgrp -v bin log2012.log    将log2012.log的所属组修改为bin

    例:chgrp - R bin test6   将目录test6及其子目录下的所有文件的所属组修改为bin

    cp  复制文件或目录

    例:cp test.so /home/game/dll/test.so

          将当前目录下的test.so文件拷贝到/home/game/dll下,并命名为test.so

    例:cp -r * /home/game   将当前目录中的所有文件(递归子目录)拷贝到/home/game目录中

    例:cp -r home/test/ /home/game/  // 将home/test/目录中的所有文件(递归子目录)拷贝到/home/game目录中

    find  查找文件或目录

    例:find -maxdepth 10 -name resource.h

          在当前目录及其以下10级内的子目录下,搜索resource.h文件

    例:find . -name .svn -execdir svn update r12005 \;

          在当前目录下查找含有.svn的文件或目录(递归子目录),并对该目录执行指定版本号svn更新

    例:find /Users/mySource -name .svn -execdir svn update r12005 \;

          在/Users/mySource目录下查找含有.svn的文件或目录(递归子目录),并对该目录执行指定版本号svn更新

    例:find /Users/mySource -name "export*.txt"

          在/Users/mySource目录下查找含有export*.txt的文件或目录(递归子目录)注:*为通配符,匹配0个或多个字符

    mv  移动或重命名现有的文件或目录

    例:mv resource.h ../test.h
         将当前目录下resource.h移动到其上级目录,并重命名为test.h

    例:mv home/test/ dev/test/
         将home/test/目录移动到dev目录中

    例:mv home/test/ dev/test2/
         将home/test/目录移动到dev目录中,并重命名为test2

    rm  删除文件或目录

    例:rm -f -r ./*.o  递归子目录,强制删除的所有.o文件

    例:rm -rf {test1,test2,test3}  删除当前目录下的test1,test2,test3目录(递归子目录)

    mkdir  建立目录

    例:mkdir test  在当前目录下建立test目录

    例:mkdir {test1,test2,test3}  在当前目录下建立test1,test2,test3三个文件夹

    例:mkdir -p test/folder 在当前目录下建立test目录,并在test中新建folder目录

    例:mkdir -p test/.folder  在当前目录下建立test目录,并在test中新建.folder隐藏目录

    rmdir  删除空目录

    例:rmdir test    删除当前目录下的test空目录

    例:rmdir {test1,test2,test3}  删除当前目录下的test1,test2,test3空目录

    touch 新建空文件、修改文件或目录的时间戳(格式:YYMMDDhhmm)

    例:touch NEWS README AUTHORS ChangeLog  新建名为NEWS、README、AUTHORS及ChangeLog四个空文件

    例:touch .file.txt  新建名为.file.txt的隐藏空文件

    例:touch *  修改当前目录下文件的时间戳

    例:find ./ * -exec touch {} \;  递归修改当前目录下文件的时间戳(递归子目录)

    例:find ./test/ * -exec touch {} \;  递归修改当前test目录下文件的时间戳(递归子目录)

    例:touch -t 0812200135 cmd.txt  将文件cmd.txt的时间戳修改为2008.12.20  01:35

    例:touch -t 1312251825 source  将目录source的时间戳修改为2013.12.25  18:25

    tee 重定向输出

    例:tee  只输出到标准输出

    例:tee file.txt  输出到标准输出的同时,保存到file.txt中。如果文件不存在则创建;如果文件存在则覆盖

    例:tee -a file.txt  输出到标准输出的同时,追加到file.txt中。如果文件不存在则创建;如果文件存在则追加

    例:tee -  输出到标准输出两次

    例:tee file1.txt file2.txt 输出到标准输出的同时,保存到file1.txt和file2.txt中。如果文件不存在则创建;如果文件存在则覆盖

    tar  打包或解包文件

    例:tar czvf xx.tar.gz *.txt

         将当前目录下的txt文件打包到xx.tar.gz文件

    例:tar czvf kov3_20140714.tar.gz kov3

         将当前目录下的kov3文件夹打包到kov3_20140714.tar.gz文件中(会将整个kov3文件夹中的所有内容打包 [递归子目录] )

    例:tar xzvf xx.tar.gz -C ./

         将xx.tar.gz解包到当前目录

    unzip 解压

    例:unzip files.zip -d /home/main2/me   // 将files.zip解压到/home/main2/me目录中

    例:unzip -qo files.zip -d /home/main2/me   // 将files.zip以安静覆盖的方式解压到/home/main2/me目录中

    zip 压缩

    例:zip -r test.zip /home/main2/me  // 将home/main2/me目录压缩成files.zip文件

    例:zip -r MSDKCore.embeddedframework.zip ./MSDKCore.embeddedframework/  // 将当前目录下的MSDKCore.embeddedframework目录压缩成MSDKCore.embeddedframework.zip

    例:zip -d MSDKCore.embeddedframework.zip __MACOSX .DS_Store  // 删除MSDKCore.embeddedframework.zip中的__MACOSX和.DS_Store文件 

    ar  创建静态库.a文件

    例:ar -rf test.a main.o fun.o // 将main.o fun.o打包成test.a

         ar -t test.a  // 显示库文件中有哪些目标文件,只显示文件名

         ar -tv test.a  //显示库文件中有哪些目标文件,显示文件名、时间、大小等详细信息

         ar -x test.a  // 将test.a中所有目标文件解压到当前目录

    ranlib  对静态库的符号索引表进行更新

    例:ranlib test.a  // 更新test.a的符号索引表

    当给静态库增加一个 .o 文件到静态库中,ar可直接将需要增加的 .o 文件简单的追加到静态库的末尾。
    但是当我们使用这个库生成可执行文件时,链接程序提示找不到某个符号的错误。
    这个问题的原因是:追加的 .o 文件直接加入到了库的末尾,却并没有更新库的符号索引表,ranlib就是用于更新符号索引表的命令。

    md5sum   计算文件的md5码

    例:md5sum test.a  // 计算并输出test.a的MD5码值

    2. 文件查看

    cat  显示文件内容

    例:cat -n main.c

        带上行号显示main.c的内容

    例:cat main.c | grep 67523115

        只显示包含67523115字符串的行

    tail  显示文件末尾内容

    例:tail -f test.log

        显示test.log文件的最后10行,同时继续监视文件内容有无变化,新增内容会继续输出,直到按下Ctrl+C组合键停止该命令

    例:tail -30 test.log

        显示test.log文件的最后30行

    例:tail +30 test.log

        显示test.log文件的从末尾到第30行的内容

    head  显示文件起始内容

    例:head test.log

        显示test.log文件的前10行

    例:head -15 test.log 

        显示test.log文件的前15行

    more 分页显示文件内容

    例:more main.c

    --------------------------------------------
    空格:查看下一页    向下方向键:查看下一行     q:退出

    less  分页显示文件内容

    例:less main.c

    --------------------------------------------
    空格/Page Down:查看下一页     Page Up:查看上一页

    向下方向键:查看下一行   向上方向键:查看上一行   q:退出

    3. @#@

    @cmd  执行cmd命令执行,不打印出cmd命令内容

    @echo off  关闭后续的命令内容打印,另外不打印出echo off

    !$  !$是一个特殊的环境变量,代表了上一个命令的最后一个字符串

    例:

    $mkdir mydir
    $mv mydir yourdir
    $cd yourdir
    可以改成:
    $mkdir mydir
    $mv !$ yourdir
    $cd !$

    -----------

    !cmd  执行上一条cmd命令

    -----------

    被反引号`或$括起来的命令,shell会返回其执行结果
    例:tmVar=`date`
    例:tmVar=$date

    -----------

    man ascii  显示ascci码表

    uname 显示系统版本信息

    clear  清理屏幕

    su      输入root密码,切换到管理员控制台;

             结束后可输入exit命令回到原来用户状态

    sudo  以其他身份来执行指定命令,预设身份为root

    sudo !!  以root身份执行上一条命令

    source /home/game/cmd.txt  执行cmd.txt中命令(该文件可以不是bash脚本文件)

    echo $PATH  查看环境变量

    which type  查看type可执行文件的位置

    w/who  查看登录用户

    例:w     // 查看当前登陆用户
    例:who //另一种查看当前登陆用户的方式, 两者显示内容有区别
    例:whoami //查看当前是用哪个用户名登陆的

    passwd    修改当前用户密码

    getent passwd  显示所有用户

    sleep 3  暂停3秒

    read  myvar  等待用户输入,按回车后输入内容保存到myvar变量中

    date    系统日期

    例:date     // 查看当前系统时间
    例:date MMDDhhmm[ [CC]YY] [.ss]  //设置系统时间为CCYY年MM月DD日hh时mm分ss秒

    history   显示在当前shell下命令历史

    ssh    登录(ssh 用户名@IP -p/#端口号)

    例:ssh  game@10.6.221.70 -p36000

    例:ssh  game@10.6.221.70#36000

    mysql  登录(mysql -h 主机地址 -u 用户名 -p密码)

    例:mysql -h 192.168.1.23 -u test -p12345abc //p与密码间没有空格

    ulimit  限制不同种类的系统资源(模拟各种资源受限的环境)

    -H 设置硬资源限制,一旦设置不能增加。 例:ulimit –Hs 64;限制硬资源,线程栈大小为 64K。
    -S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 例:ulimit –Sn 32;限制软资源,32 个文件描述符。
    -a 显示当前所有的 limit 信息。 例:ulimit –a;显示当前所有的 limit 信息。
    -c 最大的 core 文件的大小, 以 blocks 为单位。 例:ulimit –c unlimited; 对生成的 core 文件的大小不进行限制。
    -d 进程最大的数据段的大小,以 Kbytes 为单位。 例:ulimit -d unlimited;对进程的数据段大小不进行限制。
    -f 进程可以创建文件的最大值,以 blocks 为单位。 例:ulimit –f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
    -l 最大可加锁内存大小,以 Kbytes 为单位。 例:ulimit –l 32;限制最大可加锁内存大小为 32 Kbytes。
    -m 最大内存大小,以 Kbytes 为单位。 例:ulimit –m unlimited;对最大内存不进行限制。
    -n 可以打开最大文件描述符的数量。 例:ulimit –n 128;限制最大可以使用 128 个文件描述符。
    -p 管道缓冲区的大小,以 Kbytes 为单位。 例:ulimit –p 512;限制管道缓冲区的大小为 512 Kbytes。
    -s 线程栈大小,以 Kbytes 为单位。 例:ulimit –s 512;限制线程栈的大小为 51 Kbytes。
    -t 最大的 CPU 占用时间,以秒为单位。 例:ulimit -t unlimited;对最大的 CPU 占用时间不进行限制。
    -u 用户最大可用的进程数。 例:ulimit –u 64;限制用户最多可以使用 64 个进程。
    -v 进程最大可用的虚拟内存,以 Kbytes 为单位。 例:ulimit –v 200000;限制最大可用的虚拟内存为 200000 Kbytes。

    1. 在用户的启动脚本中
    如果用户使用的是bash,就可以在用户的目录下的 .bashrc 文件中,加入 ulimit –u 64,来限制用户最多可以使用64个进程。
    此外,可以在与 .bashrc功能相当的启动脚本中加入ulimt。

    2. 在应用程序的启动脚本中
    如果用户要对某个应用程序myapp 进行限制,可以写一个简单的脚本startmyapp。
    ulimit –s 512
    myapp
    以后只要通过脚本 startmyapp 来启动应用程序,就可以限制应用程序 myapp 的线程栈大小为512K。

    3. 直接在控制台输入
    user_me@chen-10-12-131-28:~> ulimit –p 256 限制管道的缓冲区为 256K。

    * 有效范围
    ulimit 作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?
    事实上,ulimit 限制的是当前 shell 进程以及其派生的子进程。
    举例来说,如果用户同时运行了两个shell 终端进程,只在其中一个环境中执行了 ulimit –s 100,
    则该shell进程里创建文件的大小收到相应的限制,而同时另一个shell 终端包括其上运行的子程序都不会受其影响。

    sysctl vm.max_map_count  // 查看当前机器的进程可以拥有的VMA(虚拟内存区域)的数量  返回:vm.max_map_count = 65530

    sysctl -w vm.max_map_count=6553000  // 修改当前机器的进程可以拥有的VMA(虚拟内存区域)的数量为6553000

    4. 进程操作

    &   启动程序时打印其进程id

    例:./UE4Editor &  // 启动UE4Editor程序,并打印其进程id

    top  动态显示当前系统的进程信息(按进程的cpu占用从大到小排序)

    --------------------------------------------

    h:打印出帮助信息    空格:立即刷新    k:终止掉某个进程    q:退出top

    例:top -H  // 动态显示当前系统的线程信息(按线程的cpu占用从大到小排序)

    例:top -H -p 28182  // 动态显示进程id为2812的所有线程信息(按线程的cpu占用从大到小排序)

    free 查看内存使用情况

    例:free       // 查看当前内存使用状况, 单位 byte
    例:free -m  //查看当前内存使用状况, 单位 MB, 参数还可以是 -g, -k 等

    ps   进程查看命令

    例:ps -ux   //查看当前用户运行进程信息

    例:ps -aux //查看当前所有用户运行的进程

    例:ps -elf //另一种常用的查看所有用户运行进程的指令

    例:ps -efx //查看当前所有用户运行的进程  注:会打印出进程可执行文件的全路径

    例:ps -ef | grep devops | grep -v "grep"  // 显示含有devops字符串且不含有grep字符串的进程信息

    例:ps axwef  //以树状列出进程及子进程

    例:ps aux | sort -nk +4 | tail  // 列出头十个最耗内存的进程

    例:ps -T -p 20282   // 列出线程id为20282中的所有的线程

    例:ps -eo pid,pcpu | sort -n -k 2 | tail -8 // 列出cpu占用头8大的进程(第1列为pid,第2列为进程的cpu占用)

    例:ps -T -eo pid,tid,pcpu | sort -n -k 3 | tail -20  // 列出cpu占用头20大的线程(第1列为pid,第2列为tid,第3列为线程的cpu占用)

    例:ps -T -p 20282 -eo pid,tid,pcpu,cmd | sort -n -k 3 | tail -15  // 列出线程id为20282中cpu占用头15大的线程(第1列为pid,第2列为tid,第3列为线程的cpu占用,第4列为线程名)

    pstree  进程树查看命令(看到进程的父子关系)

    例:pstree // 以进程树的方式输出所有进程的信息

    例:pstree -p 11350 // 以进程树的方式输出pid为11350的信息(由其启动的子进程也会输出)

    pidof  从进程名查询pid

    例:pidof com.tencent.tmgp.pubgm  查询名为com.tencent.tmgp.pubgm进程的pid

    kill  结束指定进程

    例:kill -9 352    // 强行结束PID为352的进程  注:-9表示SIGKILL

    例:killall gamesvr // 终止所有名为gamesvr的进程  注:名称大小写敏感

    例:killall -9 DsymExporter // 强制终止所有名为DsymExporter的进程  注:名称大小写敏感

    例:kill -l   // 列出信号对照表

     1) SIGHUP :终端的挂断或进程死亡

     2) SIGINT :来自键盘的中断信号(Ctrl + C)

     3) SIGQUIT:来自键盘的离开信号,会产生Core文件(Ctrl + \)

     4) SIGILL:非法指令

     5) SIGTRAP:跟踪/断点自陷(调试断点)

     6) SIGABRT:来自abort的异常信号

     7) SIGEMT:Term

     8) SIGFPE: 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误,具体如下:

                          FPE_INTDIV(整数除0)、FPE_INTOVF(整数上溢)、FPE_FLTDIV(浮点除0)、FPE_FLTOVF(浮点上溢)

                          FPE_FLTUND(浮点下溢)、FPE_FLTRES(浮点结果不准)、FPE_FLTINV(无效浮点操作)、FPE_FLTSUB(浮点下标越界)

     9) SIGKILL:杀死

    10) SIGBUS:总线错误(内存访问错误)

    11) SIGSEGV:段非法错误(内存引用无效)。如:试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.

    12) SIGSYS:非法系统调用(SVr4)

    13) SIGPIPE:管道损坏:向一个没有读进程的管道写数据

    14) SIGALRM:来自alarm的计时器到时信号

    15) SIGTERM:终止。shell命令kill缺省产生这个信号

    16) SIGURG: socket紧急信号(4.2BSD)

    17) SIGSTOP:非来自终端的暂停信号

    18) SIGTSTP:来自终端的停止信号(Ctrl + Z)

    19) SIGCONT:如果停止,继续执行

    20) SIGCHLD: 子进程停止或终止,父进程会收到这个信号。

    21) SIGTTIN:后台进程读终端

    22) SIGTTOU:后台进程写终端

    23) SIGIO:描述符上可以进行I/O操作

    24) SIGXCPU:超过CPU时限(4.2BSD)

    25) SIGXFSZ:超过文件长度限制(4.2BSD)

    26) SIGVTALRM:虚拟计时器到时(4.2BSD)

    27) SIGPROF:统计分布图用计时器到时

    28) SIGWINCH:窗口大小改变(4.3BSD, Sun)

    29) SIGINFO:与SIGPWR同义  注:SIGPWR -- 电力故障(System V)

    30) SIGUSR1:用户自定义信号1

    31) SIGUSR2:用户自定义信号2

     

    只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:

    HUP 1 终端断线
    INT 2 中断(同 Ctrl + C)
    QUIT 3 退出(同 Ctrl + \)
    KILL 9 强制终止
    TERM 15 终止
    CONT 18 继续(与STOP相反, fg/bg命令)
    STOP 19 暂停(同 Ctrl + Z)

    更多详见:附录:Linux信号列表 

     

    其他一些快捷键:

    Ctrl + D:Terminate input, or exit shell
    Ctrl + S:Suspend output
    Ctrl + Q:Resume output
    Ctrl + O:Discard output
    Ctrl + L:Clear screen 

     

    pmap 查看内存映像信息

    例:pmap 13455    // 查看进程ID为13455的内存映像信息(含内存使用情况,加载的so等)

    5. 开发相关

    file  查看文件的类型描述

    例:file savespace.py  //查看savespace.py的类型信息

    例:file UE4Editor  // 查看可执行程序UE4Editor(调试信息已被strip掉)的文件信息

    UE4Editor: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.10.93, stripped

    例:file UE4Editor.debug  // 查看可执行程序UE4Editor.debug(很大,里面含调试信息)的文件信息

    UE4Editor.debug: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.10.93, not stripped

    例:file libUE4Editor-Core.so  // 查看共享目标文件(Shared Object File)libUE4Editor-Core.so的文件信息

    libUE4Editor-Core.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

    例:file libpython2.7.a

    libpython2.7.a: current ar archive

    例:file Module.Core.10_of_12.cpp.o

    Module.Core.10_of_12.cpp.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

    例:file core_MyGameServer_1602521155.4113

    core_MyGameServer_1602521155.4113: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/data/home/MyGameServer'

    size  查看可执行程序、so文件、o中间文件的代码段、数据段、BSS段的长度(dec为这3个段总和的十进制,hex为这3个段总和的十六进制)

    例:size UE4Editor

    text data bss dec hex filename
    614439 5076 79780 699295 aab9f UE4Editor

    pstack  不中断的情况下打印进程所有线程的堆栈    注:pstack是gdb的一个工具

    例:pstack 20282  // 打印pid为20282进程所有线程的堆栈

    gstack  功能与pstack一致,只是gstack是一个脚本

    例:gstack 20282  // 打印pid为20282进程所有线程的堆栈

    ldd   查看可执行程序或so文件依赖那些so文件

    例:ldd UE4Editor  // 查看UE4Editor依赖的so文件

    例:ldd libUE4Editor-Slate.so  // 查看libUE4Editor-Slate.so依赖的so文件

    c++filt    还原被gcc编译器修饰后后名称

    例:c++filt _ZN1N1C4funcEi  // 输出N::C::func(int)

    nm   查看ELF文件中的符号

    例:nm libUE4.debug.so

    0000000000400590 T _ZN1N1C4funcEi

    例:nm -n libUE4.debug.so   // 按照地址顺序列出符号信息

    00000000082775f0 T _ZN18UAkGameplayStatics12GetRTPCValueEPK7UAkRtpci14ERTPCValueTypeRfRS3_P6AActor5FName
    0000000008277724 T _ZN18UAkGameplayStatics8SetStateEPK13UAkStateValue5FNameS3_
    0000000008277850 T _ZN18UAkGameplayStatics11PostTriggerEPK10UAkTriggerP6AActor5FName

    例:nm -n -C libUE4.debug.so   // 按照地址顺序列出符号信息,并自动对c++符号名进行反修饰(Demangle)

    00000000082775f0 T AkGameplayStatics::GetRTPCValue(UAkRtpc const*, int, ERTPCValueType, float&, ERTPCValueType&, AActor*, FName)
    0000000008277724 T UAkGameplayStatics::SetState(UAkStateValue const*, FName, FName)
    0000000008277850 T UAkGameplayStatics::PostTrigger(UAkTrigger const*, AActor*, FName)

    strip  清除符号信息

    例:strip -s UE4Editor-Cmd.debug   // 清除UE4Editor-Cmd.debug中所有调试和重定位信息

    例:strip -S UE4Editor-Cmd.debug   // 清除UE4Editor-Cmd.debug中所有调试符号和调试段

    objcopy  将二进制文件变成一个ELF文件

    例:objcopy --remove-section .eh_frame libUE4.so  // 删除libUE4.so中的.eh_frame段

    例:objcopy -I binary -O elf64-littleaarch64 -B aarch64 test.png test.o // 把当前目录下的test.png图片转换成test.o的ELF文件 

    例:objcopy --only-keep-debug foo foo.dbg  // 将foo可执行二进制中的符号信息保存成一个单独的名为foo.dbg符号表文件

    例:objcopy --add-gnu-debuglink=foo.dbg foo  // 建立符号表文件foo.dbg与foo的关联

    例:objcopy --strip-debug main.debug main    // strip掉main.debug可执行文件中的符号,并输出为main可执行文件

    objdump  查看ELF文件

    例:objdump -x test.o  // 输出test.o的整个头的信息    注:包括段表的信息

    test.o:     file format elf64-littleaarch64
    test.o
    architecture: aarch64, flags 0x00000010:
    HAS_SYMS
    start address 0x0000000000000000
    private flags = 0:
    
    Sections:
    Idx Name          Size      VMA               LMA               File off  Algn
      0 .data         0000641e  0000000000000000  0000000000000000  00000040  2**0
                      CONTENTS, ALLOC, LOAD, DATA
    SYMBOL TABLE:
    0000000000000000 l    d  .data  0000000000000000 .data
    0000000000000000 g       .data  0000000000000000 _binary_test_png_start
    000000000000641e g       .data  0000000000000000 _binary_test_png_end
    000000000000641e g       *ABS*  0000000000000000 _binary_test_png_size

    注: _binary_test_png_start、_binary_test_png_end、_binary_test_png_size分别是该图片文件在内存中的起始地址、结束地址和大小;可以在程序里面直接声明并使用它们。

    strings    打印出ELF文件中包含的所有字符串

    例:strings libtestSo.so | grep "EnterPoint"   // 判断libtestSo.so文件中是否包含EnterPoint字符串

    addr2line  将ELF文件的某个地址转换为文件名和行数

    例:addr2line -e libUE4.debug.so 0000000008277724   // 将libUE4.debug.so文件的0000000008277724地址转换为文件名和行数

    /home/admin/MyGame/Plugins/Wwise/Source/AkAudio/Private/AkGameplayStatics.cpp:377

    6. 网络

    ifconfig  显示网络接口以及相应的IP地址

    iwconfig  显示无线网络接口

    route  显示路由表

    rz   从本地上传文件到服务器  SecureCRT命令

    例:rz -bey    从弹出传文件对话框,选择文件进行上传即可 

    sz  从服务器下载文件到本地     SecureCRT命令

    例:sz -bey file1.txt  ../test/file2.txt  ../test2/*  下载file1.txt、file2.txt以及test2目录中的所有文件(不含子目录)

    rz上传于sz下载默认路径设置:

    scp  跨服务器复制文件或目录

    例:scp -P 3000 user@192.168.1.22:/root/test.tar.gz /home/test.tar.gz  获取远程服务器上的文件到本地

    例:scp -r user@192.168.1.22#3000:/root/testDir /home/testDir   获取远程服务器上的目录到本地

    例:scp /home/test.tar.gz user@192.168.1.22#3000:/root/test.tar.gz  将本地文件上传到远程服务器上

    例:scp -r /home/testDir user@192.168.1.22#3000:/root/testDir 将本地目录上传到远程服务器上

    ---------------------

    -P 指定ssh端口号
    -r 递归复制(即复制该目录下面的文件和目录)
    -v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .
    -C 使能压缩选项 .
    -4 强行使用 IPV4 地址 .
    -6 强行使用 IPV6 地址 .

    ---------------------

    netstat  

    例:netstat –tlnp    列出本机进程监听的端口号

    例:netstat -anop   可以显示侦听端口号的进程 

    例:netstat -anop | grep 10.6.221.70  当前主机连向10.6.221.70的信息

    例:netstat -anop | grep 9005   当前主机连向9005端口的信息

    tcpdump

    例:tcpdump tcp port 7012 and host 172.25.34.88 -i eth1 -n   用tcpdump解析tcp连接建立和释放 

    1. 14:44:52.174122 IP 172.25.38.145.49563 > 172.25.34.88.7012: S 1986599379:1986599379(0) win 5840
    2. 14:44:52.174249 IP 172.25.34.88.7012 > 172.25.38.145.49563: S 4294961892:4294961892(0) ack 1986599380 win 5792
    3. 14:44:52.174228 IP 172.25.38.145.49563 > 172.25.34.88.7012: . ack 1 win 1460
    4. 14:44:52.174433 IP 172.25.38.145.49563 > 172.25.34.88.7012: P 1:109(108) ack 1 win 1460
    5. 14:44:52.174443 IP 172.25.34.88.7012 > 172.25.38.145.49563: . ack 109 win 1448
    6. 14:44:52.186891 IP 172.25.34.88.7012 > 172.25.38.145.49563: P 1:857(856) ack 109 win 1448
    7. 14:44:52.186914 IP 172.25.34.88.7012 > 172.25.38.145.49563: F 857:857(0) ack 109 win 1448
    8. 14:44:52.187054 IP 172.25.38.145.49563 > 172.25.34.88.7012: . ack 857 win 1888
    9. 14:44:52.195347 IP 172.25.38.145.49563 > 172.25.34.88.7012: F 109:109(0) ack 858 win 1888
    10. 14:44:52.195355 IP 172.25.34.88.7012 > 172.25.38.145.49563: . ack 110 win 1448

    每一行中间都有这个包所携带的标志:
    S=SYN,发起连接标志。
    P=PUSH,传送数据标志。
    F=FIN,关闭连接标志。
    . ack表示响应确认包。
    RST=RESET,异常关闭连接。

    抓包的过程解析:
    第1行:14:44:52,从172.25.38.145(client)的临时端口49563向172.25.34.88(server)的7012监听端口发起连接,
    client初始包序号为1986599379,滑动窗口大小为5840字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),
    mss大小为1460(即可接收的最大包长度,通常为MTU减40字节,IP头和TCP头各20字节)。
    第2行:server响应连接,同时带上第一个包的ack信息,为client端的初始包序号加1,
    即1986599380,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。
    Server端的初始包序号为4294961892,mss也是1460。
    第3行:client再次确认,tcp连接三次握手完成。
    第4行:client发请求包,包长度108字节。
    第5行:server响应ack。
    第6行:server回包,包长度856字节。
    第7行:client响应ack。
    第8行:client发起关闭连接请求。
    第9行:server响应ack,并且也发送FIN标志关闭。
    第10行:客户端响应ack,关闭连接的四次握手完成。

    --------------------------------------------------------------

    指定源地址和目的地址

    tcpdump -i eth1 src host 172.25.38.145
    tcpdump -i eth1 dst host 172.25.34.88

    >> tcpdump小结

    7. 文本处理

    grep  正则表达式文本搜索工具  --管道命令

    参数说明:

    -zz    // 显示匹配行周围的上下zz行

    -n    // 打印该行所在的行数

    -c    // 打印出匹配到的总行数

    -i     // 忽略大小写

    -v    // 反检索,只显示不匹配的行

    -a    // 将二进制档案视为文本文件搜寻

    -b    // 搜索统计

    -r     // 递归目录搜索

    -h     // 在每个符合样式行前加上符合的文件名称,但不显示文件路径

    -H     // 在每个符合样式行前加上符合的文件名称,若有路径会显示路径

    -l      // 不显示平常一般的输出结果,只显示符合的文件名称

    -L     // 不显示平常一般的输出结果,反而显示出没有符合的文件名称

    -f     // 使用样式文件(一行一个样式)进行搜索

    -w    // 将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出

    -x    // 将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出

    正则表达式语法:

    ^     // 匹配行首

    $      // 匹配行尾

    *      // 匹配任意字符

    .       // 匹配一个非换行字符

    []     // 匹配指定范围的字符

    [^]   // 匹配不在指定范围的字符

    \(..\)  // 标记匹配字符,如'\(love\)',love被标记为1

    \<      // 匹配单词的开始

    \>      // 匹配单词的结尾

    x\{m\}  // 重复字符x,m次

    x\{m,\}  // 重复字符x,至少m次

    x\{m,n\}  // 重复字符x,m到n次

    \w      // 匹配文字和数字字符,等价于[A-Za-z0-9]

    \W     // 匹配一个或多个非单词字符,如点号句号等

    \b      // 单词锁定符  如: \bgrep\b只匹配grep

    例:grep "CRoom::OnUserEnterRoom" *  // 当前目录下,在所有文件中搜索CRoom::OnUserEnterRoom字符串

    例:grep -E 'Address|libUE4.so|\[stack\]'  // 过滤信息为Address或libUE4.so或[stack]字符串

    egrep  grep扩展命令

    egrep "(DoEndAttack|SyncAIAttack)" room96.log | grep 10102002 | head -100  // 打印出当前目录下room96.log中包含“DoEndAttack”、“SyncAIAttack”或“10102002”字符串的前100行

  • 相关阅读:
    细说java中的类
    使用LayUI操作数据表格
    使用LayUI展示数据
    一步一步做搜索(一)
    试图加载格式不正确的程序
    自己实现spring核心功能 三
    SpringMvc请求处理流程与源码探秘
    设计模式之代理模式
    爬虫功能介绍
    爬虫监控帮助文档汇总
  • 原文地址:https://www.cnblogs.com/kekec/p/2679496.html
Copyright © 2011-2022 走看看