0%

P81-87(系统信息)

01.时间和日期

​ date:查看系统日期

​ cal:calendar查看日历,-y选项可以查看一年日历

02.磁盘信息

​ df -h:disk free显示磁盘剩余空间

​ du -h[目录名]:disk usage显示目录下文件大小(-h以人性化方式显示文件大小)

​ /看根目录

03. 进程信息

当前正在执行的一个程序是进程

​ ps aux:process status查看进程的详细状况

​ top:动态显示运行中的进程并且排序

​ kill [-9] 进程代号:终止指定代号进程,-9是强制终止

ps

Linux ps命令用于显示当前进程 (process) 的状态。

语法

1
ps [options] [--help]

参数

  • ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
  • -A 列出所有的行程
  • -w 显示加宽可以显示较多的资讯
  • -au 显示较详细的资讯
  • -aux 显示所有包含其他使用者的行程(
  • au(x) 输出格式 :(常用)
  • USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  • USER: 行程拥有者
  • PID: pid
  • %CPU: 占用的 CPU 使用率
  • %MEM: 占用的记忆体使用率
  • VSZ: 占用的虚拟记忆体大小
  • RSS: 占用的记忆体大小
  • TTY: 终端的次要装置号码 (minor device number of tty)
  • STAT: 该行程的状态:
  • D: 无法中断的休眠状态 (通常 IO 的进程)
  • R: 正在执行中
  • S: 静止状态
  • T: 暂停执行
  • Z: 不存在但暂时无法消除
  • W: 没有足够的记忆体分页可分配
  • <: 高优先序的行程
  • N: 低优先序的行程
  • L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
  • START: 行程开始时间
  • TIME: 执行的时间
  • COMMAND:所执行的指令
  • x:显示没有控制终端的进程(会显示很多)

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# ps -A 显示进程信息
PID TTY TIME CMD
1 ? 00:00:02 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
6 ? 00:00:00 events/0
7 ? 00:00:00 cpuset
8 ? 00:00:00 khelper
9 ? 00:00:00 netns
10 ? 00:00:00 async/mgr
11 ? 00:00:00 pm
12 ? 00:00:00 sync_supers
13 ? 00:00:00 bdi-default
14 ? 00:00:00 kintegrityd/0
15 ? 00:00:02 kblockd/0
16 ? 00:00:00 kacpid
17 ? 00:00:00 kacpi_notify
18 ? 00:00:00 kacpi_hotplug
19 ? 00:00:27 ata/0
……省略部分结果
30749 pts/0 00:00:15 gedit
30886 ? 00:01:10 qtcreator.bin
30894 ? 00:00:00 qtcreator.bin
31160 ? 00:00:00 dhclient
31211 ? 00:00:00 aptd
31302 ? 00:00:00 sshd
31374 pts/2 00:00:00 bash
31396 pts/2 00:00:00 ps

显示指定用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# ps -u root //显示root进程用户信息
PID TTY TIME CMD
1 ? 00:00:02 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
6 ? 00:00:00 events/0
7 ? 00:00:00 cpuset
8 ? 00:00:00 khelper
9 ? 00:00:00 netns
10 ? 00:00:00 async/mgr
11 ? 00:00:00 pm
12 ? 00:00:00 sync_supers
13 ? 00:00:00 bdi-default
14 ? 00:00:00 kintegrityd/0
15 ? 00:00:02 kblockd/0
16 ? 00:00:00 kacpid
……省略部分结果
30487 ? 00:00:06 gnome-terminal
30488 ? 00:00:00 gnome-pty-helpe
30489 pts/0 00:00:00 bash
30670 ? 00:00:00 debconf-communi
30749 pts/0 00:00:15 gedit
30886 ? 00:01:10 qtcreator.bin
30894 ? 00:00:00 qtcreator.bin
31160 ? 00:00:00 dhclient
31211 ? 00:00:00 aptd
31302 ? 00:00:00 sshd
31374 pts/2 00:00:00 bash
31397 pts/2 00:00:00 ps

显示所有进程信息,连同命令行

1
2
3
4
5
6
7
8
9
10
11
12
13
# ps -ef //显示所有命令,连带命令行
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:22 ? 00:00:02 /sbin/init
root 2 0 0 10:22 ? 00:00:00 [kthreadd]
root 3 2 0 10:22 ? 00:00:00 [migration/0]
root 4 2 0 10:22 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 10:22 ? 00:00:00 [watchdog/0]
root 6 2 0 10:22 ? /usr/lib/NetworkManager
……省略部分结果
root 31302 2095 0 17:42 ? 00:00:00 sshd: root@pts/2
root 31374 31302 0 17:42 pts/2 00:00:00 -bash
root 31400 1 0 17:46 ? 00:00:00 /usr/bin/python /usr/sbin/aptd
root 31407 31374 0 17:48 pts/2 00:00:00 ps -ef

top

(Linux top命令用于实时显示 process 的动态。(好玩哪)

使用权限:所有使用者。

语法

1
top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

参数说明

  • d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
  • q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
  • c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
  • s : 安全模式,将交谈式指令取消, 避免潜在的危机
  • i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
  • n : 更新的次数,完成后将会退出 top
  • b : 批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内

实例

显示进程信息

1
# top

显示完整命令

1
# top -c

以批处理模式显示程序信息

1
# top -b

以累积模式显示程序信息

1
# top -S

设置信息更新次数

1
2
3
top -n 2

//表示更新两次后终止更新显示

设置信息更新时间

1
2
3
# top -d 3

//表示更新周期为3秒

显示指定的进程信息

1
2
3
# top -p 139

//显示进程号为139的进程信息,CPU、内存占用率等

显示更新十次后退出

1
top -n 10

使用者将不能利用交谈式指令来对行程下命令

1
top -s

kill

Linux kill命令用于删除执行中的程序或工作。

kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。

语法

1
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

参数说明

  • -l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。
  • -s <信息名称或编号>  指定要送出的信息。
  • [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。

实例

杀死进程

1
# kill 12345

强制杀死进程

1
# kill -KILL 123456

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

1
# kill -HUP pid

彻底杀死进程

1
# kill -9 123456

显示信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

杀死指定用户所有进程

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

P88-92(其他命令)

1.查找文件

​ find

Linux find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

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

参数说明 :

find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

-amin n : 在过去 n 分钟内被读取过

-anewer file : 比文件 file 更晚被读取过的文件

-atime n : 在过去n天内被读取过的文件

-cmin n : 在过去 n 分钟内被修改过

-cnewer file :比文件 file 更新的文件

-ctime n : 在过去n天内被修改过的文件

-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写(常用)

-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。-type c : 文件类型是 c 的文件。

d: 目录

c: 字型装置文件

b: 区块装置文件

p: 具名贮列

f: 一般文件

l: 符号连结

s: socket

-pid n : process id 是 n 的文件

你可以使用 ( ) 将运算式分隔,并使用下列运算。

exp1 -and exp2

! expr

-not expr

exp1 -or exp2

exp1, exp2

实例

将目前目录及其子目录下所有延伸档名是 c 的文件列出来。(经典)

1
# find . -name "*.c"

将目前目录其其下子目录中所有一般文件列出

1
# find . -type f

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

1
# find . -ctime -20

查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:

1
# find /var/log -type f -mtime +7 -ok rm {} \;

查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:

1
# find . -type f -perm 644 -exec ls -l {} \;

为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:

1
# find / -type f -size 0 -exec ls -l {} \;

2. 软链接(类似快捷方式)

ln -s 被链接的源文件 起的文件名

ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

例如:ln -s /bin/less /usr/local/bin/less

-s 是代号(symbolic)的意思。

这 里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接 和硬链接两种,软链接就是ln -s ** *,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln * **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls -l命令去察看,就可以看到显示的link的路径了。

不加-s是硬链接,ls -l可以查看硬链接数

ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件。
  当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。例如:ln –s /bin/less /usr/local/bin/less
  -s 是代号(symbolic)的意思。
  这里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又 软链接和硬链接两种,软链接就是ln –s ** *,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln * **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
  如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls –l命令去察看,就可以看到显示的link的路径了。
  指令详细说明
  指令名称 : ln
  使用权限 : 所有使用者
  使用方式 : ln [options] source dist,其中 option 的格式为 :
  [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
  [–help] [–version] [–]
  说明 : Linux/Unix 档案系统中,有所谓的连结(link),我们可以将其视为档案的别名,而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link),硬连结的意思是一个档案可以有多个名称,而软连结的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬连结是存在同一个档 案系统中,而软连结却可以跨越不同的档案系统。
  ln source dist 是产生一个连结(dist)到 source,至于使用硬连结或软链结则由参数决定。
  不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

Linux ln命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。

当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

语法

1
ln [参数][源文件或目录][目标文件或目录]

其中参数的格式为

[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]

[–help] [–version] [–]

命令功能 :
Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。

不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

软链接:(用绝对路径)

  • 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  • 2.软链接可以 跨文件系统 ,硬链接不可以
  • 3.软链接可以对一个不存在的文件名进行链接
  • 4.软链接可以对目录进行链接

硬链接

  • 1.硬链接,以文件副本的形式存在。但不占用实际空间。
  • 2.不允许给目录创建硬链接
  • 3.硬链接只有在同一个文件系统中才能创建

命令参数

必要参数

  • -b 删除,覆盖以前建立的链接
  • -d 允许超级用户制作目录的硬链接
  • -f 强制执行
  • -i 交互模式,文件存在则提示用户是否覆盖
  • -n 把符号链接视为一般目录
  • -s 软链接(符号链接)(常用)
  • -v 显示详细的处理过程

选择参数

  • -S “-S<字尾备份字符串> “或 “–suffix=<字尾备份字符串>”
  • -V “-V<备份方式>”或”–version-control=<备份方式>”
  • –help 显示帮助信息
  • –version 显示版本信息

实例

给文件创建软链接,为log2013.log文件创建软链接link2013,如果log2013.log丢失,link2013将失效:

1
ln -s log2013.log link2013

输出:

1
2
3
4
5
6
[root@localhost test]# ll
-rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log
[root@localhost test]# ln -s log2013.log link2013
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log

给文件创建硬链接,为log2013.log创建硬链接ln2013,log2013.log与ln2013的各项属性相同

1
ln log2013.log ln2013

输出:

1
2
3
4
5
6
7
8
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log
[root@localhost test]# ln log2013.log ln2013
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r--r-- 2 root bin 61 11-13 06:03 ln2013
-rw-r--r-- 2 root bin 61 11-13 06:03 log2013.log

P93(软链接硬链接)

linux中文件名和文件数据分开存储

删除文件,软链接自动删除,文件数据自动删除,硬链接不会删除,文件数据还可以硬链接读取,几乎不会用硬链接。

P94-97打包压缩

windows中:rar

mac中:zip

linux:tar.gz

Linux tar命令用于备份文件。

tar是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。

tar -cvf 打包文件.tar 被打包文件/路径… #打包

tar -xvf 打包文件.tar#解压

语法

1
tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X <范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]

参数

  • -A或–catenate 新增文件到已存在的备份文件。
  • -b<区块数目>或–blocking-factor=<区块数目> 设置每笔记录的区块数目,每个区块大小为12Bytes。
  • -B或–read-full-records 读取数据时重设区块大小。
  • -c或–create 建立新的备份文件。
  • -C<目的目录>或–directory=<目的目录> 切换到指定的目录。
  • -d或–diff或–compare 对比备份文件内和文件系统上的文件的差异。
  • -f<备份文件>或–file=<备份文件> 指定备份文件。
  • -F<Script文件>或–info-script=<Script文件> 每次更换磁带时,就执行指定的Script文件。
  • -g或–listed-incremental 处理GNU格式的大量备份。
  • -G或–incremental 处理旧的GNU格式的大量备份。
  • -h或–dereference 不建立符号连接,直接复制该连接所指向的原始文件。
  • -i或–ignore-zeros 忽略备份文件中的0 Byte区块,也就是EOF。
  • -k或–keep-old-files 解开备份文件时,不覆盖已有的文件。
  • -K<文件>或–starting-file=<文件> 从指定的文件开始还原。
  • -l或–one-file-system 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制。
  • -L<媒体容量>或-tape-length=<媒体容量> 设置存放每体的容量,单位以1024 Bytes计算。
  • -m或–modification-time 还原文件时,不变更文件的更改时间。
  • -M或–multi-volume 在建立,还原备份文件或列出其中的内容时,采用多卷册模式。
  • -N<日期格式>或–newer=<日期时间> 只将较指定日期更新的文件保存到备份文件里。
  • -o或–old-archive或–portability 将资料写入备份文件时使用V7格式。
  • -O或–stdout 把从备份文件里还原的文件输出到标准输出设备。
  • -p或–same-permissions 用原来的文件权限还原文件。
  • -P或–absolute-names 文件名使用绝对名称,不移除文件名称前的”/“号。
  • -r或–append 新增文件到已存在的备份文件的结尾部分。
  • -R或–block-number 列出每个信息在备份文件中的区块编号。
  • -s或–same-order 还原文件的顺序和备份文件内的存放顺序相同。
  • -S或–sparse 倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。
  • -t或–list 列出备份文件的内容。
  • -T<范本文件>或–files-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。
  • -u或–update 仅置换较备份文件内的文件更新的文件。
  • -U或–unlink-first 解开压缩文件还原文件之前,先解除文件的连接。
  • -v或–verbose 显示指令执行过程。
  • -V<卷册名称>或–label=<卷册名称> 建立使用指定的卷册名称的备份文件。
  • -w或–interactive 遭遇问题时先询问用户。
  • -W或–verify 写入备份文件后,确认文件正确无误。
  • -x或–extract或–get 从备份文件中还原文件。
  • -X<范本文件>或–exclude-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让ar排除符合设置条件的文件。
  • -z或–gzip或–ungzip 通过gzip指令处理备份文件。
  • -Z或–compress或–uncompress 通过compress指令处理备份文件。
  • -<设备编号><存储密度> 设置备份用的外围设备编号及存放数据的密度。
  • –after-date=<日期时间> 此参数的效果和指定”-N”参数相同。
  • –atime-preserve 不变更文件的存取时间。
  • –backup=<备份方式>或–backup 移除文件前先进行备份。
  • –checkpoint 读取备份文件时列出目录名称。
  • –concatenate 此参数的效果和指定”-A”参数相同。
  • –confirmation 此参数的效果和指定”-w”参数相同。
  • –delete 从备份文件中删除指定的文件。
  • –exclude=<范本样式> 排除符合范本样式的文件。
  • –group=<群组名称> 把加入设备文件中的文件的所属群组设成指定的群组。
  • –help 在线帮助。
  • –ignore-failed-read 忽略数据读取错误,不中断程序的执行。
  • –new-volume-script=<Script文件> 此参数的效果和指定”-F”参数相同。
  • –newer-mtime 只保存更改过的文件。
  • –no-recursion 不做递归处理,也就是指定目录下的所有文件及子目录不予处理。
  • –null 从null设备读取文件名称。
  • –numeric-owner 以用户识别码及群组识别码取代用户名称和群组名称。
  • –owner=<用户名称> 把加入备份文件中的文件的拥有者设成指定的用户。
  • –posix 将数据写入备份文件时使用POSIX格式。
  • –preserve 此参数的效果和指定”-ps”参数相同。
  • –preserve-order 此参数的效果和指定”-A”参数相同。
  • –preserve-permissions 此参数的效果和指定”-p”参数相同。
  • –record-size=<区块数目> 此参数的效果和指定”-b”参数相同。
  • –recursive-unlink 解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。
  • –remove-files 文件加入备份文件后,就将其删除。
  • –rsh-command=<执行指令> 设置要在远端主机上执行的指令,以取代rsh指令。
  • –same-owner 尝试以相同的文件拥有者还原文件。
  • –suffix=<备份字尾字符串> 移除文件前先行备份。
  • –totals 备份文件建立后,列出文件大小。
  • –use-compress-program=<执行指令> 通过指定的指令处理备份文件。
  • –version 显示版本信息。
  • –volno-file=<编号文件> 使用指定文件内的编号取代预设的卷册编号。

实例

压缩文件 非打包

1
2
3
# touch a.c       
# tar -czvf test.tar.gz a.c //压缩 a.c文件为test.tar.gz
a.c

列出压缩文件内容

1
2
# tar -tzvf test.tar.gz 
-rw-r--r-- root/root 0 2010-05-24 16:51:59 a.c

解压文件

1
2
# tar -xzvf test.tar.gz 
a.c

Linux 常用的压缩与解压缩命令有:tar、gzip、gunzip、bzip2、bunzip2、compress 、uncompress、 zip、 unzip、rar、unrar 等。


tar

最常用的打包命令是 tar,使用 tar 程序打出来的包我们常称为 tar 包,tar 包文件的命令通常都是以 .tar 结尾的。生成 tar 包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲 tar 命令的基本用法。

tar 命令的选项有很多(用 man tar 可以查看到),但常用的就那么几个选项,下面来举例说明一下:

1
# tar -cf all.tar *.jpg

这条命令是将所有 .jpg 的文件打成一个名为 all.tar 的包。-c 是表示产生新的包,-f 指定包的文件名。

1
# tar -rf all.tar *.gif

这条命令是将所有 .gif 的文件增加到 all.tar 的包里面去,-r 是表示增加文件的意思。

1
# tar -uf all.tar logo.gif

这条命令是更新原来 tar 包 all.tar 中 logo.gif 文件,-u 是表示更新文件的意思。

1
# tar -tf all.tar

这条命令是列出 all.tar 包中所有文件,-t 是列出文件的意思。

1
# tar -xf all.tar

这条命令是解出 all.tar 包中所有文件,-x 是解开的意思。

以上就是 tar 的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar 提供了一种特殊的功能。这就是 tar 可以在打包或解包的同时调用其它的压缩程序,比如调用 gzip、bzip2 等。

1) tar调用

gzip 是 GNU 组织开发的一个压缩程序,.gz 结尾的文件就是 gzip 压缩的结果。与 gzip 相对的解压程序是 gunzip。tar 中使用 -z 这个参数来调用gzip。下面来举例说明一下:

1
# tar -czf all.tar.gz *.jpg

这条命令是将所有 .jpg 的文件打成一个 tar 包,并且将其用 gzip 压缩,生成一个 gzip 压缩过的包,包名为 all.tar.gz。

1
# tar -xzf all.tar.gz

这条命令是将上面产生的包解开。

2) tar 调用 bzip2

bzip2 是一个压缩能力更强的压缩程序,.bz2 结尾的文件就是 bzip2 压缩的结果。

与 bzip2 相对的解压程序是 bunzip2。tar 中使用 -j 这个参数来调用 gzip。下面来举例说明一下:

1
# tar -cjf all.tar.bz2 *.jpg

这条命令是将所有 .jpg 的文件打成一个 tar 包,并且将其用 bzip2 压缩,生成一个 bzip2 压缩过的包,包名为 all.tar.bz2

1
# tar -xjf all.tar.bz2

这条命令是将上面产生的包解开。

3)tar 调用 compress

compress 也是一个压缩程序,但是好象使用 compress 的人不如 gzip 和 bzip2 的人多。.Z 结尾的文件就是 bzip2 压缩的结果。与 compress 相对的解压程序是 uncompress。tar 中使用 -Z 这个参数来调用 compress。下面来举例说明一下:

1
# tar -cZf all.tar.Z *.jpg

这条命令是将所有 .jpg 的文件打成一个 tar 包,并且将其用 compress 压缩,生成一个 uncompress 压缩过的包,包名为 all.tar.Z。

1
# tar -xZf all.tar.Z

这条命令是将上面产生的包解开。

有了上面的知识,你应该可以解开多种压缩文件了,下面对于 tar 系列的压缩文件作一个小结:

1) 对于.tar结尾的文件

1
tar -xf all.tar

2) 对于 .gz 结尾的文件

1
2
gzip -d all.gz
gunzip all.gz

3)对于 .tgz 或 .tar.gz 结尾的文件

1
2
tar -xzf all.tar.gz
tar -xzf all.tgz

4) 对于 .bz2 结尾的文件

1
2
bzip2 -d all.bz2
bunzip2 all.bz2

5) 对于 tar.bz2 结尾的文件

1
tar -xjf all.tar.bz2

6) 对于 .Z 结尾的文件

1
uncompress all.Z

7) 对于 .tar.Z 结尾的文件

1
tar -xZf all.tar.z

另外对于 Windows 下的常见压缩文件 .zip 和 .rar,Linux 也有相应的方法来解压它们:

1) 对于 .zip

linux 下提供了 zip 和 unzip 程序,zip 是压缩程序,unzip 是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

1
# zip all.zip *.jpg

这条命令是将所有 .jpg 的文件压缩成一个 zip 包:

1
# unzip all.zip

这条命令是将 all.zip 中的所有文件解压出来。

2) 对于 .rar

要在 linux 下处理 .rar 文件,需要安装 RAR for Linux。下载地址:http://www.rarsoft.com/download.htm,下载后安装即可。

1
2
3
# tar -xzpvf rarlinux-x64-5.6.b5.tar.gz
# cd rar
# make

这样就安装好了,安装后就有了 rar 和 unrar 这两个程序,rar 是压缩程序,unrar 是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

1
# rar a all *.jpg

这条命令是将所有 .jpg 的文件压缩成一个 rar 包,名为 all.rar,该程序会将 .rar 扩展名将自动附加到包名后。

1
# unrar e all.rar

这条命令是将 all.rar 中的所有文件解压出来:


扩展内容

tar

-C 解压缩到指定目录,且目录必须存在

1
2
3
4
5
-c: 建立压缩档案 
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

1
2
3
4
5
-z:有gzip属性的 
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出

下面的参数 -f 是必须的:

1
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

# tar -cf all.tar *.jpg

这条命令是将所有 .jpg 的文件打成一个名为 all.tar 的包。-c 是表示产生新的包,-f 指定包的文件名。

1
# tar -rf all.tar *.gif

这条命令是将所有 .gif 的文件增加到 all.tar 的包里面去。-r 是表示增加文件的意思。

1
# tar -uf all.tar logo.gif

这条命令是更新原来 tar 包 all.tar 中 logo.gif 文件,-u 是表示更新文件的意思。

1
# tar -tf all.tar

这条命令是列出 all.tar 包中所有文件,-t 是列出文件的意思。

1
# tar -xf all.tar

