Linux 常用命令及文件操作笔记

初级Shell命令

查看当前用户基本信息
    finger <username>
命令别名
  • 查看当前shell可以别名

        alias -p
    
  • 创建用户别名

    eg:
    alias li='ls -li'
    
    • alias属于shell内建命令,默认情况下,一个别名仅在它所被定义的shell进程才有效
    • type <shell command> 可以查看命令是否是内建命令(相对于shell而言,shell自带的为内建,系统命令/bin,/usr/bin等为外建命令)
    • 使用外建命令会调用子shell,需要创建子shell环境,速度慢

查看磁盘空间
  • 查看某个设备上面还有多少磁盘空间(查看的是已挂载磁盘的使用情况)
    df -h
    
    h表示按照用户易读的形式显示

  • 查看当前目录各文件大小,并按照降序排列
    du -sh * | sort -nr
    
    • du表示查看当前目录文件大小,-s表示显示每个输出参数的统计信息-h表示按照用户易读方式输出
    • * 表示对当前目录下的每个目录文件都统计
    • sort表示对上面目录大小排序,-n表示当作数字排序,-r表示降序排列

过滤文件数据
  • 搜索过滤数据
    grep [options pattern]  [file]
    eg:
    grep [A-Z] -n file1.txt (在file1.txt中查找包含A-Z字符的行,-n表示显示行号)
    grep H -v file1.txt (-v表示反向搜索,在file1.txt中查找不包含H的行)
    grep H -c file1.txt (-c表示统计包含字符H的总行数)
    

压缩数据
  • GNU 压缩工具 gzip

    • 压缩
      gzip
      
    • 查看压缩文件
      gzcat
      
    • 解压文件
      gunzip
      
    • 可以使用通配符 * 实现批量压缩

实现数据归档 - tar
  • tar 实现数据归档
    • 创建归档文件

      tar -cvf test.tar test/ test2/
      
      • 上面命令创建了名为test.tar的归档文件,含有test和test2目录内容
      • -c 创建一个新的tar归档文件
      • -v 处理时候显示文件信息
      • -f 输出结果到文件或设备

    • 列出文件test.tar内容(不提取内容)

      tar -tf test.tar
      
      • -t 表示列出tar归档文件内容
    • 提取test.tar归档文件内容

      tar -xvf test.tar
      
      • -x 表示从已有归档文件提取文件
    • 从.tgz压缩文件提取(.tgz指的是被gzip压缩过的tar文件)

      tar -zxvf filename.tgz
      
      • -z 表示把输出重定向给gzip命令来解压缩内容

查看进程信息
  • 查看进程信息(Unix风格的ps命令)
    ps -ef
    ps -l
    ps --forest
    
    • -e 表示查看所有进程
    • -f 表示显示完整格式信息
    • -l 可以获得更多信息
    • –forest 可以按父shell和子shell层级展示各进程使用的cmd
  • 实时监测进程信息
    top
    
  • 结束进程1(根据pid结束进程)
    kill -9 <pid> (pid表示进程号)
    kill -s KILL <pid>
    
    • 上面两者等价
  • 结束进程2(可以根据进程名结束进程)
    eg:
    killall http*
    
    • 上例表示结束所有以http开头的进程

挂载设备相关命令
  • 查看当前系统挂载设备列表
    mount
    
    • 输出结果中,每行表示一个设备挂载信息,如下:
    • 媒体设备文件名 on 媒体设备挂载到虚拟目录的挂载点 文件系统类型 已挂载媒体的访问状态
        eg:
        /dev/sda1 on /boot type ext3 (rw)
    
  • 为当前设备以新的权限挂载到 / 虚拟目录
        mount –o remount,rw /
    
    • -o 表示给文件系统添加特定的选项
    • 这种方式通常用于忘记密码进入recovery mode 修改密码使用,因为recovery mode中,默认挂载方式是只读权限,需要通过这种方式重新以读写权限方式挂载到 / 上,然后修改密码
  • 从 Linux系统上移除一个可移动设备时,不能直接从系统移除,而应先卸载
        umount [directory | device]
        eg:
        umount /home/rich/mnt    
    

