Linux基础:利用script命令记录下会话过程
作为linux服务器管理员,经常要使用ssh登陆到远程linux机器上做一些耗时的操作。
也许你遇到过使用telnet或SSH远程登录linux,运行一些程序。如果这些程序需要运行很长时间(几个小时),而程序运行过程中出现网络故障,或者客户机故障,这时候客户机与远程服务器的链接将终端,并且远程服务器没有正常结束的命令将被迫终止。
又比如你SSH到主机上后,开始批量的scp命令,如果这个ssh线程断线了,scp进程就中断了。在远程服务器上正在运行某些耗时的作业,但是工作还没做完快要下班了,退出的话就会中断操作了,如何才好呢?
我们利用screen命令可以很好的解决这个问题。实现在断开SSH的情况下,在服务器上继续执行程序。
那什么是screen命令?
Screen被称之为一个全屏窗口管理器,用他可以轻松在一个物理终端上获得多个虚拟终端的效果。
Screen功能说明:
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器,这意味着你能够使用一个单一的终端窗口运行多终端的应用。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。
Screen命令语法:
screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
Screen命令参数:
-A -[r|R] 将所有的视窗都调整为目前终端机的大小。
-c filename 用指定的filename文件替代screen的配置文件’.screenrc’.
-d [pid.tty.host] 断开screen进程(使用该命令时,screen的状态一定要是Attached,也就是说有用户连在screen里)。一般进程的名字是以pid.tty.host这种形式表示(用screen -list命令可以看出状态)。
-D [pid.tty.host] 与-d命令实现一样的功能,区别就是如果执行成功,会踢掉原来在screen里的用户并让他logout。
-h <行数> 指定视窗的缓冲区行数。
-ls或–list 显示目前所有的screen作业。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-p number or name 预先选择一个窗口。
-r [pid.tty.host] 恢复离线的screen进程,如果有多个断开的进程,需要指定[pid.tty.host]
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s shell 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。(用来替代[pid.tty.host]的命名方式,可以简化操作).
-v 显示版本信息。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
-x 恢复之前离线的screen作业。
Screen命令的常规用法:
screen -d -r:连接一个screen进程,如果该进程是attached,就先踢掉远端用户再连接。
screen -D -r:连接一个screen进程,如果该进程是attached,就先踢掉远端用户并让他logout再连接
screen -ls或者-list:显示存在的screen进程,常用命令
screen -m:如果在一个Screen进程里,用快捷键crtl+a c或者直接打screen可以创建一个新窗口,screen -m可以新建一个screen进程。
screen -dm:新建一个screen,并默认是detached模式,也就是建好之后不会连上去。
screen -p number or name:预先选择一个窗口。
Screen实现后台运行程序的简单步骤:
1> 要进行某项操作时,先使用命令创建一个Screen:
[linux@user~]$ screen -S test1
2>接着就可以在里面进行操作了,如果你的任务还没完成就要走开的话,使用命令保留Screen:
[linux@user~]$ Ctrl+a+d #按Ctrl+a,然后再按d即可保留Screen
[detached] #这时会显示出这个提示,说明已经保留好Screen了
如果你工作完成的话,就直接输入:
[linux@user~]$ exit #这样就表示成功退出了
[screen is terminating]
3> 如果你上一次保留了Screen,可以使用命令查看:
[linux@user~]$ screen -ls
There is a screen on:
9649.test1 (Detached)
恢复Screen,使用命令:
[linux@user~]$ screen -r test1 (or 9649)
Screen命令中用到的快捷键
Ctrl+a c :创建窗口
Ctrl+a w :窗口列表
Ctrl+a n :下一个窗口
Ctrl+a p :上一个窗口
Ctrl+a 0-9 :在第0个窗口和第9个窗口之间切换
Ctrl+a K(大写) :关闭当前窗口,并且切换到下一个窗口(当退出最后一个窗口时,该终端自动终止,并且退回到原始shell状态)
exit :关闭当前窗口,并且切换到下一个窗口(当退出最后一个窗口时,该终端自动终止,并且退回到原始shell状态)
Ctrl+a d :退出当前终端,返回加载screen前的shell命令状态
Linux的screen命令挺不错,在服务器上做点什么费时的工作就不用愁了!
linux-script
[itlife365@linux92181 20120620temp]$ which script
/usr/bin/script
[itlife365@linux92181 20120620temp]$ man script
默认保存在当今文件夹下的 typescript 文件,也可以通过如下命令指定保存路径
vi /etc/profile
新增内容如下:
if [ $UID -ge 500 ]; then
exec /usr/bin/script -a -f -q /var/lgo/test/$USER-$UIDO-`date +%Y%m%d%H%M`.log
fi
这样用户登陆后执行的操作都会记录到/var/log/test/*.log里,我们可以通过more或vi来进行查看
二、script还能用scriptreplay进行回放
因为使用scriptreplay回放需要跟时间结合,所以需要使用-t进行记录时间这两个文件放置位置可以自己定义如下:
vi /etc/profile
新增内容:
if [ $UID -ge 500 ]; then
exec /usr/bin/script -t 2>/var/log/test/$USER-$UID-`date +%Y%m%d%H%M`.date -a -f -q /var/log/test/$USER-$UIDO-`date +%Y%m%d%H%M`.log
fi
2、scriptreplay
scriptreplay这个命令默认情况下是不会安装的,所以我们需要做些“工作”,其实,该命令就是一个perl脚本文件
下载:
wget http://www.linux-australia.lkams.kernel.org/pub/linux/utils/util-linux/util-linux-2.12r.tar.bz2
[root@xen_202_18 test]# tar -jxvf util-linux-2.12r.tar.bz2
三、scirpt命令使用的注意事项。
从以上的截图中可以看出这个命令使用起来其实并不是很复杂。不过在一些细节方面还系统管理员仍然需要注意。具体的来说,有如下几个方面要注意。
第一需要注意重复记录的问题。系统工程师可能只需要记录部分的操作,为此在世纪工作中可能会频繁的打开和关闭这个命令。但是需要注意的是,默认情况下采用script命令后会覆盖原有的文件。如现在系统工程师首先使用script命令记录了ps操作,此时系统会产生一个叫做typescript的文件,记录这个命令操作的相关信息,然后中止了这个命令。一会儿一后又重新使用这个命令,来记录who操作的过程。此时系统又会产生一个一模一样的typescript文件。此时系统会将原先的记录文件覆盖掉。显然这可能跟系统工程师的初衷相违背的。系统工程师希望后续的操作能够保存在原先的记录文件中,而不是覆盖掉。如果要实现这个需求的话,那么系统工程师在执行这个命令时,必须使用一个可选项参数。即按照script –a的形式来启动这个命令。此时系统就不会覆盖原有的记录内容,而是将后续的操作内容追加到原有的文件中。
第二是不会记录所有的操作。如系统工程师先启动了script命令。然后再利用passwd命令来修改当前帐户或者其他帐户(以特权用户登录)的密码时,这个密码信息是否也会记录下来呢?如果在记录文件中也记录了密码的操作信息,那么显然会带来一定的安全隐患。不过这个担忧是多余的。各位读者可以回去测试一下,一般情况下这个密码信息是不会记录在这个文件中。其实,大家可以想象一下,再输入passwd命令后,输入新密码时,在屏幕上也不会显示用户的输入内容,即新密码。为此这个在屏幕上没有输出的内容,也不会保存到这个记录文件中。所以笔者说用户的这个担忧是不必要的。
第三是某些特定的命令不会记录。笔者上面谈到,有些键盘操作记录是不会被保存的。即只要在屏幕上没有输出的信息一般情况下就不会给保存到记录文件中。不过这是一个充分不必要条件。即反过来就不成立。并不是屏幕上所有显示的内容都会一五一十的记录到这个文件中。像一些全屏模式的操作命令,如vi命令等等,就不会记录到这个文件中。为此系统工程师在使用这个工具时,需要预见到这种情况。在操作时,如果需要记录相关的会话过程,那么就需要尽量避免使用一些全屏的命令。如在设置环境变量时,尽量不要直接利用vi修改相关的配置文件。而是使用set等非全屏命令来对环境变量进行操作。如此操作系统才能够记录完成的操作过程。
第四系统工程师需要了解一些特殊键在文件中是如何表示的。上面笔者所过,记录文件基本上会记录所有的键盘敲击动作。如现在用户输入了ls -1命令先查看当前目录下的所有文件的详细信息。后来用户反悔了,就利用退格键将后面的-l参数去掉了。此时这个退格键的操作也会保存到记录文件中。但是这些特定的功能键在文件中是采用一些特殊的符号来表示的。如退格键在文件中采用的是“[K”字符符号。所以向这个光标移动键或者del删除键等等都有不同的代表方式。只有熟悉了这些代码的含义之后,才可以真正的读懂这个文件。不过其代表的形式虽然不同,但是还是有点规律可循。即一般特殊的功能键都是以[开头的。如果系统工程师看到有这个字符的话,那么就需要考虑这是否代表着某个特殊的功能键。
第五是可以根据自己的需要来确定记录的文件名与保存的路径。如果系统工程师直接使用script命令的话,那么系统会自动为这个文件命名。并且这个文件默认是保存在命令执行所在的目录,即当前目录中。系统工程师在执行命令时,也可以自定义记录文件的名字与保存路径。如可以使用这个命令script log,让系统将相关的记录保存在当前文件夹下的log文件中。如果这个文件不存在的话,系统会自动创建这个文件。若存在的话,除非在命令中使用了-a参数,否则的话,会覆盖原有的文件。在覆盖之前,不会提醒系统工程师。所以这一点系统工程师要引起重视,防止文件被意外删除。
第六是需要注意如果输出结果中有图片信息的话,在这个文件中无法正常读取。如在会话记录的过程中,使用了netconfig命令启动了一个图形窗口。这个图形窗口的信息不会在记录文件中正确反映。系统工程师查看记录文件时,看到的可能只是一连串的[k符号而已。最后需要说明的是,script命令只是对当前的会话有效。即即使在root帐户下启动了script命令,则系统记录的仍然是当前会话的操作。对于其他用户的会话不会有丝毫影响,也不会记录其他用户的操作。