这条命令是解出 all.tar 包中所有文件,-x 是解开的意思。

压缩

1
2
3
4
5
6
tar –cvf jpg.tar *.jpg       // 将目录里所有jpg文件打包成 tar.jpg 
tar –czf jpg.tar.gz *.jpg // 将目录里所有jpg文件打包成 jpg.tar 后,并且将其用 gzip 压缩,生成一个 gzip 压缩过的包,命名为 jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg // 将目录里所有jpg文件打包成 jpg.tar 后,并且将其用 bzip2 压缩,生成一个 bzip2 压缩过的包,命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg // 将目录里所有 jpg 文件打包成 jpg.tar 后,并且将其用 compress 压缩,生成一个 umcompress 压缩过的包,命名为jpg.tar.Z
rar a jpg.rar *.jpg // rar格式的压缩,需要先下载 rar for linux
zip jpg.zip *.jpg // zip格式的压缩,需要先下载 zip for linux

解压

1
2
3
4
5
6
tar –xvf file.tar         // 解压 tar 包 (常用)
tar -xzvf file.tar.gz // 解压 tar.gz
tar -xjvf file.tar.bz2 // 解压 tar.bz2
tar –xZvf file.tar.Z // 解压 tar.Z
unrar e file.rar // 解压 rar
unzip file.zip // 解压 zip

总结

1
2
3
4
5
6
7
8
9
1、*.tar 用 tar –xvf 解压 
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压

压缩/解压缩

总结:tar -cvf tar -xvf(一对)(打包解压)

​ tar -zcvf tar-zxvf(一对) (压缩解压)

​ tar -zcvf 打包文件.tar.gz 被压缩文件/路径 #压缩

​ tar -zxvf 打包文件.tar.gz #压缩文件

​ tar -zxvf 打包文件.tar.gz -C 目标路径 #解压到指定路径

gzip:压缩(和tar一起用:打包压缩)

Linux gzip命令用于压缩文件。

gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出”.gz”的扩展名。

语法

1
gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][文件...] 或 gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][目录]

参数

  • -a或–ascii  使用ASCII文字模式。
  • -c或–stdout或–to-stdout  把压缩后的文件输出到标准输出设备,不去更动原始文件。
  • -d或–decompress或—-uncompress  解开压缩文件。
  • -f或–force  强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接。
  • -h或–help  在线帮助。
  • -l或–list  列出压缩文件的相关信息。
  • -L或–license  显示版本与版权信息。
  • -n或–no-name  压缩文件时,不保存原来的文件名称及时间戳记。
  • -N或–name  压缩文件时,保存原来的文件名称及时间戳记。
  • -q或–quiet  不显示警告信息。
  • -r或–recursive  递归处理,将指定目录下的所有文件及子目录一并处理。
  • -S<压缩字尾字符串>或—-suffix<压缩字尾字符串>  更改压缩字尾字符串。
  • -t或–test  测试压缩文件是否正确无误。
  • -v或–verbose  显示指令执行过程。
  • -V或–version  显示版本信息。
  • -<压缩效率>  压缩效率是一个介于1-9的数值,预设值为”6”,指定愈大的数值,压缩效率就会愈高。
  • –best  此参数的效果和指定”-9”参数相同。
  • –fast  此参数的效果和指定”-1”参数相同。

实例

压缩文件

1
2
3
4
5
6
[root@runoob.com a]# ls //显示当前目录文件
a.c b.h d.cpp
[root@runoob.com a]# gzip * //压缩目录下的所有文件
[root@runoob.com a]# ls //显示当前目录文件
a.c.gz b.h.gz d.cpp.gz
[root@runoob.com a]#

接范例1, 列出详细的信息

1
2
3
4
5
[root@runoob.com a]# gzip -dv * //解压文件,并列出详细信息
a.c.gz: 0.0% -- replaced with a.c
b.h.gz: 0.0% -- replaced with b.h
d.cpp.gz: 0.0% -- replaced with d.cpp
[root@runoob.com a]#

接范例1,显示压缩文件的信息

1
2
3
4
5
[root@runoob.com a]# gzip -l *
compressed uncompressed ratio uncompressed_name
24 0 0.0% a.c
24 0 0.0% b.h
26 0 0.0% d.cpp

bzip2

Linux bzip2命令是.bz2文件的压缩程序。

bzip2像gzip一样,tar打包,bzip2压缩tar后文件,扩展名 .tar.bz2

压缩文件 tar -jcvf 打包文件.tar.bz2 被压缩文件/路径

解压 tar -jxvf 打包文件.tar.bz2

-C 解压缩到指定目录,且目录必须存在

bzip2采用新的压缩演算法,压缩效果比传统的LZ77/LZ78压缩演算法来得好。若没有加上任何参数,bzip2压缩完文件后会产生.bz2的压缩文件,并删除原始的文件。

语法

1
bzip2 [-cdfhkLstvVz][--repetitive-best][--repetitive-fast][- 压缩等级][要压缩的文件]

参数

  • -c或–stdout  将压缩与解压缩的结果送到标准输出。
  • -d或–decompress  执行解压缩。
  • -f或–force  bzip2在压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件。若要覆盖,请使用此参数。
  • -h或–help  显示帮助。
  • -k或–keep  bzip2在压缩或解压缩后,会删除原始的文件。若要保留原始文件,请使用此参数。
  • -s或–small  降低程序执行时内存的使用量。
  • -t或–test  测试.bz2压缩文件的完整性。
  • -v或–verbose  压缩或解压缩文件时,显示详细的信息。
  • -z或–compress  强制执行压缩。
  • -L,–license,
  • -V或–version  显示版本信息。
  • –repetitive-best  若文件中有重复出现的资料时,可利用此参数提高压缩效果。
  • –repetitive-fast  若文件中有重复出现的资料时,可利用此参数加快执行速度。
  • -压缩等级  压缩时的区块大小。

实例

解压.bz2文件

1
[root@w3cschool.cc ~]# bzip2 -v temp.bz2 //解压文件显示详细处理信息

压缩文件

1
[root@w3cschool.cc ~]# bzip2 -c a.c b.c c.c

检查文件完整性

1
[root@w3cschool.cc ~]# bzip2 -t temp.bz2

P98-100软件安装

apt是advanced packaging tool,linux下安装管理工具

sudo apt install 软件包#安装

sudo apt remove 软件包名#卸载

sudo apt upgrade#更新

sudo apt install htop#查看当前进程,输入htop即可

P60-61(用户文件权限)

用户管理包括用户与组管理。

Linux操作系统对多用户的管理,是非常繁琐的,所以用组的概念来管理用户就变得简单,每个用户可以在一个独立的组,每个组也可以有零个用户或者多个用户。

Linux系统用户是根据用户ID来识别的,默认ID长度为32位,从默认ID编号从0开始,但是为了和老式系统兼容,用户ID限制在60000以下,Linux用户分总共分为三种,分别如下:

root用户 (ID 0)

系统用户 (ID 1-499)

普通用户 (ID 500以上)

Linux系统中的每个文件或者文件夹,都有一个所属用户及所属组,使用id命令可以显示当前用户的信息,使用passwd命令可以修改当前用户密码。Linux操作系统用户的特点如下:

每个用户拥有一个UserID,操作系统实际读取的是UID,而非用户名;

每个用户属于一个主组,属于一个或多个附属组,一个用户最多有31个附属组;

每个组拥有一个GroupID;

每个进程以一个用户身份运行,该用户可对进程拥有资源控制权限;

每个可登陆用户拥有一个指定的Shell环境。

Linux用户管理

Linux用户在操作系统可以进行日常管理和维护,涉及到的相关配置文件如下:

/etc/passwd 保存用户信息

/etc/shdaow 保存用户密码(以加密形式保存)

/etc/group 保存组信息

/etc/login.defs 用户属性限制,密码过期时间,密码最大长度等限制

/etc/default/useradd 显示或更改默认的useradd配置文件

如需创建新用户,可以使用命令useradd,执行命令useradd test1即可创建test1用户,同时会创建一个同名的组test1,默认该用户属于test1主组。

Useradd test1命令默认创建用户test1,会根据如下步骤进行操作:

在/etc/passwd文件中添加用户信息;

如使用passwd命令创建密码,密码会被加密保存在/etc/shdaow中;

为test1创建家目录:/home/test1;

将/etc/skel中的.bash开头的文件复制至/home/test1家目录;

创建与用户名相同的test1组,test1用户默认属于test1同名组;

test1组信息保存在/etc/group配置文件中。

在使用useradd命令创建用户时,可以支持如下参数:

用法:useradd [选项] 登录

useradd -D

useradd -D [选项]

选项:

-b, –base-dir BASE_DIR 指定新账户的家目录;

-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 到的目录;

-s, –shell SHELL 新账户的登录 shell;

-u, –uid UID 新账户的用户 ID;

-U, –user-group 创建与用户同名的组;

-Z, –selinux-user SEUSER 为SELinux 用户映射使用指定 SEUSER。

Linux组管理

所有的Linux或者Windows系统都有组的概念,通过组可以更加方便的管理用户,组的概念应用于各行行业,例如企业会使用部门、职能或地理区域的分类方式来管理成员,映射在Linux系统,同样可以创建用户,并用组的概念对其管理。

Linux组有如下特点:

每个组有一个组ID;

组信息保存在/etc/group中;

每个用户至少拥有一个主组,同时还可以拥有31个附属组。

通过命令groupadd、groupdel、groupmod来对组进行管理,详细参数使用如下:

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 创建一个系统账户;

groupmod用法

-g, –gid GID 将组 ID 改为 GID;

-h, –help 显示此帮助信息并推出;

-n, –new-name NEW_GROUP 改名为 NEW_GROUP;

-o, –non-unique 允许使用重复的 GID;

-p, –password PASSWORD 将密码更改为(加密过的) PASSWORD;

groupdel用法

groupdel admin 删除admin组;

二、 Linux权限管理

Linux权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户或用户组可以对特定文件进行相应的操作。

Linux每个进程都是以某个用户身份运行,进程的权限与该用户的权限一样,用户的权限越大,则进程拥有的权限就越大。

Lnux中有的文件及文件夹都有至少权限三种权限,常见的权限如表5-1所示:

权限 对文件的影响 对目录的影响
r(读取) 可读取文件内容 可列出目录内容
w(写入) 可修改文件内容 可在目录中创建删除内容
x(执行) 可作为命令执行 可访问目录内容
目录必须拥有 x 权限,否则无法查看其内容

Linux权限授权,默认是授权给三种角色,分别是user、group、other,Linux权限与用户之间的关联如下:

U代表User,G代表Group,O代表Other;

每个文件的权限基于UGO进行设置;

权限三位一组(rwx),同时需授权给三种角色,UGO;

每个文件拥有一个所属用户和所属组,对应UGO,不属于该文件所属用户或所属组使用O来表示;

在Linux系统中,可以通过ls –l查看peter.net目录的详细属性,如图5-1所示:

drwxrwxr-x 2 peter1 peter1 4096 Dec 10 01:36 peter.net

peter.net目录属性参数详解如下:

d 表示目录,同一位置如果为-则表示普通文件;

rwxrwxr-x 表示三种角色的权限,每三位为一种角色,依次为u,g,o权限,如上则表示user的权限为rwx,group的权限为rwx,other的权限为r-x;

2表示文件夹的链接数量,可理解为该目录下子目录的数量;

从左到右,第一个peter1表示该用户名,第二个peter1则为组名,其他人角色默认不显示;

4096表示该文件夹占据的字节数;

Dec 10 01:36 表示文件创建或者修改的时间;

peter.net 为目录的名,或者文件名。

peter.net目录属性参数详解如下:

d 表示目录,同一位置如果为-则表示普通文件;

rwxrwxr-x 表示三种角色的权限,每三位为一种角色,依次为u,g,o权限,如上则表示user的权限为rwx,group的权限为rwx,other的权限为r-x;

2表示文件夹的链接数量,可理解为该目录下子目录的数量;

从左到右,第一个peter1表示该用户名,第二个peter1则为组名,其他人角色默认不显示;

4096表示该文件夹占据的字节数;

Dec 10 01:36 表示文件创建或者修改的时间;

peter.net 为目录的名,或者文件名。

Chmod用户及组权限

修改某个用户、组对文件夹的权限,用命令chmod实现,其中以代指ugo,、-、=代表加入、删除和等于对应权限,具体案例如下:

(1) 授予用户对peter.net目录拥有rwx权限

chmod –R u+rwx peter.net

(2) 授予组对peter.net目录拥有rwx权限

chmod –R g+rwx peter.net

(3) 授予用户、组、其他人对jpeter.net目录拥有rwx权限

chmod –R u+rwx,g+rwx,o+rwx peter.net

(4) 撤销用户对peter.net目录拥有w权限

chmod –R u-w peter.net

(5) 撤销用户、组、其他人对peter.net目录拥有x权限

chmod –R u-x,g-x,o-x peter.net

(6) 授予用户、组、其他人对jpeter.net目录只有rx权限

chmod –R u=rx,g=rx,o=rx peter.net

Chmod二进制权限

Linux权限默认使用rwx来表示,为了更简化在系统中对权限进行配置和修改,Linux权限引入二进制表示方法,如下代码:

Linux权限可以将rwx用二进制来表示,其中有权限用1表示,没有权限用0表示;Linux权限用二进制显示如下:rwx=111r-x=101rw-=110r–=100依次类推,转化为十进制,对应十进制结果显示如下:rwx=111=4+2+1=7r-x=101=4+0+1=5rw-=110=4+4+0=6r–=100=4+0+0=4得出结论,用r=4,w=2,x=1来表示权限。

使用二进制方式来修改权限案例演示如下,其中默认peter.nett目录权限为755:

(1) 授予用户对peter.net目录拥有rwx权限

chmod –R 755 peter.net

(2) 授予组对peter.net目录拥有rwx权限

chmod –R 775 peter.net

(3) 授予用户、组、其他人对peter.net目录拥有rwx权限

chmod –R 777 peter.net

Linux特殊权限及掩码

Linux权限除了常见的rwx权限之外,还有很多特殊的权限,细心的读者会发现,为什么Linux目录默认权限755,而文件默认权限为644呢,这是因为Linux权限掩码umask导致。

每个Linux终端都拥有一个umask属性,umask熟悉可以用来确定新建文件、目录的默认权限,默认系统权限掩码为022。在系统中每创建一个文件或者目录,文件默认权限是666,而目录权限则为777,权限对外开放比较大,所以设置了权限掩码之后,默认的文件和目录权限减去umask值才是真实的文件和目录的权限。

对应目录权限为:777-022=755;

对应文件权限为:666-022=644;

执行umask命令可以查看当前默认的掩码,umask -S 023可以设置默认的权限掩码。

在Linux权限中,除了普通权限外,还有如下表5-2所示,三个特殊权限:

权限 对文件的影响 对目录的影响
Suid 以文件的所属用户身份执行,而非执行文件的用户
sgid 以文件所属组身份去执行 在该目录中创建任意新文件的所属组与该目录的所属组相同
sticky 对目录拥有写入权限的用户仅可以删除其拥有的文件,无法删除其他用户所拥有的文件

表5-2 Linux三种特殊权限

Linux中设置特殊权限方法如下:

q 设置suid: chmod u+s peter.net

q 设置sgid: chmod g+s peter.net

q 设置sticky: chmod o+t peter.net

特殊权限与设置普通权限一样,可以使用数字方式表示:

SUID = 4

SGID = 2

Sticky = 1

可以通过chmod 4755 peter.net对该目录授予特殊权限为s的权限,Linux系统中s权限的应用常见包括:su、passwd、sudo,

P62-63(ls -l)

权限 对文件的影响 对目录的影响
r(读取) 可读取文件内容 可列出目录内容
w(写入) 可修改文件内容 可在目录中创建删除内容
x(执行) 可作为命令执行 可访问目录内容
目录必须拥有 x 权限,否则无法查看其内容

-rw-rw-r–: rw, rw, r

drwxrwxr-x:目录,rwx,rwx,r-x

d是目录,第一组是拥有者权限,第二组是组权限,第三组是其他用户权限,每3个一组。

”/“是根目录,”~“是家目录。Linux存储是以挂载的方式,相当于是树状的,源头就是”/“,也就是根目录。而每个用户都有”家“目录,也就是用户的个人目录,比如root用户的”家“目录就是/root,普通用户a的家目录就是/home/a

ls常见命令参数

ls: -F 给不同的文件添加不同表示,添加帽子

d/ l* =s

-a: 显示隐藏文件 以.开头的文件

-p: 只给目录添加/

-t: 按照修改时间排序 time

–time-style=long-iso: ls -l –time-style=long-iso 显示友好长格式时间

-r: 倒着排序 reverse

-S: 按照文件大小排序

-h: 以人类理解的范围显示

-i: 索引节点(inode==书的目录) print the index number of each file(内核根据此区别文件是否同一文件)

ls –l 文件显示内容分析

1
2
3
4
5
6
7
8
9
10
11
12
13
第一列: 文件类型(共10个字符) + 权限  --> ``man` `find` `搜索``type``可看
``-:普通文件
``d:目录
``c:字符设备 --> ``/dev/tty` `例如 USB接口、猫等一些串行端口设备
``b:块设备 --> ``/dev``下查找 例如光驱,硬盘等属于块设备
``.:SELINUX相关
``l:链接文件 --> 软连接
第二列:硬链接个数 默认从1开始 如果是目录,则默认是2(目录不做硬链接):几种到达的方法
第三列:文件属主
第四列:文件属组
第五列:文件大小
第六-八列:创建时间/最后一次修改时间
第九列:文件名

image

P64-65(chmod)

Linux/Unix 的文件调用权限分为三级 : 文件拥有者、群组、其他。利用 chmod 可以藉以控制文件如何被他人所调用。

使用权限 : 所有使用者

语法

1
chmod [-cfvR] [--help] [--version] mode file...

参数说明

mode : 权限设定字串,格式如下 :

1
[ugoa...][[+-=][rwxX]...][,...]

其中:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
  • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明:

  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

实例

将文件 file1.txt 设为所有人皆可读取 :

1
chmod ugo+r file1.txt

将文件 file1.txt 设为所有人皆可读取 :

1
chmod a+r file1.txt

将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :

1
chmod ug+w,o-w file1.txt file2.txt

将 ex1.py 设定为只有该文件拥有者可以执行 :

1
chmod u+x ex1.py

将目前目录下的所有文件与子目录皆设为任何人可读取 :

1
chmod -R a+r *

此外chmod也可以用数字来表示权限如 :

1
chmod 777 file

语法为:

1
chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

r=4,w=2,x=1

  • 若要rwx属性则4+2+1=7;
  • 若要rw-属性则4+2=6;
  • 若要r-x属性则4+1=5。
1
chmod a=rwx file

1
chmod 777 file

效果相同

1
chmod ug=rwx,o=x file

1
chmod 771 file

效果相同

若用chmod 4755 filename可使此程序具有root的权限

P65-66(超级用户)

sudo的全称为Superuser do的意思

日常使用用标准用户administrator,root用户用来系统维护和管理,对所有资源都有访问权限

默认安装完成之后并不知道root用户的密码,那么如何应用root权限呢?

(1)sudo 命令

xzm@ubuntu:~$ sudo

这样输入当前管理员用户密码就可以得到超级用户的权限。但默认的情况下5分钟root权限就失效了。

(2)sudo -i

xzm@ubuntu:~$ sudo -i

通过这种方法输入当前管理员用户的密码就可以进到root用户。

(3)如果想一直使用root权限,要通过su切换到root用户。

那我们首先要重设置root用户的密码:

xzm@ubuntu:~$ sudo passwd root

这样就可以设置root用户的密码了。

(4)之后就可以自由的切换到root用户了

xzm@ubuntu:~$ su

输入root用户的密码即可。

su “king” 或者 exit回到用户权限

Linux su命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。

使用权限:所有使用者。

语法

1
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]

参数说明

  • -f 或 –fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh
  • -m -p 或 –preserve-environment 执行 su 时不改变环境变数
  • -c command 或 –command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者
  • -s shell 或 –shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell
  • –help 显示说明文件
  • –version 显示版本资讯
  • - -l 或 –login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root
  • USER 欲变更的使用者帐号
  • ARG 传入新的 shell 参数

实例

变更帐号为 root 并在执行 ls 指令后退出变回原使用者

1
su -c ls root

变更帐号为 root 并传入 -f 参数给新执行的 shell

1
su root -f

变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)

1
su - clsung

切换用户

1
2
3
4
5
6
7
8
9
10
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su root //切换到root用户
密码:
root@runoob.com:/home/hnlinux# whoami
root
root@runoob.com:/home/hnlinux# pwd
/home/hnlinux

切换用户,改变环境变量

1
2
3
4
5
6
7
8
9
10
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su - root //切换到root用户
密码:
root@runoob.com:/home/hnlinux# whoami
root
root@runoob.com:/home/hnlinux# pwd //显示当前目录
/root

P67-69(组管理)

sudo来创建删除组,不用sudo会permission denied

  1. groupadd 组名:添加组
  2. groupdel 组名 :删除组
  3. cat /etc/group: 确认组信息
  4. chgrp -R 组名 文件/目录名:递归修改文件/目录所属组

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

每个用户账号都拥有一个唯一的用户名和各自的口令。

用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

实现用户账号的管理,要完成的工作主要有如下几个方面:

  • 用户账号的添加、删除与修改。
  • 用户口令的管理。
  • 用户组的管理。

一、Linux系统用户账号的管理

用户账号的管理工作主要涉及到用户账号的添加、修改和删除。

添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用。

1、添加新的用户账号使用useradd命令,其语法如下:

1
useradd 选项 用户名

参数说明:

  • 选项:

    • -c comment 指定一段注释性描述。
    • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
    • -g 用户组 指定用户所属的用户组。
    • -G 用户组,用户组 指定用户所属的附加组。
    • -s Shell文件 指定用户的登录Shell。
    • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
  • 用户名:

    指定新账号的登录名。

实例1

1
# useradd –d  /home/sam -m sam

此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。

实例2

1
# useradd -s /bin/sh -g group –G adm,root gem

此命令新建了一个用户gem,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。

这里可能新建组:#groupadd group及groupadd adm

增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。

Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。

2、删除帐号

如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

删除一个已有的用户账号使用userdel命令,其格式如下:

1
userdel 选项 用户名