将任务放到后台模式运行
  • 在shell 命令后加 ‘&’ 就可以进入后台命令运行
        <shell command> &
        eg:
        sleep 3000&
    
  • sleep 3000表示休眠3000秒,后面的&表示后台运行
  • 查看后台运行的程序
        jobs
        jobs -l
        eg result:
        [1]+  2369  Running     sleep 3000&
    
    • [1] 表示作业号
    • Runing表示进程正在执行
    • Done表示进程执行完毕
    • 最后显示运行的cmd
    • -l 能够显示进程(作业)的PID

Linux 环境变量

全局变量与局部变量
全局变量
```
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见
```
* 查看所有全局变量
    ```
    env
    printenv
    ```
* 查看特定局部变量(以HOME为例)
    ```
    printenv HOME
    echo $HOME
    ls $HOME  #变量如果是目录可以直接使用
    ```
局部变量
局部环境变量只能在定义它们的进程中可见
设置用户自定义变量
设置局部用户自定义变量
    echo $my_variable # 定义变量
    my_variable=Hello # 赋值
    echo $my_variable # 查看变量
  • 离开当前shell,定义的局部变量就不可被访问
  • 如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
  • 所有的系统环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母
  • 变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,bash shell就会把值当成 一个单独的命令
设置全局变量
    var='Hello world' #给变量赋值
    export var #声明为全局变量
    echo $var #查看全局变量
  • 子shell中不能修改父shell中定义的全局变量(修改值只在子shell有效)
删除环境变量
    unset var #删除变量var,注意不需要写$
  • 在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用
设置PATH环境变量
当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录
  • 添加搜索目录
            PATH=$PATH:/home/zhangw
    
    • 对PATH变量的修改只能持续到退出或重启系统
