likes
comments
collection
share

Linux操作系统与命令行

作者站长头像
站长
· 阅读数 26

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{}
    • 其他系统派生系统同理...

什么是命令

先看两个单词kernelshell

  • kernel是指内核,如水果的核,而Linux内核则是常说的负责合计算机硬件交互调度的核心
  • shell则是壳,负责和内核打交道

广义的命令行包括一切通过字符终端控制计算机的方式

  • windowscmd、powerShell、git bash
  • unix/linuxsh、zsh、Terminal、iterm2

sh就是shell的简称,都是普通的程序,只是可以和计算机交互,为什么要壳的原因是,没有办法直接和内核打交道,如下图所示

Linux操作系统与命令行

开始之前需要准备一台安装了Linux操作系统的主机

  • 可以在各大云主机厂商购买(阿里云,腾讯云等)
  • 通过虚拟机安装镜像

开始Linux之旅

  • 通过一个终端链接Linux主机,主机本身在哪里并不重要,如我在阿里云购买了一台云服务器,我只需要在任意电脑上通过Shell即可链接上这台服务器
  • 连接主机使用命令
    • 密码访问,顾名思义
    • SSH key pairSSH全称是Secure Shell,更加安全加密的Shell

通过ssh root@remoteIp,表明以root用户进行登陆,即可访问服务器。有密码时会要求输入密码,一般情况下,在linux系统下输入密码是没有回显的

登陆后输入whoami可以查看当前用户

Linux操作系统与命令行 每个用户都有其自己的Home目录,登陆后当前工作路径默认就是这里,也可以使用cd ~命令更改当前工作路径到当前用户的家目录

pwd命令(print working directory)可以查看当前工作路径 Linux操作系统与命令行

一般来说操作root是比较危险的,因为它相当于这台服务器的神,拥有着一切的权力,也就意味着很容把文件系统搞坏,当前为学习使用,实际环境切记不要用root操作

新建一个用户

sudo useradd -m kunkun命令可以创建一个用户(-m参数表示把用户的家目录也创建出来),其中sudo的意思为switch user do(切换成root用户干活),如很多安装程序的操作,都需要更高的权限才能操作,一般都会加sudo ,若当前用户就是root加不加都一样

su 用户名则可以切换用户,下面的操作为创建一个用户【kunkun】,切换用户并输出当前用户名 Linux操作系统与命令行 这里跳到kunkun的家,并输出家的路径 Linux操作系统与命令行

  • 在切换用户后,输入exit可以退出当前用户
  • 已是当前用户输入exit则退出链接

ls命令(list directory contents的缩写)用来查看当前工作路径下的文件

  • -a参数表示显示隐藏文件
  • -h参数表示以人类可读的信息形式展示,如文件大小会转成kb,mb
  • -l参数表示以长格式显示
  • -t参数表示按时间顺序排列 Linux操作系统与命令行 可以看到列出了非常多信息,随意选取一条来解释

Linux操作系统与命令行 开头的文件类型以10个字符来表示

  • 第一个字符为d表示directory文件夹
  • -表示这是一个文件
  • l表示这是一个软连接(soft link类似windows系统的快捷方式)

后面9个字符是linux权限系统的基石,分别表示不同用户对这个文件的不同访问权限,解析如下 Linux操作系统与命令行

紧接着的数字19是硬连接节点,不怎么用得上可以跳过

第一个root表示文件所有者

第二个root表示所有者所在的组(User Group)

接着是文件大小,文件夹也是文件,可以看成一个节点,大小是固定的4kb

接着是最后更改时间以及文件名

文件权限问题

若用root用户创建了一个文件,类型字符为-rwx------,此时用户kunkun无法对这个文件做任何操作 在Linux系统中判断一个文件是否可执行取决于x的值是否为1,目录的x表示是否有权限查看这个目录里的内容

