说明当一个用户登录和注销时发生了什么。较详细地说明后台进程的各种交互、log文件、配置文件等
通过终端登录
首先,init 确认有一个getty 程序提供给终端连接(或控制台)。 getty 侦听终端等候用户告知它要登录 (这通常意味着用户必然键入些什么)。当它注意到一个用户,getty 输出一个欢迎信息(存在/etc/issue 中),并提示用户名,最后运行login 程序。 login 作为一个参数得到用户名,并提示用户输入口令。如果正确,login 启动给此用户设置的shell;否则退出并终止进程 (可能在再给用户一个机会输入用户名和口令之后)。 init 注意到进程终止,就给这个终端启动一个新的getty 。
注意唯一的新进程是由init 产生的(用fork 系统调用); getty 和login 只是替代进程运行的程序 (使用exec 系统调用)。
为注意用户,串行线需要一个单独的程序,因为终端活动时可以(传统上也是)变得复杂。 getty 也适应连接的速度和其他设置,这对拨号连接特别重要,因为连接和连接的参数可能不同。
getty 和init 有多个版本在使用,各有优缺点。学习你的系统的版本也了解其他版本是个好主意(你可以用 linux software map来找。)如果你没有拨入,可能不必考虑 getty ,但 init 仍然很重要。
通过网络登录
一个网络中的2台计算机通常通过一个物理电缆连接。当他们通过网络通信是,参与通信的每个计算机里的程序通过虚拟连接virtual connection通信,即一些虚构的电缆。虚拟连接的每端的程序,独占自己的(虚拟)电缆。然而,因为这电缆不是真的,只是虚构的,所有计算机的操作系统可以在同一物理电缆上有多条虚拟连接。这样,只用一条电缆,多个程序可以不必考虑其他通信而相互通信。使用同一电缆使多台计算机是可能的;2台计算机间存在的虚拟连接,其他计算机会忽略他们不参加的连接。
那是一个复杂和抽象的真实描述。但可能足够理解网络登录与普通登录的不同的重要原因。不同计算机上的2个程序要通信时,虚拟连接建立。由于理论上可能从网络上的任何一台计算机登录到任何一台计算机,因此可能有极大数量的潜在的虚拟通讯。因此,为每个潜在的login启动一个getty 是不现实的。
有一个进程.netd(与getty 协同)处理所有的网络登录。当它发现一个进来的网络登录(即发现某台其他计算机来的新的虚拟连接), 它启动一个新进程来处理那个登录。原来的进程继续侦听新的登录。
更复杂的是,网络登录有多个通讯协议。2个最重要的协议是 te.net 和rlogin 。除了登录,还有许多其他虚拟连接可能建立(为ftp、gopher、http和其他网络服务)。为要侦听的每种类型的连接提供一个进程不是很有效,因此,只用一个侦听器来识别连接的种类,能启动正确的程序来提供服务。这个侦听器叫.netd ;更多的信息请见《linux网络管理指南》。
login干了些什么
login 程序负责认证用户(确认用户名和口令相配),并建立串行线,启动shell,建立用户的初始环境。
部分初始化设置是输出文件/etc/motd (每天的短信息)的内容,并检查电子邮件。可以在用户家目录中产生一个叫.hushlogin 的文件来是上面所述的失效。
如果存在文件/etc/nologin ,就不允许登录。这个文件一般由shutdown 及其相关的东西产生。 login 检查这个文件,如果这个文件存在,就拒绝接受登录。如果这个文件确实存在,login 就会在退出之前,将它的内容输出到终端。
login 将所有失败的登录企图登记在系统log文件中 (通过syslog )。它也登记所有的root的登录。这些都对跟踪入侵者有用。
当前登录着的用户列在/var/run/utmp 中。这个文件直到系统下次启动或关机前有效。系统刚启动时它被清空。它列出了每个用户和用户使用的终端(或网络连接),及一些有用的信息。 who 、w 及其他类似的命令查看utmp 文件得到都有谁登录着。
所有成功的登录记录在/var/log/wtmp 中。这个文件将无限制地增大,所以必须有规律的清除,例如有个每周的cron 任务来清除它。 last 命令浏览wtmp 文件。
utmp 和wtmp 都是二进制格式 (见utmp 的man页);不幸的是,没有特殊的程序无法查看它们。
x和xdm
meta: x implements logins via xdm; also: xterm -ls
存取控制
用户数据库传统上包含在/etc/passwd 文件中。有些系统使用影子口令shadow passwords,并把口令移到 /etc/shadow 中。许多计算机的场所可以用nis或其他存储用户数据库的方法共享帐户;它们可能也自动从中心位置复制数据库到所有其他计算机。
用户数据库不仅包含口令,还包括有用户的其他信息,比如其真实姓名、家目录、登录 shell等。这其他信息需要公用,使所有人都能读。因此口令是加密保存的。这有缺点,任何人取得加密的口令,可以用不同的加密方法猜试口令,而不用试着真正登录到计算机。影子口令试图用把口令移动到其他文件的办法避免这种情况,只有 root能读(口令还是加密保存的)。 however, installing shadow passwords later onto a system that did not support them can be difficult.
不管有没有口令,确认系统中的所有口令是好的是很重要的,即不易猜。 crack 程序可用于破解口令;任何可以精确地找到的口令都不是好的口令。同时crack 可以为入侵者运行,也可由系统管理员运行以避免坏的口令。好的口令也可以被passwd 程序强制实现;这样对cpu周期来说很有效,因为破解口令需要许多计算。
用户组数据库保存在/etc/group 文件中;有影子口令的系统,是/etc/shadow.group 。
root通常不能通过更多的终端或网络登录,只能通过列在/etc/securetty 文件中的终端登录。这使得必须能够物理存取这其中的一个终端。当然也可能通过任何终端用任何拥护登录,然后使用su 命令变成root。
shell启动
当一个交互的登录shell启动时,它自动执行一个或更多预定义的文件。不同的shell执行不同的文件;更多的信息见每个shell的文档。
多数shell首先运行一些全局文件,例如,bourne shell(/bin/sh ) 和它引出执行的/etc/profile ;另外,它们执行用户家目录中的.profile 。 /etc/profile 允许系统管理员建立一个公用的用户环境,特别是建立path,以包括本地命令目录。另外,.profile 允许用户通过覆盖按照自己的口味客户化环境,如果必要,使用确省环境。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器