Linux基础知识和一些shell命令

一些小知识:
1. OS(Operation System),操作系统。

  1. 服务器三大操作系统:
    Windows
    Linux
    Unix
    3
    . 开源(Open Source):
    让世界上的所有人都能看到软件和源代码,并且只要有人愿意,都可以对其修改和创造衍生品。

  2. 开源许可证:
    即使能让人自由使用,也有一些版权问题。所以要遵循一些规定,这些规定有不同的版本,有严格的,有宽松的,它们就叫做开源许可证。例如:GPLv2、GPLv3、Apache等。

  3. Linux系统中的用户,分为管理员(root)和普通用户。管理员就是玉皇大帝,想干什么都行,管理普通用户什么的,即使损害系统也被允许。普通用户要遵守一定的规则,只能管自家的一亩三分地,屁民。

  4. Shell:
    翻译成中文叫外壳,挺形象的。用户不能直接操作系统内核(kernel),中间隔着一层内核的外壳,但用户可以把命令写在外壳上,外壳再跟内核交流。就是一种命令解释器。

  5. 命令提示符:
    按字面理解,再这个提示符后面输入想要执行命令。可以自己设置格式和颜色,推荐换成绿色的,看着舒服点。

一些shell的命令(COMMAND)和用它们的相关知识:

cd DIRECTORY

(change directory)可以切换目录,就是切换目前自己的位置,类似于图形界面下,打开文件夹。
绝对路径:以/开始,完整的文件的位置路径;
相对路径:不以/开始,指定相对于当前工作目录或某目录的位置。
基名:最右的那个名;
目录名:除了最右的那个名。
Linux中当前目录可以用.表示。

cd ..
去当前目录的上一级。

cd -
可以在上一个目录(oldpwd)和现在目录(pwd)中来回切换。

pwd

显示当前的工作目录。

ls

(list directory contents)显示当前目录内容,但不递归显示。
显示的信息都是元数据,最左侧的字母表示文件的类型,然后剩下九个,左三位是文件属主,中间是属组,后三位是用户
r —> read;w —> write ;x —>exec

ls -l
以长型显示额外信息

ls -a
显示隐藏文件

ls -l -d
显示当前目录的自身信息

ls -1
文件分行显示

ls -t
按mtime显示。(modify time ,修改时间,后面会解释)

ls -i
可以显示文件的inode号。(inode号每个文件都有一个,标识文件储存的位置)

stat FILE

atime(access time):访问时间,最近一次读取的时间;
mtime(modify time):数据内容的修改时间;
ctime(change time):元数据的修改时间。
数据变了,元数据一定变;但元数据变了,数据未必会变
stat命令很重要,工作时会通过时间戳看文件是否被人非法改变过

touch [OPTION] FILE

用于改时间戳的

touch -a -m
可以修改atime和mtime到当前的时间

touch -t TIME
改成指定时间,例如:201806300000.00

touch“摸”某个文件时,如果文件不存在,就会创建一个新的空文件。

touch -c FILE
这样就不会创建新文件

cp FILE DIRECTORY

例:cp /etc/passwd /tmp/
把/etc里的passwd文件,复制一个,放入/tmp中
文件可以是多个,也可以是一个,路径也可以是文件。一个文件,一个路径文件,这样就把原来的覆盖这个了;如果文件是多个,路径是一个,就是把这些都复制过去;文件是多个,一个路径文件,就会报错。
可以用通配符复制
复制的逻辑是,先创建一个空文件,再把原有的数据导入里面

cp -r (recursive)
递归复制,把一个目录和目录里的所有文件都复制过去。

cp -i
复制之前确认一下,专业叫做交互式。

cp -p INFORMATION
复制之后保留某些信息。

cp -a
复制后,保留了属主属组的信息.

cp -u
若源文件比目标文件新,则覆盖,否则跳过 .

mv [OPTION] FILE DIRECTORY

移动,如果源和目标在同一个目录先,相当于重命名。不在的话,表示移动
mv和cp的[OPTION]几乎都一样,参考上面的。

rm

