/dev/tty文件在Unix操作系统中的妙用
在Unix系统中,文件是其中最重要的资源。如标准输出文件、标准输入文件、标准错误文件等等。不过这些文件普通用户与系统工程师都需要用到。而在实际工作中,对于系统工程师来说,还需要掌握/dev/tty这个文件。
这个文件顾名思义,主要用来表示用户的终端,但是它跟普通的终端又有差异。普通的终端是指一些硬件设备,如显示器等等。通常情况下,标准输出或者标准错误流的文件都会输出到终端中。但是,这些标准的输入输出往往不能够输入到/dev/tty文件中。而是需要通过重定向功能,把一些命令的输出重定向到这个文件中。另外需要说明的是,普通终端的话往往是每个用户之间相互独立的。也就是说,每个用户的输出彼此之间是互不干涉的。在用户A的终端中不能够看到用户B的终端信息。但是/det/tty这个文件由其特殊性。这个终端文件可以由各个用户共享。正是因为这个文件有这方面的特殊性,为此在实际工作中系统工程师经常需要用到这个文件。
一、系统工程师常见需求描述及实现方案。
利用这个特殊文件,可以帮助系统工程师解决很多实际问题。
1、利用这个文件来屏蔽不需要的结果信息。通常情况下,为了提高与用户沟通界面的友好性,往往会在脚本程序中,利用echo命令向用户显示一些提示信息。如一个简单的计算器脚本程序,会提示用户输入相关的参数,如“Put one number等等。有时候,还会在程序的开头显示一大堆的程序说明。这毋庸置疑,可以提高脚本程序的可读性。即方便了用户的使用,而且别的系统工程师借助这些说明也可以顺利对其进行功能上的调整与扩展。不过这也会赞成一些工作上的困扰。如当系统工程师调试脚本程序的时候,这些显示的提示信息反而会增加系统工程师的困扰,会增加他们的阅读量。因为此时用户终端上显示的将士全部的信息,即包括对于应用程序没有实际价值的提示信息,也包括一些应用程序执行过程中的错误信息。这显然会给系统工程师阅读错误信息带来一定的麻烦。另外如笔者谈过,系统工程师可以通过重定向符号把这个终端输出的信息重定向到一个文件中。可是此时这个文件中也会显示全部的信息。而这些信息大部分是系统工程师不需要看到的。系统工程师可能只需要一些相关的参数以及具体的执行结果。如10*10=100。就这么简单,而不需要看到一大堆的提示说明。而且如果这个文件中带有这么多的无用信息,对于其他脚本程序来调用这个文件也不是很方便。遇到这种情况时该如何处理呢?其实系统工程师可以轻松的通过/dev/tty文件来过滤这些无用的提示信息。如只需要把脚本程序的运行结果通过重定向服务重定向到/dev/tty文件中。在这个重定向的过程中,Unix系统的shell会采取一定的内部处理机制,会忽略掉echo等命令。也就是说,只要把命令的标准输出重定向到这个文件中,则利用echo命令设置的一些提示信息都会被忽略掉。此时在这个文件中,存储的只有一些必要的运行信息,如错误或者警告信息等等。
2、当作其他命令的参数。/dev/tty文件不仅可以用作终端设备来管理,而且这个文件还可以被用来当作其他命令的参数。因为一个终端就相当于一个文件,为此在一些命令中如tee命令就可以拿这个文件当作参数。Tee命令是一个分流命令,其主要用途就是把一个输入流的一个副本保存到另外一个文件中。有时候这个特性非常有用。如现在系统工程师需要利用who命令来显示Unix系统的当前登录用户。同时希望把这个显示结果保存到一个特定的文件中。如果没有tee这个命令的话,则需要通过两个步骤才能够完成。首先需要利用who命令在当前终端中显示相关的结果。然后再利用who >重定向符号把这个命令的显示结果保存到一个特定的文件中。如果一开始就采用who >进行重定向的话,则在用户终端将不会显示任何信息。因为其直接把结果保存到了一个文件中。而现在系统工程师即希望把命令的结果输出到终端中,同时保存到一个文件中,就需要利用tee命令,如who | tee userinfo.txt。(注意,如果利用了tee命令的话,在可以不再使用重定向符号)。到这里为止没有涉及到/dev/tty这个文件。who | tee userinfo.txt这个命令的显示结果,只会显示当前登录的用户明细,而不会显示当前有多少个用户登录到系统中。可能或许有人回说只要数一下就可以了呀。确实数数的话可以实现,但是计算机不会自己数呀。如果其他脚本程序需要用到当前登录用户的总数而不需要明细,那么该如何处理呢?此时就需要利用/dev/tty文件作为参数了。如可以使用who | tee /dev/tty |wc –l 命令。这个命令可以把当前用户的明细以及总共的用户数量显示出来。以上这个命令其实我们可以分为四个步骤。第一步系统先执行who命令;第二步tee命令把who命令执行对结果保存到/dev/tty文件中;第三步wc命令会统计/dev/tty文件中的行数。由于一个终端对相当于一个文件,故利用wc命令可以统计出当前系统登录用户的数量。第四步再把这个统计的结果显示在终端上。所以说,把/dev/tty文件当作其他命令的一个参数,一个一起组合以实现一些比较复杂的功能。
二、/dev/tty文件使用的注意点。
在使用这个文件中,特别需要关注的是其权限文件。默认情况下,普通用户也可以实现这个文件,从而可能造成一定的安全隐患。如现在系统中有两个普通用户sa01与sa02。而他们两个都是通过远程终端连入到Unix操作系统中。此时假设用户sa01知道用户sa02的用户名以及登录密码。那么就可以假冒用户sa02的身份,把一些命令的执行结果重定向到/dev/tty文件中。同时利用tee命令进行分流。此时对于用户sa02时,因为其执行相关的命令在终端上仍然可以正常显示,不会产生什么怀疑。但是这个用户其可能不知道,自己执行命令的结果已经保存到/dev/tty文件中。而其他用户就可以通过这个文件来显示在其用户终端上所显示的信息。这显然会导致用户SA02信息的泄漏,给其带来一定的损失。
/dev/tty这个文件可以有多个用户同时使用,而且相互之间不会发生冲突。这个特性可以帮助系统工程师实现很多有用的功能。但是毋庸置疑的是,也造成了一定的安全隐患。为此对于大部分情况下,Unix系统工程师要对这个文件进行一定的权限限制,如只有系统工程师(不一定是特权用户)才可以使用这个文件。从而防止非法攻击者利用这个文件来获取其攻击所必要的信息。
另外需要注意的是命令 >/dev/tty与命令> file连个命令其最终的结果有可能相同,也有可能不同。前者在把命令的显示结果保存到/dev/tty文件中的时候,会过滤掉echo等命令设置的信息。而后者这个命令这会把显示的结果一五一十的照搬到file文件中去。也就是说,如果在命令或者脚本程序中没有echo等类似的命令设置信息的话在,则这两个命令重定向文件后所保存文件的内容是一致的。但是如果在命令或者脚本程序中有类似的提示命令的话,则两个文件的显示结果则会不同。为此系统工程师就需要根据自己的实际需要,来选择合适的重定向文件,看看有否必要采用/dev/tty文件。笔者的态度是,只有在确实有必要的情况下,才能够使用/dev/tty文件。因为这个文件是比较稀缺的,只由在缺其不可的情况下,才启用这个文件。