安装软件原本是一件非常简单的事,但其背后错综复杂的文件依赖使得这件事情没有那么轻松了。Linux系统分离软件包与依赖的设计减少了重复安装所需要的硬盘空间,但是也造成了一些潜在的问题。幸运的是,Debian系统在20世纪90年代解决了这些棘手的问题,解决方案是Debian包管理器以及APT包管理器。由Debian衍生出的各种系统(比如Ubuntu以及树莓派系统)都沿用了这个优秀的解决方案。现在我们先介绍一下通过命令行安装文件的方法,然后看一下文件所属用户组以及执行权限的问题。
使用apt命令可以非常简单地更新系统上安装的软件apt-get update。尝试着以用户pi的身份执行这条指令,然后你会得到一条报错信息。原因是在GNU/Linux系统上只有超级用户,也就是root用户有权限执行这条指令。
共享你的设备
如果你想要共享树莓派设备,就应该先查阅一下sudo以及visudo指令,确保给予其他用户正确的权限。
apt包管理器是Debian类系统的默认包管理器,所以从Debian衍生而来的Raspbian自然而然地采用了这种包管理器。与此同时,其他的Linux发行版(比如CentOS)有自己的包管理器yum,甚至MacOS下也有自己的管理器homebrew,了解并且学习一些其他的包管理器也是十分有必要的。
在我们详细讲解用户权限之前,我们先来谈谈sudo指令。sudo指令简单来说就是给普通用户提供了使用root权限的权利。在树莓派系统上,在命令前加上sudo指令几乎能让你完成任何操作,当然也包括一些危险的操作,所以一定要小心使用!
需要注意的是,sudo其实是系统上的一个软件,如果你的系统遇到了sudo命令找不到的问题,就可能需要apt-get install sudo –y,在一些纯净的镜像上sudo程序是不会被安装的。
以下的两条指令可以更新树莓派系统中安装的程序:
sudo apt-get update sudo apt-get upgrade
你可以同时用一条指令完成上述任务:
sudo apt-get update && sudo apt-get upgrade
&&是逻辑运算符号“与”。简单来说,它的意思就是如果与符号左边的指令没有成功运行,那么右边的就不会执行。
在每次安装新软件前执行更新操作是一种良好的习惯。因为刚才我们已经更新过了,所以现在可以直接安装一些终端游戏:
sudo apt-get install bsdgames
apt-cache search games命令可以在软件列表中搜索特定类型的软件。同时,你也可以通过apt-cache show bsdgames命令查看某一个软件包。APT是dpkg的一个前端实现。关于dpkg命令,你可以尝试dpkg -l,这条指令会打印出系统上已安装的软件(注意,在一个全新的系统上这条指令也会打出很长的列表)。
在这里我们简单地介绍一下dpkg指令,因为虽然在Raspbian下有非常好用的APT包管理器,但有时你还是会遇到一些需要自己手动安装deb包的情况。dpkg是APT的底层依赖,功能是安装和卸载deb包。比如说你拿到了一个网络上下载的.deb包,然后就可以使用dpkg命令来安装了。在这里顺便提一下,一般Debian系统可能会提供图形界面的用来安装deb包的软件,但是使用dpkg才是你应该掌握的正确方法,毕竟Linux下图形界面软件的可靠性比较有限,而且图形界面即使出了错你也不知道根源在何处。使用dpkg命令安装软件的命令是sudo dpkg –i,后面接上软件包的名字即可。
已经下载的软件包会存档在/var/cache/apt文件夹中。当你发现硬盘空间不足时,sudo apt-get clean命令会自动清除这些存档,同时不会影响到已安装的软件。你也可以尝试sudo apt-get autoremove,这是笔者常用的一条清理指令,可以删除一些过时的旧版软件包。
现在尝试使用命令ls -lh /etc/apt,同时观察对应的输出:
观察输出信息,sources.list对应的信息为-rw-rw-r--。这些信息告诉了你不同用户组的不同用户在使用这个文件上的对应权限。文件夹内的其他项对应的信息以字母d开头,这是因为它们是文件夹。sources.list对应的文件信息以-开头,表明这是一个常规文件,而剩下的文件信息位表明了文件的使用权限。
再尝试观察ls -l /dev/input的输出:
有些项以字母c开头,这是因为它们是硬件设备。在Linux上,所有东西都是文件,包括你现在使用的鼠标。
每一个文件都有对应的所有者与所有组。举例来说,你的home文件夹下的内容所有者就是你自己。试着输入命令“ls ~ -l”,那么你应该在输出中看到pi。pi表明了文件的所有者与所有组(假设你以pi用户身份登录)。注意,把-l放在命令尾部不是一种好的习惯,这里是知法犯法,为的是向你们展示各种可能的情况。接下来尝试命令ls -l /dev,你会发现所有者与所有组并不总是相同的。
Linux的文件属性设计是对安全性的有力保障,但也会带来使用上的问题。如果在执行命令的过程中遇到了权限问题,就试着在命令前加上sudo。
文件属性是文件类型后包含字母rwx的序列。文件属性能够告诉你某一用户能否读取、运行这个文件。如果你想要运行一个程序(比如之前的python games),在你的文件属性中需要包括x;对于文件夹来说,x属性允许你cd到它的内部。
现在尝试cd到/usr/share/python_games并且输入命令“sudo chmod a-x launcher.sh”,这里的a表示所有组(user、group与others),使用u、g、o可以只改变一个组对应的权限。修改过后,现在你已经无法执行我们的Python游戏了。想要恢复权限,我们可以使用指令:sudo chmod 755 launcher.sh。
上面的数字755是另一种表示权限的方式。3个数字分别代表user、group与others这3个组对应的权限。那么这些数字如何解读呢?一般来说,4代表读权限,2代表写权限,1代表执行权限。在解读的时候,我们把这些数字加起来即可。举例来说,7=4+2+1,那么7也就表明对应的用户组对这个文件有读、写、执行的权限;5=4+1表明有读、执行的权限。在当前目录执行ls -l,你会发现在launcher.sh的权限变为了-rwxr-xr-x。
chown命令与chgrp命令可以改变文件所属的用户以及文件所属的用户组。在当前目录下新建一个文本文件myfile.txt,然后输入sudo chown root myfile.txt,你会发现现在这个文件只能读,不能写了。运用相似的原理,你可以尝试着新建一个可以写、可以执行但不能读的文件。
pi@raspberrypi:~$ id uid=1000(czk) gid=1000(czk) 组=1000(czk),4(adm),24(cdrom),27(sud o),30(dip),46(plugdev),118(lpadmin),129(sambashare),996(docker)
id指令显示你现在的用户组访问信息,这决定了你使用、修改文件与设备的权限。
一般来说,chmod 755是你在之后的工作日常中经常要使用的命令,当你在网上下载了一个脚本文件却发现无法运行时,那么先确认文件的使用权限,然后使用chmod命令为它加上执行权限。