删除,默认删文件;如果是目录,默认不删,但是可以用 -r 删除目录下所有文件。

rm -f(force)
强制删除

rm -r(recursion)
递归删除,就是一层一层的把目录下所有的文件和目录路径都删除。

tree DIRECTORY

显示目录树(个人觉得十分有用,并且我经常用)

-d
只显示目录,不显示文件。

-l 层数
显示目录下的几层。

-p
配合文字通配符使用,筛选出符合条件的文件,以目录树的形式输出

mkdir

创建目录,最后的基名,才是创建的目录,前面的目录名,必须是存在的。

-v
可以显示创建过程。

-p
如果父目录不存在,就创建父目录。

ln FILENAME LINKNAME

创造一个硬链接,啥叫硬链接呢,我觉得就是,文件不动,复制了一个文件名和inode号。

ln -s FILENAME LINKNAME
创造一个软连接,那啥又叫软连接呢,类似于windows里的快捷方式。原文件在,软连接有效,原文件不在,软连接失效。但是替换原文件内容,只要文件名不变,软连接就有效。

输出重定向

>
指定一个文件,把输出的内容输出到这个,我定的文件里。
如果没有这个文件,就会创造一个这个文件。
如果有这个文件,就会覆盖原文件的内容。
如果输出内容的文件不存在,就会报错,输出 错误输出。

>
追加,和上面的同理
例:
cat /tmp/test.txt > /tmp/exist.txt
cat /tmp/test2.txt >> /tmp/exist.txt
把test.txt文件内容,输出到同目录下的exist.txt中
把test2.txt文件内容,追加输出到同目录下的exist.txt中,并且不覆盖exist.txt文件中原有的内容

输入重定向,

<
一般都不会使用的,因为例如:
cat /etc/test.txt 就是把keyboard输入重定向为/etc下的test.txt文件了
<<
有一个特殊的用法,此处创建文档,here document,就在命令所在处,把输入的任何内容输入创建的文档,二者综合使用:
例如:
cat > /tmp/test.txt << EOF
# EOF是End Of File的意思,这个命令就是把,在keyboard上输入的内容,输出在/tmp/下的test.txt文件中。
输入完了要再输入EOF表示输入完毕。

错误输出重定向

2>
例:
cat /tmp/test.doc 2> /tmp/error
# 假设这个test.doc不存在,按理说是错误输出,此时就会把这个错误输出,储存在/tmp下的error文件中,输出设备(terminal monitor)上什么都不会显示。
# 但是假设test.doc存在,那么这个命令就是正确的,不会报错,输出显示在输出设备(terminal monitor)上,并且就不会有数据输入进error中

和 2>联合使用
例如:
cat /tmp/test.txt > /tmp/unkonw.txt 2> /tmp/error
# 如果unknow.txt文件存在,就输入到这个文件中,如果不存在,就输入到error中,terminal monitor中什么都不显示。

&>
不管正确输出还是错误输出,都放在一个文件里,两个输出流合并为一
例:

/PATH/TO/SOMEFILE 2>&1

file FILE

查看文件的类型,以内容来判断
文件信息开头字符表示文件类型:
b,block device 块设备文件
c,character device 字符设备文件
p,pipe 管道文件
s,socket 套接字符文件

管道:

COMMAND1 | COMMAND2 | COMMAND3,用来连接命令

输入输出重定向的另一种方式,一般程序都要有三路数据流,输入,正确输出,错误输出。
用 | 来分隔,前一个命令的输出,是后一个命令的输入(有的命令后面要加 - ,来接受前面的命令)。
最后一重管道在子shell中执行。

tee
可以在管道中实现一路输入,两路输出
例:
cat /test/a.txt | tr ‘a-z’ ‘A-Z’ | tr -d ‘abc’ | tee /test/dir1/b
# 在terminal monitor中输出,把小写全转换成大写,并且删除了abc三个字母的文本;并且把文本储存在/test/dir1/的b文件中。

tr

字符转换命令,translation
例:
tr ‘a-z’ ‘A-Z’ <
# 把小写全部转换成大写

