zoukankan      html  css  js  c++  java
  • Linux 命令行

    Linux 命令笔记


    一、目录/文件

    1.1 目录文件日常操作

    .            ->    当前目录
    ..           ->    上一级目录
    .file/.dir   ->    隐藏文件/文件夹
    

    【ls】 查看指定目录文件
    ls命令是最常用的linux命令,要配合着选项使用。

    常用命令
    
    ls -lh # 方便查看文件大小
    ls -AsSh
    

    【pwd】:查看当前目录

    pwd等价于/bin/pwd -L,显示当前绝对路径,如果是链接,则显示链接路径
    pwd -P等价于/bin/pwd -P,显示实际路径,而非链接路径
    
    如果文件夹被临时删除,pwd还是显示未删除文件夹的那个路径,这时候可以使用/bin/pwd,就会提示当前路径不存在
    

    【cd】:切换目录

    cd -    # 上一目录
    cd ~    # 家目录
    cd      # 家目录
    cd ..   # 上一目录
    cd !$   # 将上命令的参数做为cd 参数
    

    【touch】:新建文件

    1. 创建新文件同时可以指定一些时间参数
    $ touch newfile
    
    2. 一次性创建多个文件
    $ touch {1..10}.txt
    

    可以对已有文件修改时间戳(ll显示的时间)

    【1】
    touch -d [[CC]YY]MMDD text
    touch -t [CC[YY]MMDDhhmm[.SS] text
    CC为年数中的前两位,即”世纪数”;YY为年数的后两位,即某世纪中的年数.如果不给出CC的值
    touch -d 20171004 text
    touch -t 201710041330.30 text
    
    【2】
    -r:以另一文件为基准更新时间戳
    以file1的时间戳为基准,将file2的改成一样的
    touch -r file1 file2
    
    【3】其他不常用参数
    -a   或--time=atime或--time=access或--time=use  只更改存取时间。
    -c   或--no-create  不建立任何文档。
    -f  此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
    -m   或--time=mtime或--time=modify  只更改变动时间。
    

    【mkdir】:新建文件夹

    # 创建一个或多个的同级目录
    mkdir adir bdir
    
    # 递归创建目录
    # 当前目录下并没有cdir这个文件夹,如果使用单纯mkdir cdir/ddir会报错。
    # 应该使用
    mkdir -p cdir/ddir
    
    # 指定权限
    mkdir -m 777 dir_name
    
    # 显示创建信息(成功或失败)
    mkdir -v dir_name
    
    # 使用!$快速进入新建文件夹
    mkdir ming
    cd !$
    

    【rm | rmdir】

    # 只能删除空文件夹
    rmdir dirname
    
    # 删除当前文件夹下所有文件并不提示
    rm -f *
    
    # 递归删除dirname下所有文件
    rm -r dirname
    
    # 上面二者结合,递归删除dirname下所有文件并不提示
    rm -rf dirname
    

    【cp】:复制文件或目录

    # 递归复制old_dir目录下所有文件和文件夹到new_dir文件夹下
    cp -r old_dir new_dir
    

    注意:默认cp拷贝文件后会使用预设权限,即其他人没有更改的权限,需要使用-p或
    者-a文件所有的所有特性都一起复制过来 (拉取源站数据缓存,不更改文件最后修改
    时间)

    【mv】:移动或重命名

    # 移动/tmp/test/sample.txt文件到当前目录下
    mv /tmp/test/sample.txt ./
    

    【cat 】查看文件

    作用:文本文件查看和连接工具,用于查看文本文件的内容。
    命令格式:cat file 经常和more、head、tail、less以及管道命令结合使用,如:cat file | more、cat file | head等。

    三个功能

    1.一次显示整个文件:cat filename
    2.从键盘创建一个文件:cat > filename 创建文件,输入内容,Ctrl+d 结束
    3.将几个文件合并为一个文件:cat file1 file2 > file
    

    命令参数

    -A, --show-all           等价于 -vET
    -b, --number-nonblank    对非空输出行编号
    -e                       等价于 -vE
    -E, --show-ends          在每行结束处显示 $
    -n, --number     对输出的所有行编号,由1开始对所有输出的行数编号
    -s, --squeeze-blank  有连续两行以上的空白行,就代换为一行的空白行
    -t                       与 -vT 等价
    -T, --show-tabs          将跳格字符显示为 ^I
    -u                       (被忽略)
    -v, --show-nonprinting   使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
    

    【tac】反向查看

    cat是第一行到最后一行,tac是最后一行到第一行
    

    【head | tail】

    # 显示前10行
    head xs.txt  等价于  cat xs.txt|head  等价于  cat xs.txt|head -n 10
    
    
    # 显示最后10行
    tail xs.txt  等价于  tail -n 10 xs.txt
    
    
    # 显示除末尾10行外
    head -n -10 xs.txt
    

    【more | less】

    更具体命令可以参考:Linux中more和less命令用法

    【more】
    # 回车就往下一行显示,空白键就往下一页显示
    # 按 b 键就会往回一页显示,按 q 就会退出
    more xs.txt
    
    # 查找比较鸡肋,并从该处前两行开始显示输出
    more +/查找内容 xs.txt
    
    【less】
    # 和more几乎一样的功能,但是less更灵活(可以使用任何vim的移动命令,还有标记功能很使用),比如查找命令,直接像vim一样输入/即可
    less xs.txt
    
    ma : 使用 a 标记文本的当前位置
    'a : 导航到标记 a 处
    
    F :实现和tail -f的功能,实时输出内容,tail +F xs.txt
    

    小练习

    选取xs.txt的10-20行

    head -n 20 xs.txt|tail
    
    # 更快捷的方法
    sed -n '10,20p' xs.txt
    

    1.2 文件处理

    wc

    统计文件信息

    # 统计所有信息(行数、单词数、字符数)
    $ wc /etc/passwd
    
    # 行数
    $ wc -l /etc/passwd
    
    # 单词数   # 中文无法统计
    $ wc -w /etc/passwd
    
    # 字节数
    $ wc -c /etc/passwd
    
    # 字符数
    $ wc -m /etc/passwd
    
    # 最长行字节数
    $ wc -L /etc/passwd
    

    sort

    $ cat /etc/passwd | sort
    $ cat /etc/passwd | sort -r
    
    # 以:为分隔符,对第三列排序,所得的结果,再通过cut以:为分隔符取第三列
    $ cat /etc/passwd | sort -t ":" -k 3 |cut -d ":" -f 3
    

    uniq

    # 显示每行重复频率
    uniq -c 文件名
    
    # 只显示有重复的行
    uniq -d 文件名
    

    挑战题目

    wget http://labfile.oss.aliyuncs.com/courses/1/data1
    # 里面是包含一些命令使用的列表
    
    # 要求:从里面找出出现频率次数前3的命令并保存在/home/result
    
    $ cat data1 | cut -c 8-|cut -d " " -f 1 |sort | uniq -dc | sort -r -n -k1 | head -n 3 > /home/result
    
    

    1.3 文字处理

    tr

    tr可以删除或者去重某文本信息中的某些文字。还可以进行替换操作

    # 删除hello,里面所有l,o字符
    $ echo 'hello' | tr -d 'lo'
    
    # 去重hello里的l
    $ echo 'hello' | tr -s 'l'
    
    # hello里,l换成a,e换成b
    $ echo 'hello' | tr 'le' 'ab'
    

    col

    将tab转换为等数量的空格,或者反转

    -x   tab转空格
    -h   空格转tab(默认)
    
    # 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
    $ cat -A /etc/protocols
    
    # 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了
    $ cat /etc/protocols | col -x | cat -A
    

    sed

    文件处理工具。
    使得不需要打开文件就可以对文件进行操作(删除,替换,选取,新增)。以行为单位进行处理。

    常用选项

    -n∶经过处理后的结果显示出来。不影响真实文件。
    -e:直接在指令列模式上进行 sed 的动作编辑;(没明白)
    -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
    -i∶直接修改读取的档案内容,而不是由屏幕输出。
    

    常用命令:

    a∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
    c∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
    d∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
    i∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    p∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n
    s∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
    

    删除某行

     sed '1d' somefile              #删除第一行
     sed '$d' somefile              #删除最后一行
     sed '1,2d' somefile           #删除第一行到第二行
     sed '2,$d' somefile           #删除第二行到最后一行
     
     # 以上,只是输出,源文件并不会替换,若要对源文件进行修改,需加 -i
     sed -i '1,2d' somefile
     
    

    显示某行

     sed -n '1p' somefile           #显示第一行
     sed -n '$p' somefile           #显示最后一行
     sed -n '1,2p' somefile        #显示第一行到第二行
     sed -n '2,$p' somefile        #显示第二行到最后一行
    

    使用模式进行查询

     sed -n '/ruby/p' somefile    #查询包括关键字ruby所在所有行
     sed -n '/$/p' somefile      #查询包括关键字$所在所有行,使用反斜线屏蔽特殊含义
    

    插入行

    sed '1a drink tea' somefile              #第一行后增加字符串"drink tea"
    sed '1,3a drink tea' somefile            #第一行到第三行后增加字符串"drink tea"
    sed '1a drink tea
    or coffee' somefile   #第一行后增加多行,使用换行符
    
    

    替换行

    sed '1c Hi' somefile                #第一行代替为Hi
    sed '1,2c Hi' somefile              #第一行到第二行代替为Hi
    

    替换行中部分数据

    sed 's/ruby/bird/g somefile'    #替换ruby为bird,记住这个并不会更改源文件,只是输出
    sed 's/ruby//g' somefile       #删除ruby
    

    【注意】:以上对源文件都不做修改,若要修改,要加上-i

    1.4 文件重构

    cut

    【显示每行的某位置的内容】

    # 前五个(包含第五个)
    $ cut /etc/passwd -c -5
    # 前五个之后的(包含第五个)
    $ cut /etc/passwd -c 5-
    # 第五个
    $ cut /etc/passwd -c 5
    # 2到5之间的(包含第五个)
    $ cut /etc/passwd -c 2-5
    

    【以指定的分隔符分隔,并返回某些列】

    # 返回第一列和第六列
    $ cut /etc/passwd -d ":" -f 1,6
    

    awk

    awk是一个强大的文本分析工具。
    简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片(相当于Excel的分列),切开的部分再进行各种分析处理。

    # 打印空白行,文件有几个空行,就输出几个空行
    awk '/^$/{print "This is a blank line"}' awk.txt
    
    # 打印全部列,引用变量
    awk '{print $0}' awk.txt
    
    # 打印前三列,引用变量
    awk '{print $1,$2,$3}' awk.txt
    
    # 指定间隔符为空格,获取第四列
    awk -F" " '{print $4}' awk.txt
    
    # 重组表格
    awk  -F ':'  '{print $1"	"$7}' awk.txt
    
    # 表头和结尾,会先输出name,shell
    awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}' awk.txt
    
    # 在awk中引用变量变量,在原理是拼接.
    limit=30
    df -Th| grep "/dev/vd" | sed 's/%//g' |awk '{ if($6>'"$limit"') print $6}'
    

    1.5 其他命令

    nl

    -b :指定行号指定的方式,主要有两种:

    -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
    -b t :如果有空行,空的那一行不要列出行号(默认值);
    

    -n :列出行号表示的方法,主要有三种:

    -n ln :行号在萤幕的最左方显示;
    -n rn :行号在自己栏位的最右方显示,且不加 0 ;
    -n rz :行号在自己栏位的最右方显示,且加 0 ;
    
    -w  :行号栏位的占用的位数。
    nl -b a -n rz -w 3 text
    

    1.6 文件查找

    which:查询软件

    在PATH变量指定的路径中,搜索某个系统命令(可执行文件)的位置,并且返回第一个搜索结果。

    参数选项(基本不用)

    -n  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
    -p  与-n参数相同,但此处的包括了文件的路径。
    -w  指定输出时栏位的宽度。
    -V  显示版本信息
    

    grep:搜索神器

    搜索并筛选显示结果。
    该命令经常配合管道命令来控制输出。
    以下 是常用的选项:

    【非常好用:不打开文件,直接搜索指定目录下文件内的内容】

    $ vim a   # wongbingming
    $ vim b   # wangbingming
    $ grep -rnI "bingming" .    # 当然这里也可以使用正则表达式
    ./a:1:wongbingming
    ./b:1:wangbingming
    
    参数解释
    -r  递归遍历各个文件夹下的所有文件
    -n  显示在文件中的第几行查询到
    -I  忽略二进制文件
    

    whreris:简单快速

    定位可执行文件、源代码文件、帮助文件在文件系统中的位置。
    个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。

    $ whereis who
    

    参数选项

    -b   定位可执行文件。
    -m   定位帮助文件。
    -s   定位源代码文件。
    -u   搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。
    -B   指定搜索可执行文件的路径。
    -M   指定搜索帮助文件的路径。
    -S   指定搜索源代码文件的路径。
    

    locate:快而全

    通过/var/lib/mlocate/mlocate.db数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb命令(在我们的环境中必须先执行一次该命令)。

    $ updatedb
    $ locate /etc/sh
    
    # 查找/etc/目录下所有以sh开头的文件
    

    find:小而细

    鸟哥的Linux私房菜-find
    每天一个linux命令(19):find 命令概览
    每天一个linux命令(20):find命令之exec

    1.7 文件传输/下载

    scp

    实现不同机器之间传输数据(加密)
    scp详解

    curl

    Curl是一个命令行方式下传输数据的开源传输工具,支持多种协议包括:FTP,HTTP,HTTPS,IMAP,POP3,TELNET等。同样支持HTTP POST方法,PUT方法,FTP上传,cookie,用户名/密码认证,下载文件端点续传等,功能十分强大。

    常用的,用于模拟浏览器请求。
    curl详解

    wget

    测试速率

    wget -S http://115.231.74.93:80/lvs.lxdns.net/test.rar && rm -rf test.rar*
    

    1.8 文件压缩

    zcat

    查看压缩的文件内容

    zcat file.gz
    

    Linux上的压缩格式比Windows上多很多,在 Windows 上最常见的不外乎这三种 *.zip*.rar*.7z 后缀的压缩文件。而在 Linux 上面常见的格式除了以上三种外,还有 *.gz*.xz*.bz2*.tar*.tar.gz*.tar.xz*.tar.bz2,对于常见的压缩格式,tar已经可以解决,所以这里只介绍tar。tar并不能压缩和解压7z,zip等其他文件

    tar

    压缩示例

    # test是当前目录下一个文件夹
    $ tar -czvphf test.tar.gz old_folder
    

    参数解释

    -c  指明创建tar文件
    -z  指明生成gz文件
    
    -v  可视输出,不加就静默压缩
    
    -f  指明压缩后的文件名,必须-f后必须紧跟文件名,否则无效
    -p  当在其他主机还原时希望保留文件的属性
    -h  备份链接指向的源文件而不是链接本身
    
    

    解包示例

    $ mkdir new_folder
    $ tar -xzvf test.tar.gz -C new_folder
    

    参数解释

    -x  解压命令
    -z  指明源文件是gz文件
    -f  指明压缩后的文件名,必须-f后必须紧跟文件名,否则无效
    
    -v  可视化输出解包过程,一般不加,静默解包
    
    -C  指明解压到哪个目录
    

    其他压缩格式

    *.tar.gz	-z
    *.tar.xz	-J
    *tar.bz2	-j
    
    

    gz

    最简单的压缩格式

    # 压缩
    gzip somefile
    
    # 解压
    gzip -d somefile.gz
    

    7zip

    yun install p7zip
    
    # 解压
    7za x file.7z
    
    # 压缩
    # 先将要压缩的文件都放到~/test/ 下
    7za a file.7z ~/test/
    

    zip

    # 解压
    unzip some.file 
    
    # 压缩 
    zip -r some.zip file1 file2 dir1 dir2...
    

    1.9 rpm包管理

    # 解压rpm包
    rpm2cpio xxx.rpm |cpio -div
    
    # 查看文件属于哪个rpm包
    rpm -qf /path/filename
    
    # 使用rpmrebuild重新生成rpm包
    # 使用rpmrebuild需要依赖rpmbuild:yum install -y rpmbuild
    rpmrebuild xxx
    

    二、系统管理

    2.0 环境变量

    变量分为用户变量(env)和shell变量(set)

    # 添加shell变量
    
    [root@host ~]# myuser=wangbm
    [root@host ~]# echo $myuser
    wangbm
    [root@host ~]# env|grep myuser
    [root@host ~]# set|grep myuser
    myuser=wangbm
    
    
    # 添加用户变量,会发现用户变量会覆盖shell变量
    [root@host ~]# export myuser=wangbingming
    [root@host ~]# env|grep myuser
    myuser=wangbingming
    [root@host ~]# set|grep myuser
    myuser=wangbingming
    
    
    # 删除环境变量
    [root@host ~]# unset myuser
    [root@host ~]# env|grep myuser
    [root@host ~]# set|grep myuser
    

    一些系统的变量

    # 这里生成的变量,对所有用户生效
    /etc/profile
    
    # 对特定user生效
    /root/.bash_profile
    /home/user/.bashrc
    
    # 注意修改文件后,要手动source一下
    

    2.1 相关查询

    系统信息

    # 查询开机时间
    $ who -b
    
    # 查询系统内核
    $ uname -r
    
    # 查询是否安装某个rpm包
    $ rpm -qa|grep nova
    
    # service 文件目录
    $ /usr/lib/systemd/system    # centos 7.x
    $ /etc/init.d                # centos 6.x
    
    # 查询开机自启列表
    $ systemctl list-unit-files
    $ chkconfig --list
    
    # 查看系统版本
    $ cat /etc/redhat-release
    
    # ------或者------
    $ yum install redhat-lsb -y
    $ lsb_release -a
    
    # 进程树
    $ pstree -p
    
    # 查看系统运行多长时间
    $ uptime/w
    
    # 查看系统版本
    lsb_release -a
    
    # 查看CPU信息
    $ cat /proc/cpuinfo
    $ numactk -H
    

    时间查询

    输出操作系统的当前日期、时间和时区。

    # -s参数用于修改当前的日期和时间
    date –s 2007-10-17
    date –s 18:05:00
    
    用法:cd /CNCLog/cache/qsLogBackSrcFull/bkDir/`date +%Y-%m-%d`
    

    2.2 系统分区

    分区介绍

    Linux的分区,不同于Windows,一定要区别对待,不然会搞不明白。

    Linux的分区的过程经历以下几个步骤

    1. 设备分区:对硬盘存储空间的划分
    2. 格式化:写入文件系统
    3. 挂载:将分区挂载到目录上,才能访问数据
    

    关于硬件对应的设备文件名,可以参照下图

    其中以硬盘为例来说明

    硬盘可以分为三种
    hd : IDE硬盘接口(淘汰,接口最大传输100来M)
    sd : SCSI硬盘接口(淘汰,接口最大传输200M),和SATA硬盘接口
    
    现在都是SATA的硬盘接口
    
    /dev/sda1   表示的是第一块(a)SATA硬盘的第一个分区(1)
    /dev/sdb2   表示的是第二块(b)SATA硬盘的第二个分区(2)
    

    分区类型
    可以分为:主分区扩展分区逻辑分区

    【主分区】:最多只能有4个    (受硬盘结构限制,如果硬盘结构不变,将都被限制)
    
    【扩展分区】:
        1. 最多只能有一个
        2. 主分区+扩展分区,一共只能有四个,可以少于
        3. 扩展分区下面,不能存放数据,只能进行逻辑分区的划分
    
    【逻辑分区】:挂载后就是一个目录下的空间,数量不受限制
    

    格式化做了哪些事

    【目的】
    1. 不是为了清空数据
    2. 主要是为了写入文件系统
    
    【文件系统】
    Windows:
    FAT16(每个分区大小最大不能超过2G),FAT32(单个分区大小最大16G,单个文件大小不能超过4G),NTFS
    
    Linux:ext2,ext3,ext4
    
    ->>>>> 越往后越先进
    
    【写入文件系统做了啥】
    1. 分数据块
    把空间分成若干个等大小的数据块(block),每个大小4kb
    如果我们有一个文件10kb,那么会占用3个数据块,实际大小就会是12kb
    
    你可以查看一个文件夹的大小,也都是4kb
    ll -l
    
    2. 建立数据表
    一个文件被分成若干个的数据块,那么如果有用户访问的时候,就需要有一个表把这些数据块拼凑起来。
    这个数据表就记录了这个文件由哪些数据块组成。
    

    分区说明

    必须分区
    /        根目录,最高级目录,不分配的话,所有的文件都没存储,软件没法运行
    /swap    交换分区,虚拟内存,4G以下,分2倍,4G以上,和真实内存一样即可
    
    推荐分区
    /boot    启动分区,防止/ 分区写满,导致系统无法启动,不需要很大,200M足矣
    
    
    逻辑分区号:只能从5开始,即使3,4没有被使用
    

    分区操作

    关于分区的操作可以参考这个: 分区操作

    ## 查看分区表信息
    $ sudo fdisk -l
    $ lsblk
    
    # 删除分区前,先确认有没有挂载点,有的话需要先umount卸载
    $ fdisk /dev/vdb  然后再按d,w
    

    2.3 进程管理

    ps、kill、killall

    参考文档:ps 命令的十个简单用法

    # 查看当前所有进程
    ps -aux
    
    # 终止pid为1095的进程
    kill 1095
    
    # 强制终止pid为1095的进程
    # 9是信号强度,强制杀死
    # 其他信号,-1 该信号让进程正常关闭,然后重新读取配置文件之后重启
    # -15 正常结束进程的信号,kill命令默认信号
    kill -9 1095
    
    # 终止指定程序
    killall 程序名
    
    # pkill
    pkill -9 httpd 强制终止进程
    pkill -t -9 pts/1 强制杀死pts/1虚拟终端登入的进程
    

    top

    常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
    linux的top命令参数详解

    top       实时得查看进程的状态,以及系统的一些信息(如 CPU、内存信息等),3s刷新一次
    ps        来静态查看当前的进程信息
    pstree    来查看当前活跃进程的树形结构。
    

    pgrep

    [root@wangbm web]# pgrep keepalived
    21955
    21956
    21957
    [root@wangbm web]# ps -ef|grep keepalived
    root     21955     1  0 21:27 ?        00:00:00 /usr/sbin/keepalived -D
    root     21956 21955  0 21:27 ?        00:00:00 /usr/sbin/keepalived -D
    root     21957 21955  0 21:27 ?        00:00:00 /usr/sbin/keepalived -D
    root     22035 12159  0 21:33 pts/0    00:00:00 grep --color=auto keepalived
    

    2.4 设备信息管理

    df

    显示磁盘的相关信息

    df -Th
    

    free

    输出内存的使用情况,m,g分别是指定单位,默认是kb

    free -m
    free -g
    

    total 表示总内存大小;
    used和free分别表示被使用和空闲内存大小;
    share指可被多个进程共同享有的内存; buffers和cached用来保留最近访问的文件和数据,当其他进程需要更多的内存时,这些内容可以被缩减; Free命令还可以输出交换空间的相关信息。

    ifconfig

    显示或设置网络设备

    last

    列出目前与过去登入系统的用户相关信息。一般可用来查看系统重启记录

    history

    屏幕输出当前用户在命令行模式下执行的最后(1000个)命令

    passwd

    这个用于修改密码

    非交互式修改密码

    echo 'root12#$'| passwd --stdin root
    

    reboot/shutdown

    重启/关机

    reboot/shutdown -r now
    
    # reboot [-n][-w][d][-i]	重新启动计算机,使用权限是系统管理员
    -n 重启前不将记录写回硬盘
    -w 并不是真的重启,只是把记录写道/var/log/wtmp文件中
    -d 不把记录写入/var/log/wtmp文件中
    -i 重启谦先把所有与网络相关的装备停止
    

    rpm

    # 安装rpm包
    rpm -ivh monitor-system-1.2-1.i386.rpm
    
    # 更新rpm包
    rpm -U/Fvh (F只更新已存在的文件)
    
    # 查询包中的文件
    rpm -ql monitor-system
    
    # 查询文件所属的包
    rpm -qf /usr/local/squid/etc/squid.conf(绝对路径/到目录下查找)
    
    # 查询所有包
    rpm –qa | grep squid
    
    # 卸载某个rpm包
    rpm –e monitor-system
    

    开启80端口

    vi /etc/sysconfig/iptables
    
    # 在22端口下面添加一行
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    
    # 重启防火墙
    /bin/systemctl restart  iptables.service
    

    修改时区

    # 由EDT(美国)改成CST(中国)
    
    $ mv /etc/localtime /etc/localtime.bak  
    $ ln -s /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime 
    

    查看机器连接的哪个交换机

    $ service lldpd restart
    $ lldpcli show nei sum   # 查看JS_HuaiAnDXXZ4_166.3
    -------------------------------------------------------------------------------
    LLDP neighbors:
    -------------------------------------------------------------------------------
    Interface:    eth1, via: LLDP
      Chassis:     
        ChassisID:    mac 00:6b:8e:01:1a:07
        SysName:      JS_HuaiAnDXXZ4_165.132_IPMI
      Port:        
        PortID:       local 39
        PortDescr:    Ethernet1/0/39
        TTL:          120
    -------------------------------------------------------------------------------
    Interface:    eth0, via: LLDP
      Chassis:     
        ChassisID:    mac 58:69:6c:62:7b:c2
        SysName:      JS_HuaiAnDXXZ4_166.3
      Port:        
        PortID:       ifname TenGigabitEthernet 0/41
        PortDescr:    TenGigabitEthernet 0/41
        TTL:          121
    -------------------------------------------------------------------------------
    

    2.5 磁盘管理

    df

    显示指定磁盘文件的可用空间。
    这里要理解挂载的概念。

    所有的设备(磁盘/等其他介质)都需要挂载在一个目录,Linux才能访问数据。

    具体可以参考这篇文章:df 命令

    常用命令

    $ df -Th
    $ df -lh
    
    
    $ df -h        以1024来换算
    $ df -H        以1000来换算
    
    $ df -t ext3   指定设备类型
    $ df -T        文件系统的类型
    $ df -i        查看inode的使用情况
    

    关于inode可以查看:inode的理解

    du

    查看目录的容量

    $ du -h -d 0 ~
    
    # 参数解释
    -h  以人能看得懂的方式显示
    -d  扫描的目录层级,0表示只有一个指定目录,1表示次级目录
    
    ~   是家目录,这里可以选你指定的目录
    
    $ du -s
    # 查看当前所处目录总容量大小,单位是k,不可跟-d
    
    $ du -a
    # 查看当前所处目录及所有子目录的所有文件,单位是k,建议不用
    

    查看文件的大小

    $ du -h file.txt
    

    dd

    dd命令用于转换和复制文件,不过它的复制不同于cp。之前提到过关于 Linux的很重要的一点,一切即文件,在 Linux上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero/dev/random)都像普通文件一样,只要在各自的驱动程序中实现了对应的功能,dd也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在 ASCIIEBCDIC编码间互换。

    这里有篇文章讲得很好:Linux-dd命令详解

    补充一点

    # 输出到文件
    $ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1
    
    # 输出到标准输出
    $ dd if=/dev/stdin of=/dev/stdout bs=10 count=1
    # 注
    在打完了这个命令后,继续在终端打字,作为你的输入
    

    前面说到dd在拷贝的同时还可以实现数据转换,那下面就举一个简单的例子:将输出的英文字符转换为大写再写入文件

    dd if=/dev/stdin of=test bs=10 count=1 conv=ucase
    

    制作虚拟镜像并挂载

    # 制作虚拟镜像
    $ dd if=/dev/zero of=virtual.img bs=1M count=256
    $ mkfs.ext4 virtual.img
    
    # 使用一个循环设备(/dev/loop)连接虚拟镜像文件
    $ sudo losetup /dev/loop0 virtual.img
    
    # 挂载前查看下当前已挂载的设备
    $ sudo mount
    
    # 挂载
    $ sudo mkdir /mnt/point
    $ sudo mount /dev/loop0 /mnt/point
    
    # 上面连接虚拟镜像文件和挂载设备两条命令可以合并成一条,挂载类型可以省略,会自动识别
    $ sudo mount -o loop [-t ext4] /mnt/point
    
    # 再次查看挂载的设备,就可以发现我们新挂载的
    $ sudo mount
    
    
    # 卸载:一定要加-fl。不然无法卸载
    $ sudo umount -fl /mnt/point
    
    # 查看所有与文件相关联的 loop 设备
    $ losetup -a
    # 卸载
    $ losetup -d /dev/loop0
    

    2.6 任务管理

    一次性任务(at)

    创建定时任务
    $ sudo apt-get install at
    $ at now+5 minutes
    at>/bin/ls
    at><EOL>    # 就是Ctrl+d
    job 2 at Sum Oct 15 14:58:00 2017   # 结束的时候,告知执行时间
    
    管理定时任务
    $ atq  # 可以查看当前还有那些定时任务,会显示任务号
    
    # 查看具体任务代码
    $ at -c <job_no>
    
    # 删除任务
    $ atrm <job_no>
    

    例行性任务(crontab)

    参考以下文字

    1. 每天一个linux命令(50):crontab命令
    2. 鸟哥的私房菜

    做个示例

    # 检查crond服务是否启动
    $ ps aux|grep crond
    
    # 创建任务
    $ crontab -e
    
    # 输入1 回车
    # 任务是:每天凌晨3点备份日志到/home/temp/目录,文件名为日期
    # 跳到文件尾部输入任务:* 3 * * * cp alternatives.lob /home/temp/$(date \%Y-\%m-\%d)。保存退出
    # 注意%需要加来转义,不然会被当成换行使用
    
    # 查看任务
    $ crontab -l
    
    # 删除任务(当前用户),当然也可以指定用户
    $ crontab -r [-u user]
    
    

    三、用户/权限管理

    3.1 用户管理

    创建用户

    【useradd和adduser区别】
    useradd:只创建用户,创建完了用 passwd lilei去设置新用户的密码。更像一种命令。
    
    adduser:会创建用户,创建目录,创建密码(提示你设置),做这一系列的操作。更像是一个程序,执行确认一系列操作。
    

    删除用户

    sudo deluser lilei --remove-home
    

    切换用户

    su [user]   # 切换到其他用户,环境变量不变,还是当前路径,如果不指定user,就切换到root
    
    su - [user]  # 切换到其他用户,环境变量也切换,路径变为user家目录,如果不指定username,就切换到root,相当于使用user进行登录
    

    Ubuntu切换用户

    # 切换到root
    $ sudo su
    
    # 切换到普通用户
    $ su user
    

    CentOS

    $ su
    $ su root
    $ su -
    $ su -root
    
    $ su user
    $ su -user
    

    用户组

    1. 每个用户都至少属于一个用户组,创建的时候如果不指定,就和当前用户的组一样(root用户组除外)。
    2. 一个用户可以属于多个用户组。
    
    # 查看所属用户组
    $ groups [user]
    

    UID/GID/组ID

    # 显示相关信息,如要查看root用户的信息
    id root
    
    # 所有文件都保存在/etc/)asswd
    vi /etc/passwd
    

    管理用户:查看用户的UID和GID
    管理密码:Linux下/etc/shadow文件

    添加sudo用户组

    【第一种方法】
    在root下,visudo或者vi /etc/sudoers,找到root ALL=(ALL)的下一行添加一行,user ALL=(ALL),user是对应的用户名
    
    【第二种方法】
    在root下,使用命令sudo usermod -G sudo user,将user加入sudo用户组
    

    sudo免密

    当有些操作只有root用户才能操作的时候,怎么办?
    1.我们需要切换到root用户操作。
    2. 当前用户属于sudo组,可以使用sudo [command]
    3. 使用sudo输入一次密码免密使用5分钟。还是太麻烦,可以配置当前用户免密执行sudo。

    如何免密配置

    vi /etc/sudoers.d/<user>
    
    # 添加内容
    # 如果要指定特定的命令不需要密码的话,就把ALL替换成命令路径,如下
    # NOPASSWD: /sbin/mount, (root) NOPASSWD: /bin/umount
    <user> ALL=(ALL) NOPASSWD:ALL
    Defaults:shiyanlou !requiretty
    
    # 有时候,虽然用户设置免密了,但是还是需要输入密码,是group覆盖了,需要把group也设成免密。
    

    参考资料:sudo免密

    3.2 权限管理

    更改文件所有者和所属组

    [sudo] chown 用户组:用户 文件/文件夹
    
    # 如下只更改所属用户
    [sudo] chowm 用户 文件/文件夹
    

    修改文件权限

    文件权限有执行三种
    分别对应数字4,2,1,也就是22,21,2^0

    如何修改文件权限

    【第一种方法】
    chmod 777 文件
    
    【第二种方法】:加减的方法
    g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限。
    
    举个例子
    比如一个文件权限是:-wr-wr-wr-
    chmod go-wr 文件
    
    然后文件权限就变成:-wr-------
    

    禁止修改、删除、移动文件

    chattr -ichattr +i

    + :在原有参数设定基础上,追加参数。
    - :在原有参数设定基础上,移除参数。
    
    命令:chattr [ -RV ] [ -v version ] [ mode ] files
    
    A:   文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
    S:   硬盘I/O同步选项,功能类似sync。
    a:   即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文 件安全,只有root才能设定这个属性。
    c:   即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
    d:   即no dump,设定文件不能成为dump程序的备份目标。
    i:   设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
    j:   即journal,设定此参数使得当通过 mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
    s:   保密性地删除文件或目录,即硬盘空间被全部收回。
    u:   与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion.
    

    四、网络管理

    iptables

    命令格式

    iptables [-t table] 命令 [chain] [rules] [-j target]
    
    【参数解释】
    table     表名:filter、nat、mangle、raw,后两者不常用
    命令      对链的操作命令
                -P或–policy   定义默认策略
                -L或–list     查看iptables规则列表
                -A或—append   在规则列表的最后增加1条规则
                -I或–insert   在指定的位置插入1条规则
                -D或–delete   从规则列表中删除1条规则
                -R或–replace  替换规则列表中的某条规则
                -F或–flush    删除表中所有规则
                -Z或–zero     将表中数据包计数器和流量计数器归零
    chain     链名:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTIN
    
    rules     规则,可以说是匹配规则。
              分为
                1. 【通用匹配】
            	 -s:  指定作为源地址匹配,必须是IP,取反,就加一个!
            	 -d:  表示匹配目标地址
            	 -p:  用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
            	 -i    eth0:从这块网卡流入的数据,流入一般用在INPUT和PREROUTING上
            	 -o    eth0:从这块网卡流出的数据,流出一般在OUTPUT和POSTROUTING上
    
                2. 【扩展匹配】
                    -p tcp:       TCP协议的扩展。一般有三种扩展
                	--dport:      指定目标端口,--dport 21或者 --dport 21-23 (此时表示21,22,23),不能表示非连续端口
                	--sport:      指定源端口
    
                	--tcp-fiags:  TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
                	    对于它,一般要跟两个参数:
                		1.检查的标志位
                		2.必须为1的标志位
                		--tcpflags syn,ack,fin,rst syn   =    --syn
                		表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
    
                    -p udp:       UDP协议的扩展
                        --dport
                        --sport
    
                    -p icmp:      icmp数据报文的扩展
                        --icmp-type:
                		echo-request(请求回显),      一般用8 来表示
                		echo-reply (响应的数据包)   一般用0来表示
    

    参考文章

    1. ubuntu配置iptables
    2. netfilter/iptables全攻略
    3. iptables详解

    开放端口

    # 在filter表里添加规则
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8500 -j ACCEPT
    
    # 重启iptables
    $ service iptables restart
    
    # 监听端口
    $ nc -lp 8500 &
    
    # 检测是否开启完成
    $ netstat -tunl|grep 8500
    

    端口转发

    # 按开放端口配置好后才可转发。
    # 假设我们现在要将36.250.x.x的8500端口转发到192.168.2.55的80端口上
    
    # filter表
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8500 -j ACCEPT
    
    # nat表
    -A PREROUTING -d 36.250.x.x -m tcp -p tcp --dport 8500 -j DNAT --to-destination 192.168.2.55:80
    
    # 测试一下,在浏览器输入 36.250.x.x:8500
    # 就可以看到我们的内容了。
    

    ip 命令

    # ubuntu 临时修改网络,需要刷新一下
    ip addr flush dev ens4 
    

    六、Shell命令

    6.1 定时任务

    命令执行顺序控制

    1、&&
    方式:command1 && command2
    如果command1执行成功,则执行command2
    
    2、||
    方式:command1 || command2
    如果command1执行失败,则执行command2
    

    管道通信

    $ ps aux | grep mysqld
    
    # 将ps aux得到的结果传给grep命令
    

    nohup

    一般在一终端或一个SSH连接运行一个软件或服务,该软件或服务的生命周期受终端/SSH连接影响,关闭后就自动也停止。
    为了将程序放在后台运行,可以使用nohup命令

    $ nohup 程序路径/程序名 &
    

    alias

    给常用的长命令取别名,变成短的,提高效率

    # 查看现有别名
    $ alias
    
    # 添加别名
    $ alias catgra='cat /var/lib/mysql/grastate.dat'
    
    # 取消别名状态
    # 比如我们的ll,系统默认给我们加了别名,ll='ls -l --color=auto',也就是加上颜色效果
    # 如果我们不要颜色效果,可以这样使用转义符,使用原生的命令
    $ ll somedir
    
    

    column

    一个很好用的命令,经常用于管道符后,进行文本展示

    $ mount
    sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    devtmpfs on /dev type devtmpfs (rw,nosuid,size=3996196k,nr_inodes=999049,mode=755)
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    
    # 使用后,t是按表格的形式展示,-s "@" 指定分割符
    $ mount | column -t
    sysfs                                on  /sys                        type  sysfs       (rw,nosuid,nodev,noexec,relatime)
    proc                                 on  /proc                       type  proc        (rw,nosuid,nodev,noexec,relatime)
    devtmpfs                             on  /dev                        type  devtmpfs    (rw,nosuid,size=3996196k,nr_inodes=999049,mode=755)
    securityfs                           on  /sys/kernel/security        type  securityfs  (rw,nosuid,nodev,noexec,relatime)
    

    重定向

    >/dev/null 2>&1 &

    分析下这个语句
    command >/dev/null 2>&1 &
    执行command后的标准输出不在屏幕显示,而是直接丢入/dev/null 垃圾桶,如果有错误输出,则重定向到标准输出。最后&表示在后台运行。

    七、业务相关

    查看虚机的CPU是否支持虚拟化

    egrep '(vmx|svm)' /proc/cpuinfo
    # 如果有标红的vmx(Intel)、svm(AMD)说明就支持,virtualbox不支持(坑)
    
    # 或者直接查看
    vi /proc/cpuinfo
    

    查看模块是否加载

    lsmod | grep kvm
    

    开启服务

    # CentOS 6
    service xx start
    
    # CentOS 7
    systemctl start libvirtd
    

    开机自启动服务

    CentOS 6
    chkconfig acpid on
    
    # CentOS 7
    systemctl enable libvirtd
    

    开启shh登录,修改端口等配置

    vi /etc/ssh/sshd_config
    -------------------------------------
    Port 57891
    PasswordAuthentication yes
    ClientAliveInterval 60
    ClientAliveCountMax 10
    

    关闭防火墙

    setenforce 0
    service firewalld stop
    chkconfig firewalld off
    

    换yum源

    yum install wget
    
    mv /etc/yum.repos.d/CentOS-Base.repo /root/
    
    # 下载yum源,这里是CentOS6的,请下载对应版本
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
    
    yum clean all
    yum makecache
    

    推荐阅读

  • 相关阅读:
    SpringMVC学习笔记六:类型转换器及类型转换异常处理
    SpringMVC学习笔记五:HandlerExceptionResolver异常处理
    SpringMVC学习笔记四:SimpleMappingExceptionResolver异常处理
    SpringMVC学习笔记三:Controller的返回值
    SpringMVC学习笔记二:参数接受
    SSH+Ajax实现用户名重复检查(二)
    SSH+Ajax实现用户名重复检查(一)
    Java添加事件的四种方式
    用Java开发一个本地服务管理软件
    Java Web开发中的名词解释
  • 原文地址:https://www.cnblogs.com/wongbingming/p/10415781.html
Copyright © 2011-2022 走看看