常用的选项是 -r,它的作用是把用户的主目录一起删除。

例如:

1
# userdel -r sam

此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。

3、修改帐号

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。

修改已有用户的信息使用usermod命令,其格式如下:

1
usermod 选项 用户名

常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。

另外,有些系统可以使用选项:-l 新用户名

这个选项指定一个新的账号,即将原来的用户名改为新的用户名。

例如:

1
# usermod -s /bin/ksh -d /home/z –g developer sam

此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。

4、用户口令的管理

用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

1
passwd 选项 用户名

可使用的选项:

  • -l 锁定口令,即禁用账号。
  • -u 口令解锁。
  • -d 使账号无口令。
  • -f 强迫用户下次登录时修改口令。

如果默认用户名,则修改当前用户的口令。

例如,假设当前用户是sam,则下面的命令修改该用户自己的口令:

1
2
3
4
$ passwd 
Old password:******
New password:*******
Re-enter new password:*******

如果是超级用户,可以用下列形式指定任何用户的口令:

1
2
3
# passwd sam 
New password:*******
Re-enter new password:*******

普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。

为了系统安全起见,用户应该选择比较复杂的口令,例如最好使用8位长的口令,口令中包含有大写、小写字母和数字,并且应该与姓名、生日等不相同。

为用户指定空口令时,执行下列形式的命令:

1
# passwd -d sam

此命令将用户 sam 的口令删除,这样用户 sam 下一次登录时,系统就不再允许该用户登录了。

passwd 命令还可以用 -l(lock) 选项锁定某一用户,使其不能登录,例如:

1
# passwd -l sam

二、Linux系统用户组的管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

1、增加一个新的用户组使用groupadd命令。其格式如下:

1
groupadd 选项 用户组

可以使用的选项有:

  • -g GID 指定新用户组的组标识号(GID)。
  • -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

实例1:

1
# groupadd group1

此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。

实例2:

1
# groupadd -g 101 group2

此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。

2、如果要删除一个已有的用户组,使用groupdel命令,其格式如下:

1
groupdel 用户组

例如:

1
# groupdel group1

此命令从系统中删除组group1。

3、修改用户组的属性使用groupmod命令。其语法如下:

1
groupmod 选项 用户组

常用的选项有:

  • -g GID 为用户组指定新的组标识号。
  • -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
  • -n新用户组 将用户组的名字改为新名字

实例1:

1
# groupmod -g 102 group2

此命令将组group2的组标识号修改为102。

实例2:

1
# groupmod –g 10000 -n group3 group2

此命令将组group2的标识号改为10000,组名修改为group3。

4、如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:

1
$ newgrp root

这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。


三、与用户账号有关的系统文件

完成用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。

与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group等。

下面分别介绍这些文件的内容。

1、/etc/passwd文件是用户管理工作涉及的最重要的一个文件。

Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录了这个用户的一些基本属性。

这个文件对所有用户都是可读的。它的内容类似下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
# cat /etc/passwd

root:x:0:0:Superuser:/:
daemon:x:1:1:System daemons:/etc:
bin:x:2:2:Owner of system commands:/bin:
sys:x:3:3:Owner of system files:/usr/sys:
adm:x:4:4:System accounting:/usr/adm:
uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
auth:x:7:21:Authentication administrator:/tcb/files/auth:
cron:x:9:16:Cron daemon:/usr/spool/cron:
listen:x:37:4:Network daemon:/usr/net/nls:
lp:x:71:18:Printer administrator:/usr/spool/lp:
sam:x:200:50:Sam san:/home/sam:/bin/sh

从上面的例子我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:

1
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

1)”用户名”是代表用户账号的字符串。

通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。

为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

2)“口令”一些系统中,存放着加密后的用户口令字。

虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。

3)“用户标识号”是一个整数,系统内部用它来标识用户。

一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。

通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

4)“组标识号”字段记录的是用户所属的用户组。

它对应着/etc/group文件中的一条记录。

5)“注释性描述”字段记录着用户的一些个人情况。

例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

6)“主目录”,也就是用户的起始工作目录。

它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

7)用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。

系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。

用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。

利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

8)系统中有一类用户称为伪用户(pseudo users)。

这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。

常见的伪用户如下所示:

1
2
3
4
5
6
7
伪 用 户 含 义 
bin 拥有可执行的用户命令文件
sys 拥有系统文件
adm 拥有帐户文件
uucp UUCP使用
lp lp或lpd子系统使用
nobody NFS使用

拥有帐户文件

1、除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet等,它们也都各自为相关的进程和文件所需要。

由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。 有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

2、/etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生

它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用”:”隔开。这些字段是:

1
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
  1. “登录名”是与/etc/passwd文件中的登录名相一致的用户账号
  2. “口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。
  3. “最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCO Linux 中,这个时间起点是1970年1月1日。
  4. “最小时间间隔”指的是两次修改口令之间所需的最小天数。
  5. “最大时间间隔”指的是口令保持有效的最大天数。
  6. “警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
  7. “不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。
  8. “失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。

下面是/etc/shadow的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# cat /etc/shadow

root:Dnakfw28zf38w:8764:0:168:7:::
daemon:*::0:0::::
bin:*::0:0::::
sys:*::0:0::::
adm:*::0:0::::
uucp:*::0:0::::
nuucp:*::0:0::::
auth:*::0:0::::
cron:*::0:0::::
listen:*::0:0::::
lp:*::0:0::::
sam:EkdiSECLWPdSa:9740:0:0::::

3、用户组的所有信息都存放在/etc/group文件中。

将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。

每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。

当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。

用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。

用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有:

1
组名:口令:组标识号:组内用户列表
  1. “组名”是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
  2. “口令”字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
  3. “组标识号”与用户标识号类似,也是一个整数,被系统内部用来标识组。
  4. “组内用户列表”是属于这个组的所有用户的列表/b],不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

/etc/group文件的一个例子如下:

1
2
3
4
5
6
7
root::0:root
bin::2:root,bin
sys::3:root,uucp
adm::4:root,adm
daemon::5:root,daemon
lp::7:root,lp
users::20:root,sam

四、添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户的方法。Linux系统提供了创建大量用户的工具,可以让您立即创建大量用户,方法如下:

(1)先编辑一个文本用户文件。

每一列按照/etc/passwd密码文件的格式书写,要注意每个用户的用户名、UID、宿主目录都不可以相同,其中密码栏可以留做空白或输入x号。一个范例文件user.txt内容如下:

1
2
3
4
5
6
user001::600:100:user:/home/user001:/bin/bash
user002::601:100:user:/home/user002:/bin/bash
user003::602:100:user:/home/user003:/bin/bash
user004::603:100:user:/home/user004:/bin/bash
user005::604:100:user:/home/user005:/bin/bash
user006::605:100:user:/home/user006:/bin/bash

(2)以root身份执行命令 /usr/sbin/newusers,从刚创建的用户文件user.txt中导入数据,创建用户:

1
# newusers < user.txt

然后可以执行命令 vipwvi /etc/passwd 检查 /etc/passwd 文件是否已经出现这些用户的数据,并且用户的宿主目录是否已经创建。

(3)执行命令/usr/sbin/pwunconv。

/etc/shadow 产生的 shadow 密码解码,然后回写到 /etc/passwd 中,并将/etc/shadowshadow密码栏删掉。这是为了方便下一步的密码转换工作,即先取消 shadow password 功能。

1
# pwunconv

(4)编辑每个用户的密码对照文件。

格式为:

1
用户名:密码

实例文件 passwd.txt 内容如下:

1
2
3
4
5
6
user001:123456
user002:123456
user003:123456
user004:123456
user005:123456
user006:123456

(5)以 root 身份执行命令 /usr/sbin/chpasswd

创建用户密码,chpasswd 会将经过 /usr/bin/passwd 命令编码过的密码写入 /etc/passwd 的密码栏。

1
# chpasswd < passwd.txt

(6)确定密码经编码写入/etc/passwd的密码栏后。

执行命令 /usr/sbin/pwconv 将密码编码为 shadow password,并将结果写入 /etc/shadow

1
# pwconv

这样就完成了大量用户的创建了,之后您可以到/home下检查这些用户宿主目录的权限设置是否都正确,并登录验证用户密码是否正确。

P70-71(用户管理)

  1. useradd -m -g 组 新建用户名:添加新用户 -m自动建立用户加目录, -g指定用户所在组,否则会建立一个同名的组。

    例: sudo useradd -m -g dev zhangsan

    drwxr-xr-x 2 zhangsan dev 4096 Apr 26 18:30 zhangsan

  2. passwd 用户名: 设置用户密码,如果是普通用户,直接passwd可以修改密码

  3. userdel -r 用户名;删除用户, -r会自动删除用户家目录

  4. cat /etc/passwd | grep 用户名 :确认用户信息,新建用户后,用户信息会保存在/etc/passwd文件中

P72-75(id,whoami,who)

id 用户名:查看用户UID和GID信息

passwd文件:/etc/passwd文件存放用户信息,6个分号组成7个信息

信息说明
第一字段: 用户名(vampire)
第二字段: 密码位(x),只是一个占位符,真正的密码存放在/etc/shadow文件中(x,表示加密密码)
第三字段: UID(501)用户id,0为超级用户,1~499系统用户,一般不能登录系统,也叫做伪用户,500及以上普通用户,管理员创建的,一般可登录(用户标识)
第四字段: GID(501)用户初始组id,一般添加用户时,系统自动分配的(组标识)
第五字段: GECOS 用户的一些说明信息(用户全名或本地账号)
第六字段: $HOME(/home/vampire) 用户家目录,也叫做宿主目录,普通用户家目录在/home下,root用户在/下(家目录)

第七字段: shell(/bin/bash)用户登录后的shell,ubuntu默认是dash

UID,gid,组 依次打印

Linux id命令用于显示用户的ID,以及所属群组的ID。

id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。

语法

1
id [-gGnru][--help][--version][用户名称]

参数说明

  • -g或–group  显示用户所属群组的ID。
  • -G或–groups  显示用户所属附加群组的ID。
  • -n或–name  显示用户,所属群组或附加群组的名称。
  • -r或–real  显示实际ID。
  • -u或–user  显示用户ID。
  • -help  显示帮助。
  • -version  显示版本信息。

实例

显示当前用户信息

1
2
# id //显示当前用户ID
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t

显示用户群组的ID

1
2
# id -g
0

显示所有群组的ID

1
2
# id -g
0 1 2 3 4 5 6 10

显示指定用户信息

1
# id hnlinux

who:查看当前所有登录的用户列表

Linux who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。

使用权限:所有使用者都可使用。

语法

1
who - [husfV] [user]

参数说明

  • -H 或 –heading:显示各栏位的标题信息列;
  • -i 或 -u 或 –idle:显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成”.”号,如果该用户已超过24小时没有任何动作,则标示出”old”字符串;
  • -m:此参数的效果和指定”am i”字符串相同;
  • -q 或–count:只显示登入系统的帐号名称和总人数;
  • -s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题;
  • -w 或-T或–mesg或–message或–writable:显示用户的信息状态栏;
  • –help:在线帮助;
  • –version:显示版本信息。

实例

显示当前登录系统的用户

1
2
3
4
5
# who  //显示当前登录系统的用户
root tty7 2014-05-13 12:12 (:0)
root pts/0 2014-05-14 17:09 (:0.0)
root pts/1 2014-05-14 18:51 (192.168.1.17)
root pts/2 2014-05-14 19:48 (192.168.1.17)

显示标题栏

1
2
3
4
5
6
# who -H
NAME LINE TIME COMMENT
root tty7 2014-05-13 12:12 (:0)
root pts/0 2014-05-14 17:09 (:0.0)
root pts/1 2014-05-14 18:51 (192.168.1.17)
root pts/2 2014-05-14 19:48 (192.168.1.17)

显示用户登录来源

1
2
3
4
5
6
7
8
# who -l -H
NAME LINE TIME IDLE PID COMMENT
LOGIN tty4 2014-05-13 12:11 852 id=4
LOGIN tty5 2014-05-13 12:11 855 id=5
LOGIN tty2 2014-05-13 12:11 862 id=2
LOGIN tty3 2014-05-13 12:11 864 id=3
LOGIN tty6 2014-05-13 12:11 867 id=6
LOGIN tty1 2014-05-13 12:11 1021 id=1

显示终端属性

1
2
3
4
5
6
# who -T -H
NAME LINE TIME COMMENT
root + tty7 2014-05-13 12:12 (:0)
root + pts/0 2014-05-14 17:09 (:0.0)
root - pts/1 2014-05-14 18:51 (192.168.1.17)
root - pts/2 2014-05-14 19:48 (192.168.1.17)

只显示当前用户

1
2
3
# who -m -H
NAME LINE TIME COMMENT
root pts/1 2014-05-14 18:51 (192.168.1.17)

精简模式显示

1
2
3
# who -q
root root root root
# users=4

whoami:查看当前登录用户的账户名

Linux whoami命令用于显示自身用户名称。

显示自身的用户名称,本指令相当于执行”id -un”指令。

语法

1
whoami [--help][--version]

参数说明

  • –help  在线帮助。
  • –version  显示版本信息。

实例

显示用户名

1
2
# whoami 
root

usermod

用来设置用户主组/附加组 和登录shell

Linux系统以组Group方式管理用户,用户和组的对应关系为多对多,即某个用户可加入/属于一个或多个组,某个组可以有0个、1个或多个用户。

组的分类
从用户的角度,分为主组和附属组。
主组:也被称为primary group、first group或initial login group,用户的默认组,用户的gid所标识的组。
附属组:也被称为Secondary group或supplementary group,用户的附加组。

通过id命令可查看当前用户的主组和附属组

[root@localhost ~]# id root
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

[root@localhost ~]# id gg
uid=503(gg) gid=503(gg) groups=503(gg)

[root@localhost ~]# id mm
uid=502(mm) gid=500(jww) groups=500(jww)

gid标识主组,groups表示用户所属的全部组(主组和附属组)

  1. 用户必须有且只能有一个主组,可以有0个、1个或多个附属组,就如我们一定会有一个用来安家的房子(类同主组),还可以有n个用于投资或其他打算的房子(附属组)。

  2. 主组也为默认组,当用户own某个文件或目录时,默认该文件或目录的group owner为该用户的主组(当然,可以通过chgrp修改group owner)。

  3. 在/etc/passwd文件中,记录行第四个字段为gid,即用户的主组id。

  4. 在/etc/group文件中,记录行第四个字段为组的成员,不显示将该组作为主组的组成员,只显示将该组作为附属组的组成员,因此,/etc/group的记录行的第四个字段没有完整地列出该组的全部成员。

  5. 当通过useradd命令创建新用户时,可以通过-g参数指定已存在的某个组为其主组,若没有使用-g参数,
    则系统自动创建名称和用户名相同的组作为该用户的主组(前提是variable in /etc/login.defs的USERGROUPS_ENAB属性值为yes),如命令手册的useradd关于-g参数的描述所示:
    -g, –gid GROUP
    The group name or number of the user′s initial login group. The
    group name must exist. A group number must refer to an already
    existing group.
    If not specified, the bahavior of useradd will depend on the
    USERGROUPS_ENAB variable in /etc/login.defs. If this variable is
    set to yes (or -U/–user-group is specified on the command line), a
    group will be created for the user, with the same name as her
    loginname. If the variable is set to no (or -N/–no-user-group is
    specified on the command line), useradd will set the primary group
    of the new user to the value specified by the GROUP variable in
    /etc/default/useradd, or 100 by default.

另外,可通过usermod -g 将普通用户的主组/gid设置为系e799bee5baa6e79fa5e98193e4b893e5b19e31333337613161统中存在的任意某个组(永久性);
也可以通过newgrp暂时性变更当前用户的主组/gid(只对于当前login session有效,非永久性)。
通过usermod -G 设置普通用户的附属组。

Linux usermod命令用于修改用户帐号。

usermod可用来修改用户帐号的各项设定。

usermod 命令通过修改系统帐户文件来修改用户账户信息
usermod [options] user_name
选项(options)
-a|–append ##把用户追加到某些组中,仅与-G选项一起使用
-c|–comment ##修改/etc/passwd文件第五段comment
-d|–home ##修改用户的家目录通常和-m选项一起使用
-e|–expiredate ##指定用户帐号禁用的日期,格式YY-MM-DD
-f|–inactive ##用户密码过期多少天后采用就禁用该帐号,0表示密码已过期就禁用帐号,-1表示禁用此功能,默认值是-1
-g|–gid ##修改用户的gid,改组一定存在
-G|–groups ##把用户追加到某些组中,仅与-a选项一起使用
-l|–login ##修改用户的登录名称
-L|–lock ##锁定用户的密码
-m|–move-home ##修改用户的家目录通常和-d选项一起使用
-s|–shell ##修改用户的shell
-u|–uid ##修改用户的uid,该uid必须唯一
-U|–unlock ##解锁用户的密码

语法

1
usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]

参数说明

  • -c<备注>  修改用户帐号的备注文字。

  • -d登入目录>  修改用户登入时的目录。

  • -e<有效期限>  修改帐号的有效期限。

  • -f<缓冲天数>  修改在密码过期后多少天即关闭该帐号。

  • -g<群组>  修改用户所属的群组。(常用)

  • -G<群组>  修改用户所属的附加群组。(常用)

  • -l<帐号名称>  修改用户帐号名称。

  • -L  锁定用户密码,使密码无效。

  • -s  修改用户登入后所使用的shell。(常用)

    例:usermod -S /bin/bash 用户名

  • -u  修改用户ID。

  • -U  解除密码锁定。

实例

更改登录目录

1
# usermod -d /home/hnlinux root

改变用户的uid

1
# usermod -u 777 root

usermod -S /bin/bash 用户名

用户ubuntu默认是dash,而windows不是,想windows登录也是dash,需要上面的命令修改shell为dash

Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。

GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接,但鉴于 bash 过于复杂,有人把 bash 从 NetBSD 移植到 Linux 并更名为 dash (Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX标准。

Debian和Ubuntu中,/bin/sh默认已经指向dash,这是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准。

就是这个倒霉的dash解释器使得我按照bash语法写的shell 脚本不能运行。

要知道自己的/bin/sh指向何种解释器,可以用 ls /bin/sh -al 命令查看:

​ $ ls /bin/sh -al

​ lrwxrwxrwx 1 root root 4 11月 16 15:33 /bin/sh -> bash

以上结果就表示当前系统用的是dash解释器。

切换到bash的方式其实挺简单的,关键是一直没找出这个原因……

修改默认的sh,可以采用命令sudo dpkg-reconfigure dash

会出现一个图片状的配置菜单,选no就可以了

再次检查一下, ls /bin/sh -al 发现软链接指向/bin/bash

​ lrwxrwxrwx 1 root root 4 11月 16 15:33 /bin/sh -> bash

P76which

Linux which命令用于查找文件。可以查看指向命令所在位置

/etc/passwd: 用于保存用户信息的文件

/etc/bin/passwd:用于修改用户密码的程序

which指令会在环境变量$PATH设置的目录里查找符合条件的文件。

语法

1
which [文件...]

参数

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

实例

使用指令”which”查看指令”bash”的绝对路径,输入如下命令:

1
$ which bash

上面的指令执行后,输出信息如下所示:

1
/bin/bash                   #bash可执行程序的绝对路径

我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:

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

whereis 查看文件的位置。

locate  配合数据库查看文件位置。

find   实际搜寻硬盘查询文件名称。

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

1.命令格式:

which 可执行文件名称

2.命令功能:

which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。

3.命令参数:

-n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。

-p 与-n参数相同,但此处的包括了文件的路径。

-w 指定输出时栏位的宽度。

-V 显示版本信息

4.使用实例:

实例1:查找文件、显示命令路径

命令:

1
which lsmod

输出:

1
2
3
4
5
[root@localhost ~]# which pwd
/bin/pwd
[root@localhost ~]# which adduser
/usr/sbin/adduser
[root@localhost ~]#

说明:

which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的!

实例2:用 which 去找出 which

命令:

1
which which

输出:

1
2
3
4
[root@localhost ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
[root@localhost ~]#

说明:

竟然会有两个 which ,其中一个是 alias 这就是所谓的『命令别名』,意思是输入 which 会等於后面接的那串命令!

实例3:找出 cd 这个命令

命令:

1
which cd

说明:

cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是bash 内建的命令! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的!

bin:
bin为binary的简写主要放置一些系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

/usr/bin:
主 要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

/sbin:
主 要放置一些系统管理的必备程式例如:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。

/usr/sbin:

放置一些网路管理的必备程式例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等

P77(su切换用户)

Linux su命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。不安全,会返回root。然后无需sudo了,即可改系统等。

使用权限:所有使用者。

语法

1
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]

参数说明

  • -f 或 –fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh
  • -m -p 或 –preserve-environment 执行 su 时不改变环境变数
  • -c command 或 –command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者
  • -s shell 或 –shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell
  • –help 显示说明文件
  • –version 显示版本资讯
  • - -l 或 –login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root
  • USER 欲变更的使用者帐号
  • ARG 传入新的 shell 参数

实例

变更帐号为 root 并在执行 ls 指令后退出变回原使用者

1
su -c ls root

变更帐号为 root 并传入 -f 参数给新执行的 shell

1
su root -f

变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)(常用)

1
su - clsung

切换用户

1
2
3
4
5
6
7
8
9
10
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su root //切换到root用户
密码:
root@runoob.com:/home/hnlinux# whoami
root
root@runoob.com:/home/hnlinux# pwd
/home/hnlinux

切换用户,改变环境变量

1
2
3
4
5
6
7
8
9
10
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su - root //切换到root用户
密码:
root@runoob.com:/home/hnlinux# whoami
root
root@runoob.com:/home/hnlinux# pwd //显示当前目录
/root

P78修改文件权限

1。 chown: 修改拥有者

2。chgrp:修改组

3 。chmod:修改权限

想要改文件的权限,只有管理员root和所有者才能修改

Linux/Unix 是多人多工操作系统,所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。 。

一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的文件拥有者,也没有权限把自己的文件拥有者改设为别人。只有系统管理者(root)才有这样的权限。

使用权限 : root

语法

1
chown [-cfhvR] [--help] [--version] user[:group] file...