tr -d ‘*’
把某些字符删除

cat

(concatenate files)显示文件内容
例:
cat /test/a.txt /test/dir1/b
# 可以把两个文件链接起来显示

tac

倒着显示文件内容,是按行数从下到上显示,不是从后向前倒着

less

一页一页查看文件。
man命令其实是以less来实现的,翻页方法和man
都是一样的

more

也是查看文件,与less区别是不能往上翻。一旦翻到文件尾页,就会自动退出

useradd NAME

增加一个用户
添加用户,添加组,只有管理员有权限
(usermod、userdel和下面同理)

useradd -c “content”
可以为用户信息添加注释,用于描述用户是干嘛的

useradd -g NAME
(group)创建一个属于某个基本组的新用户

useradd -G NAME1,NAME2 用户名
(Group)把NAME1和NAME2 设置为用户的附加组

useradd -d 目录 NAME
(directory)创建一个家目录为输入的目录的用户

useradd -s shell的路径 NAME
(shell)用于创建一个shell类型为输入类型的新用户

(usermod -G NAME改附加组的时候,只输入新的组,那会把原有的覆盖,直接输入想要用户加的所有附加组)
(usermod -a -G NAME来改附加组,这样原有的附加组是不变的)

usermod -d DIRECTORY NAME

修改家目录,只改了路径,不会把文件移过去,所以一般要协同是用 -m选项,就是把家目录和家目录里的文件都转移过去

(创建系统用户的时候,默认不会创建家目录的,要是想让系统用户也创建家目录,要用 useradd -r -m NAME,这样就有家目录了)
(创建普通用户的时候,想让普通用户不创建家目录,要用 useradd -M NAME,这样就没有家目录了,这俩是相反的)

userdel NAME

删除用户的时候,家目录是不会被删除的,想要连家目录一起删除了,要使用userdel -r NAME

groupadd NAME

增加一个组

groupadd -g GID NAME
可以指定创建组的GID

groupadd -r NAME
可以创建一个系统组

groupmod -n 新名字 旧名字
修改group的名字

groupmod -g 组名字
修改组的GID

groupdel NAME
删除一个组

su - USERNAME

(swith user)相当于su -l USERNAME(login),切换至用户,需要登录,读取目标用户的配置文件。

su USERNAME
非登录式切换,当前用户不变,也不读取配置文件

su USERNAME -c COMMAND
切换到USERNAME的账户下,执行一个COMMAND,不用登录用户

id USERNAME

显示用户的ID号
-u 显示UID,-g显示主要组的UID,-G显示附加组的所有UID

passwd USERNAME

修改当前用户的密码,如果是root,可以用passwd USERNAME修改指定用户的密码

passwd -x 天数
(maxdays)密码最大使用期限,就是到了期限,密码就不能用了

passwd -w
(warndays)提前多少天开始警告用户改密码

passwd -i
(inactivedays)非活动期限,就是这个期间内,用户必须改密码,除了改密码什么都干不了

passwd -n
(mindays)最短使用期限,就是说密码不能老改

passwd -u USERNAME
(unlock)如果用户实在改不了密码,什么期限都错过了,那只能找管理员解锁

passwd -l USERNAME
(lock)root锁定一个用户的密码

–stdin 从标准输入收受用户密码

例:
echo “KEY” | passwd –stdin USERNAME
# 用echo回显的内容设置为,目标用户的密码,通过管道来实现

文件的权限

主要针对三类对象进行定义:

owner: 属主, u

group: 属组, g

other: 其他, o

每个文件针对每类访问者都定义了三种权限

r: Readable

w: Writable

x: Excutable

文件:

r: 可使用文件查看类工具获取其内容

w: 可修改其内容

x: 这个文件内容是一个可执行程序,或脚本。可以把此文件提请内核启动为一个进程

目录(也是磁盘块,储存着文件的inode号和文件名):

r: 可以使用ls查看此目录中文件列表,但是不进入目录

w: 可在此目录中创建文件,也可删除此目录中的文件

x: (权限r不能使用ls -l)可以使用ls -l查看此目录中文件列表,可以cd进入此目录

