基于虚拟机ubuntu的linux和shell脚本的学习,以及SSH远程登陆实战
简介
特点
是一款操作系统,跟windows,macos一样,有下面的特点
简单和高效,一切皆文件,所有配置都通过修改文件解决,不需要繁琐的权限和设置
权限高,把所有细节都交给用户,可完全自定义
安全,所有程序只有自己执行才会启动
分类
1、debian系主要有Debian,Ubuntu,Mint等;
2、redhat系主要有RedHat,Fedora,CentOs等,
3、其它有Slackware,Gentoo,Arch linux,LFS,SUSE等。
4、如果开发用,推荐redhat系,业内公司的服务器多用centos,考虑到平时使用,那么就选择fedora,可以选择最新的发行版。
5、如果简单用加开发,可以选择debian系,推ubuntu,mint。
6、如果是技术狂型,那么就推荐Gentoo,Arch linux,LFS,Slackware等
下面教程以ubuntu为例
安装
虚拟机
在阿里云或清华镜像网站下载到iso,学习时最好使用desktop版
在vmware直接创建典型,跟着操作
安装时最好选英文,一定要记住设置的密码,如000000
,防止时间太久忘记,当然,忘记了也可以去搜索对应解决方法
WSL2
这个只是命令行,方便学习命令,日常使用建议还是虚拟机安装桌面版
下载wsl2内核更新包,然后直接安装
然后设置wsl2为默认
wsl --set-default-version 2
然后微软商店下载所需要的发行版安装如ubuntu
安装完成后就可以在cmd中输入wsl直接进入了
shell&terminal
shell是一种应用程序,帮助用户和操作系统交互
terminal是一个交互界面,用于获取输入,交给shell执行,将输出展示在终端
而应用程序按是否有图形化界面分两种:
CLI(Command Line Interface)和GUI(Graphical User Interface)
即命令行和图形界面
Shell是一类程序,有CLI形式(如sh,bash,zsh;cmd,powershell等),也可以有GUI形式的(如Windows资源管理器explorer.exe等)
文件系统
目录结构
linux哲学 : 一切皆文件
执行ls /
查看根目录得到下面结果
按树状目录
目录按找功能大致分为
通用数据
/bin Binaries,系统的二进制文件,存放着常用的命令,二进制文件由操作系统直接执行
/lib Library,存放动态链接库,类似windows中的dll
/var variable,习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
/srv server, 该目录存放一些服务启动之后需要提取的数据
/usr unix shared resources,共享资源,大部分程序和文件都存在这里面,常用如下
/usr/src /usr/bin /usr/sbin 分别是源码,普通用户的二进制文件,超级用户的二进制文件
/opt optional,可选目录,默认为空
/tmp temporary,存放一些临时文件
/lost+found,当系统非法关机后,这里就存放了一些文件
用户数据
/home 普通用户
/root 超级用户
操作系统
/boot linux启动时的一些连接文件以及镜像文件
/dev device,存放Linux 的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的
/etc 存放所有的系统管理所需要的配置文件和子目录
/media 系统自动识别一些设备,例如U盘,光驱等等.系统会把识别的设备挂载到这个目录下
/proc Processes,是一种伪文件系统,存储的是当前内核运行状态,它是系统内存的映射,并不在硬盘上
/run run是一个临时文件系统,存储系统启动以来的信息.当系统重启时,这个目录下的文件会被删掉或清除
/mnt mount,系统提供该目录是为了让用户临时挂载别的文件系统
/selinux Redhat/CentOS特有的安全功能规则的目录
文件操作
所有指令可以通过man command
的形式查看用法(man:manual,命令的手册页面)
目录
目录分类
绝对目录: 从/
开始,目录的全名
相对目录: 从当前开始.
表示当前目录,..
表示父级目录
特殊目录: ~表示当前用户目录
打印
pwd (print working directory),即打印当前目录
ls (list directory contents).列出目录内容
可选参数
-a 显示所有文件及目录(“.”开头的隐藏文件也会列出),-A可以不列出`.和..`
-l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
-t 将文件依建立时间之先后次序列出
-F 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
-R 若目录下有文件,则以下之文件亦皆依序列出
多个参数可以连写,如ls -al /
切换
cd [destination] 可以用tab补全目录
管理
创建目录 mkdir [-p] directory_name
如果创建多级目录,可用-p自动创建缺失的父目录
删除目录 rmdir [-p] directory_name
,只能删除空目录,要删除文件要用rm命令
文件
创建
touch file_name
复制和移动
cp [options] source destination
options
-i 在覆盖已有文件之前询问是否覆盖
-r 若给出的源文件是一个目录文件,将复制该目录下所有的子目录和文件
mv [options] source destination
options
-i 执行覆盖前询问
-n 不执行覆盖
-u 当源文件比目标文件修改时间更晚或目标不存在时,才执行移动
删除
rm [options] [file or directory]
options
-i 删除前询问
-r 递归地删除所有子目录和文件
-f 强制删除,不给出任何提示
-v 显示详细的删除过程
shell没有回收站,rm -rf谨慎使用
显示
cat [options] file...
options
-n 加上行号
-s 将连续两行以上的空白行替换为一行
如果file不止一个文件,则会将它们连接起来
过滤显示
grep [options] [想要匹配的正则表达式] [文件或目录...]
options
-A [n] 除了显示匹配的那一行之外,还显示该行之后的n行(after)
-B [n] 除了显示匹配的那一行之外,还显示该行之前的n行(before)
-C [n] 除了显示匹配的那一行之外,还显示该行之前和之后的n行(contest)
-c 计算总匹配的行数
-r 查找目录而非文件时,必须加上这一参数,否则会报错
-e 使用正则表达式进行匹配,默认也是这样
-E 使用拓展的正则表达式进行匹配
-i 忽略字符大小写的差别
-l 列出含有匹配成功内容的文件名
-n 在显示匹配的行之前,标示出该行的行号
-v 显示不包含匹配表达式的所有行,相当于反向选择
正则表达式用单引号括起来
vim
Vim(Vi Improved)是一款文本编辑器,是Unix和类Unix系统上的一个经典编辑器,是Vi的一个增强版本
三种模式
命令模式(command),进入时的默认模式,按下esc进入
输入模式(insert),按下i进入
底线命令模式(last line): 按下:进入,常用q和wq(退出和保存并退出)
命令模式
- h i j k 左下上右移动光标
- i – 切换到输入模式,在光标当前位置开始输入文本。
- : – 切换到底线命令模式,以在最底一行输入命令。
- x – 删除当前光标所在处的字符。
- o:在当前行的下方插入一个新行,并进入插入模式。
- O – 在当前行的上方插入一个新行,并进入插入模式。
- dd – 删除当前行。
- yy – 复制当前行。
- p(小写) – 粘贴剪贴板内容到光标下方。
- P(大写)-- 粘贴剪贴板内容到光标上方。
- u – 撤销上一次操作。
- Ctrl + r – 重做上一次撤销的操作。
- :w – 保存文件。
- :q – 退出 Vim 编辑器。
用户管理
用GID(group)和UID(user)来区分, 组用来表示拥有相同权限的一类用户,通过root用户来管理
root
su,switch user
sudo superuserdo
切换到root模式就不需要每次都sudo了,方法如下
- 设置root密码
sudo passwd root
- 切换用户
su root
普通用户
下面都需要切换到root用户才能执行
新建
sudo useradd [options] username
options
-m 创建用户的主目录
-d 指定用户的主目录(如果不使用默认的话)
-g 指定用户登录组的GID或组名
-p 指定默认密码
-s 指定用户登录的shell
删除
sudo userdel [options] username
options
-r 同时删除用户主目录
修改
sudo usermod [options] username
跟新建一样,如下,将eesast的默认shell从sh修改成了bash
usermod -s /bin/bash eesast
查看
可以通过查看/etc/passwd文件来查看当前系统中的全部用户和属性
cat /etc/passwd
每行用户信息都以 “:” 作为分隔符,划分为7个字段,每个字段所表示的含义如下:用户名:密码(被隐藏):UID:GID:备注(在创建用户时或修改用户时添加):主目录:默认Shell
eesast:x:1001:1001::/home/eesast:/bin/bash
密码
passwd [options] 修改自己的密码,需要知道自己的现有密码
sudo passwd [options] username 修改别人的密码,需要超级用户权限
用户组
一个组中可以有多个用户,一个用户也可以在多个组中
跟用户操作一样
新建用户组: groupadd
修改用户组: groupmod
删除用户组: groupdel
切换用户组: newgrp
查看用户所属的组: groups username
用户权限
即用户组对该目录下的文件具有什么条件
查看
ll (约等于 ls -al) 或 ls -l
得到若干条
drwxr-xr-x 3 root root 4096 May 18 2022 ../
第一段的 drwxr-xr-x 表示文件类型及权限:
第一位表示类型 d:目录 -:文件 l:链接
后面每三位为一组,分别表示属主权限,属组权限,其他用户权限
r,w,x代表拥有read,write,excuate权限,-代表没有
第二段代表有3个硬链接指向该文件对应的节点
第三段表示文件属主为root,第四端表示文件属组为root
第五段表示文件大小为4096,第六段表示修改日期和文件名
修改
修改文件权限
chmod : change mode,修改文件的权限,语法如下
chmod [–R] [u/g/o/a][+/-/=][r/w/x] [file]
-R 表示递归修改
u:user | g:group | o:owner | a:all
+ 增加 - 减少 = 设定
r:读 | w:写 | x:执行
例子如下
为所有用户赋予1.txt的执行权限
chmod a+x 1.txt
为属主赋予读、写、执行权限,删除属组和其他用户的执行权限
chmod u=rwx,g-x,o-x 1.txt
因为选项有限,所以可以用位来表示,即用数字表示权限
上面每个选项都有3个独立的选项,都可以用三位来表示
例如,为所有用户赋予所有权限,用编码方法表示为:
chmod 777 1.txt
修改文件属主/组
chown : change owner
chgrp : change group
sudo chown [–R] [owner] [file]
sudo chown [-R] [owner]:[group] [file]
系统管理
磁盘管理
常用三个命令
- df (disk free):列出文件系统的整体磁盘使用量
- du (disk used):列出文件或目录的磁盘空间使用量
- fdisk :用于磁盘分区
查看使用量
df
df [options] [file or directory path]
options
-h 以人们较易阅读的 GB, MB, KB 等格式自行显示
-a 列出所有的文件系统
-T 显示文件系统格式
df命令会把file or directory path所在的文件系统的磁盘用量展示出来
du
du [options] [file or directory path]
options
-h 以人们较易读的容量格式 (G/M) 显示
-a 列出所有的文件与目录容量,因为不指定文件时默认仅统计目录的容量
-s 列出总量,而不列出每个目录占用容量
du命令会把file or directory path自身占用的磁盘空间大小展示出来,不指定时默认为当前目录
分区
sudo fdisk [option] [device name]
option -l 可以把整个系统内能够搜寻到的装置的分区均列出来
格式化
mkfs [option] [device name]
option: -t [filesystem] 将指定的磁盘格式化为指定文件系统格式
磁盘挂载与卸载
mount [device name] [directory] # 将文件系统挂载到某个目录下
umount [device name or directory] # 将某个文件系统或者某个目录挂载的文件系统卸载
系统管理
查看CPU使用
会出现实时更新的列表
top
查看进程
ps : process status
ps [options]
options
-a 列出所有的进程(包括其他用户的)
-u 显示较详细的信息
-x 也显示没有控制终端的进程
终止进程
kill指令用于向进程发送信号,最终如何响应由该进程决定。一般用作“杀死”一个进程,但无法“杀死”系
统进程和守护进程。
kill -l # 列出全部可以发送的信号名称和编号
kill [options] [PID]
options
-s [要发送的信号名称或编号] # 如不指定该项参数,默认发SIGTERM(15),一般可终止进程
-u [用户名] 向指定用户的所有进程发送信号
软件管理
在不同的linux发行版中,有不同的包管理工具,常见下面两个
debian系列的apt (Advanced Package Tool)
redhat系列的yum(Yellowdog Updater, Modified)
拿apt举例
安装
sudo apt install [package name...] # 可以一次性安装多个软件包
卸载
sudo apt remove [package name] # 卸载软件包
sudo apt autoremove # 清理不再使用的依赖和库文件
更新
sudo apt update # 列出所有可更新的软件清单
sudo apt upgrade # 升级全部可升级的软件包
sudo apt upgrade [package name...] # 指定升级软件包
sudo apt full-upgrade # 升级全部可升级的软件包,并且在升级前将旧的包先卸载
查询
apt list --installed # 列出所有已安装的软件包
apt list --all-versions # 列出所有已安装的软件包的版本信息
sudo apt show [package name] # 显示指定软件包的具体信息
sudo apt search [keyword] # 查找可供安装的软件包
其他命令
alias 昵称,别像下面这么写
alias cd='rm -rf > /dev/null'
shell
查找文件
find [path] [options]
path是要查找的目录路径,可以是多个,未指定则默认为当前目录
options
-name [name] 按文件名查找,支持通配符,-iname会忽略大小写
-type [type] 按文件类型查找,f(普通文件),d(目录)等
-path [p] 路径符合 p 的文件
-amin [-n] 在过去 n 分钟内被读取过的文件
-size [+nM] 大小大于 n M的文件
重定向
输入
command < file #将指定的文件内容作为命令的输入
command << string #从标准输入设备(键盘)中读入,直到遇到string才停止
输出
command > file 将命令执行的标准输出结果(stdout)重定向输出到指定的文件中,会覆盖文件
command 2> file 同上,错误输出结果(stderr)重定向到此
command &> file 将二者同时重定向
command 2>&1 >&表示将前面的输出2重定向到后面的文件描述符1中,这里 2>&1,即stderr重定向到stdout
command >>file 同理,会追加文件
管道
用|,将多个命令连接到一起,将前一个命令的输出作为后一个命令的输入
例如
ls -l | grep "txt"
清空
终端输出太多了,清空一下
clear
shell脚本
在shell中运行的脚本程序,用分号和换行来分割不同命令
变量
变量名和等号之间不能有空格
单独
a=1 #定义
unset a #删除
a=2 #修改,通过覆盖定义实现
echo $a #显示
数组
array=(value0 value1 value2 value3)
echo ${array[0]}
echo ${array[@]} #遍历
控制
分支
if condition1 then
command1
elif condition2 then
command2
else
commandN
fi
循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
for (( i = 1; i <= 10; i++ )) # 需要使用双括号,变量定义可以有空格
while condition
do
command
done
函数
function test(){
echo "参数1: ${1} !" # 通过${n}来获取传入函数的第n个参数
echo "参数10: ${10} !" # 双引号括起来的字符串中可以引用变量
n=$((${1}+${10}))
return $n # 如果不加return,则返回值为最后一条命令的结果
}
test 1 2 3 4 5 6 7 8 9 10 # 调用函数时依序传递参数
echo $? # 可以通过变量$?来获取函数的返回值或者上一条命令的结果
运行
./test.sh # 注意不能写成test.sh,否则会去环境变量中查找
shell环境变量
环境变量是存储有关 shell 的工作环境的数据,以便程序或 shell 中运行的脚能够访问到它们
系统会创建好一些环境变量,我们在安装新程序等操作时也要留意是否需要设置环境变量,否则会出现“command not found”的错误
查看
env # 查看全部全局变量
printenv HOME # 查看个别全局变量(HOME)
echo $HOME # 查看个别全局变量(HOME)
常用环境变量
- HOME :当前用户的主目录
- PATH : shell 查找命令的目录列表,由冒号分隔
- PWD :当前工作目录
设置
临时设置
variable="test"
export variable # 导出环境变量
unset variable # 删除环境变量
长期设置
export PATH=/usr/local/src/mongodb/bin:$PATH
SSH
secure shell,远程登陆会话常用的安全协议,数据进行压缩,加密chuan’shu
实战
确认虚拟机ip地址
接下来演示主机windows连接到虚拟机ubuntu上的
首先是用ifconfig
确认虚拟机的ip地址,需要安装net-tools
然后输出的ens33下的inet就是虚拟机的内网ip地址了
配置虚拟机SSH
- 安装openssh-client:
sudo apt install openssh-client
- 安装openssh-server:
sudo apt install openssh-server
- 启动ssh-server:
sudo /etc/init.d/ssh start
- 确认ssh-server工作正常:
netstat -tpl
如果你看到了有ssh
的字样,就说明ssh正在运行
主机连接虚拟机
打开cmd输入
ssh username@192.168.x.x
得到
The authenticity of host '192.168.x.x (192.168.x.x)' can't be established.
ED25519 key fingerprint is SHA256:4MTn1ZNTkGQoN8ZEERWfqdhoTV0yuLnLhknyDtXGHfY.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
然后输入yes即可连接
漫画解释
看完前面linux的各种知识,可以来看看来自turnoff的漫画,来巩固一下
结构
解释
POSIX
特点
简介 : POSIX即Portable Operating System Interface for UNIX”,由IEEE提出的一组标准,用于定义UNIX操作系统的接口。
产生原因 : 不同的操作系统,会提供不同的接口函数来实现系统调用,导致跨平台的难度增大
功能全面 : 而POSIX的标准涵盖了各种操作系统功能,包括文件系统、进程控制、系统调用等。
多平台,多语言 : 虽然POSIX最初是为UNIX设计的,但许多其他操作系统,包括Linux、macOS等,也采纳了POSIX标准或其变体。POSIX支持多种语言,但时由UNIX定义的,所以C语言是其正统血脉
功能
- 文件系统操作: 包括文件和目录的创建、删除、读取、写入、定位和权限管理等。
- 进程控制: 包括进程的创建、终止、等待、信号处理以及进程间通信等。
- 用户和组管理: 包括用户和组的创建、删除、以及权限管理等。
- 系统调用: 提供了直接访问操作系统核心功能的接口,例如内存分配、文件 I/O、进程管理等。
- 信号处理: 允许程序捕捉和处理来自操作系统的信号,以便响应异步事件。
- 线程控制: 包括线程的创建、同步、销毁等。
- 网络操作: 包括套接字编程、网络通信等。
- 时间和定时器: 包括获取系统时间、定时器的设置等。
- 共享内存: 允许多个进程共享一块内存区域。
- 互斥锁和条件变量: 用于多线程编程中的同步和互斥。
日常使用
连接网络
有的时候ubuntu安装后却没有网络,可能是因为电脑网络没有共享
虚拟机会虚拟几个专用网络连接来模拟不同的网络,我们只要把主机网络与这些虚拟专用网络共享就好
需要两步: 设置虚拟机的专用网络,设置电脑的共享
虚拟机->属性->网络适配器->自定义->VMnet8->确定
电脑->找到网络适配器设置->打开电脑连接的网络的属性->共享->勾选允许其他用户通过此计算机的internet连接来连接->选择家庭网络连接VMnet8->确定
这个时候打开firefox搜索应该就可以了
安装中文输入法
直接浏览器搜搜狗输入法,有教程,跟着教程走就行了
ctrl+space切换输入法
共享剪切板
只需要安装VMtools即可解决
首先,把所有硬盘链接方式改成使用物理驱动器
- 连接 : 然后启动虚拟机,工具栏->虚拟机->安装VMtools->然后会自动挂载安装文件的,看文件夹会多一个VMwate tools
- 右键单击类似于 VMwareTools.x.x.x-xxxx.tar.gz 复制到桌面后再提取到桌面,然后执行下面命令
su root
cd Desktop/vmware-tools-distrib
./vmware-install.pl #第一个yes后全部默认
reboot
如果安装后无法共享剪切板
apt-get update
sudo apt-get install open-vm-tools-desktop
替换镜像源
默认的源在国内访问不到或者速度极慢,所以我们替换成清华源或阿里源
注意替换需要根据找到对应自己版本的源,即更换sources.txt的内容
首先浏览器搜索ubuntu 清华源
清华镜像 然后根据自己的版本,选择对应的源复制
然后就是如下方更换源,先备份,再修改
cd /etc/apt/
cp sources.list sources.list_bak
vi sources.list