参数 :

  • user : 新的文件拥有者的使用者 ID
  • group : 新的文件拥有者的使用者组(group)
  • -c : 显示更改的部分的信息
  • -f : 忽略错误信息
  • -h :修复符号链接
  • -v : 显示详细的处理信息
  • -R : 处理指定目录以及其子目录下的所有文件
  • –help : 显示辅助说明
  • –version : 显示版本

实例

将文件 file1.txt 的拥有者设为 runoob,群体的使用者 runoobgroup :

1
chown runoob:runoobgroup file1.txt

将目前目录下的所有文件与子目录的拥有者皆设为 runoob,群体的使用者 runoobgroup:

1
chown -R runoob:runoobgroup *

1、chmod:更改文件9个属性

img

Linux文件属性有两种设置方法,一种是数字,一种是符号。

Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。

① 数字改变文件权限(常用)

我们可以使用数字来代表各个权限,各权限的分数对照表如下:

  • r:4
  • w:2
  • x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx—] 分数则是:

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= — = 0+0+0 = 0

所以等我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:

1
chmod [-R] xyz 文件或目录
  • xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
  • -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

② 符号类型改变文件权限

我们就可以藉由u, g, o来代表三种身份的权限!

此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x!也就是可以使用底下的方式来看:

chmod u g o a +(加入) -(除去) =(设定) r w x 文件或目录

如果我们需要将文件权限设置为 -rwxr-xr– ,可以使用 chmod u=rwx,g=rx,o=r 文件名 来设定。

注意:如果一个目录有写的权限,其他用户对于这个目录下的文件也可以删除。

2、chown:更改文件属主,也可以同时更改文件属组

注意:这个命令只有管理员root才可以操作。而且系统里是必须存在这个用户。

img

语法:

chown [–R] 属主名: 文件名

chown [-R] 属主名:属组名 文件名

3、chgrp:更改文件属组。

img

语法:

1
chgrp [-R] 属组名 文件名

参数选项

  • -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

4、umask设置预设的权限掩码

Linux umask命令指定在建立文件时预设的权限掩码,在学习这个命令之前,先了解一下默认的所有者和所属组是哪来的?

一个文件创建的时候所有者和所属组是哪来的?

所有者:谁创建的文件谁就是这个文件的所有者。

所属组:就是这个文件创建者的缺省组,每个用户只能有一个缺省组。

img

img显示新建文件的缺省权限。

img

img

创建一个目录的时候查看发现 权限跟缺省权限是一致的,但是在test目录里创建一个文件后,查看文件缺省权限跟默认缺省权限不一致,这个是为什么呢?

rwxr-xr-x

rw-r–r– 对比发现都少了一个x可执行权限,这是因为在Linux里缺省权限创建的文件是不可具有可执行权限的。

img

单独执行 umask 发现现实出 0022 ,这是什么意思呢?

022是权限掩码意思,真正的权限是777-022=755 写出来就是rwxr-xr-x.

如果我们自己要是想修改这个缺省权限,该怎么修改的。

先把想修改的权限格式表示出来,算出对应的数字,再用777-对应的数字就可以,例如:

img

P79chmod详解

这是使用chmod命令时的正确语法:

1
chmod [options] mode [,mode] file1 [file2 ...]

以下是chmod使用的一些常用选项:

 ● -f, - silent, - quiet(抑制大多数错误消息)

 ● -v, - verbose(为每个处理的文件输出诊断信息)

 ● -c, - changes(类似于详细但仅在进行更改时报告)

 ● -R, - recursive(递归更改文件和目录)(常用)

 ● –help(显示帮助和退出)

 ● –version(输出版本信息和退出)

下面是可以为用户,组以及计算机上的其他所有人设置的几个数字权限的列表。数字旁边是读/写/执行字母等价物。

 ● 7:表示rwx,拥有读、写和执行的权限

 ● 6:表示rw-,拥有读和写的权限

 ● 5:表示rx,拥有读取和执行的权限

 ● 4:表示r–,拥有只读权限

 ● 3:表示-wx,拥有写入和执行的权限

 ● 2:表示-w-,拥有只写权限

 ● 1:表示 - x,仅拥有执行权限

 ● 0:表示—,无权限

注:如果需要列出文件的权限,需要使用ls命令。

chmod命令示例

如果用户想要更改文件“participants”的权限,以便所有人都可以完全访问该文件,需要输入以下命令:

1
chmod 777 participants

说明:第1个7设置用户的权限,第2个7设置组的权限,第3个7设置其他所有者的权限。

如果用户想成为唯一可以访问它的人,可以使用以下命令:

1
chmod 700 participants

用户想要为自己和其小组成员提供完全访问权限,可以使用以下命令:

1
chmod 770 participants

如果用户想为自己保留完全访问权限,但希望阻止其他人修改文件,可以使用以下命令:

1
chmod 755 participants

以下使用上面的字母来更改文件“participants”的权限,以便所有者可以读取和写入文件,但不会更改其他任何人的权限:

1
chmod u=rw participants

设置模式

使用chmod命令可以为文件和目录设置其他文件系统模式。例如,要设置粘滞位 - 这意味着只有文件所有者,目录所有者或超级用户可以删除该文件,而不管文件的读写组权限如何 - 在数字序列前加1:

1
chmod 1755 participants

其他:

用户还可以使用chgrp命令更改现有文件和文件夹的组所有权,使用newgrp命令更改新文件和文件夹的默认组。

请记住,chmod命令中使用的符号链接将影响真实的目标对象。

P42远程管理常用命令

关机重启shutdown

Linux shutdown命令可以用来进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机。

使用权限:系统管理者。

语法

1
shutdown [-t seconds] [-rkhncfF] time [message]

shutdown now 立即关机

shutdown +10 10分钟后关机

参数说明

  • -t seconds : 设定在几秒钟之后进行关机程序。
  • -k : 并不会真的关机,只是将警告讯息传送给所有使用者。
  • -r : 关机后重新开机。(常用,一定要加,不加会启动不了了)
  • -h : 关机后停机。
  • -n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。
  • -c : 取消目前已经进行中的关机动作。(常用,取消之前动作)
  • -f : 关机时,不做 fcsk 动作(检查 Linux 档系统)。
  • -F : 关机时,强迫进行 fsck 动作。
  • time : 设定关机的时间。
  • message : 传送给所有使用者的警告讯息。

实例

立即关机

1
# shutdown -h now

指定 10 分钟后关机

1
# shutdown -h 10

重新启动计算机

1
# shutdown -r now

查看或配置网卡信息

Ifconfig

网卡:一个专门负责网络通讯的硬件设备。

Linux ifconfig命令用于显示或设置网络设备。

ifconfig可设置网络设备的状态,或是显示目前的设置。

ifconfig | grep inet: 查看网卡对应IP地址

ifconfig:查看网卡配置信息

语法

1
ifconfig [网络设备][down up -allmulti -arp -promisc][add<地址>][del<地址>][<hw<网络设备类型><硬件地址>][io_addr<I/O地址>][irq<IRQ地址>][media<网络媒介类型>][mem_start<内存地址>][metric<数目>][mtu<字节>][netmask<子网掩码>][tunnel<地址>][-broadcast<地址>][-pointopoint<地址>][IP地址]

参数说明

  • add<地址> 设置网络设备IPv6的IP地址。
  • del<地址> 删除网络设备IPv6的IP地址。
  • down 关闭指定的网络设备。
  • <hw<网络设备类型><硬件地址> 设置网络设备的类型与硬件地址。
  • io_addr<I/O地址> 设置网络设备的I/O地址。
  • irq<IRQ地址> 设置网络设备的IRQ。
  • media<网络媒介类型> 设置网络设备的媒介类型。
  • mem_start<内存地址> 设置网络设备在主内存所占用的起始地址。
  • metric<数目> 指定在计算数据包的转送次数时,所要加上的数目。
  • mtu<字节> 设置网络设备的MTU。
  • netmask<子网掩码> 设置网络设备的子网掩码。
  • tunnel<地址> 建立IPv4与IPv6之间的隧道通信地址。
  • up 启动指定的网络设备。
  • -broadcast<地址> 将要送往指定地址的数据包当成广播数据包来处理。
  • -pointopoint<地址> 与指定地址的网络设备建立直接连线,此模式具有保密功能。
  • -promisc 关闭或启动指定网络设备的promiscuous模式。
  • [IP地址] 指定网络设备的IP地址。
  • [网络设备] 指定网络设备的名称。

实例

显示网络设备信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ifconfig        
eth0 Link encap:Ethernet HWaddr 00:50:56:0A:0B:0C
inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe0a:b0c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:172220 errors:0 dropped:0 overruns:0 frame:0
TX packets:132379 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:87101880 (83.0 MiB) TX bytes:41576123 (39.6 MiB)
Interrupt:185 Base address:0x2024

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2022 errors:0 dropped:0 overruns:0 frame:0
TX packets:2022 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2459063 (2.3 MiB) TX bytes:2459063 (2.3 MiB)

启动关闭指定网卡

1
2
# ifconfig eth0 down
# ifconfig eth0 up

为网卡配置和删除IPv6地址

1
2
3
# ifconfig eth0 add 33ffe:3240:800:1005::2/ 64 //为网卡诶之IPv6地址

# ifconfig eth0 del 33ffe:3240:800:1005::2/ 64 //为网卡删除IPv6地址

用ifconfig修改MAC地址

1
2
3
4
5
# ifconfig eth0 down //关闭网卡
# ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE //修改MAC地址
# ifconfig eth0 up //启动网卡
# ifconfig eth1 hw ether 00:1D:1C:1D:1E //关闭网卡并修改MAC地址
# ifconfig eth1 up //启动网卡

配置IP地址

1
2
3
4
5
6
# ifconfig eth0 192.168.1.56 
//给eth0网卡配置IP地址
# ifconfig eth0 192.168.1.56 netmask 255.255.255.0
// 给eth0网卡配置IP地址,并加上子掩码
# ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255
// 给eth0网卡配置IP地址,加上子掩码,加上个广播地址

启用和关闭ARP协议

1
2
# ifconfig eth0 arp  //开启
# ifconfig eth0 -arp //关闭

设置最大传输单元

1
2
# ifconfig eth0 mtu 1500 
//设置能通过的最大数据包大小为 1500 bytes

Ping

ping ip地址:检查目标主机连接是否正常

ping 本地ip:检查本地ip是否正常。(一般127.0.0.1是本地回环地址,用了检查本机网卡是否正常,localhost)

ping用来检查计算机间网络是否通畅,数值越大,速度越慢,ping一下计算机看是否开着

Linux ping命令用于检测主机。

执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。

语法

1
ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]

参数说明

  • -d 使用Socket的SO_DEBUG功能。
  • -c<完成次数> 设置完成要求回应的次数。
  • -f 极限检测。
  • -i<间隔秒数> 指定收发信息的间隔时间。
  • -I<网络界面> 使用指定的网络接口送出数据包。
  • -l<前置载入> 设置在送出要求信息之前,先行发出的数据包。
  • -n 只输出数值。
  • -p<范本样式> 设置填满数据包的范本样式。
  • -q 不显示指令执行过程,开头和结尾的相关信息除外。
  • -r 忽略普通的Routing Table,直接将数据包送到远端主机上。
  • -R 记录路由过程。
  • -s<数据包大小> 设置数据包的大小。
  • -t<存活数值> 设置存活数值TTL的大小。
  • -v 详细显示指令的执行过程。

实例

检测是否与主机连通

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ping www.w3cschool.cc //ping主机
PING aries.m.alikunlun.com (114.80.174.110) 56(84) bytes of data.
64 bytes from 114.80.174.110: icmp_seq=1 ttl=64 time=0.025 ms
64 bytes from 114.80.174.110: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 114.80.174.110: icmp_seq=3 ttl=64 time=0.034 ms
64 bytes from 114.80.174.110: icmp_seq=4 ttl=64 time=0.034 ms
64 bytes from 114.80.174.110: icmp_seq=5 ttl=64 time=0.028 ms
64 bytes from 114.80.174.110: icmp_seq=6 ttl=64 time=0.028 ms
64 bytes from 114.80.174.110: icmp_seq=7 ttl=64 time=0.034 ms
64 bytes from 114.80.174.110: icmp_seq=8 ttl=64 time=0.034 ms
64 bytes from 114.80.174.110: icmp_seq=9 ttl=64 time=0.036 ms
64 bytes from 114.80.174.110: icmp_seq=10 ttl=64 time=0.041 ms

--- aries.m.alikunlun.com ping statistics ---
10 packets transmitted, 30 received, 0% packet loss, time 29246ms
rtt min/avg/max/mdev = 0.021/0.035/0.078/0.011 ms

//需要手动终止Ctrl+C

指定接收包的次数

1
2
3
4
5
6
7
8
9
10
# ping -c 2 www.w3cschool.cc
PING aries.m.alikunlun.com (114.80.174.120) 56(84) bytes of data.
64 bytes from 114.80.174.120: icmp_seq=1 ttl=54 time=6.18 ms
64 bytes from 114.80.174.120: icmp_seq=2 ttl=54 time=15.4 ms

--- aries.m.alikunlun.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1016ms
rtt min/avg/max/mdev = 6.185/10.824/15.464/4.640 ms

//收到两次包后,自动退出

多参数使用

1
2
3
4
5
6
7
8
9
10
11
12
# ping -i 3 -s 1024 -t 255 g.cn //ping主机
PING g.cn (203.208.37.104) 1024(1052) bytes of data.
1032 bytes from bg-in-f104.1e100.net (203.208.37.104): icmp_seq=0 ttl=243 time=62.5 ms
1032 bytes from bg-in-f104.1e100.net (203.208.37.104): icmp_seq=1 ttl=243 time=63.9 ms
1032 bytes from bg-in-f104.1e100.net (203.208.37.104): icmp_seq=2 ttl=243 time=61.9 ms

--- g.cn ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 6001ms
rtt min/avg/max/mdev = 61.959/62.843/63.984/0.894 ms, pipe 2
[root@linux ~]#

//-i 3 发送周期为 3秒 -s 设置发送包的大小 -t 设置TTL值为 255

P47-52远程登录和复制文件(ssh)

ssh:

Security shell, 数据传输加密,压缩

ssh [-p port] user@remote

user是远程机器上的用户名,如果不指定的话默认当前用户。

remote是远程机器的地址,可以是ip/域名,或者是后面会提到的别名。

port是ssh server的监听端口, 如果不指定,默认22.

windows下载:putty和xshell

使用exit退出用户登录

ip:ip是是分配给网络上使用IP协议的设备的数字标签。我们现在经常使用的是 ipv4, 由32位二进制数字组成,常以XXX.XXX.XXX.XXX形式表现。

域名:是由一串用“点”分隔的字符组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。如 i.cnblogs.com。

域名按域名系统(DNS)的规则流程组成。在DNS中注册的任何名称都是域名。域名用于各种网络环境和应用程序特定的命名和寻址目的。

域名和ip有区别也有联系,域名通常都会和IP绑定起来,通过访问域名来访问网络主机上的服务。ip地址通常是指主机,而域名通常表示一个网站。一个域名可以绑定到多个ip,多个域名也可以绑定到一个ip。

域名系统(DNS):因特网上作为域名和ip地址相互映射的分布式数据库,能使用户更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址。通过主机名,最终得到该主机名对应的ip地址的过程叫做域名解析。 DNS协议运行在UDP协议之上,端口号53。

端口号:端口,(英语:port),主要分为物理端口和逻辑端口。我们一般说的都是逻辑端口,用于区分不同的服务。因为网络中一台主机只有一个IP,但是一个主机可以提供多个服务,端口号就用于区分一个主机上的不同服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口,标识是从065535。**端口号分为公认端口(01023)、注册端口(102449151)和动态端口(4915265535)。**我们自己的服务一般都绑定在注册端口上。

跨域:在 HTML 中,,, ,, , 等标签以及 Ajax 都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

常见的端口号及其用途

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
一些常见的端口号及其用途如下:
21端口:FTP 文件传输服务(常用)
22端口:SSH 端口(常用)
23端口:TELNET 终端仿真服务
25端口:SMTP 简单邮件传输服务
53端口:DNS 域名解析服务
80端口:HTTP 超文本传输服务,web端口(常用)
110端口:POP3 “邮局协议版本3”使用的端口
443端口:HTTPS 加密的超文本传输服务(常用)
1433端口:MS SQL*SERVER数据库 默认端口号
1521端口:Oracle数据库服务
1863端口:MSN Messenger的文件传输功能所使用的端口
3306端口:MYSQL 默认端口号(常用)
3389端口:Microsoft RDP 微软远程桌面使用的端口
5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口
5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口
5000端口:MS SQL Server使用的端口
8000端口:腾讯QQ

SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。

ssh服务端由2部分组成: openssh(提供ssh服务) openssl(提供加密的程序)

ssh的客户端可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接

SSH的工作机制

服务器启动的时候自己产生一个密钥(768bit公钥),本地的ssh客户端发送连接请求到ssh服务器,服务器检查连接点客户端发送的数据和IP地址,确认合法后发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit)和服务器的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输。

SSH的加密技术

加密技术:传输过程,数据加密。
1.SSH1没有对客户端的秘钥进行校验,很容易被植入恶意代码
2.SSH2增加了一个确认联机正确性的Diffe_Hellman机制,每次数据的传输,Server都会检查数据来源的正确性,避免黑客入侵。
SSH2支持RSA和DSA密钥
DSA:digital signature Algorithm 数字签名
RSA:既可以数字签名又可以加密

SSH知识小结

1.SSH是安全的加密协议,用于远程连接Linux服务器
2.SSH的默认端口是22,安全协议版本是SSH2
3.SSH服务器端主要包含2个服务功能SSH连接和SFTP服务器
4.SSH客户端包含ssh连接命令和远程拷贝scp命令等

如何防止SSH登录入侵

1.密钥登录,更改端口
2.牤牛阵法
3.监听本地内网IP(ListenAddress 192.168.25.*)

SSH功能大全

1
1.登录          ``    ``ssh` `-p22 omd@192.168.25.137        ``  ``2.直接执行命令 -->最好全路径          ``    ``ssh` `root@192.168.25.137 ``ls` `-ltr ``/backup/data`            `      ``==>``ssh` `root@192.168.25.137 ``/bin/ls` `-ltr ``/backup/data`        `  ``3.查看已知主机           ``    ``cat` `/root/``.``ssh``/known_hosts``  ``4.``ssh``远程执行``sudo``命令``    ``ssh` `-t omd@192.168.25.137 ``sudo` `rsync` `hosts ``/etc/` `  ``5.``scp`        `       ``1.功能  -->远程文件的安全(加密)拷贝          ``         ``scp` `-P22 -r -p ``/home/omd/h``.txt omd@192.168.25.137:``/home/omd/`        `       ``2.``scp``知识小结          ``         ``scp``是加密远程拷贝,``cp``为本地拷贝          ``         ``可以推送过去,也可以拉过来          ``         ``每次都是全量拷贝(效率不高,适合第一次),增量拷贝用``rsync` `  ``6.``ssh``自带的``sftp``功能        ``       ``1.Window和Linux的传输工具          ``         ``wincp  filezip          ``        ``sftp` `-->基于``ssh``的安全加密传输          ``        ``samba  ``       ``2.``sftp``客户端连接          ``        ``sftp` `-oPort=22 root@192.168.25.137          ``        ``put ``/etc/hosts` `/tmp`          `        ``get ``/etc/hosts` `/home/omd`  `      ``3.``sftp``小结:          ``        ``1.linux下使用命令: ``sftp` `-oPort=22 root@x.x.x.x          ``        ``2.put加客户端本地路径上传          ``        ``3.get下载服务器端内容到本地          ``        ``4.远程连接默认连接用户的家目录

ssh常见命令参数

1
usage: ``ssh` `[-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]``      ``[-D [bind_address:]port] [-e escape_char] [-F configfile]``      ``[-i identity_file] [-L [bind_address:]port:host:hostport]``      ``[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]``      ``[-R [bind_address:]port:host:hostport] [-S ctl_path]``      ``[-W host:port] [-w local_tun[:remote_tun]]``      ``[user@]``hostname` `[``command``]

关于后台ssh服务的相关

1
# 查询openssl软件``  ``rpm -qa openssh openssl``# 查询sshd进程``  ``ps` `-ef | ``grep` `ssh``    ``--> ``/usr/sbin/sshd``# 查看ssh端口``  ``netstat` `-lntup | ``grep` `ssh` `  ``ss | ``grep` `ssh`        `(效果同上,同下,好用)``  ``netstat` `-a | ``grep` `ssh``(记住这个)``  ``netstat` `-lnt | ``grep` `22  ==> 查看22端口有没有开``/ssh``服务有没有开启``  ``技巧: ``netstat` `-lnt | ``grep` `ssh` `| ``wc` `-l -->只要大于2个就是``ssh``服务就是好的``# 查看ssh的秘钥目录``  ``ll ``/root/``.``ssh``/known_hosts` `# 当前用户家目录的.ssh目录下``# ssh的配置文件``  ``cat` `/etc/ssh/sshd_config`  `# ssh服务的关闭``  ``service sshd stop``# ssh服务的开启:``  ``service sshd start``# ssh服务的重启``  ``service sshd reload  [停止进程后重启] ==> 推荐``  ``service sshd restart  [干掉进程后重启] ==> 不推荐``# ssh远程登录``  ``ssh` `192.168.1.100   ``# 默认利用当前宿主用户的用户名登录``  ``ssh` `omd@192.168.1.100 ``# 利用远程机的用户登录``  ``ssh` `omd@192.168.1.100 -o stricthostkeychecking=no ``# 首次登陆免输yes登录``  ``ssh` `omd@192.168.1.100 ``"ls /home/omd"` `# 当前服务器A远程登录服务器B后执行某个命令``  ``ssh` `omd@192.168.1.100 -t ``"sh /home/omd/ftl.sh"` `# 当前服务器A远程登录服务器B后执行某个脚本

image

ssh免密设置

1、进入用户的家目录

1
[root@localhost ~]``# cd /root/.ssh/       【root用户就在root目录下的.ssh目录】``[root@localhost ~]``# cd /home/omd/.ssh/  【普通用户就是在家目录下的.ssh目录】

image

2、根据DSA算法生成私钥和公钥【默认建立在当前用户的家目录】

1
[root@localhost .``ssh``]``# ssh-keygen -t dsa   # 一路回车即可``        ``id_dsa     -->私钥(钥匙) ``        ``id_dsa.pub   -->公钥(锁)

image

3.拷贝公钥给目标服务器

