• 主页
  • 相册
  • 随笔
  • 目录
  • 存档
Total 244
Search AboutMe

  • 主页
  • 相册
  • 随笔
  • 目录
  • 存档

linux小知识-1

2020-06-22

1. utmp/wtmp

  • utmp 文件的绝对路径是 /var/run/utmp ,该文件通常用 who 命令来读取;

    • utmp日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。
  • wtmp 文件的绝对路径是 /var/log/wtmp ,该文件通常通过 last 命令来读取。

    • wtmp日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端tty或时间显示相应的记录
  • 这两个文件都不是普通的文本文件,所以不能用 cat ,less,more 等命令来查看

  • last命令用了显示用户登录情况,以下是直接显示固定行数的记录:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    last -10
    root pts/0 221.6.45.34 Tue Dec 17 09:40 still logged in
    root pts/0 221.6.45.34 Mon Dec 16 09:00 - 11:57 (02:56)
    root pts/0 222.94.97.122 Sun Dec 15 20:39 - 23:28 (02:48)
    root pts/0 222.95.209.80 Sat Dec 14 14:39 - 14:58 (00:18)
    root pts/0 221.6.45.34 Thu Dec 12 16:55 - 17:37 (00:41)
    root pts/0 49.65.139.195 Wed Dec 11 20:40 - 21:16 (00:35)
    root pts/0 49.65.139.195 Wed Dec 11 19:46 - 20:03 (00:17)
    root pts/0 221.6.45.34 Tue Dec 10 14:41 - 15:52 (01:10)
    root pts/0 221.6.45.34 Mon Dec 9 17:24 - 17:30 (00:06)
    root pts/0 221.6.45.34 Mon Dec 9 09:38 - 11:41 (02:02)

2. 文件目录data当前权限为rwx — —,只需要增加用户组可读权限,但不允许写操作,具体方法为:

  • chmod+050data
    • 别忘了,文件夹首先要可访问才行,因此不论干什么必须加上x权限

3. 与用户管理相关的配置文件

1
2
3
4
5
6
1.  /etc/passwd  用来存储操作系统用户信息(eg:bin:x:1:1:bin:/bin:/sbin/nologin )
1
2

2. /etc/shadow shadow 是 passwd 的影子文件。(为了安全,现在的linux都提供了 /etc/shadow这个影子文件,密码放在这个文件里面,并且是只有root可读的。 )
3. /etc/group 存储有关本地用户组的信息

4. 程序员小李通过管道统计prog.c函数中for语句通过的次数,需要使用的指令分别是

  • grep “for” proc.c | wc -l

5. 下面对linux下mysqldump备份命令及参数描述正确的是

  • mysqldump -h ip -uroot -p DBNAME >bck.sql

6. 终止一个前台进程

  • 终止一个前台进程用 ctrl+C;
  • 终止一个后台进程:1、使用kill命令;2、使用fg命令将后台进程变为前台进程,然后 ctrl+C。

7. linux内核锁

Linux的内核锁主要是自旋锁、顺序锁和信号量。

  • 自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。
  • spin_lock自旋锁对于临界区是不做区分的,而读写锁是对临界区做读写区分,并且度进程进入临界区的几率比较大,因为写进程进入时需要等待读进程退出临界区。而有没有一种方法,可以保护写进程的优先权,使得写进程可以更快的获得锁? 答案是有的,就是顺序锁。顺序锁的设计思想是:对某一个共享数据读取的时候不加锁,写的时候加锁。同时为了保证读取的过程中因为写进程修改了共享区的数据,导致读进程读取数据错误。在读取者和写入者之间引入了一个整形变量sequence,读取者在读取之前读取sequence, 读取之后再次读取此值,如果不相同,则说明本次读取操作过程中数据发生了更新,需要重新读取。而对于写进程在写入数据的时候就需要更新sequence的值。
  • Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务(优先级最高的任务)将被唤醒,从而便可以获得这个信号量。信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。

8. 打印文件(demo.log)中包含ERP的行到标准输出

  • sed -n '/ERP/p' demo.log

9. Unix系统中,哪些可以用于进程间的通信

Linux进程间通信:管道、信号、消息队列、共享内存、信号量、套接字(socket)
Linux线程间通信:互斥量(mutex),信号量,条件变量
Windows进程间通信:管道、消息队列、共享内存、信号量 (semaphore) 、套接字(socket)
Windows线程间通信:互斥量(mutex),信号量(semaphore)、临界区(critical section)、事件(event)

1
2
3
4
5
6
7
8
9
10
 unix进程间的通信方式