文件操作权限:
rwx可以用八进制数字来表示,并换算成十进制

转换成二进制:
- -x 001 1
- w - 010 2
-wx 011 3
r- - 100 4
r-x 101 5
rx- 110 6
rwx 111 7

chown USERNAME FILE

(change owner)更改文件的属主
普通用户没有权限更改属主,仅有root可以更改属主
那普通用户怎么把自己的文件共享给某一个人?

facl(访问控制列表,ACL:Access Control List)

getfacl FILE

获取一个文件的访问控制列表

setfacl FILE

例:
setfacl -m u:user1:rw FILE
更改,属主,用户名,权限,目标文件
看用户有没有文件控制权限的时候:先检查属主,再检查属主访问控制列表,再检查属组,再检查属组访问控制列表,再检查其他
例:
setfacl -x g:user1
# 删除访问控制列表权限,用-x。

有一个问题,密码储存在/etc/shadow中,它的权限是管理员,但是普通用户可以修改密码,修改密码意味着改了/etc/shadow。
命令(程序)的属主和属组,和进程的属主和属组是不一样的。
s权限,如果一个命令本身,有s权限,那么无论谁启动,都是以文件自身的属主来运行。(尚方宝剑的功效)

Linux上文件系统的特殊权限:SUID, SGID, Sticky

SUID:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限。
启动为进程之后,其进程的属主为原程序文件的属主。

SUID只对二进制可执行程序有效

SUID设置在目录上无意义
权限设定:

chmod u+s FILE…

chmod u-s FILE…

普通用户修改密码,但是储存在/etc/shadow中就是这个权限,shadow只有管理员有权限

SGID:

chown g+s FILE

与上同理

s分大小写,如果以前权限,写成s,如果没有,就写成S。
更改用u,g,o,+s或者-s在,来增加和移除s权限

Sticky:
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权。t权限,在无主之地上,例如/tmp/上,可以随便创建文件,和随便更改权限,但是删除只能删除自己创建的文件

在目录设置Sticky 位,只有文件的所有者或root可以删除该文件

sticky 设置在文件上无意义

chmod o+t DIR…

chmod o-t DIR…

chown USERNAME:USERNAME FILE

同时更改文件属主和属组。左侧是属主,右侧是属组,不改就不写
这个也可以用 –reference

chown -R

递归修改属主,注意是大R

chgrp

(change group)更改文件的属组

chgrp -R

递归修改属组

chmod

(change mode)修改文件的权限,普通用户只能改自己的文件权限
可以从三个层次改:
更改属主和属组,
一次更改属主和属组的权限,一次改三种
更改属主属组权限,一次改一种
例:
chmod 777 FILE
一次给所有人权限,如果三个数字没给够,那么从左侧补零
普通文件不要给执行权限,除非确定要给执行权限。但是目录定得有执行权限
文件一般是744,目录一般是755

chmod g=rwx FILE

更改某一类权限,g是属组(group),o是其他(other),u是属主(user)
三个同时改可以-ugo,或者用-a

chmod u+x FILE
更改一类权限,属主增加x,执行权限

chmod go+x FILE
组合用,更改go的权限,增加x(增加rwx同理)
移除的话,用减号
修改所有用户的同一个权限位
+w的话,仅仅是属主权限增加了w;但是+x,属主属组其他都加了x。因为如果所有人都能写,那么文件就失控了。

chmod –reference=STANDARD FILE
把某个文件的权限作为标准,把目标文件照着标准更改

cat [OPTION] FILE

链接文件,并显示出来,是直接全部dump(倾倒)在terminal monitor上。

-E: 显示行结束符$

-n: 对显示出的每一行进行编号

-A:显示所有控制符

-b:非空行编号

-s:压缩连续的空行成一行

tac

把文件行倒着显示,最后一行变成第一行,但是每行的顺序不变
OPTION用法和cat一样

head FILE

显示文件内容的前十行

head -n FILE
显示文件的前n行

tail

显示文件内容的后十行
与上同理

