Linux基础及面试高频考点

用户、用户组、权限

Linux 是一个多用户的操作系统。一般用户在创建之初被划分到某个用户组里面,享有一般权限。一个操作系统只有一超级用户,用户名为root, 独属一个root组,拥有最高权限。
在这里插入图片描述

用户

root

很多高级权限如 useradd,chown等高级权限只有root用户才有权限使用,这时如果一般用户想这些高级权限,需要用 “sudo” 关键字指明以root身份运行该命令

常见root 权限的指令

useradd + passwd 添加用户并修改密码

useradd -m user_name
passwd user_name
  1. -m 表示创建普通user_name时,同时创建的由user_name命名的user group,user作为该group的初始user, 且user不能离开此组, 并用/etc/skel/下文件初始化其家目录/home/username
  2. 必须有passwd指令!否则不能正常使用这个新用户

userdel 删除用户

userdel user_name
userdel user_name -t 

无 -t 只会删除用户名,不会从/home中删除对应用户的文件夹,有 -t 则 同时用户的文件夹

usermod 修改用户的账户

最好不要用这个命令,因为如果已经在家目录安装某些软件,则会导致软件路径索引问题!!!

  • -l 对用户重命名。需要注意的是 /home 中的用户家目录的名字不会改变,需要手动修改。
  • -g 修改用户所在的群组,例如 usermod -g friends lion修改 lion 用户的群组为 friends 。
  • -G 一次性让用户添加多个群组,例如 usermod -G friends,foo,bar lion 。
  • -a -G 会让你离开原先的群组,如果你不想这样做的话,就得再添加 -a 参数,意味着append 追加的意思。

su切换为其他用户

su user_name

用户组

常见root 权限的指令

groupadd 创建组, groupdel 删除组, groups 查看用户所在组

groupadd user_name
groupdel user_name
groups user_name

注:

  1. /etc/passwd 文件中保存有所有用户名、用户组信息

    格式:

    user_name:passwd:user_id:group_id:description:home_path:login_shell_path
    

    其中UID:0—root; 1~499–sys-user; 500~65535—general-user ,sys-user不能动!!!

  2. root用户的家目录在 /root/,普通用户的家目录在 /home/username/

  3. /etc/shadow文件中保存有所有用户的登录密码

  4. 如何查看当前用户及权限

    shell终端以 # 开头为超级user, $开头为普通user, 使用 whoami 返回当前用户名

文件权限

非root 权限指令

查看文件权限

ls -l dir_path-or-file_path

-l 列出(以单列格式)文件模式 ,包括文件的链接数,所有者名,组名,文件大小(以字节为单位),时间信息,及文件名

例如输出drwxr-xr-x 3 root root 17 May 6 00:14 .config,对这个信息的解释如下:

  • drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段(包括d:目录, -:文件, l:链接文件),后 9 位为文件权限字段(每 3 位为一组,共 3 组,每一组分别代表对文件拥有者、所属群组以及其它人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行)
  • 3:链接数
  • root:文件拥有者
  • root:所属群组
  • 17:文件大小
  • May 6 00:14:文件最后被修改的时间
  • .config:文件名

常见root 权限的指令:

chgrp 修改文件的群组

change group~

chgrp bar file.txt 

表示file.txt文件的群组修改为组bar

chown 改变文件的所有者

chown -R 用户名称:用户组名称 文件或目录
  • -R 递归设置目标文件夹下的子目录和子文件

    即连同子目录下的所有文件、目录的权限都更新成为这个用户和用户组

chmod 更改文件所有者、所在组、其他人的权限

chmod -R 655 /mnt/sda/smm/dataset/ScanNet/
chmod -R o+rw /mnt/sda/smm/dataset/ScanNet/

655 表示修改文件夹ScanNet下所有文件的权限为:拥有者rw-, 同一用户组 r-x, 其他人r-x

o+rw 表示其他人增加r和w权限

