一、/proc的意义及说明在Linux中查看各种状态，其实质是查看内核中相关进程的数据结构中的项，通过工具将其格式化后输出出来。但是内核的数据是绝对不能随意查看或更改的，至少不能直接去修改。所以，在linux上出现了伪文件系统/proc，它是内核中各属性或状态向外提供访问和修改的接口，记录了内核自己的数据信息，各进程独立的数据信息，统计信息等。绝大多数文件都是只读不可改的，即使对root也一样，但/proc/sys除外。在/proc/目录下，其中数字命名的目录对应的是各进程的pid号，其内的文件记录的都是该进程当前的数据信息，且都是只读的，例如记录命令信息的cmdline文件，进程使用哪颗cpu信息cpuset，进程占用内存的信息mem文件，进程IO信息io文件等其他各种信息文件。非数字命名的目录各有用途，例如bus表示总线信息，driver表示驱动信息，fs表示文件系统特殊信息，net表示网络信息，tty表示跟物理终端有关的信息，最特殊的两个是/proc/self和/proc/sys。先说/proc/self目录，它表示的是当前正在访问/proc目录的进程，因为/proc目录是内核数据向外记录的接口，所以当前访问/proc目录的进程表示的就是当前cpu正在执行的进程。如果执行cat /proc/self/cmdline，会发现其结果总是该命令本身，因为cat是手动敲入的命令，它是重要性进程，cpu会立即执行该命令。再说/proc/sys这个目录，该目录是为管理员提供用来修改内核运行参数的，所以该目录中的文件对root都是可写的，例如管理数据包转发功能的/proc/sys/net/ipv4/ip_forward文件。使用sysctl命令修改内核运行参数，其本质也是修改/proc/sys目录中的文件。二、查看进程信息1、pstree命令pstree命令将以树的形式显示进程信息，默认树的分支是收拢的，也不显示pid，要显示这些信息需要指定对应的选项。pstree [-a] [-c] [-h] [-l] [-p] [pid] 选项说明： -a：显示进程的命令行 -c：展开分支 -h：高亮当前正在运行的进程及其父进程 -p：显示进程 pid，此选项也将展开分支 -l：允许显示长格式进程。默认在显示结果中超过 132 个字符时将截断后面的字符$ pstree -h systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─crond ├─kdeinit5─┬─2*[file.so] │ ├─kaccess───2*[{kaccess}] │ ├─kded5───5*[{kded5}] │ └─klauncher───2*[{klauncher}] ├─kwalletd5───2*[{kwalletd5}] ├─sddm─┬─Xorg───6*[{Xorg}] │ ├─sddm-helper───startplasma-x11─┬─plasma_session───{plasma_session} │ │ └─{startplasma-x11} │ └─{sddm} ├─start_kdeinit ├─systemd─┬─(sd-pam) │ ├─at-spi-bus-laun─┬─dbus-daemon │ │ └─3*[{at-spi-bus-laun}] │ ├─at-spi2-registr───2*[{at-spi2-registr}] │ ├─dbus-daemon │ ├─dconf-service───2*[{dconf-service}] │ ├─gvfsd───2*[{gvfsd}] │ ├─gvfsd-fuse───5*[{gvfsd-fuse}] │ ├─kactivitymanage───5*[{kactivitymanage}] │ ├─kglobalaccel5───2*[{kglobalaccel5}] │ ├─kscreen_backend───2*[{kscreen_backend}] │ ├─pipewire───{pipewire} │ ├─pulseaudio─┬─gsettings-helpe───3*[{gsettings-helpe}] │ │ └─{pulseaudio} │ ├─spectacle───3*[{spectacle}] │ ├─xdg-desktop-por───5*[{xdg-desktop-por}] │ ├─xdg-desktop-por───3*[{xdg-desktop-por}] │ ├─xdg-document-po───5*[{xdg-document-po}] │ └─xdg-permission-───2*[{xdg-permission-}] ├─systemd-journal ├─systemd-logind ├─systemd-timesyn───{systemd-timesyn} ├─systemd-udevd ├─udisksd───4*[{udisksd}] ├─upowerd───2*[{upowerd}] ├─wpa_supplicant └─xembedsniproxy───2*[{xembedsniproxy}]2、ps命令ps命令查看当前这一刻的进程信息，注意查看的是静态进程信息，要查看随时刷新的动态进程信息(如windows的进程管理器那样，每秒刷新一次)，使用top或htop命令。选项很多，其实只需知道一个用法ps -aux足以，选项"a"表示列出依赖于终端的进程，选项"x"表示列出不依赖于终端的进程，所以两者结合就表示列出所有进程，选项"u"表示展现的进程信息是以用户为导向的。$ ps aux | head USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 187744 10240 ? Ss 10:01 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 10:01 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 10:01 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 10:01 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< 10:01 0:00 [kworker/0:0H-kblockd] root 8 0.0 0.0 0 0 ? I< 10:01 0:00 [mm_percpu_wq] root 9 0.0 0.0 0 0 ? S 10:01 0:00 [ksoftirqd/0] root 10 0.0 0.0 0 0 ? I 10:01 0:02 [rcu_preempt] root 11 0.0 0.0 0 0 ? S 10:01 0:00 [rcuc/0]各列的意义：%CPU：表示CPU占用百分比，注意，CPU的衡量方式是占用时间，而不是cpu工作强度的状态。%MEM：表示各进程所占物理内存百分比。VSZ：表示各进程占用的虚拟内存，也就是其在线性地址空间中实际占用的内存。单位为kb。RSS：表示各进程占用的实际物理内存。单位为Kb。TTY：表示属于哪个终端的进程，"?"表示不依赖于终端的进程。STAT：进程所处的状态。 D：不可中断睡眠 R：运行中或等待队列中的进程(running/runnable) S：可中断睡眠 T：进程处于stopped状态 Z：僵尸进程 <：高优先级进程 N：低优先级进程 L：该进程在内存中有被锁定的页 s：表示该进程是session leader，即进程组的首进程。例如管道左边的进程，shell脚本中的shell进程 l：表示该进程是一个线程 +：表示是前端进程。前端进程一般来说都是依赖于终端的START：表示进程是何时被创建的TIME：表示各进程占用的CPU时间COMMAND：表示进程的命令行。如果是内核线程，则使用方括号"[]"包围另外常用的ps选项是ps -elf。其中"-e"表示输出全部进程信息，"-f"和"-l"分别表示全格式输出和长格式输出。全格式会输出cmd的全部参数。$ ps -elf |head F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4 S root 1 0 0 80 0 - 46936 - 10:01 ? 00:00:01 /sbin/init 1 S root 2 0 0 80 0 - 0 - 10:01 ? 00:00:00 [kthreadd] 1 I root 3 2 0 60 -20 - 0 - 10:01 ? 00:00:00 [rcu_gp] 1 I root 4 2 0 60 -20 - 0 - 10:01 ? 00:00:00 [rcu_par_gp] 1 I root 6 2 0 60 -20 - 0 - 10:01 ? 00:00:00 [kworker/0:0H-kblockd] 1 I root 8 2 0 60 -20 - 0 - 10:01 ? 00:00:00 [mm_percpu_wq] 1 S root 9 2 0 80 0 - 0 - 10:01 ? 00:00:00 [ksoftirqd/0] 1 I root 10 2 0 58 - - 0 - 10:01 ? 00:00:06 [rcu_preempt] 1 S root 11 2 0 58 - - 0 - 10:01 ? 00:00:00 [rcuc/0] 各列的意义：F：程序的标志位。0表示该程序只有普通权限，4表示具有root超级管理员权限，1表示该进程被创建的时候只进行了fork，没有进行execS：进程的状态位，注意ps选项加了"-"的是非BSD风格选项，不会有"s""<""N""+"等的状态标识位C：CPU的百分比，衡量方式是占用时间PRI：进程的优先级，值越小，优先级越高，越早被调度类选中运行NI：进程的NICE值，值为-20到19，影响优先级的方式是PRI(new)=PRI(old)+NI，越小将导致进程优先级越高。 ：但要注意，NICE值只能影响非实时进程。ADDR：进程在物理内存中哪个地方。SZ：进程占用的实际物理内存WCHAN：若进程处于睡眠状态，将显示其对应内核线程的名称，若进程为R状态，则显示"-"3、uptime命令显示当前时间，已开机运行多少时间，当前有多少用户已登录系统，以及3个平均负载值。$ uptime 15:16:52 up 1 day, 3:31, 6 users, load average: 2.95, 3.14, 3.15所谓负载率(load)，即特定时间长度内，cpu运行队列中的平均进程数(包括线程)，一般平均每分钟每核的进程数小于3都认为正常，大于5时负载已经非常高。在UNIX系统中，运行队列包括cpu正在执行的进程和等待cpu的进程(即所谓的可运行runable)。在Linux系统中，还包括不可中断睡眠态(IO等待)的进程。运行队列中每出现一个进程，load就加1，进程每退出运行队列，Load就减1。如果是多核cpu，则还要除以核数。例如，单核cpu上的负载值为"1.73 0.60 7.98"时，表示：最近1分钟：1.73表示平均可运行的进程数，这一分钟要一直不断地执行这1.73个进程。0.73个进程等待该核cpu。最近5分钟：平均进程数还不足1，表示该核cpu在过去5分钟空闲了40%的时间。最近15分钟：7.98表示平均可运行的进程数，这15分钟要一直不断地执行这7.98个进程。结合前5分钟的结果，说明前15-前10分钟时间间隔内，该核cpu的负载非常高。如果是多核cpu，则还要将结果除以核数。例如4核时，某个最近一分钟的负载值为3.73，则意味着有3.73个进程在运行队列中，这些进程可被调度至4核中的任何一个核上运行。最近1分钟的负载值为1.6，表示这一分钟内每核cpu都空闲(1-1.6/4)=60%的时间。 所以，load的理想值是正好等于CPU的核数，小于核数的时候表示cpu有空闲，超出核数的时候表示有进程在等待cpu，即系统资源不足。4、top、htop以及iftop命令top命令查看动态进程状态，默认每5秒刷新一次。top选项说明：-d：指定top刷新的时间间隔，默认是5 秒 -b：批处理模式，每次刷新分批显示 -n：指定top刷新几次就退出，可以配合-b使用 -p：指定监控的pid，指定方式为-pN1 -pN2 ...或-pN1, N2 [,...] -u：指定要监控的用户的进程，可以是uid也可以是user_name在top动态模式下，按下各种键可以进行不同操作。使用"h"或"?"可以查看相关键的说明。 1 ：(数字一)表示是否要在top的头部显示出多个cpu信息 H ：表示是否要显示线程，默认不显示 c,S ： c表示是否要展开进程的命令行，S表示显示的cpu时间是否是累积模式，cpu累积模式下已死去的子进程cpu时间会累积到父进程中 x,y ：x高亮排序的列，y表示高亮running进程 u ：仅显示指定用户的进程 n or #：设置要显示最大的进程数量 k ：杀进程 q ：退出top P ：以CPU 的使用资源排序显示 M ：以Memory 的使用资源排序显示 N ：以PID 来排序第1行：和w命令的第一行一样，也和uptime命令的结果一样。此行各列分别表示"当前时间"、"已开机时长"、"当前在线用户"、"前1、5、15分钟平均负载率"。第2行：分别表示总进程数、running状态的进程数、睡眠状态的进程数、停止状态进程数、僵尸进程数。第3-6行：每颗cpu的状况。 us = user mode sy = system mode ni = low priority user mode (nice)(用户空间中低优先级进程的cpu占用百分比) id = idle task wa = I/O waiting hi = servicing IRQs(不可中断睡眠，hard interruptible) si = servicing soft IRQs(可中断睡眠，soft interruptible) st = steal (time given to other DomU instances)(被偷走的cpu时间，一般被虚拟化软件偷走)第7-8行：从字面意思理解即可。VIRT：虚拟内存总量RES：实际内存总量SHR：共享内存量TIME：进程占用的cpu时间(若开启了时间累积模式，则此处显示的是累积时间)top命令虽然非常强大，但是太老了。所以有了新生代的top命令htop。htop默认没有安装，需要手动安装。htop可以使用鼠标完成点击选中。其他使用方法和top类似，使用h查看各按键意义即可。iftop用于动态显示网络接口的数据流量。用法也很简单，按下h键即可获取帮助。4、vmstat命令vmstat是 Virtual Meomory Statistics（虚拟内存统计）的缩写，可用来监控CPU使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。用法： vmstat [options] [delay [count]] 选项： -a, --active active/inactive memory -f, --forks number of forks since boot -m, --slabs slabinfo -n, --one-header do not redisplay header -s, --stats event counter statistics -d, --disk disk statistics -D, --disk-sum summarize disk statistics -p, --partition <dev> partition specific statistics -S, --unit <char> define display unit -w, --wide wide output -t, --timestamp show timestamp其中各列的意义如下：Procs r: 等待运行的进程数 b: 不可中断睡眠的进程数w: 被交换出去的可运行的进程数Memory swpd: 虚拟内存使用总量 free: 空闲内存量 buff: buffer占用的内存量(buffer用于缓冲) cache: cache占用的内存量(cache用于缓存)Swap si:从磁盘加载到swap分区的数据流量，单位为"kb/s" so: 从swap分区写到磁盘的数据流量，单位为"kb/s"IO bi: 从块设备接受到数据的速率，单位为blocks/s bo: 发送数据到块设备的速率，单位为blocks/sSystem in: 每秒中断数，包括时钟中断数量 cs: 每秒上下文切换次数CPU：统计的是cpu时间百分比，具体信息和top的cpu统计列一样 us: CPU 使用时间 sy: CPU 系统使用时间 id: 闲置时间5、iostat命令iostat主要统计磁盘或分区的整体使用情况。也可以输出cpu信息，甚至是NFS网络文件系统的信息。同vmstat/sar一样，第一次统计的都是自系统开机起的平均统计信息。使用命令iostat需要安装sysstat包。iostat [ -c ] [ -d ] [ -n -h ][ -k | -m ] [ -p [device][,...] ] [ interval [ count ] ] 选项说明： -c：统计cpu信息 -d：统计磁盘信息 -n：统计NFS文件系统信息 -h：使NFS统计信息更人类可读化 -k：指定以kb/s为单位显示 -m：指定以mb/s为单位显示 -p：指定要统计的设备名称 -y：指定不显示第一次统计信息，即不显示自开机起的统计信息。 interval：刷新时间间隔 count：总统计次数$ iostat Linux 5.2.21-1-MANJARO (kdkj2-pc) 2019年11月12日 _x86_64_ (6 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 30.16 0.00 3.06 1.58 0.00 65.20 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd sda 501.05 9754.67 8651.71 0.00 1012752945 898240888 0各列的意义都很清晰，从字面即可理解。tps：每秒transfer速率(transfers per second),一次对物理设备的IO请求为一个transfer，但多个逻辑请求可能只组成一个transferBlk_read/s：每秒读取的block数量Blk_wrtn/s：每秒写入的block总数Blk_read：读取的总block数量Blk_wrtn：写入的总block数量6、sar命令sar是一个非常强大的性能分析工具，它可以获取系统的cpu/等待队列/磁盘IO/内存/网络等性能指标。功能多的必然结果是选项多，应用复杂，但只要知道一些常用的选项足以。sar [options] [-o filename] [delay [count] ] 选项说明： -A：显示系统所有资源运行状况 -b：显示磁盘IO和tranfer速率信息，和iostat的信息一样，是总体IO统计信息 -d：显示磁盘在刷新时间间隔内的活跃情况，可以指定一个或多个设备，和-b不同的是，它显示的是单设备的IO、transfer信息。 ：建议配合-p使用显示友好的设备名，否则默认显示带主次设备号的设备名 -P：显示指定的某颗或某几颗cpu的使用情况。指定方式为，-P 0,1,2,3或ALL。 -u：显示每颗cpu整体平均使用情况。-u和-P的区别通过下面的示例很容易区分。 -r：显示内存在刷新时间间隔内的使用情况 -n：显示网络运行状态。后可接DEV/NFS/NFSD/ALL等多种参数。 ：DEV表示显示网路接口信息，NFS和NFSD分别表示显示NFS客户端服务端的流量信息，ALL表示显示所有信息。 -q：显示等待队列大小 -o filename：将结果存入到文件中 delay：状态刷新时间间隔 count：总共刷新几次7、free命令free用于查看内存使用情况。free [options] 选项说明： -h：人类可读方式显式单位 -m：以MB为显示单位 -w：宽版输出，将缓冲和缓存分开单独显示 -s：动态查看内存信息时的刷新时间间隔 -c：一共要刷新多少次退出free$ free -h 总计 已用 空闲 共享 缓冲/缓存 可用 内存： 15Gi 9.5Gi 605Mi 132Mi 5.4Gi 6.1Gi 交换： 15Gi 350Mi 15Gi
一、定义每个用户有用户名、用户编号(uid)、所属组及其默认的shell，可能还有密码、家目录、附属组、注释信息等。每个组有组名、组编号(gid)，组分为主组(primary group)和辅助组(secondary group)两种，用户一定会属于某个主组，也可以同时加入多个辅助组。用户的gid和uid可以不同，但一般情况下都会让它们保持一致，uid和gid是唯一的，多个用户可以指定相同的uid在Linux系统中，用户分为三类：超级管理员：拥有对系统的完全控制权，uid是0，默认用户名为root（可以更改，但是如非必要情况下不要更改它），可以修改、删除任何文件，运行任何命令，甚至可以在系统正常运行时删除所有文件系统，造成无法挽回的灾难，所以root用户也是系统里面最具危险性的用户，一般情况下，使用root用户登录系统时需要十分小心。系统用户：系统运行时必须有的用户（它具有某些特权），uid范围从1到999，用来运行特定的服务（比如使用系统用户mysql来运行mysqld服务），出于安全考虑，一般不能登录，所以它们的shell是/sbin/nologin，而且大多数时候它们是没有家目录的。普通用户：实际使用用户，这类用户可以使用用户名及密码登录系统，权限受到限制的用户，默认只能执行/bin、/usr/bin、/usr/local/bin和自身家目录下的命令，uid从1000开始。尽管普通用户权限受到限制，但是它对自身家目录下的文件是有所有权限的。其实1~65534之间的帐号并没有不同，也就是除了0之外，其他的UID并没有不一样 ，预设1000以下给系统作为保留帐号只是一个习惯。不过，一般来说， 1~99会保留给系统预设的帐号，另外100~999则保留给一些服务来使用，剩余的给一般使用者用的。linux系统现在已经可以支持4294967295 (2^32-1)的UID默认root用户的家目录为/root，其他用户的家目录一般在/home下以用户名命名的目录中，如longshuai这个用户的家目录为/home/longshuai，当然，家目录是可以自定义的。二、查看1、用户文件/etc/passwd文件里记录的是操作系统中用户的信息，这里面记录了几行就表示系统中有几个系统用户。它的格式大致如下：root:x:0:0::/root:/bin/bash nobody:x:65534:65534:Nobody:/:/usr/bin/nologin dbus:x:81:81:System Message Bus:/:/usr/bin/nologin bin:x:1:1::/:/usr/bin/nologin daemon:x:2:2::/:/usr/bin/nologin mail:x:8:12::/var/spool/mail:/usr/bin/nologin ftp:x:14:11::/srv/ftp:/usr/bin/nologin ..... rtkit:x:133:133:RealtimeKit:/proc:/usr/bin/nologin sddm:x:969:969:Simple Desktop Display Manager:/var/lib/sddm:/usr/bin/nologin kdkj3:x:1000:1000::/home/kdkj3:/usr/bin/zsh git:x:967:967:git daemon user:/:/usr/bin/git-shell每一行表示一个用户，每一行的格式都是6个冒号共7列属性，其中有很多用户的某些列属性是留空的。第一列：用户名。注意两个个特殊的用户名，root、nobody第二列：x。在古老版本系统上是存放用户密码的，后来为了安全将密码放在另一个文件/etc/shadow中，这里就都写成x了第三列：uid。第四列：gid。第五列：用户注释信息。第六列：用户家目录。注意root用户的家目录为/root第七列：用户默认shell。虽然叫shell，但其实可以是任意一个可执行程序或脚本。例如/bin/bash、/sbin/nologin、/sbin/shutdown/etc/shadow文件中存放的是用户的密码信息。该文件具有特殊属性，除了超级管理员，任何人都不能直接读取和修改该文件，而用户自身之所以能修改密码，则是因为passwd程序的suid属性，使得修改密码时临时提升为root权限。该文件的格式大致如下：root:$6$88aAfvezQn4/BLJx$hhlOahhsNzdNp2LHgphuavZQQMBsD5ilv5OcLd5No9XIVqz5HO5bHMG0YKr.lZANOroRJpmUkIbQ8U1Pln/Py0:18167:::::: nobody:!!:18167::: bin:!!:18167:::::: ...... kdkj3:$6$ru3c8AfmEW68Ol2C$EpNGOEeZEmLUdBhiJAud0.FtH3c4aY35y6Mm/BEPx3pkNepsKq/KO2PZqBSk7kBFJRJ695MNBzGvP4yqZKKwG0:18167:0:99999:7::: git:!!:18167::::::每一行表示一个用户密码的属性，有8个冒号共9列属性。第一列：用户名。第二列：加密后的密码。但是这一列是有玄机的，有些特殊的字符表示特殊的意义。该列留空，即”::”，表示该用户没有密码。该列为”!”，即”:!:”，表示该用户被锁，被锁将无法登陆，但是可能其他的登录方式是不受限制的，如ssh key的方式，su的方式。该列为””，即”::”，也表示该用户被锁，和”!”效果是一样的。该列以”!”或”!!”开头，则也表示该用户被锁。该列为”!!”，即”:!!:”，表示该用户从来没设置过密码。如果格式为”$id$salt$hashed”，则表示该用户密码正常。其中$id$的id表示密码的加密算法，$1$表示使用MD5算法，$2a$表示使用Blowfish算法，”$2y$”是另一算法长度的Blowfish,”$5$”表示SHA-256算法，而”$6$”表示SHA-512算法，可见上面的结果中都是使用sha-512算法的。$5$和$6$这两种算法的破解难度远高于MD5。$salt$是加密时使用的salt，$hashed才是真正的密码部分。第三列：从1970年1月1日到上次密码修改经过的时间(天数)。通过计算现在离1970年1月1日的天数减去这个值，结果就是上次修改密码到现在已经经过了多少天，即现在的密码已经使用了多少天。第四列：密码最少使用期限(天数)。省略或者0表示不设置期限。例如，刚修改完密码又想修改，可以限制多久才能再次修改第五列：密码最大使用期限(天数)。超过了它不一定密码就失效，可能下一个字段设置了过期后的宽限天数。设置为空时将永不过期，后面设置的提醒和警告将失效。root等一些用户的已经默认设置为了99999，表示永不过期。如果值设置小于最短使用期限，用户将不能修改密码。第六列：密码过期前多少天就开始提醒用户密码将要过期。空或0将不提醒。第七列：密码过期后宽限的天数，在宽限时间内用户无法使用原密码登录，必须改密码或者联系管理员。设置为空表示没有强制的宽限时间，可以过期后的任意时间内修改密码。第八列：帐号过期时间。从1970年1月1日开始计算天数。设置为空帐号将永不过期，不能设置为0。不同于密码过期，密码过期后账户还有效，改密码后还能登录；帐号过期后帐号失效，修改密码重设密码都无法使用该帐号。第九列：保留字段。2、组文件/etc/group包含了组信息。每行一个组，每一行3个冒号共4列属性。root:x:0:root adm:x:999:daemon wheel:x:998:kdkj3第一列：组名。第二列：占位符x。类似于用户文件的密码第三列：gid。第四列：该组下的user列表，这些user成员以该组做为辅助组，多个成员使用逗号隔开。/etc/gshadow包含了组密码信息，一般不设置用户组密码。3、骨架目录骨架目录/etc/skel，每次新建用户时，都会复制骨架目录下的文件到新用户家目录里的文件。默认只有3个环境配置文件（.bash_logout、.bash_profile、.bashrc），可以修改这里面的内容，或者添加几个文件在骨架目录中，以后新建用户时就会自动获取到这些环境和文件。4、用户限制文件/etc/login.defsh是设置用户帐号限制（例如密码长度）的文件，该文件里的配置对root用户无效。如果/etc/shadow文件里有相同的选项，则以/etc/shadow里的设置为准，也就是说/etc/shadow的配置优先级高于/etc/login.defs。该文件有很多配置项，文件的默认内容只给出了一小部分，若想知道全部的配置项以及配个配置项的详细说明，可以man 5 login.defs查看。#QMAIL_DIR Maildir # QMAIL_DIR是Qmail邮件的目录，所以可以不设置它 MAIL_DIR /var/spool/mail # 默认邮件根目录，即信箱 #MAIL_FILE .mail # mail文件的格式是.mail # Password aging controls: PASS_MAX_DAYS 99999 # 密码最大有效期(天) PASS_MIN_DAYS 0 # 两次密码修改之间最小时间间隔 PASS_MIN_LEN 5 # 密码最短长度 PASS_WARN_AGE 7 # 密码过期前给警告信息的时间 # 控制useradd创建用户时自动选择的uid范围 # Min/max values for automatic uid selection in useradd UID_MIN 1000 UID_MAX 60000 # System accounts SYS_UID_MIN 201 SYS_UID_MAX 999 # 控制groupadd创建组时自动选择的gid范围 # Min/max values for automatic gid selection in groupadd GID_MIN 1000 GID_MAX 60000 # System accounts SYS_GID_MIN 201 SYS_GID_MAX 999 # 设置此项后，在删除用户时，将自动删除用户拥有的at/cron/print等job #USERDEL_CMD /usr/sbin/userdel_local # 控制useradd添加用户时是否默认创建家目录，useradd -m选项会覆盖此处设置 CREATE_HOME yes # 设置创建家目录时的umask值，若不指定则默认为022 UMASK 077 # 设置此项表示当组中没有成员时自动删除该组 # 且useradd是否同时创建同用户名的主组。 # (该文件中并没有此项说明，来自于man useradd中-g选项的说明) USERGROUPS_ENAB yes # 设置用户和组密码的加密算法 ENCRYPT_METHOD SHA5124、用户默认配置/etc/default/useradd是创建用户时的默认配置。useradd -D修改的就是此文件。GROUP=100 # 在useradd使用-N或/etc/login.defs中USERGROUPS_ENAB=no时表示创建 # 用户时不创建同用户名的主组(primary group)，此时新建的用户将默认以 # 此组为主组，网上关于该设置的很多说明都是错的，具体可看man useradd # 的-g选项或useradd -D的-g选项 HOME=/home # 把用户的家目录建在/home中 INACTIVE=-1 # 是否启用帐号过期设置(是帐号过期不是密码过期)，-1表示不启用 EXPIRE= # 帐号过期时间，不设置表示不启用 SHELL=/bin/bash # 新建用户默认的shell类型 SKEL=/etc/skel # 指定骨架目录，前文的/etc/skel就在这里 CREATE_MAIL_SPOOL=yes # 是否创建用户mail缓冲三、管理1、创建useradd命令可以创建一个新用户，adduser是useradd的一个软链接。useradd创建用户时，默认会自动创建一个和用户名相同的用户组，这是/etc/login.defs中的USERGROUP_ENAB变量控制的，是否创建家目录是由/etc/login.defs中的CREATE_HOME变量控制的（如果不加任何和家目录相关的选项时）。用法：useradd [选项] 登录名 useradd -D useradd -D [选项] 选项： -b, --base-dir BASE_DIR 新账户的主目录的基目录 --btrfs-subvolume-home use BTRFS subvolume for home directory -c, --comment COMMENT 新账户的 GECOS 字段 -d, --home-dir HOME_DIR 新账户的主目录 -D, --defaults 显示或更改默认的 useradd 配置 -e, --expiredate EXPIRE_DATE 新账户的过期日期 -f, --inactive INACTIVE 新账户的密码不活动期 -g, --gid GROUP 新账户主组的名称或 ID -G, --groups GROUPS 新账户的附加组列表 -h, --help 显示此帮助信息并退出 -k, --skel SKEL_DIR 使用此目录作为骨架目录 -K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值 -l, --no-log-init 不要将此用户添加到最近登录和登录失败数据库 -m, --create-home 创建用户的主目录 -M, --no-create-home 不创建用户的主目录 -N, --no-user-group 不创建同名的组 -o, --non-unique 允许使用重复的 UID 创建用户 -p, --password PASSWORD 加密后的新账户密码 -r, --system 创建一个系统账户 -R, --root CHROOT_DIR chroot 到的目录 -P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files -s, --shell SHELL 新账户的登录 shell -u, --uid UID 新账户的用户 ID -U, --user-group 创建与用户同名的组newusers命令可以批量创建或修改已有用户信息。在创建用户时，它会读取/etc/login.defs文件中的配置项。用法：newusers [选项] 文件 选项： -h, --help 显示此帮助信息并退出 -r, --system 创建系统帐号 -R, --root CHROOT_DIR chroot 到的目录它从file中或标准输入中读取要创建或修改用户的信息，文件中每行格式都一样，一行代表一个用户。格式如下：pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shellpw_name：用户名，若不存在则新创建，否则修改已存在用户的信息pw_passwd：用户密码，该项使用明文密码，在修改或创建用户时会按照指定的算法自动对其进行加密转换pw_uid：指定uid，留空则自动选择uid。如果该项为已存在的用户名，则使用该用户的uid，但不建议这么做，uid应尽量保证唯一性pw_gid：用户主组的gid或组名。若给定组不存在，则自动创建组。若留空，则创建同用户名的组，gid将自动选择pw_gecos：用户注释信息pw_dir：指定用户家目录，若不存在则自动创建。留空则不创建。注意，newusers命令不会递归创建父目录，父目录不存在时将会给出信息，但newusers命令仍会继续执行以完成创建剩下的用户，所以这些错误的用户家目录需要手动去创建pw_shell：指定用户的默认shellgroupadd命令用于创建一个新组。用法：groupadd [选项] 组 选项: -f, --force 如果组已经存在则成功退出 并且如果 GID 已被使用则取消 -g -g, --gid GID 为新组使用 GID -h, --help 显示此帮助信息并退出 -K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值 -o, --non-unique 允许创建有重复 GID 的组 -p, --password PASSWORD 为新组使用此加密过的密码 -r, --system 创建一个系统账户 -R, --root CHROOT_DIR chroot 到的目录 -P, --prefix PREFIX_DIR directory prefix2、修改passwd是修改密码的工具，默认passwd命令不允许为用户创建空密码，passwd修改密码前需要认证用户。用法：passwd [选项] [登录名] 选项： -a, --all 报告所有帐户的密码状态 -d, --delete 删除指定帐户的密码 -e, --expire 强制使指定帐户的密码过期 -h, --help 显示此帮助信息并退出 -k, --keep-tokens 仅在过期后修改密码 -i, --inactive INACTIVE 密码过期后设置密码不活动为 INACTIVE -l, --lock 锁定指定的帐户 -n, --mindays MIN_DAYS 设置到下次修改密码所须等待的最短天数 为 MIN_DAYS -q, --quiet 安静模式 -r, --repository REPOSITORY 在 REPOSITORY 库中改变密码 -R, --root CHROOT_DIR chroot 到的目录 -S, --status 报告指定帐户密码的状态 -u, --unlock 解锁被指定帐户 -w, --warndays WARN_DAYS 设置过期警告天数为 WARN_DAYS -x, --maxdays MAX_DAYS 设置到下次修改密码所须等待的最多天数 为 MAX_DAYS批量修改密码用chpasswd命令，以批处理模式从标准输入中获取提供的用户和密码来修改用户密码，可以一次修改多个用户密码。也就是说不用交互，适用于一次性创建了多个用户时为他们提供密码。用法：chpasswd [选项] "user:passwd" 选项： -c, --crypt-method METHOD 加密方法(NONE DES MD5 SHA256 SHA512 中的一个) -e, --encrypted 提供的密码已经加密 -h, --help 显示此帮助信息并退出 -m, --md5 使用 MD5 算法加密明文密码 -R, --root CHROOT_DIR chroot 到的目录 -s, --sha-rounds 使用 SHA* 加密算法的轮数该命令的修改密码的处理方式是先在内存中修改，如果所有用户的密码都能设置成功，然后才写入到磁盘密码文件中。在内存中修改过程中出错，则所有修改都回滚，但若在写入密码文件过程中出错，则成功的不会回滚。chage命令主要修改或查看和密码时间相关的内容。用法：chage [选项] 登录名 选项： -d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期” -E, --expiredate 过期日期 将帐户过期时间设为“过期日期” -I, --inactive INACITVE 过期 INACTIVE 天数后，设定密码为失效状态 -l, --list 显示帐户年龄信息 -m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数” -M, --maxdays MAX_DAYS set maximum number of days before password change to MAX_DAYS -R, --root CHROOT_DIR chroot 到的目录 -W, --warndays 警告天数 将过期警告天数设为“警告天数”usermod修改帐户属性信息。必须要确保在执行该命令的时候，待修改的用户没有在执行进程。用法：usermod [选项] 登录名 选项： -c, --comment COMMENT GECOS 字段的新值 -d, --home HOME_DIR 用户的新主目录 -e, --expiredate EXPIRE_DATE 设定帐户过期的日期为 EXPIRE_DATE -f, --inactive INACTIVE 过期 INACTIVE 天数后，设定密码为失效状态 -g, --gid GROUP 强制使用 GROUP 为新主组 -G, --groups GROUPS 新的附加组列表 GROUPS -a, --append GROUP 将用户追加至上边 -G 中提到的附加组中，并不从其它组中删除此用户 -l, --login NEW_LOGIN 新的登录名称 -L, --lock 锁定用户帐号 -m, --move-home 将家目录内容移至新位置 (仅于 -d 一起使用) -o, --non-unique 允许使用重复的(非唯一的) UID -p, --password PASSWORD 将加密过的密码 (PASSWORD) 设为新密码 -R, --root CHROOT_DIR chroot 到的目录 -P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files -s, --shell SHELL 该用户帐号的新登录 shell -u, --uid UID 用户帐号的新 UID -U, --unlock 解锁用户帐号 -v, --add-subuids FIRST-LAST 添加子 UID 范围 -V, --del-subuids FIRST-LAST 移除子 UID 范围 -w, --add-subgids FIRST-LAST 添加子 GID 范围 -W, --del-subgids FIRST-LAST 移除子 GID 范围同样，还有groupmod修改组信息3、删除userdel命令用于删除用户。用法：userdel [选项] 登录名 选项： -r：递归删除家目录，默认不删除家目录。 -f：强制删除用户，即使这个用户正处于登录状态。同时也会强制删除家目录。一般不直接删除家目录，即不用-r，可以vim /etc/passwd，将不需要的用户直接注释掉。groupdel命令删除组。如果要删除的组是某用户的主组，需要先删除主组中的用户。4、手动创建用户在/etc/group中添加用户所属组的相关信息。如果用户还有辅助组则在对应组中加入该用户作为成员。在/etc/passwd和/etc/shadow中添加用户相关信息。此时指定的家目录还不存在，密码不存在，所以/etc/shadow的密码位使用”!!”代替。创建家目录，并复制骨架目录中的文件到家目录中。只是没有密码，所以只能su，不能登录，可使用passwd命令创建密码。用户和组的信息保存在/etc/group、/etc/passwd、/etc/shadow中，直接修改文件和使用命令更改是一样的四、其他有关的命令1、idid username -u：得到uid -n：得到用户名而不是uid -z：无任何空白字符输出模式，不能在默认的格式下使用。2、users查看当前正在登陆的用户名。3、last查看最近登录的用户列表，其实last查看的是/var/log/wtmp文件。用法： last [选项] [<用户名>...] [<tty>...] 显示上次登录用户的列表。 选项： -<数字> 显示行数 -a, --hostlast 最后一列显示主机名 -d, --dns 将 IP 号转换回主机名 -F, --file <文件> 用指定文件代替 /var/log/wtmp -F, --fulltimes 打印完整的登录和注销时间和日期 -i, --ip 以数字和点的形式显示 IP 号 -n, --limit <数字> 要显示的行数 -R, --nohostname 不显示主机名字段 -s, --since <时间> 显示从指定时间起的行 -t, --until <时间> 显示到指定时间为止的行 -p, --present <时间> 显示在指定时间谁在场(present) -w, --fullnames 显示完整的用户名和域名 -x, --system 显示系统关机项和运行级别更改4、lastb查看谁尝试登陆过但没有登录成功的。即能够审核和查看谁曾经不断的登录，可能那就是黑客。5、who和w都是查看谁登录过，并干了什么事，w查看的信息比who多。6、lastlog用户最后远程登录的记录，可以查看登录的来源IP。7、su切换用户或以指定用户运行命令，为了向后兼容，su默认不会改变当前目录。若su没有给定任何参数，将默认以root身份运行交互式的shell8、sudosudo -u USERNAME COMMANDsudo可以让一个用户以某个身份(如root或其他用户)执行某些命令，它隐含的执行方式是切换到指定用户再执行命令，因为涉及到了用户的切换，所以环境变量是否重置是需要设置的。默认情况下，系统只有root用户可以执行sudo命令。需要root用户编辑sudo的配置文件/etc/sudoers，才可以授权其他普通用户执行sudo命令。