Linux
是世界上使用最多的操作器,绝大部分的服务器都是用Linux
,包括Android
手机OS
也是Linux
系统的分支
POSIX
标准
可移植操作系统接口(Portable Operating System Interface of UNIX
,缩写为 POSIX
) 遵守这个标准的操作系统非常多,如macoS,centos,ubuntu
等
- 类比成
Java
世界,有POSIX
这么一个借口class MACOS implements POSIX{}
class Linux implements POSIX{}
- 其他系统派生系统同理…
什么是命令
先看两个单词kernel
与shell
kernel
是指内核,如水果的核,而Linux
内核则是常说的负责合计算机硬件交互调度的核心shell
则是壳,负责和内核打交道
广义的命令行包括一切通过字符终端控制计算机的方式
windows
:cmd、powerShell、git bash
unix/linux
:sh、zsh、Terminal、iterm2
sh
就是shell
的简称,都是普通的程序,只是可以和计算机交互,为什么要壳的原因是,没有办法直接和内核打交道,如下图所示
开始之前需要准备一台安装了Linux操作系统的主机
- 可以在各大云主机厂商购买(阿里云,腾讯云等)
- 通过虚拟机安装镜像
开始Linux之旅
- 通过一个终端链接
Linux
主机,主机本身在哪里并不重要,如我在阿里云购买了一台云服务器,我只需要在任意电脑上通过Shell
即可链接上这台服务器 - 连接主机使用命令
- 密码访问,顾名思义
SSH key pair
,SSH
全称是Secure Shell
,更加安全加密的Shell
通过ssh root@remoteIp
,表明以root
用户进行登陆,即可访问服务器。有密码时会要求输入密码,一般情况下,在linux
系统下输入密码是没有回显的
登陆后输入whoami
可以查看当前用户
每个用户都有其自己的Home
目录,登陆后当前工作路径默认就是这里,也可以使用cd ~
命令更改当前工作路径到当前用户的家目录
pwd
命令(print working directory
)可以查看当前工作路径
一般来说操作root
是比较危险的,因为它相当于这台服务器的神,拥有着一切的权力,也就意味着很容把文件系统搞坏,当前为学习使用,实际环境切记不要用root
操作
新建一个用户
sudo useradd -m kunkun
命令可以创建一个用户(-m
参数表示把用户的家目录也创建出来),其中sudo
的意思为switch user do
(切换成root
用户干活),如很多安装程序的操作,都需要更高的权限才能操作,一般都会加sudo
,若当前用户就是root
加不加都一样
su 用户名
则可以切换用户,下面的操作为创建一个用户【kunkun】,切换用户并输出当前用户名 这里跳到kunkun
的家,并输出家的路径
- 在切换用户后,输入
exit
可以退出当前用户 - 已是当前用户输入
exit
则退出链接
ls
命令(list directory contents
的缩写)用来查看当前工作路径下的文件
-a
参数表示显示隐藏文件-h
参数表示以人类可读的信息形式展示,如文件大小会转成kb,mb
等-l
参数表示以长格式显示-t
参数表示按时间顺序排列 可以看到列出了非常多信息,随意选取一条来解释
开头的文件类型以10
个字符来表示
- 第一个字符为
d
表示directory
文件夹 - 为
-
表示这是一个文件 - 为
l
表示这是一个软连接(soft link
类似windows
系统的快捷方式)
后面9
个字符是linux
权限系统的基石,分别表示不同用户对这个文件的不同访问权限,解析如下
紧接着的数字19
是硬连接节点,不怎么用得上可以跳过
第一个root
表示文件所有者
第二个root
表示所有者所在的组(User Group
)
接着是文件大小,文件夹也是文件,可以看成一个节点,大小是固定的4kb
接着是最后更改时间以及文件名
文件权限问题
若用root
用户创建了一个文件,类型字符为-rwx------
,此时用户kunkun
无法对这个文件做任何操作 在Linux
系统中判断一个文件是否可执行取决于x
的值是否为1
,目录的x
表示是否有权限查看这个目录里的内容
touch filename
可以创建一个文件,这里创建了一个test.java
文件(故意用java
后缀是为了证明与文件名无关),并查看对应的权限,可以看到没有可执行权限 chomd 777 test.java
将文件的权限更改成可执行,再次查看所有x
权限都有了,777
表示给9
个权限字符赋值,一个数字对应3
个字符,以二进制换算
777
最终解析为rwx rwx rwx
(421 421 421
)
echo
命令可以将内容输出到标准输出上,这里用>>
将要输出的字符追加到目标文件中,最后执行该文件,切记要不可直接test.java
这种文件名形式回车,这种输入会去环境变量中找对应的程序(后面会说环境变量),./test.java
则是一个相对路径 理论上需要加上shebang
:#!/bin/sh
指定解释器,我没有写也能执行是因为执行时会默认采用当前Shell
去解释这个脚本,这里涉及shell
编程不过多解释
写文件会用vim
的话更佳,不是目标内容这里不赘述
cat filename
命令可以查看文件的内容
理解SSH
有时候,并不想要通过密码的方式去管理服务器,那么可以采用密钥对的方式。公钥和私钥一般是成对生成的,公钥放在服务器,私钥放在任意客户端上,用公钥加密的信息只有私钥才能解密
- 客户端尝试访问服务器
- 服务器返回一串经过加密后的信息给客户端
- 客户端通过私钥解密后将信息返回给服务器
- 服务器发现客户端能解密成功认为你认证成功,放行
linux生成密钥对
ssh-keygen -t rsa
,一般来说执行后一通回车接口 执行后默认会在家目录下的.ssh
目录中生成私钥和秘钥信息 pub
为后缀的文件就是公钥(public
)
这个操作应该在本地机子上操作或第二台服务器上操作,这里纯演示所以在服务器上运行了(服务器也可以当成客户端去连另一台服务器),输入命令后不想过多设置全部回车即可 查看家目录下的密钥对 假设这里的操作就是在本地运行的,那么此时需要将公钥放到服务器上,需要做的操作就是将id_rsa.pub
的文件内容拷贝,在服务器的~/.ssh/authorized_keys
文件中追加进去。此时再次执行ssh root@remoteIp
就无需再输入密码即可登录服务器
命令行的四要素:环境变量、可执行程序、工作路径、参数
环境变量
黑窗口本质上是一个进程,与一组键值对绑定到一起,这些键值对称为环境变量 export
命令可以查看当前进程的所有键值对,可以理解成是一个“Map
集合”
export aaa=123
执行后,环境变量里就多这个aaa
的key
,value
是123
这种操作只会影响当前会话,不会持久化配置(断开后再链接环境变量就没有aaa
这个key
了),后续会讲如何持久化,使用时需要使用$[key]
的方式去引用
其次,fork
子进程的话,会继承父进程的所有环境变量,在子进程中覆写不会影响父进程,现在操作的黑窗口实际上就是一个子进程,不然这些默认的环境变量哪来的呢
可执行程序(环境变量有关)
- 系统内置的,如
ls,cd,echo
等命令,which echo
命令,可以查看程序从哪里来,下图所示来自环境变量/usr/bin
中 - 非内置的,如输入
java,mvn,node
等等命令,都会去环境变量的PATH
中去找,如果没有找到,就会报错command xxx not found
命令echo $PATH
可以查看当前环境变量PATH
的值 linux
下环境变量的默认分割符是冒号:
,不同于windows的分号;
。如输入java
按下回车后,操作系统在path
定义的目录下挨个去找是否有这个可执行程序,找到后就帮你运行,否则报错
演示在Linux上安装开发环境
以安装Java
的JDK
为例子,提供一个可下载的网站 Java I tell you-爪哇我话你知 (injdk.cn)
找到目标版本并复制其64
位且后缀为tar.gz
的下载链接,意思是经过gzip
压缩后的tar
文件,而tar
是linux
系统下的打包文件,这种压缩包可以称为绿色版,解压就能使用
- 安装jdk8:
wget https://d6.injdk.cn/oraclejdk/8/jdk-8u341-linux-x64.tar.gz
- 安装jdk11:
wget https://d6.injdk.cn/oraclejdk/11/jdk-11.0.16.1_linux-x64_bin.tar.gz
也可以在本地机器下载后,通过任意方式丢到服务器上,如scp
命令 scp filename user@remoteIp:/targetPath
执行命令后等待下载即可,下载完成可以执行命令的工作路径中找到压缩包 tar xvf filename
可以对tar.gz
包进行解压缩,下载并且解压后应该能得到下图中四个文件 以JAVA8
为例子,输入全路径./jdk1.8.0_341/bin/java -version
来执行JAVA
命令 说明当前JDK
是可以使用的,但显然非常不方便。想要像ls
那样任何路径下输入java
就可执行,就需要把java
所在的目录加到环境变量当中
export PATH=$PATH:/root/jdk1.8.0_341/bin
这段命令表示覆写PATH
的值,执行顺序是先右再左,所以可以先用$PATH
来获取旧的值,加上分号拼接上需要添加的路径,这种方式的好处是完全不用管旧址(当然手动补全也行)。添加后就可以使用java
执行命令,而不需要全路径了 如果你用的是brew,yum,rmp,apt
等命令安装的Java
,不配环境变量也能直接使用,那必然是有程序帮你做了这一步!
alisa(别名)和ls(软连接)
此处环境接着上文,给一段命令定义一个别名,还是以java
为例,现在想通过输入kunkun8
来执行,那么只需要alias kunkun8=java
,后面就可以用kunkun8
来代替了
创建软连接
创建一个软连接的格式为ln -s 目标文件 指向快捷方式
,现在要创建一个名为zhiyin8
的软连接: 执行ln -s /root/jdk1.8.0_341/bin/java zhiyin8
后,会在当前路径生成一个软连接,查看文件信息可以看到文件类型描述符第一个字符为l
此时直接输入zhiyin8
还不能用,因为PATH
环境变量里没有这玩意,要么将当前目录也丢到PATH
里,要么将软连接移动到已添加到PATH
到目录中 mv zhiyin8 /usr/local/bin
此时还不行,要么将软连接移动到path中存在的目录当中,要么将软连接所在的文件夹加到环境变量当中,演示为移动文件,此时zhiyin8
就可以直接使用了
参数 arguments
参数以空格分开,会传给执行程序,如何解析取决于程序,以刚刚创建软连接的命令来看ln -s /root/jdk1.8.0_341/bin/java zhiyin8
,ln
是一个可执行程序,后面-s /root/jdk1.8.0_341/bin/java zhiyin8
这部分都属于参数
- 看到的参数不等于实际传递的参数,这条命令
ls *
,看似把星号传递给命令,实际上会被执行一个行为【命令行展开】,也就是传递进去的并不是*
这个符号 想真多传入一个星号需要用单引号包裹'*'
,此时就会去找一个名为*
的文件,下图中报错是因为确实没有这个文件,是河里的 环境变量替换,echo $HOME
实际收到的参数是echo ~/root
,如果确实想传$HOME
就用一样的方式,单引号包裹
配置如何持久化
上面的所有操作,都是在当前会话有效,如果想要持久化就需要提供一个配置文件,sshd
服务就会去读取这个文件返回一个会话
文件名为.bashrc
或.bash_prifile
都可以,都能被识别,且这个文件可以全局配置或针对用户配置,用户配置需要放到用户的家目录下
先自exit退出或者关掉黑窗口再连接
我在家目录下新建了一个.bashrc
文件,文件内容写了一个别名为java8
此时还不能用,除非你关掉再链接,让sshd
去读一次,更改这个配置文件想在当前回话立即生效,可以使用. ~/.bashrc
或者source ~/.bashrc
,二者等价,相当于让程序执行了一次配置,此时就可以使用别名java8
了
工作路径
很多时候工作路径是用来计算相对路径的,像cd
命令就是用来改变工作路径的
像在JAVA
程序中,使用new File
这个动作找文件,就会在执行JVM
的工作路径中工作
基于这些概念和操作,就可以愉快的开始linux
之旅了
完:)
今天的文章Linux操作系统与命令行分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/15343.html