(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
(3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
(4)消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
(5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
(6)内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
(7)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
(8)套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

进程是相互独立的,所以进程间通信大多不需要锁,需要的锁也是文件锁之类的“大锁”,并不需要条件变量、互斥锁这些机制来同步,进程之间对资源的使用由操作系统的进程调度部分来完成。线程需要互斥锁的原因是,除了线程栈里的东西其他都是共享的,需要你自己来完成变量级别的同步。


另外,线程之间的叫同步,进程之间的叫通信

10. fork

fork()系统调用会通过复制一个现有进程来创建一个全新的进程. 进程被存放在一个叫做任务队列的双向循环链表当中.链表当中的每一项都是类型为task_struct成为进程描述符的结构.也就是进程PCB.

10.1. 为什么fork成功调用后返回两个值?

由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。所以fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值不同,
其中父进程返回子进程pid,这是由于一个进程可以有多个子进程,但是却没有一个函数可以让一个进程来获得这些子进程id,那谈何给别人你创建出来的进程。而子进程返回0,这是由于子进程可以调用getppid获得其父进程进程ID,但这个父进程ID却不可能为0,因为进程ID0总是有内核交换进程所用,故返回0就可代表正常返回了。

11. vim

  • wq 强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。
  • x! 写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间

12. 查找更改时间比文件file1新但比文件file2旧的文件

find -newer file1 ! -newer file2

13. 文件

  • /etc/rc.d/rc.local:一个启动加载配置文件,这个配置文件会在用户登陆之前读取,这个文件中写入了什么命令,在每次系统启动时都会执行一次。也就是说,如果有任何需要在系统启动时运行的工作,则只需写入 /etc/rc.d/rc.local 配置文件即可。把一个程序加入开机启动,一般也可以通过修改rc.local来完成。
  • /proc/cpuinfo:cat查看CPU信息命令
  • /proc/meminfo:cat查看内存信息命令
  • /proc/swaps:cat查看所有swap分区的信息

    Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况

  • /etc/fstab:存放文件系统的静态信息的文件;当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录
  • /sbin/init:在核心完整的加载后,开始运行系统的第一支程序,主要的功能就是准备软件运行的环境,包括系统的主机名称、网络配置、语系处理、文件系统格式及其他服务的启动等
  • /bin/sh:解释脚本的shell命令,开机后运行
  • /etc/inittab:定义了系统引导时的运行级别, 进入或者切换到一个运行级别时做什么,即init进程的配置文件

14. linux启动流程

1
2
3
4
5
6
7
1,BIOS加电自检;
2,从硬盘0柱面 0磁道 第一扇区读512字节的MBR主引导记录;
3,运行引导程序Grub并根据其配置加载kernel镜像后初始化;
4,根据/etc/inittab中系统初始化配置执行/etc/rc.sysinit脚本;
5,根据第3步读到的runlevel值启动对应服务;
6,运行/etc/rc.local;
7,生成终端待用户登录。

15. > 和 >>

  • 他们俩其实唯一的区别就是>是重定向到一个文件,>>是追加内容到文件。两个命令都是如果文件不存在则创建文件。
  • 1>>、2>>、1>、2>:1表示运行程序时程序正确运行输出结果的重定向、2表示运行程序时时程序错误运行信息(如异常信息)的重定向,然后>>与>的区别和上面一样。
  • linux命令执行成功后会返回0

0、1和2分别表示标准输入、标准输出和标准错误信息输出

16. grep -i -r example ./*.cpp

-i ignore 忽略大小写
-r recursion 递归

17. tar命令用于解压的参数是

x 从档案文件中释放文件。相当于拆包

18. 哪些函数调用必须进入内核才能完成?

1
2
3
A.fopen打开文件,肯定需要系统调用。
B.exit退出关闭进程,需要访问进程控制块和线程控制块等,肯定需要系统调用。
C.memcpy,是函数调用,但里面封装了系统调用,使用memcpy这个函数调用,有时候需要用到系统调用,有时候不需要系统调用,不是必须。

19. os模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import os, sys

# 打开文件
fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )

# 写入字符串
os.write(fd, "This is test")

# 文件描述符为 1000
fd2 = 1000
os.dup2(fd, fd2);

# 在新的文件描述符上插入数据
os.lseek(fd2, 0, 0)
str = os.read(fd2, 100)
print "读取的字符串是 : ", str

# 关闭文件
os.close( fd )

# 读取的字符串是 : This is test
  • os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2。
  • os.write() 方法用于写入字符串到文件描述符 fd 中. 返回实际写入的字符串长度
  • os.read() 方法用于从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。
    • fd – 文件描述符。
    • n– 读取的字节。

20. 统计不重行数

cat x.txt | sort -u | wc -l

  • 注意Uniq是连续行去重

21. SELinux

  • 安全增强式Linux(SELinux,Security-Enhanced Linux)是一个Linux内核的安全模块,其提供了访问控制安全策略机制,包括了强制访问控制(Mandatory Access Control,MAC)

  • SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。

将SELinux设置为强制模式(Enforcing Mode):

$ sudo setenforce 1

查询SELinux状态:

$ getenforce

22. chmod vs chcon (DAC vs MAC)

  • 本质:DAC(自主访问控制, Discretionary Access Control) vs MAC
    • 就算是root权限也要看程序能访问啥
  • 有些安全策略,只有用户知道,系统是无法知道的,那么适合自主访问控制。
  • 有些安全策略,系统是已知的,是固定的,不受用户影响的,那么适合强制访问控制。

23. 阻止跨源访问

阻止资源的跨站读取,因为嵌入资源通常会暴露信息,需要保证资源是不可嵌入的。但是多数情况下浏览器都不会遵守 Content-Type 消息头。例如如果在HTML文档中指定 <script> 标记,则浏览器会尝试将HTML解析为JavaScript

24. 查找文件位置

1
2
3
4
whereis python
which python
locate python
find -name test.txt

25. ls -l

1
2
3
4
5
6
7
8
9
10
11
ls -l test.py
-rw-r--r-- 1 root root 695 Sep 8 23:08 test.py

chown test.test test.py
ls -l test.py
-rw-r--r-- 1 hejueyun hejueyun 695 Sep 8 23:08 test.py
# -文件或目录的权限位-文件硬链接数(该字段文件占用一个节点,属于软链接(符号链接))
# -文件(目录)拥有者
# -文件(目录)拥有者所在的组
# -文件所占用的空间(以字节为单位)
# -文件(目录)最近访问(修改)时间
  • 4096:只是显示的目录本身所占用空间.只跟目录内的直接成员数有关,和目录内的文件大小无关.
  • 想要查看实际大小:du
    • 数据单位是Kbytes

26. bash -c

1
2
$ sudo echo "hahah" >> test.csv
-bash: test.asc: Permission denied

这时可以看到 bash 拒绝这么做,说是权限不够。这是因为重定向符号 “>” 和 “>>” 也是 bash 的命令。我们使用 sudo 只是让 echo 命令具有了 root 权限,但是没有让 “>” 和 “>>” 命令也具有 root 权限,所以 bash 会认为这两个命令都没有像 test.csv文件写入信息的权限。

  • echo "hahah" | sudo tee -a test.asc
  • sudo /bin/sh -c 'echo "hahah" >> test.asc'
    • 它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。

/bin/sh -c的必要性_fourierr的博客-CSDN博客

  • Operating System
  • Linux
  • Notes
信安小知识-3
信安小知识-2
  1. 1. 1. utmp/wtmp
  2. 2. 2. 文件目录data当前权限为rwx — —,只需要增加用户组可读权限,但不允许写操作,具体方法为:
  3. 3. 3. 与用户管理相关的配置文件
  4. 4. 4. 程序员小李通过管道统计prog.c函数中for语句通过的次数,需要使用的指令分别是
  5. 5. 5. 下面对linux下mysqldump备份命令及参数描述正确的是
  6. 6. 6. 终止一个前台进程
  7. 7. 7. linux内核锁
  8. 8. 8. 打印文件(demo.log)中包含ERP的行到标准输出
  9. 9. 9. Unix系统中,哪些可以用于进程间的通信
  10. 10. 10. fork
    1. 10.1. 10.1. 为什么fork成功调用后返回两个值?
  11. 11. 11. vim
  12. 12. 12. 查找更改时间比文件file1新但比文件file2旧的文件
  13. 13. 13. 文件
  14. 14. 14. linux启动流程
  15. 15. 15. > 和 >>
  16. 16. 16. grep -i -r example ./*.cpp
  17. 17. 17. tar命令用于解压的参数是
  18. 18. 18. 哪些函数调用必须进入内核才能完成?
  19. 19. 19. os模块
  20. 20. 20. 统计不重行数
  21. 21. 21. SELinux
  22. 22. 22. chmod vs chcon (DAC vs MAC)
  23. 23. 23. 阻止跨源访问
  24. 24. 24. 查找文件位置
  25. 25. 25. ls -l
  26. 26. 26. bash -c
© 2024 何决云 载入天数...