参数说明:

  • 使用字母来分配权限

    u :user 的缩写,用户的意思,表示所有者。

    g :group 的缩写,群组的意思,表示群组用户。

    o :other 的缩写,其它的意思,表示其它用户。

    a :all 的缩写,所有的意思,表示所有用户。

    + :加号,表示添加权限。

    - :减号,表示去除权限。

    = :等于号,表示分配权限。

  • 使用数字确定权限

    权限 数字
    r 4
    w 2
    x 1

    一个目录的权限也就是对其文件列表的权限。因此,目录的 r 权限表示可以读取文件列表;w 权限表示可以修改文件列表,具体来说,就是添加删除文件,对文件名进行修改;x 权限可以让该目录成为工作目录,x 权限是 r 和 w 权限的基础,如果不能使一个目录成为工作目录,也就没办法读取文件列表以及对文件列表进行修改了

文件编辑与操作

目录中查找文件、文件中查找文件内容

find——目录中查找文件

根据文件名及根路径查找

find -name "file.txt" --> 当前目录以及子目录下通过名称查找文件
find . -name "syslog" --> 当前目录以及子目录下通过名称查找文件
find /var/log -name "*syslog*" --> 查找包含syslog的文件 复制代码

“”中可以使用正则表达式的特殊字符

根据文件大小查找

find /var -size +10M --> /var 目录下查找文件大小超过 10M 的文件

根据文件最近访问时间查找

find -name "*.txt" -atime -7  --> 近7天内访问过的.txt结尾的文件

仅查找目录或文件

find . -name "file" -type f  --> 只查找当前目录下的file文件find . -name "file" -type d  --> 只查找当前目录下的file目录复制代码

操作查找结果

find -name "*.txt" -printf "%p - %u" --> 找出所有后缀为txt的文件,并按照 %p - %u格式打印,其中%p=文件名,%u=文件所有者
find -name "*.jpg" -delete --> 删除当前目录以及子目录下所有.jpg为后缀的文件,不会有删除提示,因此要慎用
find -name "*.c" -exec chmod 600 {} ; --> 对每个.c结尾的文件,都进行 -exec 参数指定的操作,{} 会被查找到的文件替代,; 是必须的结尾
find -name "*.c" -ok chmod 600 {} ; --> 和上面的功能一直,会多一个确认提示复制代码

grep ——文件中全局匹配一个正则表达式,并且打印到shell

grep -E [Pp]ath /etc/profile

表示将/etc/profile 总匹配Path或者path的文件内容打印到shell

参数说明:

  • -E 后边紧跟“[]”包括的正则表达式内容

    * 匹配 0 或多个字符

    ? 匹配任意一个字符

    [list] 匹配 list 中的任意单一字符

    [ ^list] 匹配 除 list 中的任意单一字符以外的字符

    [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9]

    {string1,string2,…} 匹配 string1 或 string2 (或更多)其一字符串

    {c1…c2} 匹配 c1-c2 中全部字符 如{1…10}

  • -i 忽略大小写, grep -i path /etc/profile

  • -n 显示行号,grep -n path /etc/profile

  • -v 只显示搜索文本不在的那些行,grep -v path /etc/profile

  • -r 递归查找, grep -r hello /etc ,Linux 中还有一个 rgrep 命令,作用相当于 grep -r

文件的链接与删除

在了解文件的链接前理解Linux 文件是如何存储的。存储一个Linux文件要包括3个部分:文件名、文件内容以及权限,每个文件名通过文件名列表中的 inode 标识绑定到文件内容。

ln ——建立链接

Linux 下有两种链接类型:硬链接(实体链接)和软链接(符号链接)。

在这里插入图片描述

  • 硬链接(实体链接)
ln file1 hard_ln1

建立一个名为hard_ln1的硬链接,链接到file1对应的inode上。要删除hard_ln1对应文件内容时,只有当对应inode的引用数为0时,文件内容才会被删除

  • 软链接(符号链接)
ln -s file1 soft_ln1

建立一个名为soft_ln1的软链接,链接到file1 ,显示的是 file1 的内容,但其实 file2 的 inode 与 file1 并不相同。如果我们删除了 soft_ln1的话, file1是不会受影响的,但如果删除 file1 的话, soft_ln1就会变成死链接,因为指向的文件不见了。

rm —— 删除文件

删除文件和目录,由于 Linux 下没有回收站,一旦删除非常难恢复,因此需要谨慎操作

rm file_path/file_name

