Unix系统下的登陆与退出
Unix系统一直以其安全性著称,实现安全性的一个比较重要的方法就是多用户分组管理,毕竟你不能让一个随便创建的用户来运行诸如rm -rf \
等危险的命令 ,因此用户在使用Unix系统时候,需要进行登录。
值得一提的是树莓派使用的Raspbian系统,实际上是Debian系统,而在Debian中root账户默认没有密码,并且账户是锁定的,因此如果执行一些需要root权限的命令时,就需要开启root用户。
首先先给root账户设置密码:sudo passwd root
然后解锁root账户:sudo passwd --unlook root
,即开启了root用户,同时也算第一次输入passwd命令。

既然知道如何登入了,就需要知道如何才能够退出才行,通常情况下可以直接在Shell中输入exit或者ctrl-d即可以退出(用户层面),但是如果是类似于树莓派这种物理机的话,因为不只有Shell,想要完全退出的话需要在Shell中输入sudo poweroff
后,才算是安全退出(机器层面)。
Unix下命令
命令格式
Unix下命令格式基本如下:
$> 命令名 [-选项] [参数]
注意,选项前面的 -
是必不可少的,对于选项而言,既可以分开多个,以空格为间隔符来写,也可以合并起来例如:
ls -a -l
可以写作 ls-al
,且后面那种写法更加常见
注意事项: Unix对于大小写是敏感的,对于ls命令而言不能写成LS(当然也有特例 如果你使用alias
命令为命令起了一个大写别名的话)
常见命令
目前学习的命令比较少,随着后续的学习了解的命令会慢慢变多,同时也会在相应章节里面更新
1.操作文件及目录
命令 | 参数 | 示例 | 说明 |
---|---|---|---|
cd | cd ~ | 切换目录 | |
pwd | pwd | 显示当前工作目录目录 | |
touch | touch 1.txt | 创建空文件 | |
mkdir | mkdir testdir | 创建一个新目录 | |
\ | -p | mkidr -p dir1/dir2/dir3/ | 创建多级目录,父目录不存在情况下先生成父目录 |
cp | cp 1.txt | 复制文件 | |
\ | cp -r dir1/ | 递归处理,将指定目录下的文件与子目录一并拷贝 | |
mv | mv dir1 dir2 | 移动文件或目录、文件或目录改名 | |
rm | rm 1.txt | 删除文件 | |
\ | -rf | rm -rf dir1 | |
rmdir | rmdir dir1 | 删除空目录 | |
cat | cat 1.txt | 显示文本文件内容 |
2.系统常用命令
命令 | 参数 | 示例 | 说明 |
---|---|---|---|
ps | 较少单独使用,配参数根据需求 | ||
\ | -e /-A | ps -e | 显示所有进程,环境变量 |
\ | -f | ps -ef | 全格式显示 |
\ | -a | ps -a | 显示所有用户的所有进程(包括其它用户) |
\ | -u | ps -au | 按用户名和启动时间的顺序来显示进程 |
\ | -x | ps -aux | 显示无控制终端的进程 |
reboot | reboot | 重新启动 | |
ifconfig | ifconfig | 网卡网络配置,常用于查看当前IP地址 | |
date | date | 显示系统当前时间 | |
cal | cal 3 2020 | 显示指定月份的日历表 |
ifconfig在使用树莓派的时候经常需要使用(查看地址来使用SSH连接),也可以使用pi@raspberrypi.local
来获取树莓派的hostname,相比于使用ifconfig更方便。
如何阅读MAN手册
很显然,那么多的命令加上参数,对于人而言是不可能完完全全记住的,在Unix中,系统就为用户提供了查看命令的帮助信息,但是相对的也带来了一些问题,man手册的阅读对于人而言是很痛苦的(无高亮、命令行下,第二语言下),而且有时候理不清文档内容组织结构,思维很混乱,或者明白文档描述所用的体例,但不明白命令各种参数该如何组合也是比较痛苦的。
在联网的情况下,通常我都是查找开源的社区直接找命令,阅读效果比直接man 命令更好,并且例子丰富且多是实际状况下所需要的。网址见下:
例图:

