1.3 Linux与Bash
对地球科学方面特别是气象方向的研究者或工作人员来说,因为NCL原生只支持Linux和macOS、常使用的高性能计算机的操作系统(通常是Linux系统)等,所以必须对Linux系统的操作有初步的了解。
Bash是Linux上使用较为广泛的一种Shell(Shell是用户与计算机交互的途径之一,它有自己的语法,通常意义上的命令行即指Shell)。当我们打开终端或通过SSH连接上远程计算机后,自动启动的Shell通常便是Bash。
1.3.1 Linux发行版
Linux是一种免费的、开源的类UNIX操作系统内核(Linux只是一个系统内核,内核是操作系统的核心,但是内核不能单独使用),使用Linux内核的操作系统统称为Linux操作系统。而使用Linux内核的完整操作系统称为Linux发行版。较为常见的发行版有Ubuntu、Debian、CentOS、RHEL(高性能计算机上较为常见)。
对于个人计算机用户,选择发行版时可以优先选择Ubuntu,因为Ubuntu源下的二进制包较为丰富,使用apt命令就可以安装,非常方便。
不同的发行版采用不同的系统级包管理工具。conda是用户级的包管理工具,不需要root权限而系统级包管理工具需要root权限。Ubuntu和Debian使用apt命令安装二进制包,CentOS和RHEL使用yum命令安装二进制包。此处不对apt和yum命令进行详细讲解,有兴趣的读者可以自行在网上搜索相关内容进行学习(本书后文基本不涉及系统级包管理)。
1.3.2 目录结构
在Linux操作系统的文件系统中,文件路径分隔符是正斜线/(Windows中是反斜线\),最顶层目录(可理解为文件夹)是/(是的,/也是目录,而且是根目录,区别于Windows操作系统的盘符C:\\)。
在Linux操作系统的任意目录中有两个特殊目录名,即.和..。其中,.指代当前目录,..指代父目录(上一层目录)。对Linux操作系统来说,目录是一种特殊的文件。
例如Linux操作系统中存在一个目录/home/test/abc/,则:
● /home/test/abc/.等同于/home/test/abc/;
● /home/test/abc/..等同于/home/test/;
● /home/./test/abc/等同于/home/test/abc/;
● /home/../home/test/abc/等同于/home/test/abc/。
由/开头的路径为绝对路径,绝对路径不受当前工作目录(使用pwd命令可以查询当前工作目录)位置的影响。
由目录名或文件名开头的路径为相对路径,相对路径受当前工作目录位置的影响。
假设当前工作目录为/home/,则:
● test/abc/等同于/home/test/abc/;
● ./test/abc/等同于/home/test/abc/。
而当工作目录(使用cd命令改变当前工作目录)变更为/home/test/后,则:
● test/abc/等同于/home/test/test/abc/(不存在);
● ./test/abc/等同于/home/test/test/abc/(不存在);
● ../test/abc/等同于/home/test/abc/(存在)。
从上面的例子可以看出,绝对路径有静态的特点,相对路径有动态的特点。
在不同的场景下相对路径和绝对路径有不同的优势,而且错误地选择路径类型会导致路径复杂、兼容性下降且易出错,所以我们需要根据具体的使用需求来选择是使用相对路径还是绝对路径。
注意:在Linux操作系统中,以.开头的文件或目录为隐藏文件或隐藏目录。隐藏目录在使用ls命令展示时需要带上-a或-A选项才可以被展现,ls命令-a和-A选项的区别如图1-30所示。
图1-30 ls命令-a和-A选项的区别
1.3.3 用户与用户组
Linux是一个多用户操作系统,需要通过某个确定的用户身份登录后才可使用。每个用户账号都拥有唯一的用户名和各自的密码。通常,在Shell中输入密码并不会有任何显示反馈,但是这并不代表你没有输入字符,这只是一种防偷窥的安全措施。
在绝大多数Linux发行版中,有一个名为root的根用户(系统管理员)。root用户拥有对系统的绝对控制权,包括但不限于可以编辑磁盘上所有用户的文件且无视权限控制和可以强制结束任意用户的任意进程。在大多数Linux发行版中,root用户在系统默认配置下不可以直接登录,因为这可能会导致非常严重的安全问题。
在使用某些需要root权限的命令(例如apt和yum)或编辑系统配置文件(例如某些位于/etc/下的配置文件)时,可以在执行的命令前添加sudo来临时提升权限。sudo命令在当前命令行中第一次执行时会要求输入当前用户的密码。
使用id命令可以查询到执行用户的用户名和用户组信息,如图1-31所示。
图1-31 使用id
命令可以查询当前用户信息
可以看到,在需要执行的命令前加上sudo
之后,该命令的执行用户将会变成root用户,可获得最高权限。
注意:在某些教程中可能会介绍使用su
命令切换为root身份或修改用户配置开启root用户的直接登录。除非你能明白这样做可能带来的风险(root密码泄露导致的所有用户隐私泄露或被植入病毒),否则绝不应该按照这些教程的介绍开启root用户的直接登录。
每个用户都至少归属于一个用户组(一个与用户名同名的用户组,这个用户组在创建用户时被创建),用户组也可以被单独创建。root用户可以将某个用户添加到其他用户组或从某个用户组中删除某个用户。
当一个用户同时属于多个用户组时,这个用户将会获得自己所属的所有用户组所拥有的权限。
1.3.4 目录权限管理
使用ls
命令展示某个目录内容时,加上-l
选项,可以查看权限、拥有者、所属用户组等信息,如图1-32所示。
图1-32 使用ls
-
l
可以展示当前目录下的权限、拥有者等信息
此处跳过total
部分,下一行开始为目录下文件或子目录的详细信息。由空格分隔开的每一个部分称作字段。最后一个字段是文件名或目录名。
第一个字段的10个字符表明了这个文件或目录的属性和权限。第一个字段的第一个字符的说明如下:
● “-
”表明这是一个文件;
● “d
”表明这是一个目录(directory);
● “l
”表明这是一个链接文件(类似于Windows中的快捷方式)。
可以看到图1-32中music
第一个字段的第一个字符是d
,所以这是一个目录(也称为文件夹)。
第一个字段的剩余9个字符按从左到右的顺序,每3个为一组权限标志,3组分别对应User、Group和Others的权限。每组的权限字符分别是r
(read),表示读;w
(write),表示写;x
(execute),表示执行;-
表示不拥有这项权限。这里需要注意的是,文件的x
权限用于决定某个用户能否运行这个文件(脚本或二进制程序),目录的x
权限用于决定某个用户能否使用cd
命令进入这个目录。通常也可以用3位数字分别表示User、Group和Others的权限,具体内容在后文chmod
命令部分进行讲解。
User指文件或目录的拥有者,即第三个字段,例如可以看到图1-32中文件和目录的拥有者都是用户sonic。Group指文件或目录所属的用户组,这个用户组下所属的所有用户对应这一段的权限标志,例如root用户组下的所有用户拥有对music目录的rwx(读、写、执行)权限。Others指除了拥有者和所属用户组之外的其他用户。
可以使用chmod
命令改变文件或目录权限,使用chown
命令改变目录文件或目录拥有者和所属用户组。
1.3.5 远程登录
某些情况下使用者只能远程访问计算机,例如使用高性能计算集群或云服务时,这时通常使用SSH协议来连接目标计算机。SSH协议用于计算机之间的加密连接。加密意味着与服务器之间的连接是安全的,中途被截获并不会导致信息泄露。
通常使用SSH协议连接远程服务器时有两种登录方式:密码登录和公钥登录。
(1)密码登录就是使用用户名和对应的密码进行认证。在密码过于简单的情况下,如果服务器暴露在公网(服务器拥有可以从运营商网络直接连接的IP地址且没有防火墙保护)上,密码将会有被破解的可能。
(2)公钥登录使用密钥对进行认证。SSH密钥对通过非对称加密算法生成一对密钥,分为公钥和私钥。非对称加密意味着使用公钥加密的数据必须使用私钥才能解密,而使用私钥加密的数据必须使用公钥才能解密。同时,不能通过单一公钥或私钥推导出与之对应的私钥或公钥。公钥保存于需要登录的目标服务器~/.ssh/authorized_keys文件中,私钥作为登录凭证需要用户自己妥善保存。通常只要私钥文件不被泄露,就可以杜绝暴力破解。
在某些情况下,为避免重要服务器暴露于公网,用户需要根据要求连接对应的虚拟专用网络(Virtual Private Network,VPN),这样才可以使用远程SSH服务。
在Windows上通常使用MobaXterm工具连接远程服务器;在Linux上则通常使用ssh命令。
1.3.6 输入输出重定向
Linux中存在3个默认的输入输出源:标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)。
Bash中运行程序或执行命令时默认输出的内容会发送到标准输出,也会从标准输入读取信息。而标准输入、标准输出就是你的命令行终端,程序将需要显示的内容发送到标准输出,命令行终端中便会显示对应的内容;当你在命令行终端中输入字符时,程序便可以在标准输入中读取你输入的内容。标准错误输出也是指输出到终端,通常用于程序或命令输出错误信息或某些重要信息。
输入输出重定向通过在执行命令后面添加重定向操作符来实现,重定向操作符如表1-1所示。其中对于输入输出描述符,0表示标准输入(stdin),1表示标准输出(stdout),2表示标准错误输出(stderr)。
表1-1 重定向操作符
输出重定向可以将程序的输出重定向为特定的文件,也就是说可以将程序或命令原本在终端中显示的内容保存于一个文件中。
例如,command >log.txt 2>&1
表示将command
命令的标准输出保存到log.txt,而且将标准错误输出重定向到标准输出,这样标准输出和标准错误输出的信息都会写入log.txt文件,如图1-33所示。
图1-33 标准输出重定向
c
ommand >log.txt 2>err.txt
表示将command
命令的标准输出保存到log.txt,将标准错误输出保存到err.txt。
输入重定向则可以将程序的标准输入重定向为特定的文件,可以将原本需要手动输入的信息,改为将一个文件中的信息自动输入。
1.3.7 常用命令
Linux中命令的格式如下:
命令 [选项]... [参数]...
● 命令为命令名称,例如ls
。
● 选项由-
或--
引导,-
后跟单个字母,称为短选项;--
后跟单词,称为长选项。选项可以有自己的参数,例如前文介绍的-n jupyter
。多个没有参数的短选项之间可以省略-(短选项之间的空格也可省略),例如ls -a -l=ls -al
。
● 参数用于描述命令,例如cd /home
中,/home
为cd
命令的参数。
在Linux文档说明中,有统一的符号用于描述命令的选项和参数的情况,如下。
● []
表示内容可选,可以缺少。
● a|b
表示多选一。
● ...
表示前面的内容可以多次重复。
1.临时“提权”——sudo
在某些情况下,例如使用apt
命令时临时需要root权限,则可以借助sudo
命令来实现。
sudo
命令的格式如下:
sudo <命令>
sudo
命令可以使后面跟随的命令临时使用root权限来执行。
使用sudo
命令时,需要确认当前用户已被添加到sudoer列表中(添加用户到sudoer列表需要root权限,如果没有则需要联系拥有root权限的管理员)。但是对于自己安装的Linux系统,安装时创建的用户通常已经被系统默认添加到sudoer列表中。
sudo
命令后面跟随的命令的运行身份是root用户,如图1-34所示。
图1-34 sudo
命令可以改变后面命令的运行身份
2.查看当前工作目录——pwd
使用Bash的过程中,通常需要将当前工作目录的路径作为配置参数或运行参数,这时可以通过pwd
命令查看当前工作目录,如图1-35所示。
3.切换当前工作目录——cd
cd
是Bash中使用较频繁的命令,使用它可以将当前工作目录切换为目标目录,也就是打开某个文件夹,目录参数可以是相对路径也可以是绝对路径,如图1-36所示。
图1-35 使用pwd
命令查看当前工作目录
图1-36 使用cd
命令切换当前工作目录
4.列出目录内容——ls
在Bash中并不会像在Windows中那样直接显示某个文件夹下的子目录或文件,需要使用ls
命令展示当前工作目录或某个指定目录下的文件或目录。
ls [-a|l|r|t|A|F|R] [目录]
● -a
:显示所有文件及目录,包括以.
开头的隐藏文件、当前目录(.
)和父目录(..
)。
● -l
:除文件名称外,同时列出文件形态、权限、拥有者、文件大小。
● -r
:将文件按照英文字母降序列出(默认按照英文字母升序列出)。
● -t
:将文件按照建立时间升序列出。
● -A
:同-a
,但不列出当前目录(.
)和父目录(..
)。
● -F
:在列出的文件名称后加上符号。例如可执行文件后加*
,目录后加/
。
● -R
:递归列出子目录(包括子目录)下的所有文件。
如果省略目录参数,则可查看当前工作目录下的文件,如图1-37所示。
图1-37 使用ls
命令查看当前工作目录下的文件
5.删除文件或目录——rm
rm
命令用于删除文件或目录。
rm [-f|r|i] 文件
● -f
:强制删除。
● -r
:将目录包括其之下的子文件和子目录递归删除。
● -i
:删除前逐一询问确认。
删除目录时必须带上-r
选项。
6.改变文件权限——chmod
Linux中的目录和文件具有权限属性,与目录或文件权限属性不相匹配的用户将不能执行修改、创建或删除操作。文件的拥有者可以使用chmod
命令修改文件的权限,以方便自己或他人使用。
chmod [-c|f|v|R] [--help] [--version] 权限 文件...
文件的拥有者或root用户可以通过chmod(change mode
)
命令修改文件权限。
● -c
:只有该文件权限确实已经被更改,才显示更改动作。
● -f
:即使该文件权限无法被更改也不显示错误信息。
● -v
:显示权限变更的详细内容。
● -R
:对当前目录下的所有文件与子目录进行相同的权限变更(以递归的方式逐个变更)。
● --help
:显示帮助说明。
● --version
:显示版本信息。
权限参数可以使用符号模式和数字模式。
(1)符号模式。
符号模式的权限参数由3个部分组成:用户类型、操作符和权限符。例如chmod a+x abc.sh
。其中用户类型可以省略,省略时默认用户类型为a。
用户类型如表1-2所示。
表1-2 用户类型
操作符如表1-3所示。
表1-3 操作符
权限符如表1-4所示。
表1-4 权限符
例如,chmod +x abc.sh
表示为abc.sh文件添加针对所有用户的执行权限,等价于chmod a+x abc.sh
和chmod ugo+x abc.sh
;chmod o-w abc.sh
表示针对其他用户取消为abc.sh文件写入的权限。
(2)数字模式。
数字模式用3个数字分别代表拥有者、用户组和其他用户的权限,如表1-5所示。例如chmod 750 abc.sh
。
表1-5 权限对应的数值及说明
实际上对于数字模式的权限只需要记住r=4、w=2和x=1,就可以推算出其他权限所对应的数值。例如,rwx
对应的数值是4+2+1,也就是7。
参数中3个数按顺序分别代表的是拥有者、用户组和其他用户所拥有的权限。
例如,chmod 750 abc.sh
表示针对拥有者设定读、写、执行权限,针对用户组设定读、执行权限,针对其他用户设定无权限。
7.改变文件拥有者和用户组——chown
Linux中的目录和文件除了有权限属性,还有拥有者属性和用户组属性。文件的拥有者对文件有最大权限,可以修改文件的权限属性。某些情况下可能会需要修改文件或目录的拥有者,这时可以使用chown
命令。注意,chown
命令通常只能以root用户的身份执行。
chown [-c|f|h|v|R] [--help] [--version] user[:group] 文件...
● -c
:显示更改部分的信息。
● -f
:忽略错误信息。
● -h
:修复符号链接。
● -v
:显示详细的处理信息。
● -R
:处理指定目录以及其子目录下的所有文件。
● --help
:显示帮助说明。
● --version
:显示版本信息。
● user
:新的文件拥有者的用户名。
● group
:新的文件所属用户组的名称。
c
hown
命令需要root权限才可以执行,所以如果以非root用户的身份登录,则需要在前方添加sudo
命令。如果以非root权限执行该命令,则会提示Operation not permitted
,表示缺少权限错误,如图1-38所示。
图1-38 chown命令需要使用root权限
例如,sudo chown root:root abc.txt
表示将abc.txt的文件拥有者改为root用户,所属用户组改为root用户组。