touch filename可以创建一个文件,这里创建了一个test.java文件(故意用java后缀是为了证明与文件名无关),并查看对应的权限,可以看到没有可执行权限 Linux操作系统与命令行 chomd 777 test.java将文件的权限更改成可执行,再次查看所有x权限都有了,777表示给9个权限字符赋值,一个数字对应3个字符,以二进制换算

777最终解析为rwx rwx rwx(421 421 421) Linux操作系统与命令行

echo命令可以将内容输出到标准输出上,这里用>>将要输出的字符追加到目标文件中,最后执行该文件,切记要不可直接test.java这种文件名形式回车,这种输入会去环境变量中找对应的程序(后面会说环境变量),./test.java则是一个相对路径 Linux操作系统与命令行 理论上需要加上shebang:#!/bin/sh指定解释器,我没有写也能执行是因为执行时会默认采用当前Shell去解释这个脚本,这里涉及shell编程不过多解释

写文件会用vim的话更佳,不是目标内容这里不赘述

cat filename命令可以查看文件的内容

Linux操作系统与命令行

理解SSH

有时候,并不想要通过密码的方式去管理服务器,那么可以采用密钥对的方式。公钥和私钥一般是成对生成的,公钥放在服务器,私钥放在任意客户端上,用公钥加密的信息只有私钥才能解密

  1. 客户端尝试访问服务器
  2. 服务器返回一串经过加密后的信息给客户端
  3. 客户端通过私钥解密后将信息返回给服务器
  4. 服务器发现客户端能解密成功认为你认证成功,放行
linux生成密钥对

ssh-keygen -t rsa,一般来说执行后一通回车接口 执行后默认会在家目录下的.ssh目录中生成私钥和秘钥信息 pub为后缀的文件就是公钥(public)

这个操作应该在本地机子上操作或第二台服务器上操作,这里纯演示所以在服务器上运行了(服务器也可以当成客户端去连另一台服务器),输入命令后不想过多设置全部回车即可 Linux操作系统与命令行 查看家目录下的密钥对 Linux操作系统与命令行 假设这里的操作就是在本地运行的,那么此时需要将公钥放到服务器上,需要做的操作就是将id_rsa.pub的文件内容拷贝,在服务器的~/.ssh/authorized_keys文件中追加进去。此时再次执行ssh root@remoteIp就无需再输入密码即可登录服务器

命令行的四要素:环境变量、可执行程序、工作路径、参数

环境变量

黑窗口本质上是一个进程,与一组键值对绑定到一起,这些键值对称为环境变量 export命令可以查看当前进程的所有键值对,可以理解成是一个“Map集合”

export aaa=123执行后,环境变量里就多这个aaakeyvalue123 这种操作只会影响当前会话,不会持久化配置(断开后再链接环境变量就没有aaa这个key了),后续会讲如何持久化,使用时需要使用$[key]的方式去引用

Linux操作系统与命令行

其次,fork子进程的话,会继承父进程的所有环境变量,在子进程中覆写不会影响父进程,现在操作的黑窗口实际上就是一个子进程,不然这些默认的环境变量哪来的呢

可执行程序(环境变量有关)

  1. 系统内置的,如ls,cd,echo等命令,which echo命令,可以查看程序从哪里来,下图所示来自环境变量/usr/binLinux操作系统与命令行
  2. 非内置的,如输入java,mvn,node等等命令,都会去环境变量的PATH中去找,如果没有找到,就会报错command xxx not found

命令echo $PATH可以查看当前环境变量PATH的值 Linux操作系统与命令行 linux下环境变量的默认分割符是冒号,不同于windows的分号;。如输入java按下回车后,操作系统在path定义的目录下挨个去找是否有这个可执行程序,找到后就帮你运行,否则报错

演示在Linux上安装开发环境

