Linux系统
视角:
Linux系统的一些知识框架
硬件设计和维修: CPU机制:寄存器机制、多级缓存机制、分段机制、分页机制、中断机制、多核同步机制
Linux的开发者(内核开发 和后台程序开发 和应用开发) Linux系统管理员 Linux桌面用户
windows:
C:\Windows\System32\drivers\etc
1.概念类
字和字符 : 文本和word之列
交互式和非交互式: vim nano : sed awk grep >> >
面向行的和面向屏幕的: 面向行的 sed awk grep 面向屏幕--分页 less pg 命令 分页显示文件内容 命令:pg (page) cat vim
命令行和图形界面: shell 内部命令和外部命令
远程和本地:本地命令行和图形界面 远程命令行和图形界面 主机和终端
参数方式 :Unix 风格 BSD 风格 GNU 风格 其他
-- 长选项 短选项 必选项 可选项 可组合 不可组合 不带- 带-个 带--个
服务前台和后台 bg fg
帮助系统
内部命令: help
外部命令: man info -h --help type history
2.动作类
--增删改查-- 查-确认状况 动作反馈
--查询-了解和查看
框架: who when where what which why how
命令: whoami locate
echo cat head tail ls echo $JAVA_HOME
uname -a :显示系统名、节点名称、操作系统的发行版号、操作系统版本、运行系统的机器 ID 号
env printenv
-搜索和匹配
find regex
-动作类 -- 增加 删除 修改 查-验证
cd chmod文件: 复制 创建 创建目录 创建文件 改名 改内容 移动位置 改权限 替换 删除文件
3.层级类
三大层级
资源和硬件 文件和用户 进程和服务
01.资源和硬件 本地和网络 cpu 内存 硬盘 内核 网络
硬件: lshw
操作系统: cat /etc/os-release
cpu: lscpu cat /proc/stat
内存 free cat /proc/meminfo
显存: 查看显卡型号命令 lspci | grep -i vga 或者 lspci | grep -i nvidia
硬盘 lsblk df du mount umount
网络 ping ifconfig netstat traceroute host ip / ip addr
时间 data
设备: lsusb `lsusb`查看USB设备信息
lspci `命令查看系统中PCI总线和连接了哪些设备
内核: cat /proc/version
显示系统当前的设置: localectl status
显示系统当前的日期时区: timedatectl
硬件-硬件驱动-内核 cat /proc/version
02.文件和用户 ls tree
cd pwd touch cp scp rm rmdir chmod mv tar wget
su sudo uname whoami useradd userdel usermod id groups groupadd groupmod gpasswd passwd newgrp
03.进程与服务: ps pstree top kill vmstat fuser lsof
jobs fg bg & at crontab
systemctl journalctl chkconfig service
export source fork exec sh
`lsof`显示正在打开的Linux文件、网络端口和进程
日志: journalctl
service --status-all chkconfig --list init
rsyslog.service /logrotate
tail -f 持续显示文件信息
Nvidia自带了一个 nvidia-smi 的命令行工具,会显示显存使用情况
04.网络:
hostname host ip
ifconfig iwconfig 无线网卡
ping 只是测试网络联接状况以及信息包发送和接收状况。
端口 可使用命令包括但不限以下:curl, ssh, nmap, telnet,nc
telnet IP地址或主机名 端口,
在linux/unix下使用telnet(telnet ip 端口号)连接主机时提示“Escape character is '^]'.”
“^”是Ctrl键的意思 telnet>"代表进入了telnet命令行窗口
ssh -v -p 443 test.test.com
ssh -v -p 443 test.test.com 2>&1 | grep "Connection established"
nc -z -v test.test.com 443
常见端口 ftp 20(数据端口) 21(控制端口)ssh 22 telnet 23 DNS 53 apache 80 nginx 80 https 443
netstat 查看监听的端口
TCP: netstat -ntlp UDP: netstat -nulp
arp route traceroute
wget
nmcli
lsof -i:22
nmcli 例如: nmcli connection show / nmcli con show
nmcli device status / nmcli dev status
nmcli是 NetWorkManager 软件命令行管理工具的缩写nm-command-line
hostnamectl status
ssh
“/etc/ssh/sshd_config”是OpenSSH的配置文件,允许设置选项改变这个daemon的运行
ListenAddress”设置sshd服务器绑定的IP地址。
“Port”设置sshd监听的端口号。
cat /etc/ssh/sshd_config
What ports, IPs and protocols we listen for
#Port 22
lsof(list open files)
lsof -i :8080
netstat -tulnp | grep :8080
tu,就是-t -u包括,udp和tcp,
-t 基于TCP的应用层协议有:SMTP、TELNET、HTTP、FTP HTTP就是基于TCP的,
UDP的应用层协议:DNS、TFTP 、RIP(路由选择协议)、DHCP、IGMP(Internet组管理协议)。
-l或--listening 显示监控中的服务器的Socket,监听中的
-n或--numeric 直接使用IP地址,而不通过域名服务器。最好用数字的意思。
-p或--programs 显示正在使用Socket的程序识别码和程序名称,显示名字。
fuser -v -n tcp 80
列出某个用户打开的文件信息
lsof -u username
列出某个程序进程所打开的文件信息
lsof -c pycharm
列出使用某文件的进程号
fuser /etc/passwd
列出指定端口的进程号
fuser -n tcp 8080
4.流程类--目的
安装程序 下载-移动-改变位置-解压-修改权限-配置环境变量-运行
编译程序 configure make make install
数据分析 导入数据-管道-预处理-数据统计-数据输出
数据分析:查看 echo od head tail less more
分割 cut 拼接 paste删除 tr 排序 sort 去重 uniq 注意这个要排序后去重
重定向 > >> tee
流程-- 给出命令,给出验证命令成功的标志
安装程序
01.源码编译安装
wget tar cd mv chmod configure make install
02.编译包安装
wget tar mkdir cd ./idea.sh
03.编译包在线
RPM (RedHat Package Manager) -- YUM(Yellow dog Updater Modified): 基于RPM包构建的软件更新机制
sudo yum install -y git
dpkg APT 软件管理系统
sudo apt-get install git
5.常识记忆类
cat /proc/version
---静态信息--动态信息
# 操作系统类型 操作系统版本 操作系统位数
lsb_release -a
uname -a
cat /proc/version
# cpu
lscpu
cat /proc/cpuinfo
总核数 = 物理CPU个数 X 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
查看CPU的主频
cat /proc/cpuinfo |grep MHz|uniq
# 内存
free -h
vmstat -s
# 硬盘 查看盘的情况lsblk命令的英文是“list block
lsblk lsblk -pf 列出uuid
df -h df -ih 命令 查看磁盘的节点 df -Th 命令 查看文件系统类型在Type列输出
du --max-depth=1 -h
lsof | grep deleted 被进程占用中的文件- deleted,而未真正删除
fdisk -l gdisk
mount
fuser -muv /media/test 使用文件、文件结构或者套节字来表示识别进程
lsblk -d -o name,rota
查看,0表示固态硬盘,1表示机械硬盘,
lsblk -f
也可以查看挂载和未挂载的文件系统类型
file -s /dev/sda3
查看指定挂载盘的文件系统类型
df -Th 命令 查看文件系统类型在Type列输出
du -h -x --max-depth=1
df -h
du -h -x -d 1 /
-x:统计指定目录下的文件和子目录的大小,不统计其他文件系统的大小
#网卡信息
ifconfig 当前主机的ip地址和网卡信息
ping
# 文件-磁盘 程序-进程-服务 用户-权限
6.逻辑思维类
###1.了解和判断--命令类型
$ type mv
mv is hashed (/bin/mv)
$ type -a echo
echo is a shell builtin
echo is /bin/echo
type命令可以查询命令类型
说明:
内部命令:命令本身存放在系统内存中,是shell程序的一部分,这些命令由shell程序内部完成运行,不需要添加运行程序。
is a shell builtin --------->>> 表示该命令为内部命令
外部命令:因为命令功能比较大,所以在系统启动加载时不会存放在内存中,只有在使用时才会加载到内存中。
is hashed (/bin/mv) ---------->>> 表示命令为外部命令
第一次,按path搜索命令文件再次运行,已hash在内存中
####Linux系统的查询命令顺序
alias builtin-内部命令 外部命令/hash-已经通过哈希加密 PATH
查看内部命令 enable -a 利用enable 查看shell中已集成的内部命令
查看hash的命令 hash
PATH 可以通过 echo $PATH 或者 env
~/.bash_profile ~/.bashrc
~/.bash_profile 是交互式、login方式进入bash运行的,
~/.bashrc是交互式non-login方式进入bash运行的,通常二者设置大致相同,所以通常前者会调用后者。
/etc/profile
###2.搜索和查找--命令位置
$ which mv
/bin/mv
$ whereis mv
mv: /bin/mv /usr/share/man/man1/mv.1.gz
which whereis locate find
#file指令, 文件的类型
#文件查看 head -n 100 tail cat less more
###3.详细的内容和案例
whatis mv
man mv
info mv
mv --help
###其他
~ 帐户的 home 目录
$
# root 权限
7.解释说明
0.命令方式--空格 空白符
find ./ -type f
通配符-- 通配符必须用引号引用起来,find 取反 \! 或者'!' ii ignorecase
find ./ \! -name "*.jpg"
ls -al ./
1.重定向:
一: Linux系统预留可三个文件描述符:0、1和2, 0——标准输入(stdin) 1——标准输出(stdout) 2——标准错误(stderr)
/dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null这个设备通常也被称为位桶(bit bucket)或黑洞。
二: 重定向的符号有两个:>或>>
&> - 以覆盖的方式将正确输出和错误输出同时输出到指定位置
&>> - 以追加的方式将正确输出和错误输出同时输出到指定位置
2>&1 - 将错误输出以正确输出的形式输出到指定位置
> /dev/null 作用是将标准输出1重定向到/dev/null
2>/dev/null 把错误输出到
> /dev/null 2>&1 命令将不会输出任何信息到控制台,也不会有任何信息输出到文件中
1>/dev/null 2>&1 等价于 >/dev/null 2>&1 标准输出和错误输出都进了“黑洞”
2>&1 >/dev/null 是标准输出进了黑洞,错误输出打印到屏幕
三: tee
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
2.工作job
01.fg、bg、jobs、&、ctrl + z都是跟系统任务
jobsID PID
1. 首次让任务进入后台 &
2. jobs 查看后台运行的进程
3. fg %n 让后台运行的进程n到前台来
4. bg %n 让进程n到后台去;
Job的状态 -- running, stopped, Terminated
02.nohup
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行
案例:
01.后台执行 root 目录下的 runoob.sh 脚本 : nohup /root/runoob.sh &
02.后台执行 root 目录下的 runoob.sh 脚本,并重定向输入到 runoob.log 文件:
nohup /root/runoob.sh > runoob.log 2>&1 &
2>&1 解释:将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文
3.管道
01.多个命令在同一行,用分号划分
02.多个命令连续执行
管道符号 |
xargs -i(insert) 允许{}作为占位符 自定义占位符
4.搜索
type 命令搜索--内部命令 -外部命令-PATH
which whereis locate find
变量 变量值 反引号
5.查看日志
服务 systemd
systemctl
日志
内存日志: journald.service
硬盘日志: rsyslog.service
日志轮循: logrotate
日志分析: logwatch
挂载的操作
lsblk
df -h
sudo umount -f /media/test
fuser -muv /media/test
fuser -kv /media/test
kill -9
sudo mount /dev/sdb1 /media/test
说明:
####结束进程
killall kill processes by name killall命令用于杀死指定名字的进程
kill terminate a process
fuser 使用文件、文件结构或者套节字来表示识别进程
常用的两个功能:查看需要的进程和要kill查到的进程
####查看端口占用
netstat -ntlp | grep 22
lsof -i:22
nc -zv 192.168.1.15 22
####查看文件占用
fuser -mv /opt
lsof /opt
1.磁盘空间根目录占满,命令逐级查找大文件
du -h -x --max-depth=1
2. fuser查询并关闭使用相应文件系统的进程
fuser -mv /mytest
3.排查删掉的数据是否还在占用磁盘空间,如果有进程占用文件,kill -9 PID 可以释放
通过 lsof 这个命令可以获取一个已经被删除但仍然被应用程序占用的文件列表
lsof | grep delete:
检查/tmp下最大的三个数据文件
du -s /tmp/*|sort -nr|head -3
进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,可以通过如下命令完成:echo " " >/tmp/acess.log
ctrl + h 显示隐藏的文件夹
###用户目录大文件---- 磁盘
df -h /home
du -h --max-depth=1
du -h -d 1
-s或--summarize 仅显示总计
-h或--human-readable 以K,M,G为单位,提高信息的可读性。
-c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
find -maxdepth 1 /
4.磁盘的IO iostat
iostat -x
磁盘的平均响应时间 <5ms,磁盘使用率>80 磁盘每秒传输次数平均约400;每秒磁盘读取约5MB,写入约1MB
rqm/s:每秒这个设备相关的读取请求有多少被Merge了
rsec/s:每秒读取的扇区数
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
5.挂载
/IP地址是windows地址,后面跟上windows上的共享目录,后面的路径是linux上的挂载路径
mount -t cifs -o username="共享用户",password="密码" //ip/sharing_folder /mountpoint
sudo mount -t cifs -o username=Everyone //192.111.111.111/win /home/sk/win
NFS(Network File System)即网络文件系统
CIFS(Common Internet File System) CIFS是一种通用网络文件系统,主要用于网络设备之间的文件共享
CIFS可以在linux系统和windows系统之间共享文件 提供CIFS的服务是SAMBA: samba samba-common samba-client
samba服务的组成部分
samba在linux系统上的服务名称:smb
samba – 服务端应用程序
samba-common – 用来提供一些配置文件
samba-client – 客户端应用程序
主配置文件:/etc/samba/smb.conf
服务端口:通常使用TCP/445进行所有连接。
还使用UDP137、UDP138和TCP/139进行向后兼容
mount -r /dev/sdb1 /media/data
1. -t
vfstype 指定文件系统的类型,通常不必指定。
nfs -UNIX(LINUX) 文件网络共享
2. -o
options 主要用来描述设备或档案的挂接方式。常用的参数有:
3.device 要挂接(mount)的设备。
4.dir设备在系统上的挂接点(mount point)
进程控制以及相关命令行
进程控制一般是由OS的内核中的原语来实现的。原语(Primitive)是由若干条指令组成的,用于完成一定功能的一个过程-不可分割、不允许中断、常驻内存
进程管理——进程的阻塞、唤醒、挂起、激活-进程控制就是要实现进程状态转换
挂起和恢复进程是一种管理和控制运行中进程的重要操作
进程的状态
基本状态: 运行、就绪、阻塞
+ 创建态 终止态
运行状态==CPU资源+其他资源
进程的层次结构
进程调度
底层实现:
挂起 原语 suspend( ) :父进程的请求 终端用户需要 负荷调节需要 操作系统需要
激活 原语 active( )
阻塞原语( Block 原语)和 唤醒原语( Wakeup 原语
命令
最常用的方法是 ps aux
top pstree
kill killall
bg fg jobs nohup
查看进程打开的文件: lsof -p 9356
pidstat命令是sysstat工具的一个命令,用来监控全部或者指定进程的CPU、内存、线程、设备IO等系统资源的占用情况
说明:以使用ps命令或pgrep命令来查找进程ID
kill 命令
挂起: kill命令发送SIGSTOP信号来挂起该进程 kill -s SIGSTOP PID
恢复: kill命令发送SIGCONT信号来恢复该进程的执行 kill -s SIGCONT PID
killall 命令用于根据进程名称挂起或终止进程。
可以使用-STOP选项来挂起进程,
使用-CONT选项来恢复进程
pkill 命令用于根据进程名或其他条件来挂起或终止进程。
可以使用-STOP选项来挂起进程,使用-CONT选项来恢复进程
信号-进程通信
信号有两类:标准信号和实时信号。标准信号是传统Unix系统中的信号,编号范围从1到31。实时信号是Linux独有的信号,编号范围从32到64
信号编号 信号名称 含义
1 SIGHUP 终端挂起或者控制进程结束
9 SIGKILL 强制终止进程
18 SIGCONT 继续执行被暂停的进程
19 SIGSTOP 暂停进程
进程通信-信号
进程通信-管道pipe:
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
命名管道FIFO 和 匿名管道 pipe |
共享内存 信号量 和 消息队列 信息-IPCS命令是Linux下显示进程间通信设施状态的工具
共享内存-共享内存的使用,主要有以下几个API:ftok()、shmget()、shmat()、shmdt()及shmctl()。
进程通信-信号量Semaphore
ipcmk命令用于创建Linux系统中的IPC对象,包括消息队列、共享内存和信号量等。
ipcs 命令用于列出Linux系统中的IPC(进程间通信)对象,包括消息队列、共享内存和信号量等
ipcrm命令
进程之间通信-套接字
socket即套接字是一种通信机制
本机进程通信-不同进程可用进程号(process ID)唯一标识
UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal)
UNIX system V有:消息(message)、共享存储区(shared memory)和信号量(semaphore)等.
网间进程通信-三元组(ip地址,协议,端口)就可以标识网络的进程
网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议
TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake)
API: socket()函数 bind() listen()、connect() accept() read()、write() close()
主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型
创建socket、命名socket、监听socket、接受连接、发起连接和关闭连接
internet domain,也就是一开始说的“IP地址+端口号”,
命令行: ss(socket statistics)命令可以获取socket连接信息
netstat - atulnp 会显示所有端口和所有对应的程序,用grep管道可以过滤出想要的字段
lsof -i:端口号 用于查看某一端口的占用情况,比如查看9092端口使用情况,lsof -i:9095
fuser命令可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口 fuser 端口号/tcp fuser 3306/tcp
ifconfig
iptables 是Linux中的一个防火墙工具,也可以用来查看被占用的端口
tcpdump 是一个强大的网络抓包工具,可以捕获和分析网络数据包
MAC地址 ifconfig是用于查看网络接口配置的命令 “HWaddr”字段即为MAC地址 Media Access Control
网卡地址、硬件地址、适配器地址
网卡是否工作,包括硬件和驱动:lspci,dmesg
ifconfig 命令检查网卡eth1状态
env | grep -i proxy
ping
route 命令查看内核路由表 主机和网关之间
nslookup命令查看DNS解析
是否开放端口 防火墙规则
docker命令行
docker rmi $(docker images -f "dangling=true" -q)
image为 <none> 命名的镜像,这种也称为悬空镜像
在同环境中两个镜像名称:tag都相同,image层数据内容不一致,覆盖后则会出现 <none> 标志
正运行的容器所引用的镜像,将其强行删除镜像docker images会出现none标记
docker ps -a | awk 'NR>1 {print $2 $4}'
进程中的OpenHarmony
大型机时代、PC主导的互联网时代,以及智能手机主导的移动互联网时代--万物互联时代
以鸿蒙为例
内核层、系统服务层、框架层和应用层
1.微内核架构
LiteIPC是 OpenHarmony LiteOS-A内核提供的一种新型IPC(Inter-Process Communication,即进程间通信)机制
LiteIPC主要是为RPC(Remote Procedure Call,即远程过程调用)而设计的,而且是通过设备文件的方式对上层提供接口的,而非传统的API函数方式
主要概念,一个是ServiceManager,另一个是Service。整个系统只能有一个ServiceManager,而Service可以有多个。
System V IPC机制,
AT&T的贝尔实验室和加州大学伯克利分校(BSD)。
在通信方面,
AT&T的贝尔实验室主要对单个计算机内的进程通信机制进行了改进和扩充,形成了System V IPC;
加州大学伯克利分校(BSD则主要在计算机间,基于嵌套字(socket)的进程间通信机制方面做出了重要贡献。
内核抽象层(KAL,Kernel Abstract Layer)通过屏蔽多内核差异
2.统一的设备驱动框架--统一多端设备
OpenHarmony 系统驱动开发,OpenHarmony 系统 HDF 驱动框架支持多种驱动加载方式:
HDF 驱动框架主要由驱动基础框架、驱动程序、驱动配置文件和驱动接口这四个部分组成。
提供统一外设访问能力和驱动开发、管理框架。
3.鸿蒙分布式架构-分布式软总线-分布式数据管理-分布式任务调度-设备虚拟化
设备间的发现和连接:从手动发现,进化成自发现
多设备互联后的组网技术:软总线组网-异构网络组网
多设备多协议间的高效传输技术
通过轻量级的 IPC(Inter Process Communication,进程间通信)机制进行通信,实现了更加灵活、可定制化的系统设计
管理设备认证、组网、通信
4.强大的编译工具链
用户程序框架、Ability框架以及UI框架,多终端软件平台API具备一致
5. 包括系统级安全、应用级安全和网络安全等方
积累的一些操作
重命名
#01.
unable to execute /usr/bin/rename: Argument list too long
#02. find需要知道exec的参数何时终止 \;
find /old -name '*.*' -exec mv {} /new \;
# 03批量重命名
find ./ -name "*.jpeg" |xargs -i sudo rename -v 's/.jpeg/.jpg/' {}
# <() 操作 类似于匿名文件
comm <(find ./ -maxdepth 1 -type f -name "test*.zip" |cut -d . -f1-2 |sort) <( find ./ -maxdepth 1 -type d -name "test*"|sort )
### 比较两者之间的差异,然后删除 uniq -d表示仅显示重复行
sort <(find ./ -maxdepth 1 -type f -name "test*.zip" |cut -d . -f1-2 ) <( find ./ -maxdepth 1 -type d -name "test*" ) |uniq -d | xargs -i rm -v {}.zip
##
find ./ -maxdepth 1 -type f -name "*.bag" |while read dir;do rosbag filete $dir ../baagtest/$dir "topic=='info/test' ";done
for file_nm in `ls` ;do mv -f $i Start_"$i`; done
批量查看
--查看当前目录下每个子目录的文件数量
find ./ -maxdepth 1 -type d | while read dir; do count=$(find "$dir" -type f | wc -l);echo "$dir :$count"; done
-- 查看当前目录压缩文件内的图像个数
find ./ -maxdepth 1 -type f -name "*.zip" | while read dir; do count=$(unzip -v "$dir" |grep ".jpg" |wc -l); echo "$dir : $count "; done
--命令说明
01.linux变量赋值 :变量赋值的格式:变量名=值
注意: 变量名和和值与=之间不要有空格 bash中变量赋值,等号两边均不能有空格存在;
count=$(unzip -v "$dir" |grep ".jpg" |wc -l); 对的格式
count = $(unzip -v "$dir" |grep ".jpg" |wc -l);错误格式
02.:查看压缩文件目录,但不解压 -v list verbosely/show version info
unzip -v ./345.zip | wc -l
03.shell中while read line的一种用法:
read通过输入重定向,把file的第一行所有的内容赋值给变量line
while read line 是一次性将文件信息读入并按行赋值给变量line ,
while中使用重定向机制,文件中的所有信息都被读入并重定向给了整个while 语句中的line 变量
04.find
--不是以Test开头的有哪些
find . -name "[^Test]*"
简名 全名 中文名 含义
atime access time 访问时间 文件中的数据库最后被访问的时间
mtime modify time 修改时间 文件内容被修改的最后时间
ctime change time 变化时间 文件的元数据发生变化。比如权限,所有者等
ls -l #默认的ls -l显示的是mtime
ls -l --time=ctime #列出ctime
find -amin -mmin -cmin (注意只能以time、min作为单位)
##进一步完善
find ./ -maxdepth 1 -type f -iname "*.zip" | while read dir; do count=$(unzip -v "$dir" |grep -i ".jpg" |wc -l); echo "$dir : $count "; done
find ./ -maxdepth 1 -ctime 0 -type f -iname "*.zip" | while read dir; do count=$(unzip -v "$dir" |grep -i ".jpg" |wc -l); echo "$dir : $count "; done
find ./ -maxdepth 1 -newermt '2021-10-01' ! -newermt '2021-10-21' -type f -iname "*.zip" | while read dir; do count=$(unzip -v "$dir" |grep -i ".jpg" |wc -l); echo "$dir : $count "; done
-newermt '2021-10-01' ! -newermt '2021-10-21
find -newermt的真正形式是find -newerXY {variable} X可选a,c,m; Y可选a,c,m,t。
2. 进行反选,在find中加入 !
Linux目录下面,如果有文件或文档名中带有空格, 可以考虑将空格转化其它的字符,比如将空格转化为“_”这种下划线
find . -type f -name "* *" -print |while read name; do rep_nm=$(echo $name | tr ' ' '_'); if [[ $name != $rep_nm ]]; then mv "$name" $rep_nm; fi; done ;
find . -type f -name "* *" -print |while read name; do rep_nm=$(echo $name | tr ' ' '_'); if [[ $name != $rep_nm ]]; then mv "$name" $rep_nm; fi; done;
for file in `ls`; do result=$(echo $file | grep ".jpg"); if [[ $result != "" ]] ; then echo $result ;fi;done;
for file in `ls`; do result=$(echo $file | grep ".cfg"); if [[ $result != "" ]] ; then rename -v 's/^/TEST_/' "$file" ;fi;done;
shell
#查看当前用户可以使用的shell
cat /etc/shells
#查看当前所使用的shell
echo ${SHELL}
#查看所有用户使用的shell
cat /etc/passwd
# 设置shell类型
chsh -s /bin/bash
shell命令
循环-常用循环方式
for i in `cat $FILENAME`
do
echo $i
done
while read line
do
echo $line
done < file
command | while read line
do
…
done
shell 一行写一个循环
数据重定向 管道命令
while read f_nm; do echo "$f_nm "; done < /opt/test.txt
cat /opt/test.txt | while read f_nm ;do echo "$f_nm "; done
for file_nm in `cat /opt/test.txt` ;do echo $file_nm; done
for file_nm in $(cat /opt/test.txt) ;do echo $file_nm; done
shell脚本
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1是传递给该shell脚本的第一个参数
$2是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
私服
echo 1.10.10.10 repo.test.com >> /etc/hosts
cd /etc/apt/
cp sources.list{,_bak}
echo deb https://repo.test.com/repository/apt-aliyun/ bionic main restricted universe multiverse >/etc/apt/sources.list
echo deb https://repo.test.com/repository/apt-aliyun/ bionic-security main restricted universe multiverse >>/etc/apt/sources.list
--非常不安全
sudo apt-get update --allow-insecure-repositories
sudo apt-get install vim --allow-unauthenticated
find命令+cut
01.目录重命名
find ./ -maxdepth 1 -type d |cut -d / -f 2 |xargs -i echo ./{} ./my_{}_new
find ./ -maxdepth 1 -type d |cut -d / -f 2 |xargs -i mv ./{} ./my_{}_new
02.压缩文件
find ./ -maxdepth 1 -type d |cut -d / -f 2 |xargs -i echo {} {}.zip
find ./ -maxdepth 1 -type d |cut -d / -f 2 |xargs -i zip -r -v {}.zip {}
cat /my/new/test_pack.txt | while read dir; do echo $dir.zip $dir ; done;
cat /my/new/test_pack.txt | while read dir; do zip -r -v $dir.zip $dir ; done;
03.统计zip压缩的数据
find /my/new/ -name '.zip' |while read dir; do count=$(unzip -v "$dir" |grep -i ".png" |wc -l); echo "$dir —— $count "; done;
find ./ -maxdepth 1 -type d | while read dir; do count=$(ls $dir |wc -l); echo "$dir : $count "; done;
04.上传文件
find ./ -maxdepth 1 -type f -name "*.zip" |cut -d / -f 2 |xargs -i echo /my/new/{} hdfs:/hdfile/hecked/
find ./ -maxdepth 1 -type f -name "*.zip" |cut -d / -f 2 |xargs -i hadoop fs -put /my/new/{} hdfs:/hdfile/hecked/
cat /my/new/test_pack.txt | while read dir; do echo /my/new/$dir.zip hdfs:/hdfile/hecked/ ; done;
cat /my/new/test_pack.txt | while read dir; do hadoop fs -put /my/new/$dir.zip hdfs:/hdfile/hecked/ ; done;
05.合并文件夹
cd /test/mydata/
find ./ -maxdepth 1 -type d -name "test*" | xargs -i echo {} | cut -d '_' -f 1-5 | sort |uniq |cut -d '/' -f 2| xargs -i mkdir ../sull/{}
find ./ -maxdepth 1 -type d -name "test*" | while read dir; do count=$( echo $dir | cut -d '_' -f 1-5 | cut -d '/' -f 2); mv $dir/* ../sull/$count/ ; done;
find ./ -maxdepth 1 -type d -empty | xargs -i rmdir -v {}
06.字符串处理
sed awk grep cut echo
01.sed [-nefri] ‘command’ 输入文本 新增 删除 和修改替换 查找;
001.#查询包括关键字port=0所在所有行
sed -n '/port=0/p' kube-scheduler.yaml
sed -n '/port=0/=' kube-scheduler.yaml
#显示第19行
sed -n '19p' kube-scheduler.yaml
002.#kube-scheduler.yaml 文件的第19的行首添加注释符# ."^"代表行首,"$"代表行尾
sed -i '19s/^/#/' kube-scheduler.yaml
003.在mytest.cfg 中的第28行加入myname的数据
sed "28i myname" /opt/mytest.cfg
004.在mytest.cfg 中的第29~38行删除
sed '29,38d' /opt/mytest.cfg
加入 -i才会执行到文档
sed -i "28i myname" /opt/mytest.cfg
sed -i '29,38d' /opt/mytest.cfg
005.替换-第五行的
sed '5s/mi=5/mi=1/' test.txt
cat test.txt |grep tiout | sed -n 's/mi=5/mi=1/'
获取字符串所在的行数
cat kube-scheduler.yaml | grep -n port=0
awk awk 具有编程语言的特性 变量,和循环,分支等逻辑
cat kube-controller-manager.yaml |grep -n port=0 | awk -F ':' '{print $1}'
linux 时间-时区-时钟
01.Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟
系统时钟则是指kernel中的时钟, 硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。
时钟查看和设置的命令主要有date、hwclock和clock
date
clock --show
硬件时间的运行,是靠BIOS电池来维持,而系统时间,是用CPU Tick来维持的-在系统开机的时候,会自动从BIOS中取得硬件时间,设置为系统时间
02.定时 延时 倒计时 限时
定时器(setInterval)
at
crontab
a time limit command : timeout
delay: sleep
03.集群时间同步
ntpdate NTP(Network Time Protocol,网络时间协议)
GNSS (Global Navigation Satellite System) 纳秒级,百纳秒内
PTP(Precision Timing Protocol精密时间协议) 有线网络中可以实现5ns级的时间精度
gPTP 协议==TSN(Time-Sensitive Networking,时间敏感网络)中时间同步协议使用 IEEE 802.1AS 协议
“处理延时(processing delay)”和“传输延时(propagation delay)
第三方的命令 timelimit
第二条命令仅在***条命令成功执行后才会开始执行 &&
管道命令 |
xargs -i {} :xargs(extended ARGuments) 是给命令传递参数的一个过滤器
timeout是一个命令行实用程序,发出有时间限制的命令
它运行指定的命令,如果在给定的时间段后仍在运行,则终止该命令
timeout 如果它在超时值之前完成,
timeout 2s rostopic echo -n 2 /per/lar
timeout 3 bash -c "ls | sleep 10"
timeout 5s find ./ -maxdepth 1 -type f -iname "*.bag"
如果不加以限制的话,直接执行 tail -f /var/log/pacman.log 的话,它会一直打印信息,直到你按 ctrl+c 为止
timeout -k 20 10 tail -f /var/log/pacman.log
timeout 命令在命令/程序运行到指定时间之后,将会发送一个信号给该命令/程序。默认情况下这个命令是 SIGKILL 代号 20 的信号是 SIGSTP 信号
当然你也可以指定它发送其它信号,这个时候你就需要使用它的 -k 选项了。,所有支持的信号可使用以下命令查询 kill -l
timeout 10 dmesg -w
后缀s代表秒(默认值), m代表分,h代表小时,d代表天。
###sleep命令可以延迟脚本执行一段时间
Linux date 命令可以用来显示或设定系统的日期与时间
###第三方的命令 timelimit
###进程与信号
kill -l killall pkill skill
ps pidof
Linux-文件系统
ramfs initramfs rootfs sysfs
kernel
Ramfs 是一个空间大小动态可变的基于 RAM 的文件系统,
它是Linux 用来实现磁盘缓存(page cache and dentry cache)的文件系统
RAM是随机存取存储器,也叫主存,是与CPU直接交换数据的内部存储器
initramfs 挂载真正根文件系统之前加载一些必须的设备驱动程序,也可以作为根文件系统的“跳板”
根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行
ramfs 的cache实现上加了一层很薄的封装, initramfs不依赖于任何其他文件系统
以 cpio 格式压缩后的 rootfs 文件系统.通常和 Linux 内核文件一起被打包成 boot.img 作为启动镜像
rootfs : 根文件系统首先是内核启动时所mount的第一个文件系统
rootfs是基于内存的文件系统,所有操作都在内存中完成;也没有实际的存储设备,所以不需要设备驱动程序的参与
/etc/ /bin/ /sbin/ /lib/ dev/
内核代码映像文件保存在根文件系统中
根文件系统包含系统启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件
linux挂载分区时所依赖的信息存放于根文件系统/etc/fstab
sysfs 文件系统
自动或手动挂载其他的文件系统
文件系统类型、文件系统和一个挂装点--文件和树形目录
磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab
配置“/etc/fstab”文件,再通过mount -a命令重新将“/etc/fstab”文件所有内容加载即可
通过lsblk命令查看可用的磁盘分区-通过blkid命令,查询磁盘分区的UUID TYPE是分区的文件系统格式
df -h命令查看挂载信息
Linux压缩和解压
一、分卷压缩
01.先压缩成完整zip:zip -r a.zip ./somethings ;
02.再分割成分卷:zip -s 1g a.zip --out b.zip ,单位可以是m、g、t等;
二、分卷解压
01.先将分卷合并成完整zip:
方法一:cat b.zip b.z01 b.z02 > a.zip 或 cat b.z* > a.zip ;
方法二:zip -F b.zip --out a.zip ;
方法三:zip -s 0 b.zip --out a.zip ;
02.再解压zip到指定目录:unzip a.zip -d ./dir
三:##加密压缩-在分卷压缩--分片
把日志文件按100M来拆分。 默认是以字母来标记分片的,
split -b 100M out.log out.log.
#如果想要以数字为结尾的,如“XXX.xx.01”,可以加上“-d”的参数。
split -b 100M -d out.log out.log.
命令指定把文件分割成 n 份,如
split -n 5 -d out.log out.log.
###合并文件
cat 命令就可以简单快速的“组装”回去了
“join”指令可以将两个文件连接到一起,其连接依赖于两个文件的共同字段
,只有这些字段相同的行才会连接起来。例如,将“file1”和“file2”两个文件连接成一个文件“newfile”的命令如下
“paste”指令可以将多个文件按照列的方式合并在一起,其格式如下
说明
解压ZIP分卷压缩文件之前,要先确保所有的分卷压缩包都存放在一个文件夹里,且名字没有更改过,否则会解压失败。
WinRAR,只能通过解压第一个分卷文件来解压全部文件,选择其他分卷时没有“解压选项”
-r 递归处理所有子文件
-s 指定分卷的大小
-F 尝试修复损坏的压缩文件
r:压缩文件夹 e:加密压缩
传统的zip分卷压缩是和zip加密独立而开的,即当且仅当使用了其中一个,就不可以使用另一个的互斥关系。
所以我们选择使用split来分卷压缩:
分割文件 split 合并文件 join
分卷压缩--大小--数据加密
###tar
j,通过bzip2命令压缩或解压 z,通过gzip压缩或解压
-c:表示创建新的tar包
-x:从存档文件中提取文件(eXtract)
-t:不解压查看tar包的内容
v,表示显示详细tar执行过程
f 指定压缩文件名(一定要写在选项最后一个)
打包文件:tar -zcvf cofig.tar.gz test.txt
文件解包:tar -zxvf config.tar.gz
查看命令:tar -ztvf config.tar.gz
1、不带目录压缩
tar -czf 压缩文件名 文件路径/文件名 默认会把待压缩文件的文件夹一起压缩的,
tar -C 文件路径 压缩文件名 待压缩文件1 待压缩文件2 这样压缩就没有文件夹路径。
同样zip压缩不带路径的方式为 zip -pj 压缩文件名 带压缩文件
cat /my/new/test_pack.txt | while read dir; do zip -r -v $dir.zip $dir ; done;
使用-j参数:不处理压缩文件中原有的目录路 -j 只保存文件名称及其内容,而不存放任何目录名称。
tar zcvf /data/cloud/testb.tar.gz -C /data/cloud .
2.zip乱码
####1.现象描述
-乱码:
windos下面的文件夹打成zip包上传至Linux中解压处理,解压后中文文件名变成了乱码
####分析原因:
zip格式中并没有指定编码格式
windows下生成的zip文件中的编码是GBK/GB2312等,linux系统中默认的编码是UTF8
因此导致这些windows下压缩文件在linux系统中解压时出现乱码问题
Linux命令行 locale echo $LANG
####解决办法
指定编码格式为GBK GB18030进行解压
unzip -O cp936 xxx.zip 或者: unzip -O gbk xxx.zip
1.docker 日志占用空间比价大处理方式
在docker 环境中,将已启东的容器停止。命令:docker stop “容器名”发现此命令无效,
使用命令docker ps 容器仍然处于“up”状态,
使用docker kill “容器id”,显示该容器没有在运行,但是docker ps 仍处于运行状态
解决方案:重启docker
命令:systemctl restart docker
命令:docker ps 显示没有容器在运行。
执行以下命令,可查看各文件夹空间占用情况:
du -h -x --max-depth=1
需要关闭进程才能释放空间
如果先通过rm -f命令删除了日志文件,则需要kill掉进程才能是否空间,否则虽然文件被删除了但空间未被释放,
此时可以通过 lsof|grep deleted 命令查看删除的文
有时看 /下实际占用空间并没有满,有可能是只删除了文件,但实际进程还在文件还是打开的空间没有释放;
lsof | grep deleted : 列出当前系统已打开文件,但是deleted的状态
当有其他进程打开某文件时文件被删除,就会将该文件标记为deleted,并删除其目录节点。
使用du查看时,因为没有该删除状态文件的节点信息,所以就不做统计,从而导致与df的结果不一致。
若要将deleted状态文件删除,则根据pid直接kill调相应进程即可
lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。
通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件
查看linux进程占用端口步骤如下:
lsof -i 用以显示符合条件的进程情况
fuser命令的用法是:fuser -uv 文件名 列出的结果里面,PID那一列就是占用该文件的进程PID,COMMAND那一列是占用该文件的进程名
###crontab -l是查看
### 周期性的移动数据--30秒移动一次
### 命令 crontab -e 输入以下语句,然后 :wq 保存退出
### crontab -e是编辑 如果要停止某个定时任务,只需要 -e 的时候使用 # 将其注释即可
* * * * * mv $(find /media/my/ -maxdepth 1 -type f -name "*.txt" ! -name "*.active") /data/cloud/tmp
* * * * * sleep 30; mv $(find /media/my/ -maxdepth 1 -type f -name "*.txt" ! -name "*.active") /data/cloud/tmp
linux
Linux 服务管理有两种方式 service 和 systemctl
旧的init启动脚本(System V的那个)是“一项一项任务依序启动”的模式,因此不相依的服务也是得要一个一个的等待
systemV还要init,chkconfig,service...等等指令
on off status start stop restart
service ssh start
而systemd是Linux系统最新的初始化系统(init) systemctl
enable disable status start stop restart
systemctl start sshd
Linux 执行二进制文件
file 查看文件类型
1.更改文件权限:可以使用chmod命令更改文件的权限,例如:chmod +x /path/to/file将文件设置为可执行。
2.在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:
error while loading shared libraries: libvtkRenderingCore8.2.so.1: cannot open shared object file: No such file or directory
3.修改环境变量
https://blog.51cto.com/u_15717531/5471391
####vscode远程连接
01. 可以先测试ssh是否能够远程登录容器
启动一个容器,并将 端口映射到容器的22端口上
进入容器,
设置容器密码 修改配置,获取远程ROOT权限
安装 ssh 服务 开启sshd服务
sudo vim /etc/ssh/sshd_config,找到 PermitRootLogin without-password 修改为PermitRootLogin yes
注意-仅限于个人用容器使用root远程连接,其他情况谨慎使用root
02.使用vscode,为了方便调试,远程连接服务器中的 docker 容器
https://update.code.visualstudio.com/commit:2d23c42a936db1c7b3b06f918cde29561cc47cd6/server-linux-x64/stable
VS Code Server 允许以新的方式使用 VS Code
vscode
Remote - SSH
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh
服务器上安装VS Code Server
离线的情况
https://code.visualstudio.com/updates/v1_76 查看版本
https://github.com/microsoft/vscode/tree/release/1.76
https://github.com/microsoft/vscode/commits/release/1.76
ee2b180d582a7f601fa6ecfdad8d9fd269ab1884
https://update.code.visualstudio.com/commit:e7d7e9a9348e6a8cc8c03f877d39cb72e5dfb1ff/server-linux-x64/stable
bin 目录下面存放的是VS Code Server程序,
extensions 目录下是VS Code Server端安装的插件
data 目录下是用户数据
签名文件以及校验文件
校验和签名
签名文件 +加密 +认证 +验证
01.校验文件: Linux 校验命令 md5sum sha1sum
01.判断两个文件是否相同,可以使用校验和(checksum),检验和一样,则两个文件相同。
02.加密文件
使用gpg命令加密文
gpg -c plainfile.txt
解密
gpg plainfile.txt.gpg
03.签名文件 --PGP签名技巧 PGP(Pretty Good Privacy)是一种用于保护个人通信内容的安全协议。PGP使用一种混合加密系统
PGP数字签名使用私钥/公钥对,
发送者可以使用自己的私钥对通信内容进行数字签名,
接收者使用发送者公钥进行验证,以确保通信信息来自发送者并未被篡改
步骤
1.生成密钥对的命令如下:
gpg –gen-key #在输入命令后,系统会提示输入生成密钥所需的信息,如名称、邮箱、密码等等。
2.使用命令行工具gpg来进行PGP签名
gpg –sign filename #其中,filename是待签名的文件名 执行命令后,系统会提示输入密钥密码,输入正确的密码后,签名就会生成
3.使用命令行工具gpg来验证PGP签名。
gpg –verify filename.sig filename
验证签名的命令如下:执行命令后,系统会提示签名的真实性 filename.sig是签名文件的文件名
4.导入PGP公钥 使用PGP加密通信 使用PGP解密通信
gpg –import
gpg –encrypt -r
gpg –decrypt
Git免密拉取代码
1.ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
创建一个公钥(id_rsa.pub)和私钥(id_rsa)
2.公约 添加SSH Key到GitHub/GitLab等服务器:登录到你的Git服务商网站,找到“Settings”-> “SSH and GPG keys”
3.测试联通性 git@github.com git对应的网站
ssh -T git@github.com (如果你使用的是GitHub),或者ssh -T gitlab.com
4.拉取代码
ssh-keygen
是 OpenSSH 身份验证密钥实用工具。 ssh-keygen 用于OpenSSH身份验证密钥的生成、管理和转换,它支持 RSA 和 DSA 两种认证密钥
apt-key
用于管理Debian Linux系统中的软件包密钥。每个发布的deb包,都是通过密钥认证的,apt-key用来管理密钥
本地trusted数据库中,使用描述性名称,以gpg或asc作为文件扩展名
/etc/apt/sources.list指定的源更新软件列表
Release文件和签名文件[.gpg]分离的
Release 文件
Release文件包含分发元数据和索引文件的校验值
apt 要求随 Release 文件一起发布一个 Relesase.gpg 的签名文件,用来验证安装包提供者的信息
之前:官方保存 /etc/apt/trusted.gpg文件中。
第三方软件密钥需要通过apt-key add [.gpg] 安装到/etc/apt/sources.list.d/目录下
说明:新的密钥将存在 /etc/apt/trusted.gpg.d/ 目录下, 而不是/etc/apt/trusted.gpg文件中
rpm数据库文件目录为/var/lib/rpm,
rpm数字签名验证功能主要是向系统管理员提供一种有用的管理机制,其使用/var/lib/rpm目录下的数据库内容,来比较当前linux系统环境的所有组件
$rpm -Va #验证系统所有RPM包
--sign参数来加上数字签名。
$rpmbuild -ba --sign xxx.spec
终端 gnome-terminal
控制台切换 终端控制台 consol
Linux 预设的情况下会提供六个Terminal 来让使用者登入,
切换的方式为使用:[Ctrl] + [Alt] + [F1]~[F6]的组合按钮
虚拟终端 虚拟终端pty(pseudo-tty)。
linux 命令行多窗口-gnome-terminal
gnome-terminal --title="OBU" -- bash -c "sh /home/hil/HILsh/HIL/OBU.sh"
gnome-terminal --title="OBU" -- bash -c "sh /home/hil/HILsh/HIL/OBU.sh;exec bash"
最后的exec bash;是让打开的终端在执行完脚本后不关闭
# 使用-e 或-- 后面跟命令
gnome-session-properties 是ubuntu的开机启动项管理器
1.打开设置开机自启配置程序
终端输入 gnome-session-properties
额外的启动程序- DesktopController
2.添加开机自启配置
点右方的add加入
填写名称,可自定义
填写指令,即开机想要执行的指令 -- 注意脚本要有执行权限
gnome-session-properties 实际是在 /home/user/.config/autostart 下写入一个desktop启动脚本,
也可以直接将脚本写成desktop的内容形式,放在/home/user/.config/autostart目录下
GNOME桌面的终端模拟器-- GNOME终端 终端给用户使用基于文本的命令(例如 Bash)和系统交互的能力。
gnome-terminal 基础用法
命令行: 在终端中 输出 gnome-terminal,就会自动弹出一个新的终端
手动交互: Ctrl + Alt + t键,也会弹出一个新的终端
linux 命令行多窗口-gnome-terminal
gnome-terminal --title="OBU" -- bash -c "sh /home/hil/HILsh/HIL/OBU.sh"
gnome-terminal --title="OBU" -- bash -c "sh /home/hil/HILsh/HIL/OBU.sh;exec bash"
最后的exec bash;是让打开的终端在执行完脚本后不关闭
# 使用-e 或-- 后面跟命令
gnome-terminal 多窗口、多标签
–-window: 打开一个新窗口
–-tab: 在最后一个窗口中打开一个新标签页
-–window 是生成多个新的窗口 -–tab是在同一个窗口中生成多个标签页
ssh连接远程服务器,cd到自定义目录,执行python3
gnome-terminal -e 'ssh -t 192.168.0.10 "cd /home/test/rr;python3;exec bash"'
gnome-terminal --command 'ssh -t test@192.168.0.10 "cd /home/test;ls;exec bash"'
sshpass 是一个实用工具,它提供了一种自动化 SSH 密码认证的方式。
它允许你将密码作为命令行参数或通过环境变量传递给 SSH 命令,从而在非交互式方式下进行 SSH 登录
KDE 与 GNOME:什么是 Linux 桌面的终极选择
Ubuntu自带的桌面环境是gnome
快捷键
ctrl + Alt +T 打开一个新窗口
ctrl + shift +T 打开一个新标签页
ALT + Tab
Alt + [1 - 9] 标签之间切换 Ctrl+PgUp/PgDn 切换标签页
Ctrl+l 相当于clear,即清屏
参考:
SSH 远程连接docker容器 https://zhuanlan.zhihu.com/p/553478864
Linux