Linux 是一个多用户的操作系统。一般用户在创建之初被划分到某个用户组里面,享有一般权限。一个操作系统只有一超级用户,用户名为root, 独属一个root组,拥有最高权限。
很多高级权限如 useradd,chown等高级权限只有root用户才有权限使用,这时如果一般用户想这些高级权限,需要用 “sudo” 关键字指明以root身份运行该命令
常见root 权限的指令
useradd -m user_name
passwd user_name
userdel user_name
userdel user_name -t
无 -t 只会删除用户名,不会从/home中删除对应用户的文件夹,有 -t 则 同时用户的文件夹
最好不要用这个命令,因为如果已经在家目录安装某些软件,则会导致软件路径索引问题!!!
su user_name
常见root 权限的指令
groupadd user_name
groupdel user_name
groups user_name
注:
/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不能动!!!
root用户的家目录在 /root/,普通用户的家目录在 /home/username/
/etc/shadow文件中保存有所有用户的登录密码
如何查看当前用户及权限
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
,对这个信息的解释如下:
常见root 权限的指令:
change group~
chgrp bar file.txt
表示file.txt文件的群组修改为组bar
chown -R 用户名称:用户组名称 文件或目录
-R 递归设置目标文件夹下的子目录和子文件
即连同子目录下的所有文件、目录的权限都更新成为这个用户和用户组
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 -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 -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 标识绑定到文件内容。
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就会变成死链接,因为指向的文件不见了。
删除文件和目录,由于 Linux 下没有回收站,一旦删除非常难恢复,因此需要谨慎操作
rm file_path/file_name
【常用参数】
把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 指令的目标进行去重
注意:
Red Hat 家族的软件包后缀名一般为 .rpm ,Debian 家族的软件包后缀是 .deb 。
yum 是 CentOS 中默认的包管理工具,适用于 Red Hat 一族。
apt 是 Ubuntu中默认的包管理工具,适用于 Debian 一族。
如果要使用没有在yum仓库中的软件,就得自己去找软件源码,将源码编译安装使用。
Cmake是一种高级编译工具,能将源码编译为可执行二进制文件,具体编译步骤如下:
下载源代码或自己编写
如一个写有“hello word!” 的 hello.cpp 文件就是源码
编写CMakeLists.txt
相当于一个指令文件,指导cmake逐条执行CMakeLists.txt中的命令
用cmake 命令编译生成可执行文件
执行可执行文件,验证软件是否安装成功
如下为一个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” 为指令关键字,"()"中为传入的变量
接下来讲解一些必须掌握的指令关键字及其参数
用来指定工程的名字和支持的语言,如下例表示工程名为HELLO, 支持的编译语言为C++和JAVA
PROJECT (HELLO CXX JAVA)
注意:
用来显示指定变量, 如下例表示:参数 SRC_LSIT中存了main.cpp, fun1.cpp2个文件路径
SET (SRC_LSIT main.cpp fun1.cpp)
注意:
用来指定向终端用户输出自定义信息,如下例表示
SATUS >> 在shell向用户输出前缀为 '--'的info, eg: '-- Generating done'
FATAL_ERROR >> 立即终止所有cmake过程
SEND_ERROR >> cmake过程产生错误, 过程被跳过
用来指定向用户生成可执行文件, 表示把SRC_LIST变量包括的所有文件打包,生成可执行文件 hello_exe
ADD_EXECUTABLE(hello_exe ${SRC_LIST})
注意:
用来指定子文件夹路径, 把~/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 运行项目的脚本文件
假设内网服务器A, 外网服务器B
AB之间通过传输ssh公钥,即可实现免密登录。具体步骤如下:
A上生成key
在A的shell中输入如下命令,生成SSH的公钥和私钥
ssh-keygen
接下来系统会询问是否用默认path生成,新手一路按"Enter"即可完成生成
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
ssh B_username@B_ip
基于SSH连接,可实现两台服务器间文件的加密传输, 如下命令可实现从A服务器传文件到B服务器
scp -P B_port_num -r A_file-path B_username@B_ip:B_target_dir
注:
-P —— 目标服务器的端口
-P 3085
-r —— 资源文件夹
-r dir_path
如果出现报错“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
ssh B_username@B_ip
基于SSH连接,可实现两台服务器间文件的加密传输, 如下命令可实现从A服务器传文件到B服务器
scp -P B_port_num -r A_file-path B_username@B_ip:B_target_dir
注:
-P —— 目标服务器的端口
-P 3085
-r —— 资源文件夹
-r dir_path
( 持续更新中)