Linux快速整理

环境搭建:

vmware虚拟机+XShell登录虚拟机

Linux快速整理:

  1. [root@hadoop001 ~]表示[登录的用户@机器名称 ],“”表示家目录

  2. pwd查看当前所在目录路径地址

    有时候2个文件夹同名可能会搞错,需要要查看目录

  3. 切换目录 cd

    root用户的家目录:/root

    xxx用户的家目录:/home/xxx 默认

    家目录的修改:vi /etc/passwd 默认不修改

    什么情况会修改?部署mysql时,修改mysqladmin的家目录为/usr/local/mysql,方便操作与规范。行业里比较标准的事情

    cd 回车 / cd ~ / cd /root 回到家目录

    cd -回到上一次访问的目录

    cd ../ 回退上一层目录

    cd ../../ 回退上两层目录

  4. 目录 文件夹

    绝对路径:“/”代表根目录,以根目录开始表示

    ​ 写shell脚本时,路径要用绝对路径。

    相对路径:不以根目录为开始,以当前光标所在目录(pwd结果)为开始表示

    查看当前文件夹下的内容 ls

  5. 清空屏幕 clear

  6. ls查看当前光标所在的目录 文件有哪些

    ls -l 等价于`ll``

    ``ls -l -a` 查看当前的文件文件夹+ 隐藏文件、文件夹(以.开头)

    ll -h 显示文件的大小

    ll -rt 按时间排序

  7. 查询命令帮助 --help /man

  8. 创建文件夹 mkdir

    1
    mkdir [-mp] 目录名称

    选项与参数:

    • -m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~
    • -p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!

    例如

    mkdir -p a/b/c/d递归创建多层目录

    mkdir a b c d在当前文件夹下创建4个文件夹

    删除空的目录:rmdir

    选项与参数:

    • -p :从该目录起,一次删除多级空目录
  9. 复制文件或目录: cp [-adfilprsu] source destination

    移动文件与目录,或修改名称: mv [-fiu] source destination

    移除文件或目录: rm [-fir] 文件或目录

    思考:mv和cp哪个执行快?

    • 同一个文件系统(在同一个分区)内,mv的速度是瞬间的,因为它所有需要的是重命名的目录的文件路径。除了目录条目之外,没有必要更改任何数据。
    • 在文件系统之间移动目录将涉及将数据复制到目标并将其从源中删除。这将与在单个文件系统中复制(复制)数据一样长的时间。
    • 都可修改名称。
  10. 如何创建一个空文件 或者把一个文件设置为空

    • touch rz.log 如何创建一个空文件

      touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。

    • echo “” > rz.log1 慎用(不是真正的空,会有1字节的大小)

    • cat /dev/null > ruoze.log20191113 把一个文件设置为空

  11. 查看文件内容

    • cat命令用于连接文件并打印到标准输出设备上。

      -n 或 –number:由 1 开始对所有输出的行数编号。

    • more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读

      空白键(space)- 往下一页显示

      b - 往回(back)一页显示

      q - 退出more

    • less 与 more 类似,less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页

      /字符串:向下搜索”字符串”的功能

      ?字符串:向上搜索”字符串”的功能

      n:重复前一个搜索(与 / 或 ? 有关)

      N:反向重复前一个搜索(与 / 或 ? 有关)

      G :移动到最后一行

      g:移动到第一行

      q / ZZ :-退出 less 命令

    配置文件,内容较少,可用以上上个命令

    log日志,内容较多,用tail命令

    • tail 可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。

      实时查看

      tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。

      tail -F filename等于-f + retry,即使文件丢失后再创建也会更新

      补充:flume exec source 切记使用 -F

      -n<行数> 显示文件的尾部 n 行内容

      -c<数目> 显示的字节数

      tail -n -5 /test001/text001tail -n 5 /test001/text001 显示的结果相同,均是文件末尾最后 5 行内容。
      tail -n +5 /test001/text001 显示的内容为从第 5 行开始,直到末尾的内容。tail -n 后面的数字有效输入只有单个数字(5)或者加号连接数字(+5)两种。

      tail -300f messages 实时查看倒数300行文件
      tail -300F messages 不能这样写,即不能写成数字+F
      tail: option used in invalid context – 3

  12. 文件上传下载工具

    安装: yum install -y lrzsz

    文件下载到windows:sz

    windows上传到linux: rz

  13. 如何定位ERROR

    • 文件内容很小,几十兆

      先下载到windows上,用编辑器打开搜索关键字定位ERROR

    • 文件内容很大,几百兆 2G

      cat xxx.log | grep ERROR

      | 是管道符,管道符前面的命令结果作为管道符后面命令的输入,grep是过滤命令

  14. grep命令

    grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 **-**,则 grep 指令会从标准输入设备读取数据。

    -A<显示行数> 或 –after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。

    -B<显示行数> 或 –before-context=<显示行数>: 除了显示符合样式的那一行之外,并显示该行之前的内容。

    -C<显示行数> 或 –context=<显示行数>或-<显示行数>: 除了显示符合样式的那一行之外,并显示该行之前后的内容。

    cat xxx.log | grep -A 10 ERROR 后10行
    cat xxx.log | grep -B 10 ERROR 前10行
    cat xxx.log | grep -C 30 ERROR 前后各30行 经常用 迅速定位ERROR上下文

    cat xxx.log | grep -C 30 ERROR > error.log 新建/覆盖
    cat xxx.log | grep -C 30 ERROR >> error.log 追加

  15. 环境变量$PATH

    打印环境变量:echo $PATH

    1
    2
    [root@hadoop001 ~]# echo $PATH
    /usr/local/mysql/bin:/usr/java/jdk1.7.0_80/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    which命令:依次在环境变量$PATH中以冒号分割,查找目录下是否有要查找的命令目录,返回第一个查找到的目录地址

    1
    2
    3
    [root@hadoop001 ~]# which ls
    alias ls='ls --color=auto'
    /bin/ls

    全局环境变量: /etc/profile 所有人都使用
    个人环境变量: ~/.bash_profile

                          ~/.bashrc       个人 不给其他人
    

    注意:配置个人环境变量文件**.bashrc** 优先。当用ssh远程登录时,**.bashrc** 会自动生效, .bash_profile则不会,bug。

    生效文件: source xxxx

                  `. ~/.bashrc`
    

    (补充:安装unzip命令 :yum install -y unzip 解压:tar -xzvf xxxx.tar.gz

    配置环境变量:vi /etc/profile

    环境变量是指的什么
    K=V 等号前后不能有空格
    使用环境变量K时用$符号,如: $K

    export JAVA_HOME=usr/java/jdk1.8.0_121

    export PATH=$JAVA_HOME/bin:$PATH

    新配置的变量在前面追加

    a. 上下键 移动光标
    b. 按 i键insert 进入 编辑模式
    c. 开始编辑
    d. 按 esc键退出 编辑模式,进入命令行模式
    e. 按 :(shift+;)键,进入尾行模式
    f. 输入 wq 保存退出

    1
    2
    3
    4
    5
    6
    [root@ruozedata001 java]# source /etc/profile
    [root@ruozedata001 java]# echo $PATH
    /usr/java/jdk1.8.0_121/bin:/usr/java/jdk1.8.0_12/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@ruozedata001 java]# which java
    /usr/java/jdk1.8.0_121/bin/java
    [root@ruozedata001 java]#

    小结:
    1.command not found
    没有部署安装包,部署了没有配置环境变量
    2.习惯
    当我们以后部署一个软件,bin目录的可执行文件 比如java
    习惯 当生效环境变量文件,习惯做 which java

  16. 别名alias

    alias 命令用于设置指令的别名。

    用户可利用alias,自定指令的别名。若仅输入alias,则可列出目前所有的别名设置。alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在.profile或.bashrc中设定指令的别名。

    1
    alias[别名]=[指令名称]
    1
    2
    3
    4
    5
    6
    7
    8
    [root@hadoop001 ~]# alias
    alias cp='cp -i'
    alias l.='ls -d .* --color=auto'
    alias ll='ls -l --color=auto'
    alias ls='ls --color=auto'
    alias mv='mv -i'
    alias rm='rm -i'
    alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

    配置个人环境变量文件**.bashrc** 优先。当用ssh远程登录时,**.bashrc** 会自动生效, .bash_profile则不会,bug。

  17. 查看历史命令history

    当前命令输入状态下:

    * 可以按一下**上\下方向键**,命令行就会显示相对于当前命令的上一条或下一条历史记录.
    
    *  和方向键相同功能的就是组合键**Ctrl+ p** (前面执行过的命令),**Ctrl +n**(后面执行过的命令)
    
    • 上面两个都是相对于当前命令查询上一条或者下一条命令的历史记录.如果搜索命令历史记录,就用Ctrl+ r 组合键进入历史记录搜寻状态,然后,键盘每按一个字母,当前命令行就会搜索出命令历史记录.使用Ctrl+r反向查询历史命令,将匹配的最新一条显示出来

      如果还想继续向上查询,继续按Ctrl+r

    history [n] n为数字,列出最近的n条命令

    history -c 将目前shell中的所有history命令消除

    使用! 执行历史命令。

    * `!  [n]`  n为数字 执行第n条命令
    
    • ! command 从最近的命令查到以command开头的命令执行
    • !! 执行上一条

    当同一账号,同时登录多个bash时,只有最后一个退出的会写入bash_history,其他的都被覆盖了。

    历史命令文件记录在 ~/.bash_history中,要清空历史记录:

    1
    2
    cat /dev/null >  ~/.bash_history
    history -c

    拓展:

    当刚进公司进入服务器,第一步应该用history 看看这个账号之前做过哪些操作,有可能发现password

  18. 删除
    生成新文件:

    1
    2
    3
    touch xxx.log 
    cat /dev/null > xxx.log //把文件置空
    vi xxx.log

    创建文件夹: mkdir

    rm(英文全拼:remove)命令用于删除一个文件或者目录。

    • -i 删除前逐一询问确认。

    • -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。

    • -r 将目录及以下之档案亦逐一删除。

      删除文件可以直接使用rm命令,若删除目录则必须配合选项”-r”,例如:

      1
      2
      3
      4
      5
      6
      # rm  test.txt 
      rm:是否删除 一般文件 "test.txt"? y
      # rm homework
      rm: 无法删除目录"homework": 是一个目录
      # rm -r homework
      rm:是否删除 目录 "homework"? y

    文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。

    风险:
    rm -rf / 高危命令
    什么场景会发生? shell脚本:

    K=’/home/jepson’

    K=’’
    shell脚本中必须判断 $K命令是否存在
    rm -rf $K/*

    1
    2
    3
    4
    5
    6
    7
    [root@hadoop001 6]# K='' //本应该设置K='/home/jepson'
    [root@hadoop001 6]# echo $K/
    /
    [root@hadoop001 6]# ls $K/
    6 data home lost+found mnt proc selinux tmp
    bin dev lib media net root srv usr
    boot etc lib64 misc opt sbin sys var
  19. 用户 用户组

    创建用户:useradd username

    查看用户信息:id username

    1
    2
    3
    [root@hadoop001 ~]# id ruoze
    //uid=501(ruoze) gid=501(ruoze) groups=501(ruoze) 默认值
    uid=501(ruoze) gid=502(bigdata) groups=502(bigdata),501(ruoze)

    创建一个普通用户,默认创建这个名称的用户组ruoze,
    且设置这个用户 主组为ruoze,且创建/home/ruoze

    查看机器上的用户:cat /etc/passwd
    查看机器上的用户组:cat /etc/group

    删除用户:userdel username

    删除用户后,/etc/passwd内会删除用户信息,但是用户home文件夹依然存在。如果组内只有一个成员,成员被删除后,组会自动删除。

    模拟切换用户丢失样式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@ruozedata001 ruoze]# ll -a
    total 12
    drwx------ 2 ruoze ruoze 59 Nov 16 21:16 .
    drwxr-xr-x. 5 root root 44 Nov 16 21:16 ..
    -rw-r--r-- 1 ruoze ruoze 18 Apr 11 2018 .bash_logout
    -rw-r--r-- 1 ruoze ruoze 193 Apr 11 2018 .bash_profile
    -rw-r--r-- 1 ruoze ruoze 231 Apr 11 2018 .bashrc
    [root@ruozedata001 ruoze]# rm -rf .bash*

    [root@ruozedata001 ~]# su - ruoze
    Last login: Sat Nov 16 21:29:09 CST 2019 on pts/1
    -bash-4.2$
    -bash-4.2$

    修正样式(从/etc/skel上把隐藏文件复制到用户home目录下即可)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    [root@ruozedata001 ruoze]# cp /etc/skel/.* /home/ruoze/
    cp: omitting directory ‘/etc/skel/.’
    cp: omitting directory ‘/etc/skel/..’
    [root@ruozedata001 ruoze]# ll -a
    total 12
    drwx------ 2 ruoze ruoze 59 Nov 16 21:32 .
    drwxr-xr-x. 5 root root 44 Nov 16 21:16 ..
    -rw-r--r-- 1 root root 18 Nov 16 21:32 .bash_logout
    -rw-r--r-- 1 root root 193 Nov 16 21:32 .bash_profile
    -rw-r--r-- 1 root root 231 Nov 16 21:32 .bashrc
    [root@ruozedata001 ruoze]# chown ruoze:ruoze .bash*

    [root@ruozedata001 ruoze]# ll -a
    total 12
    drwx------ 2 ruoze ruoze 59 Nov 16 21:32 .
    drwxr-xr-x. 5 root root 44 Nov 16 21:16 ..
    -rw-r--r-- 1 ruoze ruoze 18 Nov 16 21:32 .bash_logout
    -rw-r--r-- 1 ruoze ruoze 193 Nov 16 21:32 .bash_profile
    -rw-r--r-- 1 ruoze ruoze 231 Nov 16 21:32 .bashrc
    [root@ruozedata001 ruoze]#
    [root@ruozedata001 ~]# su - ruoze
    Last login: Sat Nov 16 21:30:23 CST 2019 on pts/2
    [ruoze@ruozedata001 ~]$

    创建用户组:groupadd groupname

    把用户添加到用户组:usermod -a -G bigdata ruoze

    1
    2
    3
    usermod	-g, --gid GROUP               force use GROUP as new primary group
    -G, --groups GROUPS new list of supplementary GROUPS
    -a, --append append the user to the supplemental GROUPS

    给用户设置密码:passwd username,passwd后不加参数,就是设置当前用户的密码

    切换用户:su

    1
    2
    su username
    su - username

    加”-“会把当前目录切换到用户的家目录,且执行环境变量文件(.bash_profile和.bashrc都执行)

    不加“-”,目录不切换,.bashrc中的配置执行,.bash_profile中的配置不执行。所以配置最好写在.bashrc上。

    用户权限问题:connection连接拒绝、Permission denied

    普通用户获取root的最大权限vi /etc/sudoers

    1
    2
    Allow root to run any commands anywhere 
    username ALL=(root) NOPASSWD:ALL
    1
    2
    3
    4
    5
    6
    [ruoze@ruozedata001 root]$ ls -l
    ls: cannot open directory .: Permission denied
    [ruoze@ruozedata001 root]$ cat rz.log
    cat: rz.log: Permission denied
    [ruoze@ruozedata001 root]$ sudo cat rz.log
    www.ruozedata.com

    /etc/passwd:

    设置为:ruoze:\x:1002:1003::/home/ruoze:/bin/false,然后su切换失败

    1
    2
    3
    [root@ruozedata001 ~]# su - ruoze
    Last login: Sat Nov 16 21:57:32 CST 2019 on pts/0
    [root@ruozedata001 ~]#

    设置为:ruoze:\x:1002:1003::/home/ruoze:/sbin/nologin,然后不允许登录

    1
    2
    3
    4
    [root@ruozedata001 ~]# su - ruoze
    Last login: Sat Nov 16 22:08:52 CST 2019 on pts/0
    This account is currently not available.
    [root@ruozedata001 ~]#

    所以以后在CDH中遇到切换用户失败,到/etc/passwd中对应修改为 /bin/bash

  20. 权限:chown chmod

    错误: Permission denied(permission denied一般用chmod修改文件权限就可,chown不必要)

    1
    2
    3
    chmod -R 777 文件夹/文件路径
    chown -R 用户:用户组 文件夹/文件路径
    -R, --recursive operate on files and directories recursively
    1
    2
    3
    4
    [root@ruozedata001 ~]# ll
    total 4
    drwxr-xr-x 2 root root 6 Nov 16 22:15 ruozedata
    -rw-r--r-- 1 root root 18 Nov 16 21:58 rz.log

    第一个字符:d:文件夹;-:文件;l:连接;

    r: read 4
    w: write 2
    x: 执行 1
    -: 没权限 0

    rwx 第一组 7 代表文件或文件夹的用户root,读写执行
    r-x 第二组 5 代表文件或文件夹的用户组root,读执行
    r-x 第三组 5 代表其他组的所属用户对这个文件或文件夹的权限: 读执行

  21. 查看大小

    文件:

    • ll
    • du -sh

    文件夹:

    • du -sh
    • 用ll看到的并不是文件夹大小
  22. 删除执行中的程序或工作:kill

    kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。

    若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号(pid)可利用 ps 指令或 jobs 指令查看。

    root用户将影响用户的进程,非root用户只能影响自己的进程。

    使用 kill -l 命令列出所有可用信号。最常用的信号是:

    • 1 (HUP):重新加载进程。
    • 2(INT):中断(同 Ctrl + C)
    • 3(QUIT):退出(同 Ctrl + \)
    • 9 (KILL):强制杀死一个进程。
    • 15 (TERM):正常停止一个进程。

    杀死进程

    1
    # kill pid

    强制杀死进程

    1
    2
    # kill -KILL pid
    # kill -9 pid

    发送SIGHUP信号,可以使用一下信号

    1
    # kill -HUP pid

    杀死指定用户所有进程

    1
    2
    #kill -9 $(ps -ef | grep hnlinux) //方法一 过滤出hnlinux用户进程 
    #kill -u hnlinux //方法二

    扩展:kill pid与kill -9 pid的区别

    kill pid的作用是向进程号为pid的进程发送SIGTERM(这是kill默认发送的信号),该信号是一个结束进程的信号且可以被应用程序捕获。若应用程序没有捕获并响应该信号的逻辑代码,则该信号的默认动作是kill掉进程。这是终止指定进程的推荐做法。

    kill -9 pid则是向进程号为pid的进程发送SIGKILL(该信号的编号为9),SIGKILL既不能被应用程序捕获,也不能被阻塞或忽略,其动作是立即结束指定进程。通俗地说,应用程序根本无法“感知”SIGKILL信号,它在完全无准备的情况下,就被收到SIGKILL信号的操作系统给干掉了,显然,在这种“暴力”情况下,应用程序完全没有释放当前占用资源(善后:关闭socket链接、清理临时文件、将自己将要被销毁的消息通知给子进程、重置自己的终止状态)的机会。事实上,SIGKILL信号是直接发给init进程的,它收到该信号后,负责终止pid指定的进程。在某些情况下(如进程已经hang死,无法响应正常信号),就可以使用kill -9来结束进程。

    注意:kill生产上不能随意杀进程,确认是自己服务不影响其他不丢数据,在杀死前周知运维、部门。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。

  23. 其他命令

    • 搜索 find

      1
      #find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

      将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:

      1
      #find . -name "*.c"

      将当前目录及其子目录中的所有文件列出:

      1
      #find . -type f

      将当前目录及其子目录下所有最近 20 天内更新过的文件列出:

      1
      #find . -ctime -20
    • 查看进程:ps -ef

    • 系统情况:top(load average: 0,0,0反映繁忙不繁忙。超过十就很高。)

    • 查看ip通不通:ping ip地址

    • 测试端口号连通性:telnet ip地址 端口号