# tar 打包和压缩
tar -cvf xxx.tar xxx.xxx #将文件打成一个tar包,不压缩
tar -zcvf xxx.tar.gz xxx #打包成tar.gz格式压缩包
tar -jcvf xxx.tar.bz2 xxx #打包成tar.bz2格式压缩包
# tar 解压
tar zxvf xxx.tar.gz #解压tar.gz格式压缩包
tar jxvf xxx.tar.bz2 #解压tar.bz2格式的压缩包
tar xvf xxx.tar.[gz/bz2] #两种解压的便捷写法
# 参数
-z:通过 gzip 指令处理文件
-j:通过 bzip2 指令处理文件
-c:创建归档文件,也就是打包
-x:从归档文件中还原文件,也就是解压
-v:显示操作过程
-f:指定压缩文件
# zip 压缩和解压
zip -q -r xxx.zip xxx # 压缩成zip格式
unzip xxx.zip # 解压zip格式的压缩包
# 参数
-q:不显示指令执行过程
-r:递归处理
文件名是一个指向原始文件inode
的指针,所以多个指针可以指向同一个原始文件inode
。软链接,相当于给文件名创建了一个快捷方式,删除文件名快捷方式则无效;硬链接,相当于创建了一个新的文件名(指针),删除旧文件名不影响新文件名。
ln [OPTION] <目录/文件> <LINK_NAME>
# OPTION
-s 创建软链接(如果不带 -s 参数,默认创建硬链接)
-f 强制创建文件或目录的链接,即原来有则删除
-i 覆盖前先询问
-v 显示创建链接的过程
# 举例
ln -s ../bit.lua ./bit_link.lua #在当前目录下创建../bit.lua文件的软链接,链接名为bit_link.lua
find
是个很强大的搜寻指令,但时间花用的很大,因为 find
是直接搜寻硬盘。如果可以,更推荐使用whereis
和locate
指令代替搜索。
#语法
find <指定目录> <指定条件> <指定动作>
# 在根目录下查找文件名以.txt结尾的文件
find / -name '*.txt'
# 在根目录下查找文件名以abc开头的文件,并显示详情
find / -name 'abc*' -ls
# 在当前目录中搜索过去10分钟更新的普通文件,如果不加-type f参数,则搜索普通文件+特殊文件+目录
find . -type f -mmin -10
-type 根据文件类型查找:f表示文件,d表示目录,l表示软链接
-amin 访问时间
-cmin 文件属性被更改
-mmin 文件内容被修改
#查找当前目录下i节点为400342的文件或目录
find . -inum 400342
-inum 根据i节点查找
#在当前目录下查找大于100M的文件,-n表示小于,n表示等于;1数据块==512字节==0.5KB,也就是1KB等于2数据块,100MB==102400KB==204800数据块
find . -size +204800
#组合搜索,当前目录查找大于100M且过去十分钟更新的普通文件的文件
find . -size +204800 -a -type f -mmin -10
- a 表示两个条件同时满足(and)
- o 表示两个条件满足任意一个即可(or)
#---统计源码的行数---#
#去空行
find . "(" -name "*.c" -or -name "*.h" -or -name "*.lua" ")" -print | xargs grep -v "^$"|wc -l
#含空行
find . "(" -name "*.c" -or -name "*.h" -or -name "*.lua" ")" -print | xargs wc -l
#也可以用cloc工具统计源码行数
cloc <path>
#语法
grep [选项] pattern [文件名]
#在当前路径下的所有文件中查找字符串gcc所在位置
grep -rn 'gcc' .
--color=auto 对匹配到的文本着色显示
-a :将 binary 文件以 text 文件的方式搜寻数据
-r 递归读取每个目录下的文件
-w 完全匹配字符串,相当于 grep "\"
-v 反向选择,亦即显示出没有 'gcc' 内容的那一行!
-i 忽略字符大小写
-n 显示匹配的行号
-c 计算找到 'gcc' 的次数
-o 仅显示匹配到的字符串
-e 实现多个选项间的逻辑or关系 # grep –e ‘cat’ -e ‘dog’ file
-q 静默模式,不输出任何信息
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
# 在ls的结果中搜索以a开头的文件或目录
ls | grep '^a'
pattern
常用的匹配模式如下:
\ #反义字符,如"\"\""表示匹配""
[ - ] #匹配一个范围,[0-9a-zA-Z]匹配所有数字和字母
* #所有字符,长度可为0
+ #前面的字符出现了一次或者多次,"g\+"匹配具有一个或连续多个字符g的单词
^ #匹配行的开始 如:'^grep'匹配所有以grep开头的行
$ #匹配行的结束 如:'grep$'匹配所有以grep结尾的行
. #匹配一个非换行符的字符,如:'gr.p'匹配gr后接一个任意字符,然后是p
* #匹配零个或多个先前字符,如:'*grep'匹配所有一个或多个空格后紧跟grep的行
.* #一起用代表任意字符
[] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep
[^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行
\(..\) #标记匹配字符,如'\(love\)',love被标记为1
\< #到匹配正则表达式的行开始,如:'\
\> #到匹配正则表达式的行结束,如'grep\>'匹配包含以grep结尾的单词的行
\w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p
\W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等
\b #单词锁定符,如: '\bgrep\b'只匹配grep
x\{m\} #重复字符x,m次,如:'g\{5\}'匹配包含5个g的行
x\{m,\} #重复字符x,至少m次,如:'g\{5,\}'匹配至少有5个g的行
x\{m,n\} #重复字符x,至少m次,不多于n次,如:'g\{5,10\}'匹配5--10个g的行
which
命令的作用是,在 PATH
变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用 which
命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
当我们在执行一个指令的时候,比如ls
,系统会依照 PATH 的设定去每个 PATH 定义的目录下搜寻文件名为 ls
的可执行文件,如果在 PATH 定义的目录中含有多个文件名为 ls
的可执行文件,那么先搜寻到的同名指令先被执行!
which -a cc # -a:将所有在PATH目录中找到的文件均列出,而不止第一个找到的文件
/usr/bin/cc
/bin/cc
which cc
/usr/bin/cc
whereis
在一些特定的目录中寻找文件文件名,主要是针对 /bin /sbin
底下的执行档, 以及 /usr/share/man
底下的 man page 文件,跟几个比较特定的目录来处理,所以速度要快的多。
whereis [-bmsu] 文件或目录名
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文件 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
whereis which
which: /usr/bin/which /usr/share/man/man1/which.1.gz
locate
寻找的数据是由已建立的数据库 /var/lib/mlocate/
里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据。而数据库的建立默认是在每天执行一次 (每个 distribution 都不同,CentOS 7.x 是每天更新数据库一次!),所以当你新建立起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你找不到。但是可以手动更新数据库,直接输入updatedb
就可以了! updatedb
指令会去读取 /etc/updatedb.conf
这个配置文件的设定,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件!因为 updatedb
会去搜寻硬盘,所以当你执行updatedb
时,可能会等待数分钟的时间喔!
locate [-ir] keyword
-i :忽略大小写的差异
-c :不输出档名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正规表示法的显示方式
用到了三个命令:chgrp
更改文件属组;chown
更改文件属主,也可以同时更改文件属组;chmod
更改文件9个属性。
chgrp [-R] 属组名 文件名
-R : 进行递归(recursive)的持续变更,以及连同次目录下的所有文件都会变更
chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
chown bin install.log #将install.log的拥有者改为bin这个用户
chmod 754 test.sh #-rwxr-xr--
user = rwx = 4+2+1 = 7
group = r-x = 4+1 = 5
others = r-- = 4
chmod u=rwx, g+r, o-w test.sh
文本操作可以参考shell中总结的一些命令,互相结合使用:重导向与管线命令
cut
命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut
命令将读取标准输入。必须指定 -b
、-c
或 -f
标志之一。
cut OPTION... range [FILE]...
# OPTION
-b:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志
-c:以字符为单位进行分割
-d:自定义分隔符,默认为制表符
-f:与-d一起使用,指定显示哪个区域
-n:取消分割多字节字符,仅和 -b 标志一起使用
--complement:补足被选择的字节、字符或字段,即反选
# range
N:只选中第N个字节、字符、字段
N-:从第N个字节、字符、字段到结尾
N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段
-M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段
# eg
cut -b 2 tmp.txt # 选择tmp.txt中每一行的第2个字节的内容,成列输出,加上--complement则是反向选择
cut -c 3- tmp.txt # 每一行的第3个字符到行尾所有的内容
cut -f 1-2 tmp.txt # 以tab分割每一行的内容,选择第1到第2个被分割的内容
cut -d ' ' -f -2 tmp.txt # 以空格分割每一行内容,选择行首到第2个被分割的内容
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。这个工具使用比较复杂,以下是部分内容总结,更详细的可参考:Linux awk 命令。
awk [选项参数] 'script' var=value [FILE]
awk [选项参数] -f scriptfile var=value [FILE]
# 选项参数
-F fs: 指定文本分隔符 (默认是空格符),fs是一个字符串或者是一个正则表达式
-f scripfile:从脚本文件中读取awk命令
-v var=value:赋值一个用户定义变量
# script
# awk运行处理规则的执行流程
1. BEGIN{} : 最开始执行
2. // : 正则,先执行正则,再执行循环
3. {} : 循环体
4. END{} : 最后执行
# 内置变量
$n:当前记录的第n个字段,字段间由FS分隔
$0:完整的输入记录
NF:当前记录的总字段数
NR:已经处理过的(所有文件)总记录数目,或者说行号
FNR: 当前输入文件的记录数目
length:当前记录的长度
RS: 记录分隔符
FS:指定文本内容分隔符(默认是空格)
OFS: 输出字段分隔符变量(默认是空格)
IGNORECASE:如果为真,则进行忽略大小写的匹配
FILENAME: 当前输入文件的名字
# 运算符
赋值:= += -= *= /= %= ^= **=
算数运算:+ - * / % ++ --
关系逻辑:< <= > >= != == ?: && || !
连接符:空格
求幂:^ ***
字段引用:$
数组成员:in
正则匹配(包含):~
正则匹配(不包含):!~
# awk中的函数
print : 打印
printf : 格式化打印
%s : 字符串
%d : 数字
- : 左对齐
+ : 右对齐
15 : 至少占用15字符
# eg:
awk -F':' '{printf "%+20s\n", $NF}' /etc/passwd # :为字段分隔符,输出文件每一行的最后一个字段,右对齐,至少占20个字符
awk 'BEGIN{FS=":"}{print $1,$NF}' /etc/passwd # :为分隔符,输出文件每一行的第一个和最后一个字段
awk -F: 'BEGIN{OFS=" --- "}{print $1,$NF}' /etc/passwd # :为分隔符,输出第一个和最后一个字段,字段之间用“ --- ”连接
awk -F: '$NF ~ /bash/{print $0}' /etc/passwd # 输出最后一个字段包含bash的行
awk -F: '$NF !~ /bash/{print $0}' /etc/passwd # 输出最后一个字段不包含bash的行
awk -F: '$4 > $3{print $0}' /etc/passwd # 输出属组ID大于属主ID的行
awk -F: '{if($3>$4){print "$3:",$3}else{print "$4:",$4}}' /etc/passwd # 条件控制:if(){}else if(){}else{}
awk -F: '{for(i=1;i<=10;i++){print $0, i}}' /etc/passwd # 对每一行内容多执行循环
awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd # 同上,且都循环10次
sort
命令可以针对文本文件的内容,按行进行排序。在排序的时候以指定分隔符对文本文件进行内容分列,对指定列进行升序或降序排列,并且在排序的同时可以指定是否忽略大小写。
sort [OPTION]... [FILE]...
sort [-bcdfhnru][-t<分隔字符>]-k field1[,field2]][输入文件][[-o<输出文件>] # 常用写法,不唯一
# OPTION
-b:忽略每行前面开始的空格字符,空格数量不固定时,该选项几乎是必须要使用的
-c:选项检查文件是否已经排好序
-d:按字典序升序排列,空行在前(默认);
-f:忽略大小写进行排列,例如 A 与 a 视为编码相同
-h:使用易读性数字(例如:2K、1G)
-M:以月份的名字来排序,例如 JAN, DEC 等等的排序方法
-k:按行中的某个字段排序:字段间默认使用空格隔开,默认-k 1
-n:使用『纯数字』升序进行排序(默认是以文字型态来排序的)
-o<输出文件>:将排序后的结果存入指定的文件
-r:降序,以相反的顺序来排序
-u:意味着是唯一的(unique),相同的数据中,仅出现一行代表
-t<分割字符>:指定分隔符,默认的分隔符为空白字符和非空白字符之间的空字符
# eg:
sort -bnr -t ":" -k 3 /etc/passwd # 以:分隔,对第3个字段按照数值降序排列
sort -bf -t ":" /etc/passwd -o 1.txt # 以:分隔,对第1个字段按照字典顺序、忽略大小写排序,结果输入1.txt文件
# 查看磁盘和磁盘的分区
lsblk #列出系统上的所有磁盘列表
# 选项与参数:
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据
-f :同时列出该磁盘内的文件系统名称
-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
-p :列出该装置的完整文件名!而不是仅列出最后的名字而已。
-t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
# 输出信息
NAME:就是装置的文件名啰!会省略 /dev 等前导目录!
MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!
RM:是否为可卸除装置 (removable device),如光盘、USB 磁盘等等
SIZE:当然就是容量啰!
RO:是否为只读装置的意思
TYPE:是磁盘 (disk)、分区槽 (partition) 还是只读存储器 (rom) 等输出
MOUTPOINT:就是前一章谈到的挂载点!
date # 查看系统时间
cal # 查看日历,cal [[[day] month] year]
env # 查看环境变量资源
hostname # 查看计算机名
arch # 查看架构信息
uname [-asrmpi]
-a :所有系统相关的信息,包括底下的数据都会被列出来
-s :系统内核名称
-r :内核的版本
-m :本系统的硬件名称,例如 i686 或 x86_64 等
-p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型
-i :硬件的平台 (ix86)
lspci -tv # 罗列 PCI 设备
lsusb -tv # 显示 USB 设备
lscpu # Linux查看cpu相关信息,包括型号、主频、内核信息等
lsblk # 列出系统上的所有磁盘列表
# 添加新的用户
useradd [选项] 用户名
-c comment 指定一段注释性描述
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
-g 用户组 指定用户所属的用户组
-G 用户组,用户组 指定用户所属的附加组
-s Shell文件 指定用户的登录Shell
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号
useradd –d /home/sam -m sam #创建了一个用户sam,并为sam产生一个主目录 /home/sam
# 切换用户
su [选项] 用户名
- 当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),使用 - 选项可省略用户名,默认会切换为 root 用户。
-c 仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令
-p 表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)
# 删除用户
userdel [选项] 用户名
-r 作用是把用户的主目录一起删除
userdel -r sam #删除sam,把/home/sam目录一并删除
# 修改用户
# 修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等
usermod [选项] 用户名
usermod -s /bin/ksh -d /home/z –g developer sam #将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer
# 用户密码管理
passwd [选项] 用户名
-l 锁定口令,即禁用账号
-u 口令解锁
-d 使账号无口令
-f 强迫用户下次登录时修改口令
# 普通用户修改自己的密码
$ passwd
Old password:******
New password:*******
Re-enter new password:*******
# root用户修改普通用户的密码
$ passwd sam
New password:*******
Re-enter new password:*******
1.切换到root用户下
2.添加sudo文件的写权限,命令是:chmod u+w /etc/sudoers
3.编辑sudoers文件,命令是:vim /etc/sudoers
找到 root ALL=(ALL) ALL,在下面添加 youuser ALL=(ALL) ALL
ps:可以在sudoers中添加下面内容
youuser ALL=(ALL) ALL #允许用户youuser执行sudo命令(需要输入密码)
%youuser ALL=(ALL) ALL #允许用户组youuser里面的用户执行sudo命令(需要输入密码)
youuser ALL=(ALL) NOPASSWD: ALL #允许用户youuser执行sudo命令,并且在执行的时候不输入密码
%youuser ALL=(ALL) NOPASSWD: ALL #允许用户组youuser里面的用户执行sudo命令,并且在执行的时候不输入密码
4.撤销sudoers文件写权限,命令:chmod u-w /etc/sudoers
apt是一个应用管理工具,类似于电脑上安装的应用中心这类软件。区别就是,应用中心这类软件的软件列表是你进入软件中心的时候,实时从金山服务拉取列表。而apt是本地存了一份软件包信息的列表,比如软件大小、版本号、依赖等,仓库源中的应用更新以后,apt需要手动更新软件包信息。
源配置文件:/etc/apt/sources.list
,以下是常用操作总结。
# 搜索查看
apt search <search_term> #可以找到包含search_term的所有包。
apt show <package_name> #查看package的内容,可以在安装或删除软件包之前查看有关软件包的更多信息
apt list --upgradable #查看已安装且可升级的版本
apt list --installed #查看系统上所有已安装的软件包
apt list --all-versions #查看可用于系统的所有软件包
# 更新升级
sudo apt update #更新本地存放的软件包信息的列表,而不会更新包本身
#命中(Hit):包版本与之前的版本没有变化
#忽略(Ign):包被忽略。要么是包版本太新,它甚至懒得检查,要么在检索文件时出错,但错误微不足道,因此被忽略
#获取(Get):有一个新版本可用。它将下载有关版本的信息(而不是包本身)
sudo apt upgrade #升级所有可以更新的软件包
sudo apt full-upgrade #升级所有可以更新的软件包,并将旧的软件包删除
sudo apt update && sudo apt upgrade -y #比较快速的升级常用命令
# 安装升级
sudo apt install <package_name> # 安装指定的软件命令
sudo apt install <package_1> <package_2> <package_3> # 安装多个软件包
#如果在已安装的软件包上运行 apt install,这将只查看数据列表
#如果找到更新的版本,它会将已安装的软件包升级到较新的软件包,否则啥也不做
sudo apt install <package_name> --only-upgrade #只想升级软件包但不想安装它(如果尚未安装)
sudo apt install <package_name>=<version_number> #安装特定版本的应用程序
#默认情况下,将为应用程序安装存储库中可用的最新版本。但是如果不想安装最新版本,可以指定版本号
#这需要知道要安装的确切版本号
# 删除已安装的软件包
sudo apt remove <package_name> #只是删除包的二进制文件,它留下了残留的配置文件
sudo apt purge <package_name> #删除与包相关的所有内容,包括配置文件
sudo apt autoremove #清理系统
#安装软件时会自动安装一些满足依赖关系的库和包,如果软件包被删除,
#这些自动安装的库和包虽然没有用,但仍会保留在系统中,可以使用此命令清除掉
SSH 的架构是服务器/客户端模式,两端运行的软件是不一样的。OpenSSH 的客户端软件是ssh
,服务器软件是sshd
。SSH 的全局工作目录是/etc/ssh/
,用户工作目录在~/.ssh/
,优先级高于全局配置文件。以下是目录中的一些文件:
config
:客户端配置文件。开始可能没有config
文件,我们需要自己新建一个config
文件。在使用ssh连接服务器时,经常要输入一些不同的主机地址和密码,使用config
文件可以很好的解决这个问题。# 在config中添加以下内容后,就可以使用"ssh 23"登录目标主机了
Host 23 # 23只是个别名
HostName 10.123.1.23
Port 10010 # 默认的port可以不用加这个
user user_name
id_rsa
:用于 SSH 协议版本2 的 RSA 私钥。服务器上经过rsa算法生成的私钥。与公钥是一对的密钥对,用于连接其他服务器用。id_rsa.pub
:用于SSH 协议版本2 的 RSA 公钥。服务器上经过rsa算法生成的公钥。与私钥是一对的密钥对,用于连接其他服务器用。将主机A的id_rsa.pub
内容copy到B主机的authorized_keys
文件中,这样A主机就能不通过密码连接到B主机。known_hosts
:ssh会把你每个你访问过计算机的公钥(public key)都记录在该文件中。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击,移除你目标机器的公钥就不会再警告:ssh-keygen -f "~/.ssh/known_hosts" -R "xxx.xxx.xx.11"
。authorized_keys
:实现真正无密码连接,即为授权文件,当把master的公钥添加到authorized_keys文件中后,下次连接直接输入ssh master即可,不需要再次输入密码。(我们本地可以自动生成公钥,将公钥输入到该文件中,本地就可无密码连接到该服务器,分布式集群时也会用到。)sshd_config
:服务器的配置文件,只在目录/etc/ssh/
下面有。以下只是简单的常用总结,更详细内容参考:SSH教程。
1)SSH 客户端
如果机器A要通过SSH控制其他机器,则要安装SSH客户端。连接SSH服务器的常用命令:
sudo apt install openssh-client # 安装客户端
# 连接服务器
ssh alias # 可使用别名快捷登录,在config中加入一下配置即可
# Host alias
# HostName ip_addr
# user name
# Port port,默认22
ssh user@host # 登录服务器,服务器和客户端处于同一局域网
ssh -l user host # -l 参数指定远程登录的用户名
ssh -p port user@host # -p 指定连接服务器端口,ssh默认连接服务器的22端口
ssh user@host command # 登录成功后,立刻执行command命令
# 传送文件
scp -r SourceDir user@host:/directory # 将本机的目录拷贝到远程主机
scp user@host:directory/SourceFile TargetDir # 从远程主机复制文件到本地
scp user@host:directory/SourceFile user@host:/directory # 两个远程系统之间的复制
-r:以递归方式复制目录
-P:指定服务器端口,默认22
-p:保留修改时间(modification time)、访问时间(access time)、文件状态(mode)等原始文件的信息
-v:显示详细的输出
2)SSH 密钥登录
密钥(key)是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,非对称加密需要两个密钥成对使用,分为公钥(public key)和私钥(private key)。
私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。
如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。
ssh-keygen # 生成密钥对
-t:指定密钥的加密算法,一般会选择 DSA 算法或 RSA(默认)算法
-b:指定密钥的二进制位数,这个参数值越大,密钥就越不容易破解。至少应该是1024,更安全一些可以设为2048或者更高
-C:可以为密钥文件指定新的注释,格式为username@host
-f:指定生成的私钥文件
-F:检查某个主机名是否在known_hosts文件里面
-R:将指定的主机公钥指纹移出known_hosts文件
# eg:
ssh-keygen -t rsa -C "[email protected]" # 生成一个RSA 加密算法的密钥对,并且给出了用户名和主机名
ssh-keygen -F xxx.xxx.0.11 # 检查xxx.xxx.0.11是否在known_hosts中
# 手动上传密钥
# 一般来说.ssh文件夹的权限为700,私钥为600,公钥为644。
cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
chmod 644 ~/.ssh/authorized_keys # 只有文件所有者才能写
# 自动上传密钥
ssh-copy-id -i key_file user@host
3)SSH 服务器
如果机器A打算被其他机器通过SSH链接,则要安装SSH 服务器,以下是常用命令:
sudo apt install openssh-server # 安装服务器
sudo systemctl start sshd.service # 启动,也可用sshd命令
sudo systemctl stop sshd.service # 停止
sudo systemctl restart sshd.service # 重启
sudo systemctl enable sshd.service # 让 sshd 在计算机下次启动时自动运行