tail -f FILE
写出后十行,但是不退出,能以监视的动作显示文件更改的内容

cut

按分隔符,找到第几个,显示出来
-d
后面接分隔符,看以哪个分隔符来分成不同的段
-f
第后面接第几段,可以取多段,用,隔开,取第几段到第几段,用-

wc

(words count)看一段文件有多少个行,多少个字符,多少个字节。

-l 只显示行

-w 只显示字符

-c (byte)只显示字节

-m 只计数字符总数

-L 显示文件中最长行的长度

sort FIRECTORY

排序,一排序,相同的内容就在一起了

-r (reverse)反着排序

-n(numeric)按数值排序

-u(unique)去除重复的,只显示不重复的

-c(count)显示了重复了多少次

-d(duplicate)只显示重复的

diff FILE1 FILE2

用来比较两个文件,两个目录的不同文件,并且生成补丁
输出重定向,然后用.patch结尾,补丁就做好啦

patch

打补丁的工具
例:
patch PATCH FILE

rev FILE or FILES

把文件内容倒着显示,是一行里,从后往前显示,但是行是从上往下显示

paste

把两个文件的内容,按行号,放在同一行显示

-s : 把文件内容中的所有行合成一行显示

uniq FILE

(unique)从输入中删除上下相邻的,内容重复的行。

-c: 显示每行重复出现的次数

-d: 仅显示重复过的行

-u: 仅显示不曾重复的行
连续且完全相同方为重复

grep:

Global search Regular expression and Print out the line,全局搜索正则表达式,并显示出来

grep [OPTION] PATTERN [FILE]
PATTERN 模式,由正则表达式字符(原字符)及文本字符所编写的过滤条件
匹配到的字符高亮显示

-v 取反,没匹配的显示,匹配的不显示
基本正则表达式字符匹配..
字符个数匹配,?, * , { } , ( ) 前面要加反斜线\(逃逸符)来转义: \? * { }

grep ‘^$’ /etc/passwd
查找空白行
包含空白字符的行,不叫空白行

可以锚定 行首 ^ 和 行尾 $
可以锚定 词首 \< 和 词尾 > ,要一个精确的单词,就词首词尾都锚定一下。(\b \b 也可以达到同样效果)

搜索IP地址,用正则表达式很难。

()可以限定括号内内容,分组

后向引用机制:

\1

(r..t).*\1
后面的\1代表前面的(r..t)

\1 引用第一次括号内出现的内容
\2 就是第二次

sed [OPTION] ‘SCRIPT’ FILE

一款文本查找编辑工具,支持正则表达式。

-n
不输出模式空间内容到屏幕,即不自动打印

-e
多点编辑

-f
/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本

-r
支持使用扩展正则表达式

-i.bak
备份文件并原处编辑

sed工具可以限定查找的地址,如果不限定,就全局进行查找:
sed地址:

#: 指定的行,$:最后一行

/pattern/:被此处模式所能够匹配到的每一行

# LINE

#,+#

/pat1/,/pat2/

#,/pat1/

~
步进
例:
1~2 奇数行
2~2 偶数行

vim FILE

vim是一款特别强大的文本编辑工具。它的操作方式和windows上的操作方式很不一样。描述起来及其复杂,不赘述了(偷懒)。

想要完全玩会vim,推荐每天玩一遍vimtutor,就直接在命令提示符后打vimtutor就能进入,是一个很详尽的vim教程。玩个十天半个月,肯定就记住了。

nano FILE

在没玩vim,之前,可以用nano来修改文件内容,低配版vim。

—————感触—————

学了一些基础的Linux系统之后,见了很多概念,形式大概是:几个简洁的大写字母。看起来十分高大上,也挺难记住的(虽然我不知道记住到底有没有用)。不过如果知道这些概念每个字母都代表什么,再次看见的时候,至少能知道这个概念是个什么东西。例如OS,operation system,知道OS这个概念里的字母是哪个单词之后,低头看看手机,我也知道了啥叫iOS= =!

猜你喜欢

转载自blog.csdn.net/LittleHuang950620/article/details/81278660