【常用参数】

  • -i 向用户确认是否删除;
  • -f 文件强制删除;
  • -r 递归删除文件夹,著名的删除操作 rm -rf 。

重定向

输入重定向

A < B

把B作为A指令的输入,如下把name.csv中的内容作为cat 的输入,它的运行结果与 cat name.csv 一样

cat < name.csv

输出重定向

覆盖式 >, 非覆盖式 >>

cut -d , -f 1 notes.csv > name.csv

上命令表示通过 “,” 剪切notes.csv 文件,并将获取剪切结果的第一个部分,重定向到 name.csv 文件。如果输出的文件不存在它会新建一个,如果输出的文件已经存在,则会覆盖。

cut -d , -f 1 notes.csv >> name.csv

上命令则会把名字追加到 name.csv 里面。

管道重定向

A | B 表示将A指令的结果作为B指令的目标:

grep log -Ir /var/log | cut -d : -f 1 | sort | uniq

上命令表示在log文件夹下搜索 /var/log 文本,然后将找到的 log 文本作为cut 命令的目标,通过cut 获取剪切的第一部分作为uniq 指令的目标进行去重

注意:

  1. grep的参数表示
    • -r 表示递归,-I 用于排除二进制文件

使用软件仓库安装

Red Hat 家族的软件包后缀名一般为 .rpm ,Debian 家族的软件包后缀是 .deb 。

yum 是 CentOS 中默认的包管理工具,适用于 Red Hat 一族。

apt 是 Ubuntu中默认的包管理工具,适用于 Debian 一族。

使用Cmake编译源码

如果要使用没有在yum仓库中的软件,就得自己去找软件源码,将源码编译安装使用。

Cmake是一种高级编译工具,能将源码编译为可执行二进制文件,具体编译步骤如下:

  1. 下载源代码或自己编写

    如一个写有“hello word!” 的 hello.cpp 文件就是源码

  2. 编写CMakeLists.txt

    相当于一个指令文件,指导cmake逐条执行CMakeLists.txt中的命令

  3. 用cmake 命令编译生成可执行文件

  4. 执行可执行文件,验证软件是否安装成功

了解CMakeLists.txt

如下为一个CMakeLists.txt

#  CMakeLists.txt
# top-level CMake configuration file
cmake_minimum_required(VERSION 3.5)

project(CUT_PURSUIT_SEG)


#------------------------------------------------------------------------------
# internal cmake settings
#------------------------------------------------------------------------------
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
set(CMAKE_MACOSX_RPATH ON)
include(FeatureSummary)