1
[root@localhost .``ssh``]``# ssh-copy-id -i id_dsa.pub omd@192.168.25.110       【 使用ssh登录的默认端口22】``[root@localhost .``ssh``]``# ssh-copy-id -i id_dsa.pub –p 666 omd@192.168.25.120  【使用ssh登录设置的端口666】

img

\4. 查看目标服务器生成的文件

1
[omd@localhost .``ssh``]$ ll ``/home/omd/``.``ssh``/authorized_keys

image

\5. 免密码登录目标服务器

1
ssh` `omd@192.168.25.110

\6. 总结一下钥匙和锁的关系

1
1.多个钥匙开一把锁``   ``把id_dsa.pub 复制给各个服务器` `2.一个钥匙开duobasuo``   ``把id_dsa 传给各个服务器``   ``把id_dsa 传给自己

ssh排查问题

1
2
3
4
5
6
1.判断物理链路是否通 ``ping` `192.168.25.130   线路 | 防火墙 | 是否同一个网的``      ``ping`  `本身是icmp协议``2.判断服务是否正常
telnet 192.168.25.130 22
3.Linux防火墙
service iptables status ==> ``/etc/init``.d``/iptables` `status  
4.打开``ssh``的调测进行观察
ssh` `-vvv omd@192.168.1.100

SSH批量分发与管理方案小结

1.利用root做ssh key验证

优点:简单,易用
缺点:安全性能差,无法禁止root远程连接

2.利用普通用户omd –>推荐

思路:把要分发的文件拷贝到服务器用户的家目录,然后利用sudo提权拷贝分发的文件和对应目录
优点:安全
缺点:复杂,配置麻烦
1.sudo提权
echo ‘omd All=(All) NOPASSWD:/usr/bin/rsync’ >> /etc/sudoers
visudo -c
grep omd /etc/sudoers
2.ssh分发到服务器的家目录
ssh -p22 -r /etc/hosts omd@192.168.25.137:~
3.ssh使用sudo复制到目标服务器的/etc
ssh -t omd@192.168.25.137 sudo rsync hosts /etc/

3.拓展方案2,不用sudo,而是设置suid对固定命令提权

优点:相当安全
缺点:复杂,安全性较差,任何人都可以处理带有suid权限的命令
1.which rsync
2.chmod 4755 /usr/bin/rsync

ssh章节小结

1.ssh远程的加密连接协议,相关软件openssh,openssl
2.默认端口22
3.ssh版本协议
4.服务器ssh连接,ftp连接,sshd守护进程,开机启动
5.ssh客户端重要命令:ssh(用户登录&&远程命令),scp,sftp,
6.安全验证方式:口令,密钥 学习原理
7.ssh服务优化:改端口,改监听,no root,no empty,no DNS,
8.ssh密钥对,公钥在服务器端,私钥在客户端

修改ssh服务的启动文件sshd的几个点

1
1-1修改 ``/etc/ssh/sshd_config``     GSSAPIAuthentication ``yes`  `解决一台服务器管理多个``ssh``服务``  ``UseDNS no 加快响应速度因为在内网环境下``  ``PermitRootLogin no 不运行root用户直接登录``  ``Port 11544 更改访问端口号``  ``ListenAddress 192.168.25.130 只监听内网的IP``  ``Match User anoncvs   当前环境允许登录的用户``  ``PermitRootLogin no   是否允许root用户登录,一般不允许开``1-2重启服务``  ``service sshd restart    写入命令进内存``  ``service sshd reload(优先) reload是一个平滑的访问,不影响用户使用``1-3查看连接端口``  ``netstat` `-an | ``grep` `EST

SSH跳过HostKeyChecking,不用输入yes

SSH跳过输入ssh跳过RSA key fingerprint输入yes/no

在配置大量的节点之间需要ssh连通的时候,如果自动复制很多节点,都需要输入yes,两两节点之间都要互通一次,这样会造成很大的麻烦

解决1;修改配置文件/etc/ssh/ssh_config

1
找 到 # StrictHostKeyChecking ask ``修改为:StrictHostKeyChecking ``no

解决2: 添加参数 –o 【o=option】

1
ssh root@192.168.25.133 -o ``"StrictHostKeyChecking no"

img