bash shell 的启动方式
在你登入Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作**启动文件或环境文件
  • 启动bash shell 的三种方式

    • 登陆时作为默认登录shell
    • 作为非登录shell的交互式shell
    • 作为运行脚本的非交互shell

  • 登陆时作为默认登录shell

    1、当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令:
    2、/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
    
    • /etc/profile

      • /etc/profile文件是bash shell默认的的主启动文件。只要你登录了Linux系统,bash就会执行/etc/profile启动文件中的命令。

    • 下面的启动文件都起着同一个作用,提供一个用户专属的启动文件来定义该用户所用到的环境变量。大多数Linux发行版只用这四个启动文件中的一到两个

      • $HOME/.bash_profile
      • $HOME/.bashrc
      • $HOME/.bash_login
      • $HOME/.profile

  • 作为非登录shell的交互式shell

    • 如果你的bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),那么你启动的shell叫作交互式shell。交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令。
    • 如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。

  • 非交互式shell

    • 系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符
    • 当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令
      • 为了处理这种情况,bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。
      • 这个环境变量在默认情况下并未设置,此时shell脚本可以使用继承自父shell导出过的变量
      • 举例来说,如果父shell是登录shell,在/etc/profile、/etc profile.d/*.sh和$HOME/.bashrc文件中设置并导出了变量,用于执行脚本的子shell就能够继承这些变量。
      • 由父shell设置但并未导出的变量都是局部变量。子shell无法继承局部变量。

环境变量持久化
  • 在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程
  • Linux系统中所有用户都需要使用的变量,最好不要放在/etc/profile文件,因为升级发行版这个文件也会随之更新,最好是在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中

Linux文件权限

Linux的安全性
/etc/passwd文件
Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是
/etc/passwd文件,它包含了一些与用户有关的信息:

登录用户名
用户密码
用户账户的UID(数字形式)
用户账户的组ID(GID,数字形式)
用户账户的文本描述(备注字段)
用户HOME目录的位置
用户的默认shell

  • root用户账户是Linux系统的管理员,固定分配给它的UID是0
  • Linux为系统账户预留了500以下的UID值。有些服务甚至要用特定的UID才能正常工作
  • 普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配给这个账户(并非所有的Linux发行版都是这样)
  • /etc/passwd文件中的密码字段都被设置成了x,这并不是说所有的用户账户都用相同的密码,绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。
  • /etc/shadow文件可以随意编辑(root用户),但是不推荐这样做,可能会导致用户无法登录。推荐用标准的Linux用户管理工具管理用户。
/etc/shadow文件
/etc/shadow文件为系统上的每个用户账户都保存了一条记录,如下:
rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7::: 
添加新用户
  • 查看新用户默认设置
    useradd -D
    
    eg:
        # useradd -D
        GROUP=100  # 默认组
        HOME=/home # 默认目录
        INACTIVE=-1 
        EXPIRE=  #账户过期时间,以及账户密码过期后会不会被禁用。默认为空未设置过期时间
        SHELL=/bin/bash #默认shell
        SKEL=/etc/skel # 新用户默认配置存放目录(有.bashrc等文件),新用户会从/etc/skel拷贝一份放到新用户目录下
        CREATE_MAIL_SPOOL=yes 
    
  • 修改系统默认值
        useradd -D -s /bin/bash
    
        可以在-D选项后跟上一个指定的值来修改系统默认的新用户设置:
            参数                    描述
        -b default_home  更改默认的创建用户HOME目录的位置
        -e expiration_date  更改默认的新账户的过期日期
        -f inactive     更改默认的新用户从密码过期到账户被禁用的天数
        -g group    更改默认的组名称或GID 
        -s shell    更改默认的登录shell
    
  • 创建用户
    useradd -m <username>
    
    默认情况下,useradd命令不会创建HOME目录,但是-m命令行选项会使其创建HOME目录。
    你能在此例中看到,useradd命令创建了新HOME目录,并将/etc/skel目录中的文件复制了过来。
    -d 可以设置不同于用户名的用户目录:
    sudo useradd -m test3 -d /home/test3_dir
    
删除用户
  • 默认情况下,userdel命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件
  • 如果加上-r参数,userdel会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。这在有些环境中会造成问题。
  • 在删除用户的HOME目录之前一定要检查清楚!你永远不知道用户是否在其HOME目录下存放了其他用户或其他程序要使用的重要文件
    userdel -r test 
修改用户
  • 修改密码 passwd
    sudo passwd <username>
    接着根据提示输入密码
    sudo passwd -e <username> 强制用户下次登录修改密码
  • chpasswd 可以批量修改密码
    • chpasswd命令能从
      标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置。你也可以用重定向命令来将含有userid:passwd对的文件重定向给该命令
    chpasswd < users.txt 
  • 修改备注信息
    sudo chfn <username>
  • 全能命令usermod
    usermod [options] <gid|gname> <username>
    eg:
    usermod -g 0 test #设置test的默认用户组为root所在的用户组
    usermod -u 1008 test #更改test的UID为1008 
    usermod -aG my_group test #把test追加到my_group用户组
<br>
Linux用户组
    每个用户组有唯一的GID,每个组还有唯一的组名
    和UID一样,GID在分配时也采用了特定的格式。系统账户用的组通常会分配低于500的GID值,而用户组的GID则会从500开始分配
    /etc/group文件有4个字段:
    组名
    组密码
    GID
    属于该组的用户列表
查看系统所有用户组
    sudo cat /etc/group
    sudo tail /etc/group
  • 你会发现,在列表中,有些组并没有列出用户。这并不是说这些组没有成员,当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中 。通过usermod -G <GID> <username>可以添加。
创建用户属组
    sudo groupadd <group_name> # 创建用户组,默认没有用户被分配到该组   
    sudo usermod -G <group_name> <username> #添加用户组
    eg :
    sudo usermod -G shared test # 把test加入shared用户组
  • 如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更
    改才能生效
  • -G 选项则将该组添加到用户的属组的列表里,不会影响默认组。
修改用户属组
    sudo groupmod -n sharing shared # 修改用户组名为 sharing
    sudo groupmod -g <GID> sharing # 修改用户组GID
  • 修改组名时,GID和组成员不会变,只有组名改变。由于所有的安全权限都是基于GID的,你可以随意改变组名而不会影响文件的安全性。
增加、删除用户属组
    gpasswd [option] group

    eg:
    sudo gpasswd -a test sharing #把test添加到sharing用户组
    sudo gpasswd -d test sharing #把test从sharing组中删除
理解用户权限
  • 默认文件权限
    umask 查看系统默认文件权限掩码,例如我的机器是0002,第一位为粘着位表示特殊性质
    剩下的002为掩码:
    对文件来说,全权限为 666,减去掩码,最终创建文件默认权限为664 
    即 110,110,100 -> rw-,rw-,r--
    对目录来说,全权限为 777,减去掩码。最终创建的目录默认权限为775
    即 111,111,101 -> rwx,rwx,r-x
    三组二进制分别表示该文件的 属主、同组用户、不同组其他用户对该文件的权限
     -代表文件
     d代表目录
     l代表链接
     c代表字符型设备
     b代表块设备
     n代表网络设备
    之后有3组三字符的编码。每一组定义了3种访问权限:
     r代表对象是可读的
     w代表对象是可写的
     x代表对象是可执行的
    若没有某种权限,在该权限位会出现单破折线
     对象的属主
     对象的属组
     系统其他用户
修改文件权限
  • 通过八进制模式修改权限
    chmod [options] mode
    eg:
    chmod 760 a.txt # 这里没有加入options,optins可以通过 man chmod 查看
    chmod -R 760 test/ #递归的给test/及其子目录(文件)添加权限
  • 通过符号模式修改权限
    chmod [options] [ugoa] [[+-=]][rwxXstugo]
    chmod 和 [options]同上八进制模式

    其中 [ugoa] [[+-=]][rwxXstugo]:
    第一部分 [ugoa]:
        u 文件所属用户
        g 文件用户所属组
        o 非该文件用户所属组的其他用户组
        a 代表上述所有

    第二部分 +-=:
        + 表示现有基础上增加权限
        - 现有基础上移除权限
        = 将权限值设置为后面的值
        
    第三部分:
        r 读权限
        w 写权限
        x 执行权限
        X 如果对象是目录或者它已有执行权限,赋予执行权限
        s 运行时重新设置UID或GID
        t 保留文件或目录
        u 将权限设置跟属主一样
        g 将权限设置为跟属组一样
        o 将权限设置为跟其他用户一样
        最常用的就是rwx
    eg:
        chmod ug+x a.sh  #给a.sh的属主和属组添加执行权限(x)
        chmod u+rwx b.txt #给b.txt的属主添加读写执行权限 
        chmod o-x b.txt #给b.txt的其他组用户移除执行权限
        chmod -R u+w test/ #递归的给test/及其子目录(文件)属主添加写权限
        chmod o=r a.txt #把a.txt的其他组用户权限设置为只读
改变文件用户属组
  • chown命令

        chown options owner[.group] file #[]内部表示可选项
    
        common options:
        -R 递归改变子目录和文件的属组、属主
        -h 改变该文件的所有符号链接文件的所属关系(部分系统支持)
    
        eg:
            chown test a.txt #更改a.txt文件的属主为test
            chown test.zhangw a.txt #更改a.txt文件的属主为test,同时更改其属组为zhangw
            chown .sharing a.txt #只更改a.txt的属组为sharing不更改属主
            chown test. newfile  #系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者。
    
    • 如果你的Linux系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者
    • 只有root用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。
  • chgrp 更改文件、目录的默认属组

        chgrp <group> <newfile> #更改newfile的默认属组为group
    
        eg:
        chgrp sharing newfile #更改newfile的默认属组为sharing
    
共享文件
```
    mkdir testdir #创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将该目录的SGID位置位。
    chgrp shared testdir #更改目录的默认属组为shared
    chmod g+s testdir #设置目录属组组ID(SGID)
    umask 002 #所有组成员都需把他们的umask值设置成文件对属组成员可写
```
  • 要创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将该目录的SGID位置位
  • 设置SGID:对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
  • 新文件会沿用目录的属组,而不是用户的默认属组。现在shared组的所有用户都能访问这个文件了
持续更新。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值