linux 终端设置及读写

终端设置命令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连接

  1. Terminal请求和sshd建立连接。

  1. 如果验证通过,sshd将创建一个新的session。

  1. 调用API(posix_openpt())请求ptmx创建一个pts,创建成功后,sshd将得到和ptmx关联的fd,并将该fd和session关联起来。

  1. 同时sshd创建shell进程,将新创建的pts和shell绑定。

收发消息

  1. Terminal收到键盘的输入,Terminal通过ssh协议将数据发往sshd。

  1. sshd收到客户端的数据后,根据它自己管理的session,找到该客户端对应的关联到ptmx上的fd

  1. 往找到的fd上写入客户端发过来的数据。

  1. ptmx收到数据后,根据fd找到对应的pts(该对应关系由ptmx自动维护),将数据包转发给对应的pts。

  1. pts收到数据包后,检查绑定到自己上面的当前前端进程组,将数据包发给该进程组的leader。

  1. 由于pts上只有shell,所以shell的read函数就收到了该数据包。

  1. shell对收到的数据包进行处理,然后输出处理结果(也可能没有输出)。

  1. shell通过write函数将结果写入pts。

  1. pts将结果转发给ptmx。

  1. ptmx根据pts找到对应的fd,往该fd写入结果。

  1. 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子进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小白20200202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值