1
scp -o ``"StrictHostKeyChecking no"` `newfile.txt `"mailto:root@192.168.25.133:/root"``>root@192.168.25.133:/root

img

P53-55远程登录和复制文件(scp)

scp:secure copy

指定端口-P port:注意是大写的P, port是指定数据传输用到的端口号(常用)

Linux scp 命令用于 Linux 之间复制文件和目录。

scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。

scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。

语法

1
2
3
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2

简易写法:

1
scp [可选参数] file_source file_target

参数说明:

  • -1: 强制scp命令使用协议ssh1
  • -2: 强制scp命令使用协议ssh2
  • -4: 强制scp命令只使用IPv4寻址
  • -6: 强制scp命令只使用IPv6寻址
  • -B: 使用批处理模式(传输过程中不询问传输口令或短语)
  • -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
  • -p:保留原文件的修改时间,访问时间和访问权限。
  • -q: 不显示传输进度条。
  • -r: 递归复制整个目录。(常用)
  • -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
  • -c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
  • -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
  • -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
  • -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
  • -o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
  • -P port:注意是大写的P, port是指定数据传输用到的端口号(常用)
  • -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

实例

1、从本地复制到远程

命令格式:

1
2
3
4
5
6
7
scp local_file remote_username@remote_ip:remote_folder 
或者
scp local_file remote_username@remote_ip:remote_file
或者
scp local_file remote_ip:remote_folder
或者
scp local_file remote_ip:remote_file
  • 第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;
  • 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;

应用实例:

1
2
3
4
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music 
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music/001.mp3
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music/001.mp3

复制目录命令格式:

1
2
3
scp -r local_folder remote_username@remote_ip:remote_folder 
或者
scp -r local_folder remote_ip:remote_folder
  • 第1个指定了用户名,命令执行后需要再输入密码;
  • 第2个没有指定用户名,命令执行后需要输入用户名和密码;

应用实例:

1
2
scp -r /home/space/music/ root@www.runoob.com:/home/root/others/ 
scp -r /home/space/music/ www.runoob.com:/home/root/others/

上面命令将本地 music 目录复制到远程 others 目录下。

2、从远程复制到本地

从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例

应用实例:

1
2
scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3 
scp -r www.runoob.com:/home/root/others/ /home/space/music/

说明

1.如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下:

1
2
#scp 命令使用端口号 4588
scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator

2.使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的。

(scp remote to local):

1
scp -r XXX@atlas.cselabs.umn.edu:~/Desktop/p3-code ~/Desktop:

(scp local to remote):

1
scp -r  ~/Desktop/C++CODE xxx@ipaddress: ~/Desktop

df -h:查看磁盘容量

Windows没有scp命令,需要安装PuTTy,用pscp命令或者安装FileZilla使用FTP进行文件传输。

P56-59(ssh高级)

免密码登录和配置别名

ssh配置都在用户家目录下的.ssh目录下

ls -alh, 找到.ssh隐藏文件,如何cd进入,然后ls -alh看known_hosts,可以看到已经有的连接。

免密码登录:

步骤:1. 配置公钥: ssh-keygen即可生成ssh钥匙,一路回车即可

​ 2.上传公钥到服务器:ssh-copy-id -p port user@remote, 可以让服务器记住公钥。

ssh是什么?ssh (SSH client) is a program for logging into a remote machine and for executing commands on a remote machine. (自己翻译哈)

讲ssh服务的用法之前得需要知道这个服务是否已经开启

查看ssh服务是否开启的命令:systemctl status sshd。输入这个命令之后,会得到如下的一个提示

img

第二行最后一个单词disabled表示sshd服务开机不自动启动

第三行inactive(dead)表示sshd服务当前是关闭的

现在我们来开启sshd服务,输入systemctl start sshd,然后再输入systemctl status sshd查看结果

img

现在我们可以看到第三行是active(running),这表示sshd服务当前是开启的,但仍然是开机不启动。不过,这并不影响我们使用sshd,至于如何管理这些服务,并不在我们本节讨论范围内。

ssh可以干什么,举个例子,我现在有个朋友电脑出了点问题,但是现在他在北京,我在西安 ,为给他修个电脑,我不划算去北京吧,怎么办?用ssh。

首先得知道他的ip地址,然后登录他的root用户,用命令:ssh root@...** 星号代表ip

img

输入完命令后,会有一个提示,问你是否确信连接?输入yes,再然后输入他root的密码,就进入他的电脑了。但这样有个不好的地方,我知道了他root的密码,那以后岂不是可以在他的电脑上为所欲为了,这样他肯定是不愿意的,我要是不小心删掉了他珍藏多年的种子,他肯定会杀了我。

######我现在是他的身份#####

那在这种情况下,他应该怎么办?(ps:我现在以他的身份来做)可以先给自己的电脑上一把锁,然后需要进入你电脑的人一把钥匙,你不想让别人进的时候把锁删掉就行了。那具体怎么做呢?

第一步:删除/root/.ssh/下的所有东西,如果没有.shh文件夹,建立一个。

第二步:在.ssh文件夹下,建立钥匙,使用命令ssh-keygen

img

输入命令后,第一个提示问你存在哪里,默认就好,直接回车。第二个问题让你输入一个密码,这个密码就是以后别人在拥有私钥的情况下,进入你主机需要的密码。输入完再输入一次,就会生成一个钥匙跟一把锁。

img

id_rsa叫私钥,也就是钥匙,id_rsa.pub叫公钥。

第三步:用锁来锁定本机的哪个用户,以root为例,命令是ssh-copy-id root@...** id为本机的id。回车之后会提示你是否连接?回答yes就行,然后会提示你输入要锁定用户的密码,现在要锁定root ,那就输入root密码就行。

第四步:谁想连本机,把私钥发给谁就行,比如说,我发给一个叫playsand的用户。命令是:

scp id_rsa playsand@...**:/home/playsand/.ssh 这个星号代表的是playsand用户的id,后面代表的是存储路径,一定要在playsand下建立一个.ssh目录,如果有,则将里面内容清空。

#####现在我是playsand用户#####

在自己的.ssh目录下,输入ssh root@...** id是root的id,回车之后会提示你是否连接?回答yes,然后会提示输入密码,这个密码就是上面第二步设定的密码,输入之后,就进入了。如果输入错了,系统会提示你输入root的密码,同样,输入root密码也可以进入,这就跟刚开始一样。

#####现在我是root用户####

在这里有几个小小的设置:

1.让别人登录自己的root用户是件很危险的事,怎么能让别人怎么都登录不了自己的root用户呢;

编辑ssh_config文件(vim /etc/ssh/ssh_config),将#PermitRootLogin yes改成PermitRootLogin no(大约在48行),推出保存之后,重启以下ssh服务(systemctl reload sshd)

2.要是不认识的人或者有恶意的人不小心得到了私钥和密码,对于本机来说很危险,可以设置白名单,让指定的人可以登录;

同样vim /etc/ssh/ssh_config,找一个空行写下:allowusers 指定用户名,这样只有指定的用户可以登录本机。e.g:allowusers playsand 就是允许playsand用户登录,其他用户都登录不了,同理,重启下ssh服务。

3.让别人知道登录自己的root密码或者用户密码总是不安全的,怎样让别人只能通过私钥密码登录?

同样vim /etc/ssh/ssh_config,将passwordAuthentication yes 改成passwordAuthentication no ,这样,别人只能通过私钥密码登录本机。修改完重启ssh服务。

使用ssh登录服务器的时候,需要输入ip地址、端口、用户名、密码等信息,比较麻烦,容易输错。还好,通过客户端和服务器的配置参数,可实现免密码快速登录。服务器可通过保存客户端的公钥,用于验证客户端的身份,从而省去输入密码的步骤。客户端也可通过配置服务器参数来简化登录命令。
本文主要是记录了ssh面密码快速登录的配置过程,主要分为以下几个步骤。

  1. 客户端生成密钥,包括私钥和公钥。
  2. 在服务器中配置客户端的公钥。
  3. 在客户端配置服务器登录相关参数。

本文示例中的服务器ip地址为192.168.1.1,ssh端口为22。

客户端生成密钥

客户端生成密钥的方法很简单,只需要使用ssh-keygen命令。

1
ssh-keygen -t rsa

生成密钥过程中,建议采用默认值,只需要按三次回车之后,就会再~/.ssh目录下生成密钥文件,其中,id_rsa为私钥,id_rsa.pub为公钥。

服务器配置

服务器的~/.ssh/authorized_keys文件保存可快速连接的客户端的公钥。只需把客户端生成的id_rsa.pub文件的内容拷贝到authorized_keys文件的末尾。拷贝的方法有:

  1. 直接拷贝。由于id_rsa.pub和authorized_keys都是文本文件,可通过拷贝命令直接拷贝。
  2. 把id_rsa.pub上传到服务器,然后再把内容添加到authorized_keys文件中。
    在客户端把文件上传到服务器的用户目录的操作命令如下:
1
scp ~/.ssh/id_rsa.pub root@192.168.1.1:

在服务器操作的命令如下:

1
cat id_rsa.pub >> ~/.ssh/authorized_keys

配置好之后,登录服务器就不再需要密码了。

在客户端配置服务器登录相关参数

除了密码之外,登录时,还需要配置ip地址、端口、用户等信息,也比较繁琐。可通过客户端的~/.ssh/config配置服务器的相关参数简化登录命令。
config文件的配置内容如下:

1
2
3
4
Host server
Hostname 192.168.1.1
Port 22
User bingoli

其中,Host为服务器的名称,输入登录命令时使用,后续登录只需要记住这个名字就可以;Hostname为服务器的ip地址;Port为ssh的端口;User为服务器的用户名。配置好相关参数之后,就可以使用简化的命令登录服务器了。

1
ssh server

配置别名

在本地.ssh文件夹下vi config,然后

Host school

​ HostName ip地址

​ User xxxx

​ Port 22

linux 100集

P19-22 文件和目录(ls常用选项)

Linux中“./”在系统文件中表示绝对路径的意思。

linux系统中,所有的文件与目录都是由根目录/开始,不是以/开头的就是相对路径;

1、“.”表示当前目录,也可以用“./”表示;

2、“..”表示上一级目录,也可以用“../”表示;

3、“~” 代表用户自己的宿主目录;

4、“/”处于Linux文件系统树形结构的最顶端,我们称它为Linux文件系统的root,它是Linux文件系统的入口。

所有的目录、文件、设备都在/之下,它是Linux文件系统最顶层的唯一的目录;

自动不全:tab键

查看曾经用过命令:上下光标键,退出选择用ctrl+c

ls命令扩展:

最常用,.开头的文件为隐藏文件,需要-a才可以打开, ls -a才可以显示出来

.表示当前目录

..表示上级目录, cd ..返回上一个目录

ls -l以列表方式显示文件详细信息

ls -h配合-l以人性化方式显示文件大小(文件大小用k,m表示,而不是byte,人易读):ls -l -h或者 ls -lh

所以可以ls -alh

drw… 这里d是目录

P23 文件和目录(ls常用通配符)

*:任意个数字符(0或多个)

?:任意一个字符,至少一个(只一个,不可为0)

[]:可匹配字符组任意一个

ls功能: 列出非目录的文件项,然后是每一个目录中的“可显示”文件(可理解为ls命令将本目录向下展开两级)

ls用法:ls [参数] [目录名]

​ (如过要显示当前目录的文件可不加目录名)

ls常用参数

-a 显示所有文件,包含隐藏文件

-A 显示所有文件,包含隐藏文件,但不包含.及..

-l 显示为long format(长格式),列出文件的类型、权限、链接数、owner、group、大 小,时间,名字

-R

-d 不展开目录,只显示目录自身,一般与-l配合使用以显示目录自身的属性信息(只显示当前目录的内容)

-1 数字1,成列显示内容

-S 以文件大小排序显示,默认从大到小 -r后,从小到大

-U 按存放顺序排序显示

-X 按扩展名的首字母来排序

-t 按mtime排序(先显示时间最近的)

-ul 按atime排序(先显示时间最近的)

-ct 按ctime排序(先显示时间最近的)

​ 补充:

关于时间戳:

​ atime 访问时间

​ mtime 数据修改时间 (写入,修改数据mtime改变,mtime改变ctime必改变)

​ ctime 元数据修改时间 (修改权限的时候只有ctime改变)

​ 可过“stat 文件路径”查看全部时间戳

扩展**: 如何通过ls只显示指定格式的文件**

首先我们要了解什么是文件名通配符

Shell提供了一套完整的字符串模式匹配规则,或者称之为元字符,当s h e l l遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样用户就可以用它们来匹配相应的文件名,我理解这可以称为通配符。

常用通配符:

* 匹配0或多个任意字符

? 匹配任意1个字符

[ ] 当中括号内为几个确定字符时,表示匹配括号内任意一个字符,当中括号内为一个范围时表示匹配这个范围中的任意一个字符(中括号表示的是一个范围,匹配的是一个字符)

例:

[ab46e] 表示是a,b,4,6,e中的任意一个字符

[a-z] 表示aAbBcC……z(Linux中的默认编码顺序是一个小写字母一个大写字母即aAbBcC…..Z)

​ [A-Z] 表示AbBcC……Z

​ [a- Z] 表示所有大小写字母

​ [^ae] 表示即不是a也不是e的其他任意单一字符

[:lower:] 表示一个小写字母

[:upper:] 表示一个大写字母

[:alpha:] 表示一个大小写字母 等同于[a-Z]

[:digit:] 表示任意一个数字 等同于[0-9]

[:alnum:] 表示任意一个字母或数字 等于[a-Z0-9]或[[:digit:][:alpha:]]

[:blank:]:一个水平空白字符

[:space:]:一个水平或垂直空白字符(文件名不可能包含回车,故此处使用与[:blank:]:效果相同)

通过ls命令和通配符查找指定格式的文件:

格式:ls [参数] [目录名][通配符]

以下是一些例子:

\1. 查找/usr/share/man 目录下以m开头且以一个数字加x结尾的文件

命令:ls -d /usr/share/man/m*[0-9]x

运行结果:

img

解释:-d 只展开一级目录

/usr/share/man/ 目录路径

m*[0-9]x m表示以m开头,[0-9]x表示以数字加x结尾,因为对文件的中间没

有加以限制所以用代替中间部分,表示任意个数的任意字符

\2. 查找root下的隐藏文件和目录

命令: ls -d /root/.*

运行结果:

img

解释:-d 只展开一级目录

/root 目录路径

因为Linux下以“.”开头的文件是隐藏文件,所以用“.”加上“*”来表示隐藏文件

\3. 查找/etc下所有以k开头,以一个小写字母结尾,且中间出现至少一位数字的文件

​ 命令:ls -d /etc/k[0-9][[:lower:]]

​ 运行结果:

img

解释:-d 只展开一级目录

/etc 目录路径

​ k表示以k开头,[0-9]表示一个数字,[[:lower:]]表示一个小写字母,因为[:lower:]表示为小写字母,也就是abcdefg…z,所以在[:lower:]外面加

上[ ]以表示在这写子母中取任意一个,因为只规定了开头和结尾,对中间只要求至少出现一位数字,所以中间用*[0-9]*来表示

P25 文件和目录(cd常用选项)

cd

跳入test目录:

1
2
3
[root@/root/linuxdaxue.com]#cd testDir/
[root@/root/linuxdaxue.com/testDir]#ls
file1 file2 file3

跳至上层目录

1
2
3
[root@/root/linuxdaxue.com/testDir]#cd ..
[root@/root/linuxdaxue.com]#ls
testDir

跳至上上层目录

1
2
[root@/root/linuxdaxue.com/testDir]#cd ../../
[root@/root]#ls

跳入用户主目录: cd ~或者cd

1
2
3
4
5
[root@/root/linuxdaxue.com/testDir]#ls
file1 file2 file3
[root@/root/linuxdaxue.com/testDir]#cd ~/
[root@/root]#pwd
/root

使用绝对路径

1
2
3
[root@/root]#cd /root/linuxdaxue.com/testDir
[root@/root/linuxdaxue.com/testDir]#ls
file1 file2 file3

使用环境变量

1
2
3
[root@/root]#cd $TEST_PATH
[root@/root/linuxdaxue.com/testDir]#ls
file1 file2 file3

跳入上次使用目录: cd -, 可以在最近两次工作目录间切换

1
2
3
4
5
[root@/root]#pwd
/root
[root@/root]#cd -
/root/linuxdaxue.com/testDir
[root@/root/linuxdaxue.com/testDir]#

P26 文件和目录(相对路径绝对路径)

  • 绝对路径:路径的写法一定是由根目录 / 写起的,例如 /usr/local/mysql
  • 相对路径:路径的写法不是由根目录 / 写起的,例如 首先用户进入到 /home,然后再进入到test,执行的命令为 “#cd /home,#cd test”。此时用户所在的路径为 /home/test。第一个cd命令后紧跟/home,前面有斜杠;而第二个cd命令后紧跟test,前面没有斜杠。这个test是相对于/home目录来讲的,所以称为相对路径

P27 文件和目录(mkdir和touch)

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

ls -l 可以显示档案的时间记录。

语法

1
touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
  • 参数说明
  • a 改变档案的读取时间记录。
  • m 改变档案的修改时间记录。
  • c 假如目的档案不存在,不会建立新的档案。与 –no-create 的效果一样。
  • f 不使用,是为了与其他 unix 系统的相容性而保留。
  • r 使用参考档的时间记录,与 –file 的效果一样。
  • d 设定时间与日期,可以使用各种不同的格式。
  • t 设定档案的时间记录,格式与 date 指令相同。
  • –no-create 不会建立新档案。
  • –help 列出指令格式。
  • –version 列出版本讯息。

实例

使用指令”touch”修改文件”testfile”的时间属性为当前系统时间,输入如下命令:

1
$ touch testfile                #修改文件的时间属性

首先,使用ls命令查看testfile文件的属性,如下所示:

1
2
3
$ ls -l testfile                #查看文件的时间属性  
#原来文件的修改时间为16:09
-rw-r--r-- 1 hdd hdd 55 2011-08-22 16:09 testfile

执行指令”touch”修改文件属性以后,并再次查看该文件的时间属性,如下所示:

1
2
3
4
$ touch testfile                #修改文件时间属性为当前系统时间  
$ ls -l testfile #查看文件的时间属性
#修改后文件的时间属性为当前系统时间
-rw-r--r-- 1 hdd hdd 55 2011-08-22 19:53 testfile

使用指令”touch”时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件”file”,输入如下命令:

1
$ touch file            #创建一个名为“file”的新的空白文件

Linux mkdir命令用于建立名称为 dirName 之子目录。

语法

1
mkdir [-p] dirName

参数说明

  • -p 确保目录名称存在,不存在的就建一个。

实例

在工作目录下,建立一个名为 AAA 的子目录 :

1
mkdir AAA

在工作目录下的 BBB 目录中,建立一个名为 Test 的子目录。 若 BBB 目录原本不存在,则建立一个。(注:本例若不加 -p,且原本 BBB目录不存在,则产生错误。)

1
mkdir -p BBB/Test

linux中文件目录不可以重名

P28 文件和目录(rm)

rm删除的不能恢复。Linux rm命令用于删除一个文件或者目录。

rm也可以使用通配符。

格式化电脑:rm -rf *

所有数据全部删除。

语法

1
rm [options] name...

参数

  • -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

删除当前目录下的所有文件及目录,命令行为:

1
rm  -r  *

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

P29-35拷贝和移动文件

tree

Linux tree命令用于以树状图列出目录的内容。

需要此指令安装:sudo snap install tree

tree ,家目录(),全部显示出来。

执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。

语法

1
tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录...]

参数说明

  • -a 显示所有文件和目录。
  • -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
  • -C 在文件和目录清单加上色彩,便于区分各种类型。
  • -d 显示目录名称而非内容。(常用)
  • -D 列出文件或目录的更改时间。
  • -f 在每个文件或目录之前,显示完整的相对路径名称。
  • -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*”,”/“,”=”,”@”,”|”号。
  • -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
  • -i 不以阶梯状列出文件或目录名称。
  • -L level 限制目录显示层级。
  • -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
  • -n 不在文件和目录清单加上色彩。
  • -N 直接列出文件和目录名称,包括控制字符。
  • -p 列出权限标示。
  • -P<范本样式> 只显示符合范本样式的文件或目录名称。
  • -q 用”?”号取代控制字符,列出文件和目录名称。
  • -s 列出文件或目录大小。
  • -t 用文件和目录的更改时间排序。
  • -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
  • -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

cp

语法

1
cp [options] source dest

1
cp [options] source... directory

参数说明

  • -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
  • -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
  • -f:覆盖已经存在的目标文件而不给出提示。
  • -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答”y”时目标文件将被覆盖。(常用)
  • -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
  • -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。(常用)
  • -l:不复制文件,只是生成链接文件。

实例

使用指令”cp”将当前目录”test/“下的所有文件复制到新目录”newtest”下,输入如下命令:

1
$ cp –r test/ newtest

注意:用户使用该指令复制目录时,必须使用参数”-r”或者”-R”。

例 cp ~/Desktop/a.txt . 当前文件夹下

Linux mv 命令用来为文件或目录改名、或将文件或目录移入其它位置。

mv

语法

1
2
mv [options] source dest
mv [options] source... directory

参数说明

  • -i: 若指定目录已有同名文件,则先询问是否覆盖旧文件;(常用)
  • -f: 在 mv 操作要覆盖某已有的目标文件时不给任何指示;

mv参数设置与运行结果

命令格式 运行结果
mv 文件名 文件名 将源文件名改为目标文件名
mv 文件名 目录名 将文件移动到目标目录
mv 目录名 目录名 目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名
mv 目录名 文件名 出错

实例

将文件 aaa 更名为 bbb :

1
mv aaa bbb

将info目录放入logs目录中。注意,如果logs目录不存在,则该命令将info改名为logs。

1
mv info/ logs

再如将/usr/student下的所有文件和目录移到当前目录下,命令行为:

1
$ mv /usr/student/*  .

P36-39查看文件内容命令

cat, more, grep

cat:

concatenate: 查看文件,创建文件,文件合并,追加文件内容等功能

cat 命令用于连接文件并打印到标准输出设备上。(适合内容少的文本内容)

使用权限

所有使用者

语法格式

1
cat [-AbeEnstTuv] [--help] [--version] fileName

参数说明:

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

-b 或 –number-nonblank:和 -n 相似,只不过对于空白行不编号。(常用)

-s 或 –squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。

-v 或 –show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。

-E 或 –show-ends : 在每行结束处显示 $。

-T 或 –show-tabs: 将 TAB 字符显示为 ^I。

-A, –show-all:等价于 -vET。

-e:等价于”-vE”选项;

-t:等价于”-vT”选项;

实例:

把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:

1
cat -n textfile1 > textfile2

把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里:

1
cat -b textfile1 textfile2 >> textfile3

清空 /etc/test.txt 文档内容:

1
cat /dev/null > /etc/test.txt

cat 也可以用来制作镜像文件。例如要制作软盘的镜像文件,将软盘放好后输入:

1
cat /dev/fd0 > OUTFILE

相反的,如果想把 image file 写到软盘,输入:

1
cat IMG_FILE > /dev/fd0

  • \1. OUTFILE 指输出的镜像文件名。

  • \2. IMG_FILE 指镜像文件。

  • \3. 若从镜像文件写回 device 时,device 容量需与相当。

  • \4. 通常用制作开机磁片。

more:

Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。Enter键:一次滚动手册页的一行,f前滚一页,q退出,/word搜索word字符串

语法

1
more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]

参数

  • -num 一次显示的行数
  • -d 提示使用者,在画面下方显示 [Press space to continue, ‘q’ to quit.] ,如果使用者按错键,则会显示 [Press ‘h’ for instructions.] 而不是 ‘哔’ 声
  • -l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能
  • -f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
  • -p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
  • -c 跟 -p 相似,不同的是先显示内容再清除其他旧资料
  • -s 当遇到有连续两行以上的空白行,就代换为一行的空白行
  • -u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)
  • +/pattern 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示
  • +num 从第 num 行开始显示
  • fileNames 欲显示内容的文档,可为复数个数

实例

逐页显示 testfile 文档内容,如有连续两行以上空白行则以一行空白行显示。

1
more -s testfile

从第 20 行开始显示 testfile 之文档内容。

1
more +20 testfile

常用操作命令

  • Enter 向下n行,需要定义。默认为1行
  • Ctrl+F 向下滚动一屏
  • 空格键 向下滚动一屏
  • Ctrl+B 返回上一屏
  • = 输出当前行的行号
  • :f 输出文件名和当前行的行号
  • V 调用vi编辑器
  • !命令 调用Shell,并执行命令
  • q 退出more

grep:文本搜索工具

Linux grep 命令用于查找文件里符合条件的字符串。

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

常用2种模式查找:

^a: 行首,以a开头的行

ke$:行尾,以ke结尾的行

例:gref ^f a.txt

语法

1
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

参数

  • -a 或 –text : 不要忽略二进制的数据。
  • -A<显示行数> 或 –after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -b 或 –byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  • -B<显示行数> 或 –before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -c 或 –count : 计算符合样式的列数。
  • -C<显示行数> 或 –context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -d <动作> 或 –directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -e<范本样式> 或 –regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 –extended-regexp : 将样式为延伸的正则表达式来使用。
  • -f<规则文件> 或 –file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 –fixed-regexp : 将样式视为固定字符串的列表。
  • -G 或 –basic-regexp : 将样式视为普通的表示法来使用。
  • -h 或 –no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
  • -H 或 –with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
  • -i 或 –ignore-case : 忽略字符大小写的差别。 (常用)
  • -l 或 –file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -L 或 –files-without-match : 列出文件内容不符合指定的样式的文件名称。
  • -n 或 –line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。 (显示匹配行及行号,常用)
  • -o 或 –only-matching : 只显示匹配PATTERN 部分。
  • -q 或 –quiet或–silent : 不显示任何信息。
  • -r 或 –recursive : 此参数的效果和指定”-d recurse”参数相同。
  • -s 或 –no-messages : 不显示错误信息。
  • -v 或 –revert-match : 显示不包含匹配文本的所有行。 (求反,常用)
  • -V 或 –version : 显示版本信息。
  • -w 或 –word-regexp : 只显示全字符合的列。
  • -x –line-regexp : 只显示全列符合的列。
  • -y : 此参数的效果和指定”-i”参数相同。

Linux 命令大全 Linux 命令大全

实例

1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:

1
grep test *file

结果如下所示:

1
2
3
4
$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件  
testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行
testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行
testfile_2:Linux test #列出testfile_2 文件中包含test字符的行

2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串”update”的文件,并打印出该字符串所在行的内容,使用的命令为:

1
grep -r update /etc/acpi

输出结果如下:

1
2
3
4
5
6
7
$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi”  
#下包含“update”的文件
/etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)
Rather than
/etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of
IO.) Rather than
/etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update

3、反向查找。前面各个例子是查找并打印出符合条件的行,通过”-v”参数可以打印出不符合条件行的内容。

查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:

1
grep -v test *test*

结果如下所示:

1
2
3
4
5
6
7
8
9
$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行  
testfile1:helLinux!
testfile1:Linis a free Unix-type operating system.
testfile1:Lin
testfile_1:HELLO LINUX!
testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.
testfile_1:THIS IS A LINUX TESTFILE!
testfile_2:HELLO LINUX!
testfile_2:Linux is a free unix-type opterating system.

P40-41 echo

用于字符串的输出

格式

  • echo string

使用echo实现更复杂的输出格式控制

1.显示普通字符串:

复制代码

1
2
3
4
5
6
echo "It is a test"


这里的双引号完全可以省略,以下命令与上面实例效果一致:

echo It is a test

复制代码

2.显示转义字符

1
2
3
4
echo "\"It is a test\""
结果将是:
"It is a test"
同样,双引号也可以省略

3.显示变量

1
2
3
4
5
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name
echo "$name It is a test"
1
2
3
4
5
以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:

[root@www ~]# sh test.sh
OK #标准输入
OK It is a test #输出

4.显示换行

1
2
echo -e "OK! \n" # -e 开启转义
echo "It it a test"
1
2
3
4
5
输出结果:

OK!

It it a test

5.显示不换行

1
2
3
4
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
输出结果:OK! It is a test
1
 

复制代码

  • 转义

    \a 发出警告声;

    \b 删除前一个字符;

    \c 最后不加上换行符号;

    \f 换行但光标仍旧停留在原来的位置;

    \n 换行且光标移至行首;

    \r 光标移至行首,但不换行;

    \t 插入tab;

    \v 与\f相同;

    \ 插入\字符;

    \nnn 插入nnn(八进制)所代表的ASCII字符;

复制代码

1
 

6.显示结果定向至文件

1
echo "It is a test" > myfile

7.原样输出字符串,不进行转义或取变量(用单引号)

1
2
3
echo '$name\"'
输出结果:
$name\"

8.显示命令执行结果

1
2
3
4
  echo `date`
结果将显示当前日期

Thu Jul 24 10:08:46 CST 2014

重定向

Shell 输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

重定向命令列表如下:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。(会覆盖)
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。(不会覆盖)
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。


输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

1
command1 > file1

上面这个命令执行command1然后将输出的内容存入file1。

注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。

实例

执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):

1
$ who > users

执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

你可以使用 cat 命令查看文件内容:

1
2
3
4
$ cat users
_mbsetupuser console Oct 31 17:35
tianqixin console Oct 31 17:35
tianqixin ttys000 Dec 1 11:33

输出重定向会覆盖文件内容,请看下面的例子:

1
2
3
4
$ echo "菜鸟教程:www.runoob.com" > users
$ cat users
菜鸟教程:www.runoob.com
$

如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:

1
2
3
4
5
$ echo "菜鸟教程:www.runoob.com" >> users
$ cat users
菜鸟教程:www.runoob.com
菜鸟教程:www.runoob.com
$

输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

1
command1 < file1

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

注意:输出重定向是大于号(>),输入重定向是小于号(<)。

实例

接着以上实例,我们需要统计 users 文件的行数,执行以下命令:

1
2
$ wc -l users
2 users

也可以将输入重定向到 users 文件:

1
2
$  wc -l < users
2

注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

1
command1 < infile > outfile

同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

重定向深入讲解

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以这样写:

1
$ command 2 > file

如果希望 stderr 追加到 file 文件末尾,可以这样写:

1
$ command 2 >> file

2 表示标准错误文件(stderr)。

如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

1
2
3
4
5
$ command > file 2>&1

或者

$ command >> file 2>&1

如果希望对 stdin 和 stdout 都重定向,可以这样写:

1
$ command < file1 >file2

command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。


Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

它的基本的形式如下:

1
2
3
command << delimiter
document
delimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

注意:

  • 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
  • 开始的delimiter前后的空格会被忽略掉。

实例

在命令行中通过 wc -l 命令计算 Here Document 的行数:

1
2
3
4
5
6
7
$ wc -l << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF
3 # 输出结果为 3 行
$

我们也可以将 Here Document 用在脚本中,例如:

1
2
3
4
5
6
7
8
9
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF

执行以上脚本,输出结果:

1
2
3
欢迎来到
菜鸟教程
www.runoob.com

/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

1
$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出”的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

1
$ command > /dev/null 2>&1

注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

P41

echo和重定向一起用,例:echo hello > a, 想hello输入a文件中

例 ls -lh > a, ls结果放入a内。>> 是追加。>是覆盖

管道:

Shell 还有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)

Linux 管道使用竖线|连接多个命令,这被称为管道符。Linux 管道的具体语法格式如下:

command1 | command2
command1 | command2 [ | commandN… ]

当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的 Linux 命令都可以用来形成管道。

这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command2 的输出结果;而且 command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息。

为什么使用管道?

我们先看下面一组命令,使用 mysqldump(一个数据库备份程序)来备份一个叫做 wiki 的数据库:

mysqldump -u root -p ‘123456’ wiki > /tmp/wikidb.backup
gzip -9 /tmp/wikidb.backup
scp /tmp/wikidb.backup username@remote_ip:/backup/mysql/

上述这组命令主要做了如下任务:

  • mysqldump 命令用于将名为 wike 的数据库备份到文件 /tmp/wikidb.backup;其中-u-p选项分别指出数据库的用户名和密码。
  • gzip 命令用于压缩较大的数据库文件以节省磁盘空间;其中-9表示最慢的压缩速度最好的压缩效果。
  • scp 命令(secure copy,安全拷贝)用于将数据库备份文件复制到 IP 地址为 remote_ip 的备份服务器的 /backup/mysql/ 目录下。其中username是登录远程服务器的用户名,命令执行后需要输入密码。

上述三个命令依次执行。然而,如果使用管道的话,你就可以将 mysqldump、gzip、ssh 命令相连接,这样就避免了创建临时文件 /tmp/wikidb.backup,而且可以同时执行这些命令并达到相同的效果。

使用管道后的命令如下所示:

mysqldump -u root -p ‘123456’ wiki | gzip -9 | ssh username@remote_ip “cat > /backup/wikidb.gz”

这些使用了管道的命令有如下特点:

  • 命令的语法紧凑并且使用简单。
  • 通过使用管道,将三个命令串联到一起就完成了远程 mysql 备份的复杂任务。
  • 从管道输出的标准错误会混合到一起。

上述命令的数据流如下图所示:

Linux Shell管道演示图

重定向和管道的区别

乍看起来,管道也有重定向的作用,它也改变了数据输入输出的方向,那么,管道和重定向之间到底有什么不同呢?

简单地说,重定向操作符>将命令与文件连接起来,用文件来接收命令的输出;而管道符|将命令与命令连接起来,用第二个命令来接收第一个命令的输出。如下所示:

command > file
command1 | command1

有些读者在学习管道时会尝试如下的命令,我们来看一下会发生什么:

command1 > command2

答案是,有时尝试的结果将会很糟糕。这是一个实际的例子,一个 Linux 系统管理员以超级用户(root 用户)的身份执行了如下命令:

cd /usr/bin
ls > less

第一条命令将当前目录切换到了大多数程序所存放的目录,第二条命令是告诉 Shell 用 ls 命令的输出重写文件 less。因为 /usr/bin 目录已经包含了名称为 less(less 程序)的文件,第二条命令用 ls 输出的文本重写了 less 程序,因此破坏了文件系统中的 less 程序。

这是使用重定向操作符错误重写文件的一个教训,所以在使用它时要谨慎。

Linux管道实例

【实例1】将 ls 命令的输出发送到 grep 命令:

1
2
[c.biancheng.net]$ ls | grep log.txt
log.txt

上述命令是查看文件 log.txt 是否存在于当前目录下。

我们可以在命令的后面使用选项,例如使用-al选项:

1
2
[c.biancheng.net]$ ls -al | grep log.txt
-rw-rw-r--. 1 mozhiyan mozhiyan 0 4月 15 17:26 log.txt

管道符|与两侧的命令之间也可以不存在空格,例如将上述命令写作ls -al|grep log.txt;然而我还是推荐在管道符|和两侧的命令之间使用空格,以增加代码的可读性。

我们也可以重定向管道的输出到一个文件,比如将上述管道命令的输出结果发送到文件 output.txt 中:

1
2
3
[c.biancheng.net]$ ls -al | grep log.txt >output.txt
[c.biancheng.net]$ cat output.txt
-rw-rw-r--. 1 mozhiyan mozhiyan 0 4月 15 17:26 log.txt

【实例2】使用管道将 cat 命令的输出作为 less 命令的输入,这样就可以将 cat 命令的输出每次按照一个屏幕的长度显示,这对于查看长度大于一个屏幕的文件内容很有帮助。

1
cat /var/log/message | less

【实例3】查看指定程序的进程运行状态,并将输出重定向到文件中。

1
2
3
4
5
6
7
8
9
10
11
12
[c.biancheng.net]$ ps aux | grep httpd > /tmp/ps.output
[c.biancheng.net]$ cat /tem/ps.output
mozhiyan 4101 13776 0 10:11 pts/3 00:00:00 grep httpd
root 4578 1 0 Dec09 ? 00:00:00 /usr/sbin/httpd
apache 19984 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19985 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19986 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19987 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19988 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19989 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19990 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19991 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd

【实例4】显示按用户名排序后的当前登录系统的用户的信息。

1
2
3
[c.biancheng.net]$ who | sort
mozhiyan :0 2019-04-16 12:55 (:0)
mozhiyan pts/0 2019-04-16 13:16 (:0)

who 命令的输出将作为 sort 命令的输入,所以这两个命令通过管道连接后会显示按照用户名排序的已登录用户的信息。

【实例5】统计系统中当前登录的用户数。

1
2
[c.biancheng.net]$ who | wc -l
5

管道与输入重定向

输入重定向操作符<可以在管道中使用,以用来从文件中获取输入,其语法类似下面这样:

command1 < input.txt | command2
command1 < input.txt | command2 -option | command3

例如,使用 tr 命令从 os.txt 文件中获取输入,然后通过管道将输出发送给 sort 或 uniq 等命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[c.biancheng.net]$ cat os.txt
redhat
suse
centos
ubuntu
solaris
hp-ux
fedora
centos
redhat
hp-ux
[c.biancheng.net]$ tr a-z A-Z <os.txt | sort
CENTOS
CENTOS
FEDORA
HP-UX
HP-UX
REDHAT
REDHAT
SOLARIS
SUSE
UBUNTU
[c.biancheng.net]$ tr a-z A-Z <os.txt | sort | uniq
CENTOS
FEDORA
HP-UX
REDHAT
SOLARIS
SUSE
UBUNTU

管道与输出重定向

你也可以使用重定向操作符>或>>将管道中的最后一个命令的标准输出进行重定向,其语法如下所示:

command1 | command2 | … | commandN > output.txt
command1 < input.txt | command2 | … | commandN > output.txt

【实例1】使用 mount 命令显示当前挂载的文件系统的信息,并使用 column 命令格式化列的输出,最后将输出结果保存到一个文件中。

1
2
3
4
5
6
7
8
9
10
11
[c.biancheng.net]$ mount | column -t >mounted.txt
[c.biancheng.net]$ cat mounted.txt
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=496136k,nr_inodes=124034,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,seclabel,mode=755)
#####此处省略部分内容#####

【实例2】使用 tr 命令将 os.txt 文件中的内容转化为大写,并使用 sort 命令将内容排序,使用 uniq 命令去除重复的行,最后将输出重定向到文件 ox.txt.new。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[c.biancheng.net]$ cat os.txt
redhat
suse
centos
ubuntu
solaris
hp-ux
fedora
centos
redhat
hp-ux
[c.biancheng.net]$ tr a-z A-Z <os.txt | sort | uniq >os.txt.new
[c.biancheng.net]$ cat os.txt.new
CENTOS
FEDORA
HP-UX
REDHAT
SOLARIS
SUSE
UBUNTU

管道 |

linux允许讲一个命令的输出可以通过管道作为另一个命令的输入。(有用)

例: ls -lha ~| more: 用more查看

例: ls -lha ~| grep vi: 把match vi的输出,找出来。

linux 100集

P3:操作系统作用

操作系统作用:1. 直接操作硬件 2把操作硬件的代码封装成一个个系统调用,供其他使用。

操作系统,与硬件交互。操作系统作用:操作系统位于底层硬件与用户之间,是两者沟通的桥梁。用户可以通过操作系统的用户界面,输入命令。操作系统则对命令进行解释,驱动硬件设备,实现用户要求。以现代标准而言,一个标准PC的操作系统应该提供以下的功能:

1、进程管理。又称处理器管理,其主要任务是对处理器的时间进行合理分配、对处理器的运行实施有效的管理。

2、存储器管理。由于多道程序共享内存资源,所以存储器管理的主要任务是对存储器进行分配、保护和扩充。

3、设备管理。根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面。

4、文件管理。有效地管理文件的存储空间,合理地组织和管理文件系统,为文件访问和文件保护提供更有效的方法及手段。

5、用户接口。用户操作计算机的界面称为用户接口(或用户界面),通过用户接口,用户只需进行简单操作,就能实现复杂的应用处理。

例:听音乐,把硬盘中文件加载内存,然后声卡对音频数据解码,然后解码后数据给音响。这些都是操作系统做的。

P4-10:历史简介

桌面操作系统:Windows(用户多,安全性较差,稳定性较差),Linux(应用软件少), macOS(开发人员用)

服务器操作系统:Linux(安全,稳定,免费,占有率高,一般公司服务器都是Linux)(维护机房计算机,在远程维护),Windows Server(微软付费的,占有率低)

嵌入式操作系统:Linux()

系统设备操作系统:iOS,Android

虚拟机:通过软件模拟具有完整硬件系统功能的,运行在一个完全隔离环境中的完整计算机系统。

Ken Thompson, 1969运行space travel,用汇编写了Unix原型,老爷子后来用B语言写了Unix

Dennis M.Ritchie发明了c语言,然后两个人一起重写了Unix。

unix version7 后unix不在开源源代码,因为ken老爷子喜欢走后门,让贝尔实验室很不爽。

Linux出现了,Linus老爷子来了,用GNU的bash当开发环境,gcc做compiler,编写了linux内核。

Linux两个版本:内核版本和发行版本。

终端命令调系统调用,系统调用与硬件交互。

内核版本:kernel,Linux内核:内核只有一个
linux内核是一种开放源码的操作系统,由Linux Torvalds负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。

Linux发行版:
linux发行版基于linux内核源码,将Linux系统的内核与外围实用程序(Utilities)软件和文档包装起来,并提供一些系统安装界面和系统配置、设定与管理工具,就构成了一种发行版本(distribution),Linux的发行版本其实就是Linux核心再加上外围的实用程序组成的一个大软件包。

linux主要发行版:

Fedora Core、Debian、Mandrake、Ubuntu、Red Hat Linux、SuSE、Linux Mint、Gentoo、CentOS、

P11:Linux文件目录

windows每个驱动器都有根目录,前身是单用户操作系统

unix/linux是多用户操作系统,ubuntu目录:

/是根目录:/bin, /etc, /home, /lib, /usr

在/home中有/python, /laowang, 在这两个用户中都有/Desktop, /Documents, /Downloads, 各人各家,不会干扰别人。linux没有盘符概念

/bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。

/boot:放置linux系统启动时用到的一些文件。/boot/vmlinuz 为 linux 的内核文件,以及 /boot/gurb。建议单独分区,分区大小100M即可

/dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。

/etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d修改配置文件之前记得备份。

注:/etc/X11 存放与 x windows 有关的设置。

/home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,表示当前用户的家目录,edu 表示用户 edu 的家目录。建议单独分区,并设置较大的磁盘空间,方便用户存放数据

/lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为 /lib/modules。

/lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。如加载硬盘于 /disk 中,此目录下就会自动产生目录 /disk/lost+found

/mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。

/opt:给主机额外安装软件所摆放的目录。如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的 KDE 桌面软件,可以将该软件安装在该目录下。以前的 Linux 系统中,习惯放置在 /usr/local 目录下

/proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等。

/root:系统管理员root的家目录,系统第一个启动的分区为 /,所以最好将 /root和 /放置在一个分区下。

/sbin: /usr/sbin: /usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root使用的命令,一般用户只能”查看”而不能设置和使用。

/tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下

/srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。

/usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录,使用 man ls 时会查询 /usr/share/man/man1/ls.1.gz 的内容建议单独分区,设置较大的磁盘空间

/var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。建议单独分区,设置较大的磁盘空间

一切皆文件

Linux 对数据文件(.mp3、.bmp),程序文件(.c、.h、*.o),设备文件(LCD、触摸屏、鼠标),网络文件( socket ) 等的管理都抽象为文件,使用统一的方式方法管理。

文件分类:

1)普通文件( 数据文件 )

普通文件是用于存放数据、程序等信息的文件,一般都长期地存放在外存储器(磁盘)中。普通文件又分为文本文件和二进制文件。

2)目录文件

目录文件是文件系统中一个目录所包含的目录项所组成的文件。

3)设备文件

设备文件是用于为操作系统与设备提供连接的一种文件。在Linux系统中将设备作为文件来处理,操作设备就像是操作普通文件一样。每一个设备对应一个设备文件,存放在 /dev 目录中。

5)链接文件

似于 windows 下的快捷方式,链接又可以分为软链接(符号链接)和硬链接。

6)管道文件

管道文件主要用于在进程间传递数据的一种特殊文件。

7)套接口文件

主要用于不同计算机间网络通信的一种特殊文件。

【常见目录说明】

目录
/bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。
/etc 存放系统管理和配置文件
/home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/usr 用于存放系统应用程序,比较重要的目录/usr/local 本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。/usr/x11r6 存放x window的目录/usr/bin 众多的应用程序 /usr/sbin 超级用户的一些管理程序 /usr/doc linux文档 /usr/include linux下开发和编译应用程序所需要的头文件 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/man 帮助文档 /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库
/opt 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里。
/proc 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/root 超级用户(系统管理员)的主目录(特权阶级^o^)
/sbin 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等。
/dev 用于存放设备文件。
/mnt 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统。
/boot 存放用于系统引导时使用的各种文件
/lib 存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似windows里的.dll文件,存放了根文件系统程序运行所需的共享文件。
/tmp 用于存放各种临时文件,是公用的临时文件存储点。
/var 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等。
/lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里

P13-17.LInux终端命令

terminal放大字体:ctrl + shift + =;缩小字体: ctrl + -

linux常用命令:ls, pwd, cd, touch, mkdir, rm, clear.

对应:list, print work directory, change directory, touch(创建文件,例如java,txt文件), mkdir(创建目录)马克directory,clear(清屏), rmdir(删除目录)

终端命令格式:command [options] [parameter]

Linux中的rm -r 和rm -R区别为:用途不同道、范围不同、数量不同。

一、用途不同

1、rm -r :rm -r 只能用于删除文件,不能用于删除文件夹。

2、rm -R:rm -R既能用于删除文件,也能用于删除文件夹。

二、范围不同内

1、rm -容r :rm -r的删除范围是删除当前输入位置的文件。

2、rm -R:rm -R的删除范围是删除当前输入的目录文件夹里文件及其子目录里的文件。

系统信息
arch 显示机器的处理器架构
uname -m 显示机器的处理器架构
uname -r 显示正在使用的内核版本
dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)
hdparm -i /dev/hda 罗列一个磁盘的架构特性
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作
cat /proc/cpuinfo 显示CPU info的信息
cat /proc/interrupts 显示中断
cat /proc/meminfo 校验内存使用
cat /proc/swaps 显示哪些swap被使用
cat /proc/version 显示内核的版本
cat /proc/net/dev 显示网络适配器及统计
cat /proc/mounts 显示已加载的文件系统
lspci -tv 罗列 PCI 设备
lsusb -tv 显示 USB 设备
date 显示系统日期
cal 2007 显示2007年的日历表
date 041217002007.00 设置日期和时间 - 月日时分年.秒
clock -w 将时间修改保存到 BIOS

关机 (系统的关机、重启以及登出 )
shutdown -h now 关闭系统
init 0 关闭系统
telinit 0 关闭系统
shutdown -h hours:minutes & 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
shutdown -r now 重启
reboot 重启
logout 注销

文件和目录
cd /home 进入 ‘/ home’ 目录’
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录
pwd 显示工作路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls [0-9] 显示包含数字的文件名和目录名
tree 显示文件和目录由根目录开始的树形结构
lstree 显示文件和目录由根目录开始的树形结构
mkdir dir1 创建一个叫做 ‘dir1’ 的目录’
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树
rm -f file1 删除一个叫做 ‘file1’ 的文件’
rmdir dir1 删除一个叫做 ‘dir1’ 的目录’
rm -rf dir1 删除一个叫做 ‘dir1’ 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . 复制一个目录到当前工作目录
cp -a dir1 dir2 复制一个目录

cp -r dir1 dir2 复制一个目录及子目录
ln -s file1 lnk1 创建一个指向文件或目录的软链接
ln file1 lnk1 创建一个指向文件或目录的物理链接
touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm)
file file1 outputs the mime type of the file as text
iconv -l 列出已知的编码
iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
find . -maxdepth 1 -name *.jpg -print -exec convert “{}” -resize 80x60 “thumbs/{}” ; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)

文件搜索
find / -name file1 从 ‘/‘ 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 ‘user1’ 的文件和目录
find /home/user1 -name *.bin 在目录 ‘/ home/user1’ 中搜索带有’.bin’ 结尾的文件
find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件
find / -name *.rpm -exec chmod 755 ‘{}’ ; 搜索以 ‘.rpm’ 结尾的文件并定义其权限
find / -xdev -name *.rpm 搜索以 ‘.rpm’ 结尾的文件,忽略光驱、捷盘等可移动设备
locate *.ps 寻找以 ‘.ps’ 结尾的文件 - 先运行 ‘updatedb’ 命令
whereis halt 显示一个二进制文件、源码或man的位置
which halt 显示一个二进制文件或可执行文件的完整路径

挂载一个文件系统
mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 ‘/ mnt/hda2’ 已经存在
umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 ‘/ mnt/hda2’ 退出
fuser -km /mnt/hda2 当设备繁忙时强制卸载
umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用
mount /dev/fd0 /mnt/floppy 挂载一个软盘
mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom
mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件
mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统
mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享

磁盘空间
df -h 显示已经挂载的分区列表
ls -lSr |more 以尺寸大小排列文件和目录
du -sh dir1 估算目录 ‘dir1’ 已经使用的磁盘空间’
du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小
rpm -q -a –qf ‘%10{SIZE}t%{NAME}n’ | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统)
dpkg-query -W -f=’${Installed-Size;10}t${Package}n’ | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统)

用户和群组
groupadd group_name 创建一个新用户组
groupdel group_name 删除一个用户组
groupmod -n new_group_name old_group_name 重命名一个用户组
useradd -c “Name Surname “ -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 “admin” 用户组的用户
useradd user1 创建一个新用户
userdel -r user1 删除一个用户 ( ‘-r’ 排除主目录)
usermod -c “User FTP” -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性
passwd 修改口令
passwd user1 修改一个用户的口令 (只允许root执行)
chage -E 2005-12-31 user1 设置用户口令的失效期限
pwck 检查 ‘/etc/passwd’ 的文件格式和语法修正以及存在的用户
grpck 检查 ‘/etc/passwd’ 的文件格式和语法修正以及存在的群组
newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组

文件的权限 - 使用 “+” 设置权限,使用 “-“ 用于取消
ls -lh 显示权限
ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示
chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限
chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限
chown user1 file1 改变一个文件的所有人属性
chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性
chgrp group1 file1 改变文件的群组
chown user1:group1 file1 改变一个文件的所有人和群组属性
find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件
chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限
chmod u-s /bin/file1 禁用一个二进制文件的 SUID位
chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的
chmod g-s /home/public 禁用一个目录的 SGID 位
chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件
chmod o-t /home/public 禁用一个目录的 STIKY 位

文件的特殊属性 - 使用 “+” 设置权限,使用 “-“ 用于取消
chattr +a file1 只允许以追加方式读写文件
chattr +c file1 允许这个文件能被内核自动压缩/解压
chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件
chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接
chattr +s file1 允许一个文件被安全地删除
chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘
chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件
lsattr 显示特殊的属性

打包和压缩文件
bunzip2 file1.bz2 解压一个叫做 ‘file1.bz2’的文件
bzip2 file1 压缩一个叫做 ‘file1’ 的文件
gunzip file1.gz 解压一个叫做 ‘file1.gz’的文件
gzip file1 压缩一个叫做 ‘file1’的文件
gzip -9 file1 最大程度压缩
rar a file1.rar test_file 创建一个叫做 ‘file1.rar’ 的包
rar a file1.rar file1 file2 dir1 同时压缩 ‘file1’, ‘file2’ 以及目录 ‘dir1’
rar x file1.rar 解压rar包
unrar x file1.rar 解压rar包
tar -cvf archive.tar file1 创建一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 创建一个包含了 ‘file1’, ‘file2’ 以及 ‘dir1’的档案文件
tar -tf archive.tar 显示一个包中的内容
tar -xvf archive.tar 释放一个包
tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下
tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包
tar -jxvf archive.tar.bz2 解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包
tar -zxvf archive.tar.gz 解压一个gzip格式的压缩包
zip file1.zip file1 创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip 解压一个zip格式压缩包

RPM 包 - (Fedora, Redhat及类似系统)
rpm -ivh package.rpm 安装一个rpm包
rpm -ivh –nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告
rpm -U package.rpm 更新一个rpm包但不改变其配置文件
rpm -F package.rpm 更新一个确定已经安装的rpm包
rpm -e package_name.rpm 删除一个rpm包
rpm -qa 显示系统中所有已经安装的rpm包
rpm -qa | grep httpd 显示所有名称中包含 “httpd” 字样的rpm包
rpm -qi package_name 获取一个已安装包的特殊信息
rpm -qg “System Environment/Daemons” 显示一个组件的rpm包
rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表
rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表
rpm -q package_name –whatrequires 显示与一个rpm包存在依赖关系的列表
rpm -q package_name –whatprovides 显示一个rpm包所占的体积
rpm -q package_name –scripts 显示在安装/删除期间所执行的脚本l
rpm -q package_name –changelog 显示一个rpm包的修改历史
rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供
rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表
rpm –import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书
rpm –checksig package.rpm 确认一个rpm包的完整性
rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性
rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间
rpm -Va 检查系统中所有已安装的rpm包- 小心使用
rpm -Vp package.rpm 确认一个rpm包还未安装
rpm2cpio package.rpm | cpio –extract –make-directories bin 从一个rpm包运行可执行文件
rpm -ivh /usr/src/redhat/RPMS/arch/package.rpm 从一个rpm源码安装一个构建好的包
rpmbuild –rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包

YUM 软件包升级器 - (Fedora, RedHat及类似系统)
yum install package_name 下载并安装一个rpm包
yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系
yum update package_name.rpm 更新当前系统中所有安装的rpm包
yum update package_name 更新一个rpm包
yum remove package_name 删除一个rpm包
yum list 列出当前系统中安装的所有包
yum search package_name 在rpm仓库中搜寻软件包
yum clean packages 清理rpm缓存删除下载的包
yum clean headers 删除所有头文件
yum clean all 删除所有缓存的包和头文件

DEB 包 (Debian, Ubuntu 以及类似系统)
dpkg -i package.deb 安装/更新一个 deb 包
dpkg -r package_name 从系统删除一个 deb 包
dpkg -l 显示系统中所有已经安装的 deb 包
dpkg -l | grep httpd 显示所有名称中包含 “httpd” 字样的deb包
dpkg -s package_name 获得已经安装在系统中一个特殊包的信息
dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表
dpkg –contents package.deb 显示尚未安装的一个包所提供的文件列表
dpkg -S /bin/ping 确认所给的文件由哪个deb包提供

APT 软件工具 (Debian, Ubuntu 以及类似系统)
apt-get install package_name 安装/更新一个 deb 包
apt-cdrom install package_name 从光盘安装/更新一个 deb 包
apt-get update 升级列表中的软件包
apt-get upgrade 升级所有已安装的软件
apt-get remove package_name 从系统删除一个deb包
apt-get check 确认依赖的软件仓库正确
apt-get clean 从下载的软件包中清理缓存
apt-cache search searched-package 返回包含所要搜索字符串的软件包名称

查看文件内容
cat file1 从第一个字节开始正向查看文件的内容
tac file1 从最后一行开始反向查看一个文件的内容
more file1 查看一个长文件的内容
less file1 类似于 ‘more’ 命令,但是它允许在文件中和正向操作一样的反向操作
head -2 file1 查看一个文件的前两行
tail -2 file1 查看一个文件的最后两行
tail -f /var/log/messages 实时查看被添加到一个文件中的内容

文本处理
cat file1 file2 … | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc…) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中
cat file1 | command( sed, grep, awk, grep, etc…) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中
grep Aug /var/log/messages 在文件 ‘/var/log/messages’中查找关键词”Aug”
grep ^Aug /var/log/messages 在文件 ‘/var/log/messages’中查找以”Aug”开始的词汇
grep [0-9] /var/log/messages 选择 ‘/var/log/messages’ 文件中所有包含数字的行
grep Aug -R /var/log/* 在目录 ‘/var/log’ 及随后的目录中搜索字符串”Aug”
sed ‘s/stringa1/stringa2/g’ example.txt 将example.txt文件中的 “string1” 替换成 “string2”
sed ‘/^$/d’ example.txt 从example.txt文件中删除所有空白行
sed ‘/ #/d; /^$/d’ example.txt 从example.txt文件中删除所有注释和空白行
echo ‘esempio’ | tr ‘[:lower:]’ ‘[:upper:]’ 合并上下单元格内容
sed -e ‘1d’ result.txt 从文件example.txt 中排除第一行
sed -n ‘/stringa1/p’ 查看只包含词汇 “string1”的行
sed -e ‘s/ *$//‘ example.txt 删除每一行最后的空白字符
sed -e ‘s/stringa1//g’ example.txt 从文档中只删除词汇 “string1” 并保留剩余全部
sed -n ‘1,5p;5q’ example.txt 查看从第一行到第5行内容
sed -n ‘5p;5q’ example.txt 查看第5行
sed -e ‘s/00
/0/g’ example.txt 用单个零替换多个零
cat -n file1 标示文件的行数
cat example.txt | awk ‘NR%2==1’ 删除example.txt文件中的所有偶数行
echo a b c | awk ‘{print $1}’ 查看一行第一栏
echo a b c | awk ‘{print $1,$3}’ 查看一行的第一和第三栏
paste file1 file2 合并两个文件或两栏的内容
paste -d ‘+’ file1 file2 合并两个文件或两栏的内容,中间用”+”区分
sort file1 file2 排序两个文件的内容
sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u 删除交集,留下其他的行
sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm -1 file1 file2 比较两个文件的内容只删除 ‘file1’ 所包含的内容
comm -2 file1 file2 比较两个文件的内容只删除 ‘file2’ 所包含的内容
comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分

字符设置和文件格式转换
dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX
unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS
recode ..HTML < page.txt > page.html 将一个文本文件转换成html
recode -l | more 显示所有允许的转换格式

文件系统分析
badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块
fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性
fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性
fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性

初始化一个文件系统
mkfs /dev/hda1 在hda1分区创建一个文件系统
mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统
mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统
mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统
fdformat -n /dev/fd0 格式化一个软盘
mkswap /dev/hda3 创建一个swap文件系统

SWAP文件系统
mkswap /dev/hda3 创建一个swap文件系统
swapon /dev/hda3 启用一个新的swap文件系统
swapon /dev/hda2 /dev/hdb3 启用两个swap分区

备份
dump -0aj -f /tmp/home0.bak /home 制作一个 ‘/home’ 目录的完整备份
dump -1aj -f /tmp/home0.bak /home 制作一个 ‘/home’ 目录的交互式备份
restore -if /tmp/home0.bak 还原一个交互式备份
rsync -rogpav –delete /home /tmp 同步两边的目录
rsync -rogpav -e ssh –delete /home ip_address:/tmp 通过SSH通道rsync
rsync -az -e ssh –delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录
rsync -az -e ssh –delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr ‘dd of=hda.gz’ 通过ssh在远程主机上执行一次备份本地磁盘的操作
dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件
tar -Puf backup.tar /home/user 执行一次对 ‘/home/user’ 目录的交互式备份操作
( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr ‘cd /home/share/ && tar x -p’ 通过ssh在远程目录中复制一个目录内容
( tar c /home ) | ssh -C user@ip_addr ‘cd /home/backup-home && tar x -p’ 通过ssh在远程目录中复制一个本地目录
tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接
find /home/user1 -name ‘.txt’ | xargs cp -av –target-directory=/home/backup/ –parents 从一个目录查找并复制所有以 ‘.txt’ 结尾的文件到另一个目录
find /var/log -name ‘
.log’ | tar cv –files-from=- | bzip2 > log.tar.bz2 查找所有以 ‘.log’ 结尾的文件并做成一个bzip包
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容

光盘
cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容
mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件
mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件
mkisofs -J -allow-leading-dots -R -V “Label CD” -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件
cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件
gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件
mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件
cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中
cd-paranoia – “-3” 从一个CD光盘转录音轨到 wav 文件中(参数-3)
cdrecord –scanbus 扫描总线以识别scsi通道
dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD

网络 - (以太网和WIFI无线
ifconfig eth0 显示一个以太网卡的配置
ifup eth0 启用一个 ‘eth0’ 网络设备
ifdown eth0 禁用一个 ‘eth0’ 网络设备
ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址
ifconfig eth0 promisc 设置 ‘eth0’ 成混杂模式以嗅探数据包 (sniffing)
dhclient eth0 以dhcp模式启用 ‘eth0’
route -n show routing table
route add -net 0/0 gw IP_Gateway configura default gateway
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network ‘192.168.0.0/16’
route del 0/0 gw IP_gateway remove static route
echo “1” > /proc/sys/net/ipv4/ip_forward activate ip routing
hostname show hostname of system
host www.example.com lookup hostname to resolve name to ip address and viceversa
nslookup www.example.com lookup hostname to resolve name to ip address and viceversa
ip link show show link status of all interfaces
mii-tool eth0 show link status of ‘eth0’
ethtool eth0 show statistics of network card ‘eth0’
netstat -tup show all active network connections and their PID
netstat -tupl show all network services listening on the system and their PID
tcpdump tcp port 80 show all HTTP traffic
iwlist scan show wireless networks
iwconfig eth1 show configuration of a wireless network card
hostname show hostname
host www.example.com lookup hostname to resolve name to ip address and viceversa
nslookup www.example.com lookup hostname to resolve name to ip address and viceversa
whois www.example.com lookup on Whois database

JPS工具

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。

我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。

使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。

jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path.

$> jps
23991 Jps
23789 BossMain
23651 Resin

比较常用的参数:

-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
$> jps -q
28680
23789
23651

-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null

$> jps -m
28715 Jps -m
23789 BossMain
23651 Resin -socketwait 32768 -stdout /data/aoxj/resin/log/stdout.log -stderr /data/aoxj/resin/log/stderr.log

-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名

$> jps -l
28729 sun.tools.jps.Jps
23789 com.asiainfo.aimc.bossbi.BossMain
23651 com.caucho.server.resin.Resin

-v 输出传递给JVM的参数

$> jps -v
23789 BossMain
28802 Jps -Denv.class.path=/data/aoxj/bossbi/twsecurity/java/trustwork140.jar:/data/aoxj/bossbi/twsecurity/java/:/data/aoxj/bossbi/twsecurity/java/twcmcc.jar:/data/aoxj/jdk15/lib/rt.jar:/data/aoxj/jd

k15/lib/tools.jar -Dapplication.home=/data/aoxj/jdk15 -Xms8m
23651 Resin -Xss1m -Dresin.home=/data/aoxj/resin -Dserver.root=/data/aoxj/resin -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -

Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl

sudo jps看到的进程数量最全

jps 192.168.0.77

列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099

(前提是远程服务器提供jstatd服务)

注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。

P18

查阅命令帮助信息,command –help, man command.

系统中会有单独的man文件,命令百
man term
等同于
less [manpath]/term.X[.gz] // X为1-8中的数,视term而定
就是说,如果系统没有安装对度应man文件,哪怕term命令完全正常,知man term都没结果(同样,只要安装了man文件,哪怕没term命令,也可以得到道一大堆东西)。内
而–help参数将会显示可执行程序自带的信息,这些信容息是嵌入到程序本身的(所以–help信息较简短)。man是在系统安装的时候安装了狠制多的文档,可以在系统的目录doc下找到,如果软件有配套的页面,就可以使用man来查找,
而 help是软件编写百人员在编写的时候提供了内置的查询参数,查询的参数在程序里度面。也就是说man查询的结果是在程序外面,而help 查询出来的内容在程序里面。

man是一个详细的介绍,help是一个命令选项的简单介绍

man的用法:man ->>manual ###man是手册缩写
man man #####查看man命令的帮助
man passwd ###查看passwd命令的帮助

man的级别
1 系统命令
2 系统接口
3 函数库
4 特殊文件,比如设备文件
5 文件
6 游戏
7 系统的软件包
8 系统管理命令
9 内核

man 5 passwd ##查看/etc/passwd文件的帮助
man 1 passwd ##查看passwd命令的帮助,1可以省略

man页面的快捷方式
上下键 ##向上或向下一行
pageup|pagedown ##向下一个屏幕或者向上一个屏幕
d|u ##向下或者向上半个屏幕
G|gg ##跳转页面到man最下面或最上面
/关键字 ##搜索关键字,关键字会高亮显示,n向下匹配,N向上
q ##退出帮助页面

P21

内存地址存数据

在C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处:

1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效;

2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;

3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。

3.1 声明并初始化一个指针

  指针其实就是一个变量,指针的声明方式与一般的变量声明方式没太大区别:

1
2
3
4
5
int *p;        // 声明一个 int 类型的指针 p
char *p // 声明一个 char 类型的指针 p
int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针

  指针的声明比普通变量的声明多了一个一元运算符 “”。运算符 “” 是间接寻址或者间接引用运算符。当它作用于指针时,将访问指针所指向的对象。在上述的声明中: p 是一个指针,保存着一个地址,该地址指向内存中的一个变量; *p 则会访问这个地址所指向的变量。

  声明一个指针变量并不会自动分配任何内存。在对指针进行间接访问之前,指针必须进行初始化:或是使他指向现有的内存,或者给他动态分配内存,否则我们并不知道指针指向哪儿,这将是一个很严重的问题,稍后会讨论这个问题。初始化操作如下:

复制代码

1
2
3
4
5
6
7
8
/* 方法1:使指针指向现有的内存 */
int x = 1;
int *p = &x;  // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址

/* 方法2:动态分配内存给指针 */
int *p;
p = (int *)malloc(sizeof(int) * 10);    // malloc 函数用于动态分配内存
free(p);    // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h

复制代码

  指针的初始化实际上就是给指针一个合法的地址,让程序能够清楚地知道指针指向哪儿。

3.2 未初始化和非法的指针

   如果一个指针没有被初始化,那么程序就不知道它指向哪里。它可能指向一个非法地址,这时,程序会报错,在 Linux 上,错误类型是 Segmentation fault(core dumped),提醒我们段违例或内存错误。它也可能指向一个合法地址,实际上,这种情况更严重,你的程序或许能正常运行,但是这个没有被初始化的指针所指向的那个位置的值将会被修改,而你并无意去修改它。用一个例子简单的演示一下:

复制代码

1
2
3
4
5
6
7
8
9
#include "stdio.h"

int main(){
int *p;
*p = 1;
printf("%d\n",*p);

return 0;
}

复制代码

  这个程序可以编译通过,但是运行的话会报错,报错信息如下:

img

  要想使这个程序运行起来,需要先对指针 p 进行初始化:

复制代码

1
2
3
4
5
6
7
8
9
10
11
#include "stdio.h"

int main(){
int x = 1;
int *p = &x;
printf("%d\n",*p);
  *p = 2;
printf("%d\n",*p);

return 0;
}

复制代码

  这段代码的输出结果如下:

img

  可以看到,对指针进行初始化后,便可以正常对指针进行赋值了。

3.3 NULL指针

  NULL 指针是一个特殊的指针变量,表示不指向任何东西。可以通过给一个指针赋一个零值来生成一个 NULL 指针。

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdio.h"

int main(){
int *p = NULL;
printf("p的地址为%d\n",p);

return 0;
}

/***************
* 程序输出:
* p的地址为0
***************/

复制代码

  可以看到指针指向内存地址0。在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是为操作系统保留的。但是,内存地址 0 有一个特别重要的意义,它表明改指针不指向一个可访问的内存位置。

四、指针的运算

  C 指针的算术运算只限于两种形式:

1) 指针 +/- 整数 :

   可以对指针变量 p 进行 p++、p–、p + i 等操作,所得结果也是一个指针,只是指针所指向的内存地址相比于 p 所指的内存地址前进或者后退了 i 个操作数。用一张图来说明一下:

img

  在上图中,10000000等是内存地址的十六进制表示(数值是假定的),p 是一个 int 类型的指针,指向内存地址 0x10000008 处。则 p++ 将指向与 p 相邻的下一个内存地址,由于 int 型数据占 4 个字节,因此 p++ 所指的内存地址为 1000000b。其余类推。不过要注意的是,这种运算并不会改变指针变量 p 自身的地址,只是改变了它所指向的地址。举个例子:

2)指针 - 指针

  只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。两个指针相减的结果的类型是 ptrdiff_t,它是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。举个例子:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdio.h"

int main(){
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int sub;
int *p1 = &a[2];
int *p2 = &a[8];

sub = p2-p1;
printf("%d\n",sub);    // 输出结果为 6

return 0;
}

复制代码

五、指针与数组

  在C语言中,指针与数组之间的关系十分密切。实际上,许多可以用数组完成的工作都可以使用指针来完成。一般来说,用指针编写的程序比用数组编写的程序执行速度快,但另一方面,用指针实现的程序理解起来稍微困难一些。

5.1 指针与数组的关系

  我们先声明一个数组:

1
int a[10];        // 声明一个int类型的数组,这个数组有10个元素

  我们可以用 a[0]、a[1]、…、a[9] 来表示这个数组中的10个元素,这10个元素是存储在一段连续相邻的内存区域中的。

  接下来,我们再声明一个指针:

1
int *p;           // 声明一个int类型的指针变量

   p 是一个指针变量,指向内存中的一个区域。如果我们对指针 p 做如下的初始化:

1
p = &a[0];        // 对指针进行初始化,p将指向数组 a 的第 1 个元素 a[0]

  我们知道,对指针进行自增操作会让指针指向与当前元素相邻的下一个元素,即 (p + 1) 将指向 a[1] ;同样的, (p + i) 将指向 a[i] 。因此,我们可以使用该指针来遍历数组 a[10] 的所有元素。可以看到,数组下标与指针运算之间的关系是一一对应的。而根据定义,数组类型的变量或表达式的值是该数组第 1 个元素的地址**,且数组名所代表的的就是该数组第 1 个元素的地址,故,上述赋值语句可以直接写成:

1
p = a;        // a 为数组名,代表该数组最开始的一个元素的地址

  很显然,一个通过数组和下标实现的表达式可以等价地通过指针及其偏移量来实现,这就是数组和指针的互通之处。但有一点要明确的是,数组和指针并不是完全等价,指针是一个变量,而数组名不是变量,它数组中第 1 个元素的地址,数组可以看做是一个用于保存变量的容器。更直接的方法,我们可以直接看二者的地址,并不一样:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdio.h"                                                                          

int main(){
int x[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = x;
printf("x的地址为:%p\n",x);
printf("x[0]的地址为:%p\n",&x[0]);
printf("p的地址为:%p\n",&p);      // 打印指针 p 的地址,并不是指针所指向的地方的地址

p += 2;
printf("*(p+2)的值为:%d\n",*p);    // 输出结果为 3,*(p+2)指向了 x[2]

return 0;
}

复制代码

  结果如下:

img

  可以看到, x 的值与 x[0] 的地址是一样的,也就是说数组名即为数组中第 1 个元素的地址。实际上,打印 &x 后发现,x 的地址也是这个值。而 x 的地址与指针变量 p 的地址是不一样的。故而数组和指针并不能完全等价。

(笔者注:上述输出结果是在 centos7 64bit 的环境下使用 gcc 编译器得到的,可以看到地址是一个12位的十六进制数,转换成二进制是48位,也就是说寻址空间有 256TB,但是笔者的电脑只有 8GB 内存,猜测是不是由于 linux 系统开启了内存分页机制,这里寻址的是虚拟地址?另外,在Windows下使用 vs2015 编译运行的话,则输出结果是一个 8位的十六进制数,也就是32位二进制,寻址空间为 4GB)

5.2 指针数组

  指针是一个变量,而数组是用于存储变量的容器,因此,指针也可以像其他变量一样存储在数组中,也就是指针数组。 指针数组是一个数组,数组中的每一个元素都是指针。声明一个指针数组的方法如下:

1
int *p[10];    // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向int类型的指针

  在上述声明中,由于 [] 的优先级比 * 高,故 p 先与 [] 结合,成为一个数组 p[];再由 int * 指明这是一个 int 类型的指针数组,数组中的元素都是 int 类型的指针。数组的第 i 个元素是 p[i],而 *p[i] 是一个指针**。由于指针数组中存放着多个指针,操作灵活,在一些需要操作大量数据的程序中使用,可以使程序更灵活快速。

5.3 数组指针

  数组指针是一个指针,它指向一个数组。声明一个数组指针的方法如下:

1
int (*p)[10];        // 声明一个数组指针 p ,该指针指向一个数组

  由于 () 的优先级最高,所以 p 是一个指针,指向一个 int 类型的一维数组,这个一维数组的长度是 10,这也是指针 p 的步长。也就是说,执行 p+1 时,p 要跨过 n 个 int 型数据的长度。数组指针与二维数组联系密切,可以用数组指针来指向一个二维数组,如下:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdio.h"

int main(){
int arr[2][3] = {1,2,3,4,5,6}; // 定义一个二维数组并初始化
int (*p)[3]; // 定义一个数组指针,指针指向一个含有3个元素的一维数组

p = arr; // 将二维数组的首地址赋给 p,此时 p 指向 arr[0] 或 &arr[0][0]
printf("%d\n",(*p)[0]);             // 输出结果为 1
p++;                         // 对 p 进行算术运算,此时 p 将指向二维数组的下一行的首地址,即 &arr[1][0]
printf("%d\n",(*p)[1]); // 输出结果为5

return 0;
}

复制代码

六、指针与结构

6.1 简单介绍一下结构

  结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。由于结构将一组相关的变量看做一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据,特别是在大型的程序中。声明一个结构的方式如下:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct message{            // 声明一个结构 message
char name[10]; // 成员
int age;
int score;
};

typedef struct message s_message;     // 类型定义符 typedef

s_message mess = {"tongye",23,83};    // 声明一个 struct message 类型的变量 mess,并对其进行初始化 

--------------------------------------------------------------------------------------------------------------
/* 另一种更简便的声明方法 */
typedef struct{
  char name[10];
  int age;
  int score;
}message;

复制代码

  可以使用 结构名.成员 的方式来访问结构中的成员,如下:

复制代码

1
2
3
4
5
6
7
8
#include "stdio.h"

int main(){
  printf("%s\n",mess.name);    // 输出结果:tongye
  printf("%d\n",mess.age);     // 输出结果:23

  return 0;
}

复制代码

6.2 结构指针 

  结构指针是指向结构的指针,以上面的结构为例,可以这样定义一个结构指针:

1
2
s_message *p;        // 声明一个结构指针 p ,该指针指向一个 s_message 类型的结构
*p = &mess;      // 对结构指针的初始化与普通指针一样,也是使用取地址符 &

  C语言中使用 -> 操作符来访问结构指针的成员,举个例子:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdio.h"

typedef struct{
char name[10];
int age;
int score;
}message;

int main(){
message mess = {"tongye",23,83};
message *p = &mess;

printf("%s\n",p->name);      // 输出结果为:tongye
printf("%d\n",p->score); // 输出结果为:83

return 0;
}

复制代码

七、指针与函数

  C语言的所有参数均是以“传值调用”的方式进行传递的,这意味着函数将获得参数值的一份拷贝。这样,函数可以放心修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数。

7.1 指针作为函数的参数

  传值调用的好处是是被调函数不会改变调用函数传过来的值,可以放心修改。但是有时候需要被调函数回传一个值给调用函数,这样的话,传值调用就无法做到。为了解决这个问题,可以使用传指针调用。指针参数使得被调函数能够访问和修改主调函数中对象的值。用一个例子来说明:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "stdio.h"

void swap1(int a,int b)       // 参数为普通的 int 变量
{
  int temp;
  temp = a;
  a = b;
  b = temp;
}

void swap2(int *a,int *b)      // 参数为指针,接受调用函数传递过来的变量地址作为参数,对所指地址处的内容进行操作
{
  int temp;     // 最终结果是,地址本身并没有改变,但是这一地址所对应的内存段中的内容发生了变化,即x,y的值发生了变化
  temp = *a;
  *a = *b;
  *b = temp;
}

int main()
{
  int x = 1,y = 2;
  swap1(x,y); // 将 x,y 的值本身作为参数传递给了被调函数
  printf("%d %5d\n",x,y); // 输出结果为:1 2

  swap(&x,&y); // 将 x,y 的地址作为参数传递给了被调函数,传递过去的也是一个值,与传值调用不冲突
  printf("%d %5d\n",x,y); // 输出结果为:2 1
  return 0;
}

复制代码

7.2 指向函数的指针

  在C语言中,函数本身不是变量,但是可以定义指向函数的指针,也称作函数指针,函数指针指向函数的入口地址。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。 声明一个函数指针的方法如下:

1
2
3
返回值类型 (* 指针变量名)([形参列表]);

int (*pointer)(int *,int *); // 声明一个函数指针

  上述代码声明了一个函数指针 pointer ,该指针指向一个函数,函数具有两个 int * 类型的参数,且返回值类型为 int。下面的代码演示了函数指针的用法:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "stdio.h"
#include "string.h"

int str_comp(const char *m,const char *n); // 声明一个函数 str_comp,该函数有两个 const char 类型的指针,函数的返回值为 int 类型
void comp(char *a,char *b,int (*prr)(const char *,const char*)); // 声明一个函数 comp ,注意该函数的第三个参数,是一个函数指针

int main()
{
char str1[20]; // 声明一个字符数组
char str2[20];
int (*p)(const char *,const char *) = str_comp;            // 声明并初始化一个函数指针,该指针所指向的函数有两个 const char 类型的指针,且返回值为 int 类型
gets(str1); // 使用 gets() 函数从 I/O 读取一行字符串
gets(str2);
comp(str1,str2,p); // 函数指针 p 作为参数传给 comp 函数

return 0;
}

int str_comp(const char *m,const char *n)
{
   // 库函数 strcmp 用于比较两个字符串,其原型是: int strcmp(const char *s1,const char *s2);
if(strcmp(m,n) == 0)
return 0;
else
return 1;
}

/* 函数 comp 接受一个函数指针作为它的第三个参数 */
void comp(char *a,char *b,int (*prr)(const char *,const char*))
{
if((*prr)(a,b) == 0)
printf("str1 = str2\n");
else
printf("str1 != str2\n");
}

复制代码

  这段代码的功能是从键盘读取两行字符串(长度不超过20),判断二者是否相等。

  注意,声明一个函数指针时,() 不能漏掉,否则:

1
int *p(void *,void*);

  这表明 p 是一个函数,该函数返回一个指向 int 类型的指针。

1
2
char a='a';
char *pa=&a;

指针长度:以前是16位地址,指针即为2个字节,现在一般是32位系统,所以是4个字节,以后64位,则就占8个字节。

避免访问未初始化指针

1
int *a; *a=123;//野指针

P22

&取值操作符

数组名就是地址信息,也是第一个元素的地址。

当指针指向数组元素是,可以对指针变量进行加减运算。指针加一指向下一个元素。

P11

1
2
3
4
5
6
scanf("%d", &i);//地址
if(i>0)
printf("true");//这样缩进可以
if(){}
else if(){}
else{}

P12

1
2
3
4
5
6
7
switch(表达式){
case 常量表达式1:语句或代码块;
case ...
.
.
default: 语句或代码块;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(){
char ch;
scanf("%c",&ch);
switch(ch){
case 'A': printf("hi");
break;
case 'B': printf("hey");
break;
default: printf("hello");
break;//不加break会导致所有case都输出了
}
}
1
if(has = "a"){}//永远对,所以应该 ==

P13

1
int getchar();//读取下一个字符
1
2
3
4
while(){}//判断后循环
do{

}while();//先循环在判断,while后面有语句

P14

1
2
3
4
for(循环初始;循环结束;循环条件){}
_Bool flag = 1;
for(int i=0, int j=0;i<j;i++,j++){}//也可以
若想 int i=0, j=10;//则需 gcc -std=c99 test.c && ./a.out

P15

1
2
long longprintf中是%lld
break跳出当前循环,continue直接进入下一次循环

P16

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int i=5, j;
j=++i;//i=6=j
i=5;
j=i++;//i=6,j=5
//i++先把值给j,再加加
//多语句,逗号表达式
/* 语法:表达式1,...表达式n
表达式从左到右计算
逗号表达式作为一个整体,值为最后一个表达式也就是n的值
*/
a=(b=3, (c=b+4) +5)//a=12
exp1 ? exp2:exp3 //if exp1==true , exp2, else: exp3
//goto 跳到标签
goto A;//谨慎用goto
A: printf("a");

P17

1
2
3
4
5
6
7
//数组 类型 数组名[元素个数]
/*数组不能动态定义
int 自动初始化为0,最好手动初始化,要不然栈内空间会错误赋值,可能。
int a[5]={[2]=2,[3]=3};//这样可以
sizeof(a);//计算数组内存大小

*/

P18

1
2
3
//动态数组
c99, c支持可变长数组,数组长度在运行时才被决定
新编译, 在数组越界不会出现错误,好像

P19

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
字符串数组定义:
char s[3]={'a','b','\0'};
char s[]={'a','b','\0'};
char s[]={"ab"};
char s[]="ab";
字符串处理函数:<string.h>内
strcat:连接字符串
strcmp:比较字符串
strcpy:拷贝字符串
strlen:获取长度
strncat(str1,str2,5):(以下3个受限,功能一样)//str2拷贝5个字符到str1
strcmp:
strncpy:
sizeof(str);//n
strlen(str);//n-1, 因为strlen不包括那个\n,sizeof包括

1 字符串基础

字符串是一种重要的数据类型,有零个或多个字符组成的有限串行。

定义子串: 串中任意个连续的字符组成的子序列,并规定空串是任意串的子串,任意串也是其自身的子串,如字符串”adereegfb”中它本身、空串、诸如”ader”连续的字符串都是它的子串。子序列则不要求字符连续,但顺序要与主串保持一致,若有”abcd”与”ad”则两者的最长公共子序列为”ad”。在动态规划中计算最长公共子序列和最长公共子串中一定要能区分这两个概念!

在C语言中并没有显示的字符串类型,它有如下两种风格的字符串:

  • 字符串常量: 以双引号扩起来的字符序列,规定所有的字符串常量都由编译器自动在末尾添加一个空字符
  • 字符数组: 末尾添加了’\0’的字符数组,一般需要显示在末尾添加空字符。
1
2
3
char c1[]={'c','+','+'}; //末尾没有空字符
char c2[]={'c','+','+','\0'}; //末尾显示添加空字符
char c3="c++"; //末尾自动添加空字符

注意到通过字符数组初始化和字符串常量初始化并不完全相同的。因为字符串常量包含一个额外的空字符用于结束字符串,用它来初始化创建数组时,末尾会自动添加空字符。所以c1的长度是3,后两者的长度是4,并且字符数组c2和c3都被称为C风格字符串,而字符数组c1不是C风格字符串。

规定C风格的字符串都是以NULL空字符(‘\0’)作为终结符结尾。由于它是字符串的终止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NULL字节,如strlen函数。而且C标准库中提供的各种字符串处理函数都要求提供的字符串或字符数组必须以空字符结束,否则会出现不可预料的结果。如:

1
2
char c[]={'c','+','+'};
printf("%d\n",strlen(c)); //结果输出为6,这是不正确的

2 标准库中的字符串处理函数

C标准库中头文件定义了两组字符串函数(C++中用表示)。

  • 第一组函数的名字以str开头,它主要处理以’\0’结尾的字符串,所以字符串内部不能包含任何’\0’字符。
  • 第二组函数的名字以mem开头,主要考虑非字符串内部含有零值的情形,它能够处理任意的字节序列,操作与字符串函数类似
  • 除了memmove函数外,其他函数都没定义重叠对象间的行为

为了提高程序在不同机器上的移植性,利用typedef定义新类型名,即typedef unsigned int size_t。 程序员必须要保证目标字符数组的空间能够足以存放结果字符串(有可能存在字符数组溢出的危险)

  • 字符串处理类

如下表为字符串处理函数说明,变量s,t的类型是char *, cs和ct的类型是const char *;n的类型为size_t,c的类型为int

img

  • 内存操作类

按照字节数组的方式操作对象,提供一个高效的函数接口(提供字节流的访问)。其中s,t类型是void * , cs,ct的类型是const void *; n类型为size_t,c类型为int

img

总结起来,头文件< string.h>实现了如下函数:

  • 长度计算、长度不受限和受限的复制、连接和比较版本的函数
  • 基础字符串查找(查找一个字符、一组字符和匹配一个子串)、高级字符串查找(查找子串前缀位置、返回token标记)
  • 处理任意字节序列的内存操作如复制、比较、查找和初始化等函数

P20

1
2
//二维数组矩阵
和一维数组一样