#------------------------------------------------------------------------------
# General settings
#------------------------------------------------------------------------------
set (CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -std=c++11")

#------------------------------------------------------------------------------
# actual library
#------------------------------------------------------------------------------
add_subdirectory(src)

“cmake_minimum_required” 为指令关键字,"()"中为传入的变量

接下来讲解一些必须掌握的指令关键字及其参数

CMakeLists.txt中涉及的指令关键字

PROJECT

用来指定工程的名字和支持的语言,如下例表示工程名为HELLO, 支持的编译语言为C++和JAVA

PROJECT (HELLO CXX JAVA)

注意:

  • 该关键字隐含定义了 PROJECT_BINARY_DIRPROJECT_SOURCE_DIR 两个变量,例子定义了 HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR 变量

SET

用来显示指定变量, 如下例表示:参数 SRC_LSIT中存了main.cpp, fun1.cpp2个文件路径

SET (SRC_LSIT main.cpp fun1.cpp)

注意:

  • 如果文件含特殊字符,必须用 “”
  • 指令关键字(变量1 变量2) --指令关键字不区分大小写,参数和变量区分大小写

MESSAGE

用来指定向终端用户输出自定义信息,如下例表示

SATUS >> 在shell向用户输出前缀为 '--'的info, eg: '-- Generating done'
FATAL_ERROR >> 立即终止所有cmake过程
SEND_ERROR >> cmake过程产生错误, 过程被跳过

ADD_EXECUTABLE

用来指定向用户生成可执行文件, 表示把SRC_LIST变量包括的所有文件打包,生成可执行文件 hello_exe

ADD_EXECUTABLE(hello_exe ${SRC_LIST})

注意:

  • ${} 表示取{}中变量中的值

ADD_SUBDIRECTORY

用来指定子文件夹路径, 把~/proj/src/ 添加到工程目录中,同时编译生成的二进制 “.bin” 文件,放到 ~/proj/bin/ 下

 ADD_SUBDIRECTORY(src bin)

编译工程化的源码

如果你只是想输出“hello word!” 到屏幕上,那么完全可以忽略此节,但是如果你要构建一个大型项目,比如开发一个语音识别软件,那么工程化源码是你必备的技能!

假设你所有得工程文件都在 文件夹 ~/proj下,则你的文件夹建议为如下布局:

proj
	bin/  编译好的可执行
	src/  存放proj的源代码
	  CMakeLists.txt  编写编译要执行的指令
	doc/  放工程文档
	CMakeLists.txt  一般用来把目录src/添加到cmake编译查询路径中
	READMD.md
	run_proj.sh  运行项目的脚本文件

如果你已经完成了工程的所有文件,只需把 proj文件夹打包给客户,客户解压出 proj文件夹后,执行 如下命令

cd proj
mkdir build && cd build
cmake .. -参数1= -参数2=  && make

proj/CMakeLists.txt 作为 cmake指令的入口,make编译结果将会全部放在 proj/build 下, 形成如下的目录结构

proj
	build/
        - CMakeCache.txt 
        - cmake_install.cmake 
        - CMakeFiles/
        - Makefile
	bin/  编译好的可执行
	src/  存放proj的源代码
	    - CMakeLists.txt  编写编译要执行的指令
	doc/  放工程文档
	CMakeLists.txt  一般用来把目录src/添加到cmake编译查询路径中
	READMD.md
	run_proj.sh  运行项目的脚本文件

SSH连接远程服务器

假设内网服务器A, 外网服务器B

建立SSH连接,免密登录服务器

AB之间通过传输ssh公钥,即可实现免密登录。具体步骤如下:

  1. A上生成key

    在A的shell中输入如下命令,生成SSH的公钥和私钥

ssh-keygen

接下来系统会询问是否用默认path生成,新手一路按"Enter"即可完成生成

  1. A上将生成的公钥给B

    仍然在A的shell中输入如下命令

ssh-copy-id [param] B_username@B_ip

注:一些参数的意义

  • -i ——非默认path生成的key

    eg: -i ~/.ssh/id_rsa.pub

  • -p ——B 的ssh端口非22

    eg: -p 3085

  1. 在A上ssh面免密登录服务器B
ssh B_username@B_ip

scp —— 不同服务器间安全copy文件

基于SSH连接,可实现两台服务器间文件的加密传输, 如下命令可实现从A服务器传文件到B服务器

scp -P B_port_num -r A_file-path B_username@B_ip:B_target_dir

注:

  1. scp的参数
  • -P —— 目标服务器的端口

    -P 3085

  • -r —— 资源文件夹

    -r dir_path

  1. 如果出现报错“Permission denied ”,可能是因为AB间没有提前建立ssh连接 ,可查看上一节先建立SSH连接,再scp传输文件

    仍然在A的shell中输入如下命令

ssh-copy-id [param] B_username@B_ip

注:一些参数的意义

  • -i ——非默认path生成的key

    eg: -i ~/.ssh/id_rsa.pub

  • -p ——B 的ssh端口非22

    eg: -p 3085

  1. 在A上ssh面免密登录服务器B
ssh B_username@B_ip

scp —— 不同服务器间安全copy文件

基于SSH连接,可实现两台服务器间文件的加密传输, 如下命令可实现从A服务器传文件到B服务器

scp -P B_port_num -r A_file-path B_username@B_ip:B_target_dir

注:

  1. scp的参数
  • -P —— 目标服务器的端口

    -P 3085

  • -r —— 资源文件夹

    -r dir_path

  1. 如果出现报错“Permission denied ”,可能是因为AB间没有提前建立ssh连接 ,可查看上一节先建立SSH连接,再scp传输文件

( 持续更新中)

猜你喜欢

转载自blog.csdn.net/weixin_45549370/article/details/124937854
今日推荐