如果有任何问题,可以关注并私信我,我们可以一起解决;
本文中有作业的地方,欢迎大家在评论积极交作业!
引言(来自百度百科):
Linux是运维必会的一个操作系统,Liunx最大的优点就是开源,免费,并且因为是内核系统,就是被我们用来最服务器的系统,有许多的发行版,其中centos在企业中使用比较多,我们就以centos7为系统,来学习Linux;
1.Linux由众多微内核组成,其源代码完全开源;
2.Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4、TCP/IPv6和链路层拓扑程序等,且可以利用Unix的网络特性开发出新的协议栈;
3.Linux系统工具链完整,简单操作就可以配置出合适的开发环境,可以简化开发过程,减少开发中仿真工具的障碍,使系统具有较强的移植性;
VMWare虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。
就是我们电脑是windows的,但是我们怎么能用Liunx系统呢,就需要在我们的Windows系统上安装一个软件VM,VM可以搭建一个虚拟系统环境,用来安装Linux系统,方便我们学习,当然了如果自己有点儿钱,可以直接去阿里云、腾讯云买一台云服务去进行搭建Liunx环境进行,本人确实没有钱,所以麻烦点,在电脑装一个虚拟环境学习;
VM官网:https://www.vmware.com/cn.html
像qq一样安装即可使用;
如果实在不会安装,随便给你们搜了一个教程,看着还可以:https://www.cnblogs.com/fuzongle/p/12760193.html
为什么博主不做图文演示呢,因为我已经有了,不想再卸载安装了(嘻嘻);
使用vm安装centos系统。
Centos官网:https://www.centos.org/download/
这个安装起来比较麻烦,耗时耗力,不过相信自己,一会儿就安装完成了,这里我还是推荐一个
别人的教程:https://blog.csdn.net/babyxue/article/details/80970526
因为我已经安装了,所以才不会去卸载,再安装(嘻嘻)
经过了漫长了安装,终于你又回到了这篇博文,我们终于可以一起学习centos了,可以休息下,给博主点个赞在继续学习吧!
首先我们学习些常用命令,先简单使用一下Linux,我们在桌面打开一个终端,右键打开终端;
我们现在是这个样子的,现在是用户模式,也就是我们还不是管理员,很多时候我们需要管理员的权限进行操作;
#输入这个命令,然后输入密码,这时的密码是不显示的,所以大胆的输入即可
[admin@localhost ~]$ su
密码:
[root@localhost admin]# #在这个模式下,我们就进去了管理员权限
#有时只想安装某个软件的时候,需要一下管理员权限,并不想切换用户,我们可以使用
[root@localhost admin]# exit #退出当前管理员权限,回到当前用户
exit
[admin@localhost ~]$ sudo echo hello #只获得管理员权限执行语句,echo hello 输入hello
[sudo] admin 的密码:
hello
[admin@localhost ~]$
我们看一下Linux的目录结构,Linux系统不像windows系统会有分区,在Linux中一切皆文件;
打开终端,我们切换回到根目录
[admin@localhost ~]$ clear #清屏
[admin@localhost ~]$ cd / #进入根目录
[admin@localhost /]$ ls #显示目录
bin boot Desktop dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[admin@localhost /]$ ll #ls -l 的缩写,显示目录信息
总用量 20
lrwxrwxrwx. 1 root root 7 10月 23 2020 bin -> usr/bin
#bin目录,用来存放用户的二进制文件,里面的命令可以直接运行
dr-xr-xr-x. 5 root root 4096 3月 18 2021 boot
#boot boot - 引导加载程序文件、包含引导加载程序相关的文件。、内核的initrd、vmlinux、grub文件位于/boot下。例如:initrd.img-2.6.32-24-generic、vmlinuz-2.6.32-24-generic
lrwxrwxrwx. 1 root root 18 4月 6 2021 Desktop -> /home/admin/桌面 #桌面
drwxr-xr-x. 20 root root 3300 2月 20 23:25 dev
#/dev - 设备文件、包含设备文件。这些包括终端设备、USB或连接到系统的任何设备。例如:/dev/tty1、/dev/usbmon0
drwxr-xr-x. 139 root root 8192 4月 1 20:53 etc
#/etc - 配置文件包含所有程序所需的配置文件。也包含了用于启动/停止单个程序的启动和关闭shell脚本。例如:/etc/resolv.conf、/etc/logrotate.conf
drwxr-xr-x. 3 root root 42 4月 6 2021 home
#home - HOME目录、所有用户用home目录来存储他们的个人档案。
lrwxrwxrwx. 1 root root 7 10月 23 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 10月 23 2020 lib64 -> usr/lib64
#lib - 系统库、包含支持位于/bin和/sbin下的二进制文件的库文件.
drwxr-xr-x. 2 root root 6 4月 11 2018 media
#media - 可移动媒体设备、用于挂载可移动设备的临时目录。
drwxr-xr-x. 3 root root 18 3月 17 2021 mnt
#mnt - 挂载目录、临时安装目录,系统管理员可以挂载文件系统。
drwxr-xr-x. 3 root root 16 10月 23 2020 opt
#opt - 可选的附加应用程序、opt代表可选的。包含从个别厂商的附加应用程序。附加应用程序应该安装在/opt/或者/opt/的子目录下。
dr-xr-xr-x. 215 root root 0 2月 20 23:25 proc
#/proc - 进程信息、包含系统进程的相关信息
dr-xr-x---. 7 root root 265 4月 1 21:10 root
#该目录为系统管理员,也称作超级权限者的用户主目录。
drwxr-xr-x. 41 root root 1280 4月 1 20:53 run
#是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run
lrwxrwxrwx. 1 root root 8 10月 23 2020 sbin -> usr/sbin
#就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
#srv - 服务数据、srv代表服务。
dr-xr-xr-x. 13 root root 0 2月 20 23:25 sys
drwxrwxrwt. 15 root root 4096 4月 1 21:22 tmp
#tmp - 临时文件、包含系统和用户创建的临时文件。当系统重新启动时,这个目录下的文件都将被删除。
drwxr-xr-x. 13 root root 155 10月 23 2020 usr
#usr - 用户程序
- 包含二进制文件、库文件、文档和二级程序的源代码。
- /usr/bin中包含用户程序的二进制文件。如果你在/bin中找不到用户二进制文件,到/usr/bin目录看看。例如:at、awk、cc、less、scp。
- /usr/sbin中包含系统管理员的二进制文件。如果你在/sbin中找不到系统二进制文件,到/usr/sbin目录看看。例如:atd、cron、sshd、useradd、userdel。
- /usr/lib中包含了/usr/bin和/usr/sbin用到的库。
- /usr/local中包含了从源安装的用户程序。例如,当你从源安装Apache,它会在/usr/local/apache2中
drwxr-xr-x. 20 root root 282 10月 23 2020 var
#var - 变量文件、var代表变量文件。这个目录下可以找到内容可能增长的文件。
[admin@localhost /]$ date #打印时间
2022年 04月 01日 星期五 22:09:09 CST
[admin@localhost /]$ cd bin #cd 进如目录,进入到bin目录
[admin@localhost bin]$ cd .. #退回上级目录
[admin@localhost /]$
[admin@localhost /]$ passwd #修改当前密码
更改用户 admin 的密码 。
为 admin 更改 STRESS 密码。
(当前)UNIX 密码:
rm #删除命令,这里不做过多演示
#具体命令具体参数可以查看帮助文档 --help,同时可以使用help命令查看
$ rm --help(help rm)
用法:rm [选项]... 文件...
Remove (unlink) the FILE(s).
-f, --force ignore nonexistent files and arguments, never prompt
-i prompt before every removal
-I prompt once before removing more than three files, or
when removing recursively; less intrusive than -i,
while still giving protection against most mistakes
--interactive[=WHEN] prompt according to WHEN: never, once (-I), or
always (-i); without WHEN, prompt always
--one-file-system 递归删除一个层级时,跳过所有不符合命令行参
数的文件系统上的文件
--no-preserve-root do not treat '/' specially
--preserve-root do not remove '/' (default)
-r, -R, --recursive remove directories and their contents recursively
-d, --dir remove empty directories
-v, --verbose explain what is being done
--help 显示此帮助信息并退出
--version 显示版本信息并退出
默认时,rm 不会删除目录。使用--recursive(-r 或-R)选项可删除每个给定
的目录,以及其下所有的内容。
To remove a file whose name starts with a '-', for example '-foo',
use one of these commands:
rm -- -foo
rm ./-foo
请注意,如果使用rm 来删除文件,通常仍可以将该文件恢复原状。如果想保证
该文件的内容无法还原,请考虑使用shred。
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
请向<http://translationproject.org/team/zh_CN.html> 报告rm 的翻译错误
要获取完整文档,请运行:info coreutils 'rm invocation'
[admin@localhost /]$
vi/vim hello.txt #可以使用vi/vim编辑文件,如果文件不存在则在当前目录下创建文件
#还有more,less,head tail:显示或部分显示文件内容
cp -R dir:拷贝目录
chmod u+x:更改文件权限
ps的用法,ps-e或ps-o pid,ppid,session,tpgid,comm(其中session显示的sessionid,tpgid显示前台进程组id,comm显示命令名称)
ip a 查看*ip*地址信息的命令
到这里我们可以简单的使用下,Linux系统了,我们可以在使用中慢慢学习这些命令,比如跟编辑相关的命令,我们可以学习vim,我们在学习windows的时候,不也是先是使用到精通,到这里你已经打开新世界的大门了,以后机会慢慢熟练;
还有几个常用命令,留作业,了解以下几个命令:
这里给大家介绍一款工具Xshell
官网:https://www.xshell.com/zh/
百度百科:Xshell [1] 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。
Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。除此之外,其还有丰富的外观配色方案以及样式选择。
简单点说,我们可以拿他来连接Linux,可以连接云服务,同时也可以连接本地服务器,我这里为什么要使用他呢?这样写笔记会比较方便,大家可以直接通过虚拟机去使用,如果想尝试也可以下载这个工具;
当然了这个工具不是免费的,只有30天免费试用期,当然可以破解了,我们可以使用破解版就不用只用30天了
这里我给到下载地址:https://www.onlinedown.net/soft/36383.htm
不要点不然会下载病毒,点这里,像QQ一样安装即可,网页里面有使用教程,如果觉得看不惯,大家也可以自动百度其他优质教程,这里也不用你们找了,我随便找一个哈,给:https://www.jianshu.com/p/4716cc35750f
不要问我为什么自己没有做演示,因为我已经安装了(嘿嘿)!
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。
但是目前我们使用比较多的是 vim 编辑器。
vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
官网:https://www.vim.org/
其实就是linux下的一款编辑器,使用较为广泛,这里给大家简单介绍下,因为我觉得不用太多介绍,我们做开发,大部分都是再windows和mac上进行开发,最后再部署到Linux服务器上,你会在Linux从hello world写起吗?
假如我这里有一个开发完成的项目hello.c
#include
int main(){
printf("hello,World");
return 0;
}
那么怎么运行C文件呢,centos自带gcc编辑器,输入gcc -v
即可查看,如果没有gcc环境,那就不用运行了,如果想运行,这里给大家推荐教程:https://www.cnblogs.com/chuncn/archive/2010/10/15/1851853.html,为什么我又没做演示呢,我这里是安有的(嘿嘿),但是自带的编译版本都会比较底,开发中肯定不用自带版本,而安装开发版本,做升级或重装;
运行程序
[root@localhost home]# gcc hello.c -o hello #-o指定编译后可执行程序的文件名
[root@localhost home]# ls
admin hello hello.c Testlable.class
[root@localhost home]# ./hello #./文件名即可运行,linux下的程序都这样运行,我们知道Linux的内核使用C语言实现的
hello,World
[root@localhost home]#
回到正题
首先我们要了解,vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode);
用户刚刚启动 vi/vim,便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。
以下是常用的几个命令:
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。
命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
在命令模式下按下i就进入了输入模式。
在输入模式中,可以使用以下按键:
在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
按ESC键可随时退出底线命令模式。
简单的说,我们可以将这三个模式想成底下的图标来表示:
我们使用vim完成代码的编写到运行:
首先我们通过vim hello.c
新建一个文件,进入vim编辑器,这是处于命令模式
这时我们可以通过键盘输入命令,如点击i进行插入即进行编辑,同时也是进入了输入模式,命令模式下,还有几个常用命令,如h,j,k,l代表上下左右移动光标,x删除当前光标字符,我们输入i(插入)即可进行编辑,写进去我们的代码
再通过按ESC退出输入模式,进入到底线命令模式,我们输入:wq,完成退出并保存文件操作,q 退出程序、w 保存文件,回车即可完成代码的编写;
再次运行程序,也可以出现hello, world
vim的重点在于命令,上诉我们就已经学完了常见的命令,vim就是一款Linux下的编辑器,我们已经学回来CRUL已经完成了入门,后续只需要使用,不用死记命令,多使用就会熟练了;
这里在介绍几个常用的底线命令模式下的几个常用命令(来自菜鸟教程),大家可以把这几个命令尝试下:
指令行的储存、离开等指令 | |
---|---|
:w | 将编辑的数据写入硬盘档案中(常用) |
:w! | 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊! |
:q | 离开 vi (常用) |
:q! | 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。 |
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~ | |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ | 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出) |
ZQ | 不保存,强制退出。效果等同于 :q!。 |
:w [filename] | 将编辑的数据储存成另一个档案(类似另存新档) |
:r [filename] | 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面 |
:n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个档案。 |
:! command | 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息! |
我再给出几个:
查找关键字,相当与我们文本编辑器的Ctrl+F
小作业,自行去查阅文档找到这些命令:
实际业务中,管理员拥有最高权限,一般的工作人员,比如运维,可能只具有发布功能的权限,删除权限不给与,为了防止删库跑路,我们需要了解,如果创建一个用户,给用户什么权限,其实很好理解,平常在windows我们常见,有自己的新建账户,还有,每台电脑上有administrator账户,理解了就其实很简单了,下面我们来了解理论:
Linux/Unix是一个用户、多任务的操作系统;在讲Linux账号及账户组管理之前,先简单了解一下多用户、多任务操作系统的基本概念。
在Linux下,当你登录后,你也可以同时开启很多的服务任务和进程,而各自服务都会跑的很好却对其他任务没有任何影响,这种登录一个用户登录系统执行多个服务任务和进程的情况,就称为单用户多任务。
有时可能是很多用户同时用同一个系统,如公司几十个运维人员,每台机器都可以和被若干个运维人员登录部署或解决相关故障问题,但并不是所有的运维人员都要做同一件事,所以就有了多任务、多用户的情况。
值得注意的是:多用户、多任务并不是大家同时挤到一起,在一台机器的键盘和显示器前来操作机器,多用户可能是通过SSH客户端工具等远程工具等远程登录服务器来进行,比如对服务器的运程控制,只要具有相关用户的权限,任何人都是可以上去操作访问服务器。
用户在系统中是分角色的,在Linux系统中,由于角色的不同,权限和所完成的任务也不同;值得注意的是用户的角色是通过UID和GID识别的;特别是UID,在运维工作中,一个UID是唯一标识一个系统用户的账号。
用户账户:
超级用户root(0)
程序用户(1~499)
普通用户(500~65535)
以下参考菜鸟教程,我暂时还用的不多,了解即可,好比windows,就直接使用的administeror用户,毕竟就自己一个人使用
useradd 选项 用户名
参数说明:
选项:
用户名:
指定新账号的登录名。
# useradd –d /home/sam -m sa
此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。
如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。
删除一个已有的用户账号使用userdel
命令,其格式如下:
userdel 选项 用户名
常用的选项是 -r,它的作用是把用户的主目录一起删除。
例如:
# userdel -r sam
此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。
修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
修改已有用户的信息使用usermod
命令,其格式如下:
usermod 选项 用户名
常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等
,这些选项的意义与useradd
命令中的选项一样,可以为用户指定新的资源值。
另外,有些系统可以使用选项:-l 新用户名
这个选项指定一个新的账号,即将原来的用户名改为新的用户名。
例如:
# usermod -s /bin/ksh -d /home/z –g developer sam
此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。
groupadd 选项 用户组
可以使用的选项有:
# groupadd group1
此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。
# groupadd -g 101 group2
此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。
groupdel 用户组
# groupdel group1
此命令从系统中删除组group1。
groupmod 选项 用户组
常用的选项有:
# groupmod -g 102 group2
此命令将组group2的组标识号修改为102。
# groupmod –g 10000 -n group3 group2
此命令将组group2的标识号改为10000,组名修改为group3。
用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:
$ newgrp root
这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。
结
暂时了解即可,知识我们要学全,以后用到了我们自然就熟练起来了;
学习Linux你要知道一句话,Linux中一切皆文件,就像我们学习js一定听说过一句,js中一切皆对象;应该是一个意思吧
我们首先要了解文件有什么属性,第一反应肯定是读写属性,是的没错,还记得ll命令吗,前面就会显示出文件的属性
好了,下面我们全面了解下(以下内容来自菜鸟教程 *注意*只是有参考,主要还是作者的教程,既然有参考我们必须给出文章的引用):
文件的第一个属性用 d 表示。d 在 Linux 中代表该文件是一个目录文件。
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
从左至右用 0-9 这些数字来表示。
第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;
第 2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。
到这里文件的权限我们都可以知道了,那要怎么修改呢?
关于文件的权限我们需要了解两个东西:
语法:
chgrp [-R] 属组名 文件名
参数选项
例:方便记忆,可以将 chgrp 理解为是 “change group” 的缩写。
chgrp - R book /opt/local /book
改变/opt/local 及其子目录下的所有文件的属组为book。
语法:
chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
大家知道怎么这个即可,有具体需要时候可以使用,我还没用过;
这个很重要,我们知道Linux一切皆文件,那么对于文件的属性,读写执行,我们必须掌握,什么文件可以读,什么文件允许写操作,什么文件可执行,所以挂上星号*
Linux文件属性有两种设置方法,一种是数字,一种是符号。
Linux 文件的基本权限就有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。
先复习一下刚刚上面提到的数据:文件的权限字符为: -rwxrwxrwx , 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: -rwxrwx— 分数则是:
所以等一下我们设定权限的变更时,该文件的权限数字就是 770。变更权限的指令 chmod 的语法是这样的:
chmod [-R] xyz 文件或目录
选项与参数:
我们做一个小例子:
我们使用Linux一定是要会shell脚本的,这对我们帮助很大,加入有这么一个shell脚本,文件为hello.sh,内容如下:
echo hello #没错就是输出万能Hello
[root@localhost ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg
[root@localhost ~]# pwd #显示当前所在目录
/root
[root@localhost ~]# cd /
[root@localhost /]# cd home
[root@localhost home]# ls
admin hello hello.c Testlable.class
[root@localhost home]# vim hello.sh
[root@localhost home]# cat hello.sh
echo hello
[root@localhost home]# ls
admin hello hello.c hello.sh Testlable.class
[root@localhost home]#
我们怎么执行shell脚本呢?像windows双击运行吗?我们试下,直接输入文件名:
[root@localhost home]# hello.sh
bash: hello.sh: 未找到命令...
不对,没有找到命令,还记得hello.c执行吗,./hello
那我们也试下:
[root@localhost home]# ./hello.sh
-bash: ./hello.sh: 权限不够
提示权限不够,那我们就查看下文件的权限,确实没有x权限,那应该怎么办呢?
[root@localhost home]# ll
总用量 28
drwx------. 19 admin admin 4096 4月 1 22:19 admin
-rwxr-xr-x. 1 root root 8360 4月 3 11:28 hello
-rw-r--r--. 1 root root 80 4月 3 14:46 hello.c
-rw-r--r--. 1 root root 11 4月 3 21:23 hello.sh
-rw-r--r--. 3 root root 1193 4月 4 2021 Testlable.class
[root@localhost home]#
解决办法:
给文件加入写的权限,执行这条命令chmod +x hello.sh
可以看到有了x权限,然后就可以执行了,OK成功!
[root@localhost home]# chmod +x hello.sh
[root@localhost home]# ll
总用量 28
drwx------. 19 admin admin 4096 4月 1 22:19 admin
-rwxr-xr-x. 1 root root 8360 4月 3 11:28 hello
-rw-r--r--. 1 root root 80 4月 3 14:46 hello.c
-rwxr-xr-x. 1 root root 11 4月 3 21:23 hello.sh
-rw-r--r--. 3 root root 1193 4月 4 2021 Testlable.class
[root@localhost home]# ./hello.sh
hello
[root@localhost home]#
这里比较几个常用的区别:
chmod +x 和 chmod u+x的区别、就是设置谁拥有执行这个文件权限
chmod +x 和chmod a+x 是一样的,一般没有明确要求,可以就用chmod +x
大家一定要会举一反三,留作业:
1、试试更改文件读写权限(假如有一个文件比较重要,只有管理员才能查看·····)
2、试试不用用户操作文件的权限
硬链接是通过索引节点进行的链接。在Linux中,多个文件指向同一个索引节点是允许的,像这样的链接就是硬链接。硬链接只能在同一文件系统中的文件之间进行链接,不能对目录进行创建。如果删除硬链接对应的源文件,则硬链接文件仍然存在,而且保存了原有的内容,这样可以起到防止因为误操作而错误删除文件的作用。由于硬链接是有着相同 inode 号仅文件名不同的文件,因此,删除一个硬链接文件并不影响其他有相同 inode 号的文件。
硬链接可由命令 link 或 ln 创建,如:
link oldfile newfile
ln oldfile newfile
软链接(也叫符号链接)与硬链接不同,文件用户数据块中存放的内容是另一文件的路径名的指向。软链接就是一个普通文件,只是数据块内容有点特殊。软链接可对文件或目录创建。
软链接主要应用于以下两个方面:一是方便管理,例如可以把一个复杂路径下的文件链接到一个简单路径下方便用户访问;另一方面就是解决文件系统磁盘空间不足的情况。例如某个文件文件系统空间已经用完了,但是现在必须在该文件系统下创建一个新的目录并存储大量的文件,那么可以把另一个剩余空间较多的文件系统中的目录链接到该文件系统中,这样就可以很好的解决空间不足问题。删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接就变成了死链接。
软链接文件有类似于Windows的快捷方式。
在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
你选定的位置上生成一个文件的镜像,不会占用磁盘空间
使用-s选项的ln命令即可创建符号链接,命令如下:
ln -s old.file soft.link
ln -s old.dir soft.link.dir
指令 参数 要被链接的文件 软链接文件名字
很简单没有过多演示,但是不动手是不会理解很深:
留作业:
1、创建一个hello.txt文件,里面输入hello,分别创建软硬链接
2、通过du -h [文件名]
分别查看三个文件的大小
3、在修改里面的内容,再次查看三个文件的大小;
4、在不同目录下进行软硬链接的创建
下图可以参考以下结果:
为什么我没有进行图文演示呢,no不是我懒,因为是做过的,但是当我一个du -h
命令,我就被刷屏了,什么都没有了,为了证明,我这里进行一番操作:
磁盘管理呢比较难以理解,入门我们可以暂时了解下,暂时使用不多,但是我们需要知道,用到的时候就熟练了;
Linux没有像windows分区的概念,那这里我们就简单理解成,Linux中的目录相当于windows上的分区;
windows上打开计算机,我们就可以观察到磁盘容量,如果平常不加以维护,是不是你的C盘已经爆红了,相信到这里你已经理解了,那我们就快速上手吧;
主要是三个命令:
不做过多介绍,大家可以通过man df
去查阅使用文档;
来自:https://baijiahao.baidu.com/s?id=1712257373682917266&wfr=spider&for=pc
想想有多个搁板的冰箱,可用于存放各种物品。 这些货架帮助您按形状、大小、类型等组织杂货项目。相同的概念适用于文件系统,它是一种以人类可用的形式存储和组织任意数据集合的方法的体现。
Linux 支持的不同类型的文件系统:
du命令我们已经使用过了,在使用中我们已经学会了常用,那么可以使用man du
查看更多使用;
例:
du -h 【文件名】
:以人类的方式,显示指定文件大小
du [-a]
:显示出整个Linux中所有文件大小
du -h ./
:显示出当前目录大小
······
fdisk 是 Linux 的磁盘分区表操作工具。
语法:
fdisk [-l] 装置名称
选项与参数:
先不做过多了解;
Linux 的磁盘挂载使用 mount
命令,卸载使用 umount
命令。
磁盘挂载语法:
mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n] 装置文件名 挂载点
用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面!
[root@www ~]# mkdir /mnt/hdc6
[root@www ~]# mount /dev/hdc6 /mnt/hdc6
[root@www ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
.....中间省略.....
/dev/hdc6 1976312 42072 1833836 3% /mnt/hdc6
磁盘卸载命令 umount
语法:
umount [-fn] 装置文件名或挂载点
选项与参数:
卸载/dev/hdc6
[root@www ~]# umount /dev/hdc6
更过了解,给到:https://www.linuxprobe.com/mount-detail-parameters.html
每个软件的安装都不相同,但都大同小异,下面我们介绍几个安装方式
yum
安装包安装
·······
shell是什么呢?其实是我们一直在用的,所有的命令都是通过shell去实现的,看来自菜鸟教程的介绍:
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
它所说的界面,可能就是我们一直用的黑框框吧,是不是一说界面会想到图形化界面,还在纳闷呢!哈哈
大家已经写过一个脚本了hello world,在之前的章节中,我们已经写过一个小小的脚本,万能的hello world;
菜鸟教程对这里部分基础写的非常好,这里大量参考菜鸟教程Linux-shell部分加上自己的理解,帮大家进行一遍梳理;
这里我们再重新认识下,新建一个文件为hello.sh,使用vim在里面编辑:
#!/bin/bash #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
echo "Hello World !" #命令用于向窗口输出文本。
当然了,这个时候还不能运行./hello.sh
试一下,提示权限不够,是因为文件并没有执行权限,我们需要给文件添加执行权限,chmod +x hello.sh
,再次执行,成功!
[root@localhost test]# vim hello.sh
[root@localhost test]# ./hello.sh
-bash: ./hello.sh: 权限不够
[root@localhost test]# chmod +x hello.sh
[root@localhost test]# ls
helloNos.txt hello.sh helloS.txt hello.txt
[root@localhost test]# ./hello.sh
hello,world
[root@localhost test]#
注意,一定要写成 ./hello.sh,而不是 hello.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 hello.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./hello.sh 告诉系统说,就在当前目录找。
所以知道为什么执行命令需要加./
了吧
可能还有疑惑,后缀名就一定.sh是这样吗?不是的,我们来试一下,我修改了文件的名字,为hello.t再次执行还是没有问题,因为这里不像C、java、python需要固定的后缀名.c .java .py 文件名是什么都没有任何问题,.sh后缀是一种很好的规范,到时候你和别人都可以知道这是一个shell脚本文件:
[root@localhost test]# mv hello.sh hello.t
[root@localhost test]# ls
helloNos.txt helloS.txt hello.t hello.txt
[root@localhost test]# ./hello.t
hello,world
[root@localhost test]#
变量定义:
定义变量时,变量名不加美元符号($,我们使用变量时需要),如:
your_name=“runoob.com”
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
有效的 Shell 变量名示例如下:
RUNOOB
LD_LIBRARY_PATH
_var
var2
无效的变量命名:
?var=123
user*name=runoob
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
运行脚本,结果如下:
/bin/sh: NAME: This variable is read only.
使用 unset 命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使用。unset 命令不能删除只读变量。
#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl
运行shell时,会同时存在三种变量:
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号
单引号字符串的限制:
双引号
双引号的优点:
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
输出结果为:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
string="abcd"
echo ${#string} # 输出 4
echo ${#string[0]} # 输出 4
变量为数组时,KaTeX parse error: Expected '}', got '#' at position 2: {#̲string}** 等价于 *…{#string[0]}:
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
注意:可以不使用连续的下标,而且下标的范围没有限制。
读取数组元素值的一般格式是:
${数组名[下标]}
例如:
valuen=${array_name[n]}
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
以 # 开头的行就是注释,会被解释器忽略。
通过每一行加一个 # 号设置多行注释,像这样:
#--------------------------------------------
# 这是一个注释
多行注释还可以使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF 也可以使用其他符号:
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
为脚本设置可执行权限,并执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
另外,还有几个特殊字符用来处理参数:
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与 ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" ∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
不做过多赘述了,这里大家直接去参考菜鸟教程吧!
看我列出的知识点:
echo我们已经使用了很多了,printf也差不多,大家看一眼即可;
来吧给大家打开一个,传送门
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
shell中函数的定义格式如下:
定义格式:
[ function ] funname [()]
{
action;
#代码体
[return int;] #返回值
}
说明:
#!/bin/bash
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
输出结果:
-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----
下面定义一个带有return语句的函数:
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum #read读取输入的数值
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $?"
输出类似下面:
这个函数会对输入的两个数字进行相加运算...
输入第一个数字:
1
输入第二个数字:
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3
函数返回值在调用该函数后通过 $? 来获得。
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
带参数的函数示例:
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
输出结果:
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
注意, 10 不 能 获 取 第 十 个 参 数 , 获 取 第 十 个 参 数 需 要 10 不能获取第十个参数,获取第十个参数需要 10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
另外,还有几个特殊字符用来处理参数:
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
函数与命令的执行结果可以作为条件语句使用。
要注意的是,和 C 语言不同,shell 语言中 0 代表 true,0 以外的值代表 false。
作业:
y猜的比x大,反馈猜大了,相反,反馈猜小了,x=y时,游戏结束,恭喜答对;
什么是IO重定向呢?
我们拆开理解,IO就是输入和输出,我们知道我们的程序都是在对数据的输入输出(传递),那什么是重定向呢,就是改变输入输出的方向,我们知道默认模式下,输入输出都是在终端,你对终端输入,程序对终端输出,但有时候我们又不想输入输出重定向,比如:日志和错误,都是应该保存文件中,供我们找出问题,查找问题,这时候就需要输入输出重定向了;
很简单:只需要知道<、>、 >&、<&、>>、<<
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
这里做一个小案例即可:
我里有个程序,需要输入日志到执行位置,以便后期维护和查看:
程序代码:
#!/bin/bash
echo '程序执行成功,没有bug'
需要输入到相同目录下的log文件中:
#新建文件和程序
[root@localhost ~]# cd /home/test
[root@localhost test]# ls
helloNos.txt helloS.txt hello.t hello.txt
[root@localhost test]# vim logTest.sh
[root@localhost test]# ls
helloNos.txt helloS.txt hello.t hello.txt logTest.sh
[root@localhost test]# cat logTest.sh
#!/bin/bash
echo '程序执行成功,没有bug'
[root@localhost test]# chmod +x logTest.sh
#执行程序没有问题
[root@localhost test]# ./logTest.sh
程序执行成功,没有bug
查看结果
#将程序执行日志放入log中,我们可以看到,我们程序执行产生的日志都会在log中,供我们维护和查看
[root@localhost test]# ./logTest.sh > log
[root@localhost test]# ls
helloNos.txt helloS.txt hello.t hello.txt log logTest.sh
[root@localhost test]# cat log
程序执行成功,没有bug
[root@localhost test]#
那么>>
就是想文件末尾追加,以及>&
和<<
不难理解了哈!
不多说,相信看到这里,已经对Linux有了完整的了解和认识,如果还想看博主笔记,以及同样的学习日记,点赞关注收藏转发,满满的动力,后续还有更新,Linux安装tomcat,redis等等等等!!!