终端设置命令stty/getty/tty
stty:(set tty,设置tty)命令用于检查和修改当前注册的终端的通信参数。UNIX系统为键盘的输入和终端的输出提供了重要的控制手段,可以通过stty命令对特定终端或通信线路设置选项。
tty :用于查看当前是哪个终端。
getty :用于打开一个终端:getty tty7
打开一个串口shell:getty ttyS0 9600 vt100 -n -l /bin/sh
其中-n 表示无需登陆,-l 指定登陆程序为 /bin/sh。使用串口 ttyS0,波特率为 9600,不知道 vt100 是什么。
stty 用于查看和修改当前终端的参数:stty -a
Linux串口登录和agetty
agetty介绍
Man agetty


agetty只用于打开串口。Agetty中会调用login程序,由login程序完成账户认证。
Agetty功能
agetty就只是用来做登录认证的,如果登录串口不需要认证,就不需要启动该程序。
打开指定的tty;
提示用户登录(login:);
获得登录用户名;
把用户名传递给login命令
login程序功能
先检查是不是超级用户;
提示用户输入密码(通过getpass()实现);
检查密码并检查是否quiet登录;
设置登录的用户的ID和组ID,并设置相应的环境变量.
串口登录流程
串口登录前系统中的agetty进程:

使用strace命令监控串口的agetty进程,打印信息如下:


ssh登录之pts和sshd进程
建立SSH连接
Terminal请求和sshd建立连接。
如果验证通过,sshd将创建一个新的session。
调用API(posix_openpt())请求ptmx创建一个pts,创建成功后,sshd将得到和ptmx关联的fd,并将该fd和session关联起来。
同时sshd创建shell进程,将新创建的pts和shell绑定。

收发消息
Terminal收到键盘的输入,Terminal通过ssh协议将数据发往sshd。
sshd收到客户端的数据后,根据它自己管理的session,找到该客户端对应的关联到ptmx上的fd
往找到的fd上写入客户端发过来的数据。
ptmx收到数据后,根据fd找到对应的pts(该对应关系由ptmx自动维护),将数据包转发给对应的pts。
pts收到数据包后,检查绑定到自己上面的当前前端进程组,将数据包发给该进程组的leader。
由于pts上只有shell,所以shell的read函数就收到了该数据包。
shell对收到的数据包进行处理,然后输出处理结果(也可能没有输出)。
shell通过write函数将结果写入pts。
pts将结果转发给ptmx。
ptmx根据pts找到对应的fd,往该fd写入结果。
sshd收到该fd的结果后,找到对应的session,然后将结果发给对应的客户端。
数据走向为:
sshd--->fd-->ptmx--->pts--->shell
shell进程
shell做为一种和Linux系统的特殊交互式工具,为用户提供了启动程序、管理文件系统中的文件及运行在Linux上的进程的途径。shell通过解析输入的文本命令,在内核中执行来达到与系统交互的功能。shell包含了一组内部命令,通过这些命令可以进行文件管理、程序管理及运行等操作。
通常我们在执行shell命令的时候直观的感觉就是命令是直接运行在Linux系统上的,其实这是个主观的误解,shell本身就是个运行在Linux上的进程,shell命令的执行是在对应的进程内运行的(对应shell的内建命令和外部命令是不同的)。
当用户登入到虚拟终端or终端仿真器上时,就会启动默认的shell程序。用户登入启动什么样的shell取决于在/etc/passwd用户配置文件中列出的用户默认shell。
Linux系统本身也有一个默认的shell就是/bin/sh,是用于在系统中启动系统shell脚本所指定的默认shell。通常在Linux系统中这个文件是一个符号链接文件,指向/bin/bash这个shell,也可以更改/bin/sh的链接来更换系统默认shell。
用户登入终端所启动的shell是一个父shell。在终端的提示符后输入bash命令或其他等效bash命令时会创建一个新的shell程序,这个shell被称为子shell。如下,我们在终端中输入两次bash命令后使用ps --forest查看进程嵌套关系可以看出父shell和子shell的关系。
内建命令与外部命令
shell命令有内建命令和非内建(外部)命令,它们之间操作大不相同。内建命令已经是和shell编译在一起了,作为shell工具的组成部分;外部命令是存在于shell之外的程序,外部命令通常位于/bin、/usr/bin、/sbin或/usr/sbin目录中,作为外部程序文件来运行,如ps就是外部命令,可是使用which和type查看到此命令是/bin/ps程序的命令。下列例子通过使用which或type查看内建命令cd和外部命令ps的区别:

当外部命令执行时,会创建出一个子进程,这个子进程用来运行外部命令程序,这种操作被称为衍生。对于内建命令则直接在shell进程运行,不需要创建子进程进行运行命令。如ps作为外部命令,可以通过ps -f命令很方便的显示出对应的shell父进程和衍生出的ps子进程