可见确实对于学习命令有很大的帮助
那如果我需要在Shell中阅读man手册该如何做?
MAN手册分类
man [OPTION...] [章节] 手册页...
共有9卷:
序号 | 英文 | 中文 |
---|---|---|
1 | Executable programs or shell commands | 可执行程序或shell命令 |
2 | System calls (functions provided by the kernel) | 系统调用 |
3 | Library calls (functions within program libraries) | 库调用 |
4 | Special files (usually found in /dev) | 特殊文件 |
5 | File formats and conventions eg /etc/passwd | 文件格式和约定 |
6 | Games | 游戏 |
7 | Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) | 杂项(包括宏和惯例) |
8 | System administration commands (usually only for root) | 系统管理命令(通常仅适用于root用户) |
9 | Kernel routines [Non standard] | 内核例程(非标准) |
例如:man 2 mkdir
这时看到的是MKDIR(2),表示是系统调用这个板块的。要知道,man在没有指定板块时,将使用一种默认的顺序查找这些板块中的命令,只返回含有该命令的第一个文档。当指定板块时,只从该板块中查找。所以,当我们man得不到想要的文档时,就要给出板块号了。
Shell
Shell介绍
shell是unix下负责用户与unix交互的程序,unix命令的处理是由位于用户与操作系统其他部分之间的shell完成的,shell是一个命令解释程序,每一个命令都是由shell来进行分析,然后执行用户请求的。
值得一提的是,一些UNIX命令时shell程序的一部分,成为shell命令或内部命令(builtin),它是由shell识别并在shell内部执行的。
Shell的种类
shell的种类比较多,目前流行的有:
- ksh
- bash
- dash
- zsh等
切换shell的话,可以直接将shell的名称输入到命令行即可,切换回原来的shell的话,chsh不加参数即可。
/etc/passwd文件
在Linux /etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性,其中也包括了缺省的shell

可以看到一条记录分为7个字段,以:为分隔符,如果以
root: x:0:0:root:/root:/bin/bash
来分析的话
- 第一个 root:代表用户名(用户ID)
- 第二个 x:这个用户是否需要密码登录不写代表不需要密码(密码标志)
- 第三个 0:uid 用户id(0表示root用户,1-499表示系统用户,500-65535表示普通用户)
- 第四个 0:gid 用户组id(组ID)
- 第五个 root:注释(用户说明)
- 第六个 /root/ :用户的家目录(普通用户:/home/username root用户:/root)
- 第七个 /bin/bash:用户登录的命令解释器(登陆的shell,/sbin/nologin 代表不能登录)
了解到此处即可。
登录与退出过程
登录
unix启动时,内核被装入内存,而操作系统的系统工具保存在系统磁盘上,在用户请求时才被装入执行。用户登陆时,shell程序被装入内存。
先来简述一下用户登陆的过程:
系统自举时,init继承创建getty进程守护在各个终端上
当用户输入用户名时,执行login程序
login执行并提示用户输入password
当username、password验证成功,fork出shell进程
详细描述的话
Step1:系统启动时,init进程根据配置文件/etc/inittab确定需要打开哪些终端
按照配置文件进行
Step2:getty完成任务
getty根据命令行参数打开终端设备作为它的控制终端,把文件描述符0、1、2都指向控制终端,然后提示用户输入帐号。用户输入帐号之后,getty的任务就完成了,
它再执行login程序:
execle("/bin/login", "login", "-p", username, NULL, envp)
Step3:login程序运行
login程序提示用户输入密码,且在输入密码期间关闭终端的回显,因此我们在linux下输入密码时是看不到的,然后验证帐号密码的正确性。
如果密码不正确,login进程终止。init会重新fork/exec一个getty进程。如果密码正确,login程序设置⼀些环境变量,设置当前工作⽬录为该⽤户的主目录,然后执行Shell:
execl("/bin/bash", "-bash", NULL)

退出
用户退出系统也是差不多类似的道理,shell程序终止执行,login退出,init回收login,然后init再fork出新的getty,来程序等待新用户的登录。