以安装JavaJDK为例子,提供一个可下载的网站 Java I tell you-爪哇我话你知 (injdk.cn) 找到目标版本并复制其64位且后缀为tar.gz的下载链接,意思是经过gzip压缩后的tar文件,而tarlinux系统下的打包文件,这种压缩包可以称为绿色版,解压就能使用 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包进行解压缩,下载并且解压后应该能得到下图中四个文件 Linux操作系统与命令行JAVA8为例子,输入全路径./jdk1.8.0_341/bin/java -version来执行JAVA命令 Linux操作系统与命令行 说明当前JDK是可以使用的,但显然非常不方便。想要像ls那样任何路径下输入java就可执行,就需要把java所在的目录加到环境变量当中 export PATH=$PATH:/root/jdk1.8.0_341/bin这段命令表示覆写PATH的值,执行顺序是先右再左,所以可以先用$PATH来获取旧的值,加上分号拼接上需要添加的路径,这种方式的好处是完全不用管旧址(当然手动补全也行)。添加后就可以使用java执行命令,而不需要全路径了 Linux操作系统与命令行 如果你用的是brew,yum,rmp,apt等命令安装的Java,不配环境变量也能直接使用,那必然是有程序帮你做了这一步!

alisa(别名)和ls(软连接)

此处环境接着上文,给一段命令定义一个别名,还是以java为例,现在想通过输入kunkun8来执行,那么只需要alias kunkun8=java,后面就可以用kunkun8来代替了 Linux操作系统与命令行

创建软连接

创建一个软连接的格式为ln -s 目标文件 指向快捷方式,现在要创建一个名为zhiyin8的软连接: 执行ln -s /root/jdk1.8.0_341/bin/java zhiyin8后,会在当前路径生成一个软连接,查看文件信息可以看到文件类型描述符第一个字符为l Linux操作系统与命令行 此时直接输入zhiyin8还不能用,因为PATH环境变量里没有这玩意,要么将当前目录也丢到PATH里,要么将软连接移动到已添加到PATH到目录中 mv zhiyin8 /usr/local/bin 此时还不行,要么将软连接移动到path中存在的目录当中,要么将软连接所在的文件夹加到环境变量当中,演示为移动文件,此时zhiyin8就可以直接使用了 Linux操作系统与命令行

参数 arguments

参数以空格分开,会传给执行程序,如何解析取决于程序,以刚刚创建软连接的命令来看ln -s /root/jdk1.8.0_341/bin/java zhiyin8ln是一个可执行程序,后面-s /root/jdk1.8.0_341/bin/java zhiyin8这部分都属于参数

  1. 看到的参数不等于实际传递的参数,这条命令ls *,看似把星号传递给命令,实际上会被执行一个行为【命令行展开】,也就是传递进去的并不是*这个符号 Linux操作系统与命令行 想真多传入一个星号需要用单引号包裹'*',此时就会去找一个名为*的文件,下图中报错是因为确实没有这个文件,是河里的 Linux操作系统与命令行 环境变量替换,echo $HOME 实际收到的参数是echo ~/root,如果确实想传$HOME就用一样的方式,单引号包裹
配置如何持久化

上面的所有操作,都是在当前会话有效,如果想要持久化就需要提供一个配置文件,sshd服务就会去读取这个文件返回一个会话 文件名为.bashrc.bash_prifile都可以,都能被识别,且这个文件可以全局配置或针对用户配置,用户配置需要放到用户的家目录下

先自exit退出或者关掉黑窗口再连接

我在家目录下新建了一个.bashrc文件,文件内容写了一个别名为java8 Linux操作系统与命令行 此时还不能用,除非你关掉再链接,让sshd去读一次,更改这个配置文件想在当前回话立即生效,可以使用. ~/.bashrc或者source ~/.bashrc,二者等价,相当于让程序执行了一次配置,此时就可以使用别名java8Linux操作系统与命令行

工作路径

很多时候工作路径是用来计算相对路径的,像cd命令就是用来改变工作路径的

像在JAVA程序中,使用new File这个动作找文件,就会在执行JVM的工作路径中工作

基于这些概念和操作,就可以愉快的开始linux之旅了

完:)