Sunday, November 19, 2006

vsftpd用户权限设置

今天配置vsftp实现三个用户的不同权限:
a.upload用户,可以上传下载,可以新建文件夹,但不能删除文件和文件夹,不能重命名原有文件和文件夹;
b.download用户,只能下载;
c.admin用户 ,管理员,可以上传,可以下载,可以新建文件夹,可以删除和更改文件和文件夹名。

配置文件

download内容 :
anon_world_readable_only=NO

upload内容:
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES

admin内容:
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES (使可以续传上传的文件)

vsftpd上传文件权限设置
除本地用户外的其他用户属性配置函数
anon_umask=022 (最后的权限是rwxrwxrwx-022=rwxr-xr-x)


5、VSFTPD的设置选项

  VSFTPD的配置文件/etc/vsftpd/vsftpd.conf是个文本文件。以“#”字符开始的行是注释行。每个选项设置为一行,格式为“option=value”,注意“=”号两边不能留空白符。除了这个主配置文件外,还可以给特定用户设定个人配置文件,具体介绍见后。
  VSFTPD包中所带的vsftpd.conf文件配置比较简单,而且非常偏执狂的(文档自称:-))。我们可以根据实际情况对其进行一些设置,以使得VSFTPD更加可用。

5.1、连接选项

  本部分主要是一些与建立FTP链接相关的选项。

5.1.1、监听地址与控制端口

  listen_address=ip address
  此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义了在主机的哪个IP地址上监听FTP请求,即在哪个IP地址上提供FTP服务。对于只有一个IP地址的主机,不需要使用此参数。对于多址主机,不设置此参数,则监听所有IP地址。默认值为无。

  listen_port=port_value
  指定FTP服务器监听的端口号(控制端口),默认值为21。此选项在standalone模式下生效。

5.1.2、FTP模式与数据端口

  FTP 分为两类,PORT FTP和PASV FTP,PORT FTP是一般形式的FTP。这两种FTP在建立控制连接时操作是一样的,都是由客户端首先和FTP服务器的控制端口(默认值为21)建立控制链接,并通过此链接进行传输操作指令。它们的区别在于使用数据传输端口(ftp-data)的方式。PORT FTP由FTP服务器指定数据传输所使用的端口,默认值为20。PASV FTP由FTP客户端决定数据传输的端口。PASV FTP这种做法,主要是考虑到存在防火墙的环境下,由客户端与服务器进行沟通(客户端向服务器发出数据传输请求中包含了数据传输端口),决定两者之间的数据传输端口更为方便一些。

  port_enable=YES|NO
  如果你要在数据连接时取消PORT模式时,设此选项为NO。默认值为YES。

  connetc_from_port_20=YES|NO
  控制以PORT模式进行数据传输时是否使用20端口(ftp-data)。YES使用,NO不使用。默认值为NO,但RHL自带的vsftpd.conf文件中此参数设为YES。

  ftp_data_port=port number
  设定ftp数据传输端口(ftp-data)值。默认值为20。此参数用于PORT FTP模式。

  port_promiscuous=YES|NO
  默认值为NO。为YES时,取消PORT安全检查。该检查确保外出的数据只能连接到客户端上。小心打开此选项。

  pasv_enable=YES|NO
  YES,允许数据传输时使用PASV模式。NO,不允许使用PASV模式。默认值为YES。

  pasv_min_port=port number
  pasv_max_port=port number
  设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意。默认值为0。把端口范围设在比较高的一段范围内,比如50000-60000,将有助于安全性的提高。

  pasv_promiscuous=YES|NO
  此选项激活时,将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。小心打开此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中。默认值为NO。

  pasv_address=
  此选项为一个数字IP地址,作为PASV命令的响应。默认值为none,即地址是从呼入的连接套接字(incoming connectd socket)中获取。

5.1.3 ASCII模式

  默认情况下,VSFTPD是禁止使用ASCII传输模式。即使FTP客户端使用asc命令,指明要使用ASCII模式,但是,VSFTPD表面上接受了asc命令,而在实际传输文件时,还是使用二进制方式。下面选项控制VSFTPD是否使用ASCII传输模式。

  ascii_upload_enable=YES|NO
  控制是否允许使用ascii模式上传文件,YES允许,NO不允许,默认为NO。

  ascii_download_enable=YES|NO
  控制是否允许使用ascii模式下载文件,YES允许,NO不允许,默认为NO。

5.2、性能与负载控制

5.2.1、超时选项

  idle_session_timeout=
  空闲(发呆)用户会话的超时时间,若是超出这时间没有数据的传送或是指令的输入,则会强迫断线。单位为秒,默认值为300。

  data_connection_timeout=
  空闲的数据连接的超时时间。默认值为300 秒。

  accept_timeout=numerical value
  接受建立联机的超时设定,单位为秒。默认值为60。

  connect_timeout=numerical value
  响应PORT方式的数据联机的超时设定,单位为秒。默认值为60。以上两个选项针对客户端的,将使客户端空闲1分钟后自动中断连接,并在中断1分钟后自动激活连接。

5.2.2 负载控制

  max_clients=numerical value
  此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义了FTP服务器最大的并发连接数,当超过此连接数时,服务器拒绝客户端连接。默认值为0,表示不限最大连接数。

  max_per_ip=numerical value
  此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义每个IP地址最大的并发连接数目。超过这个数目将会拒绝连接。此选项的设置将影响到象网际快车这类的多进程下载软件。默认值为0,表示不限制。

  anon_max_rate=value
  设定匿名用户的最大数据传输速度value,以Bytes/s为单位。默认无。

  local_max_rate=value
  设定用户的最大数据传输速度value,以Bytes/s为单位。默认无。此选项对所有的用户都生效。此外,也可以在用户个人配置文件中使用此选项,以指定特定用户可获得的最大数据传输速率。
  步骤如下:
  ①在vsftpd.conf中指定用户个人配置文件所在的目录,如:
  user_config_dir=/etc/vsftpd/userconf
  ②生成/etc/vsftpd/userconf目录。
  ③用户个人配置文件是在该目录下,与特定用户同名的文件,如:
  /etc/vsftpd/userconf/xiaowang
  ④在用户的个人配置文件中设置local_max_rate参数,如:
  local_max_rate=80000
  以上步骤设定FTP用户xiaowang的最大数据传输速度为80KBytes/s。

  VSFTPD 对于速度控制的变化范围大概在80%到120%之间。比如我们限制最高速度为100KBytes/s, 但实际的速度可能在80KBytes/s 到120KBytes/s 之间。当然,若是线路带宽不足时,速率自然会低于此限制。

5.3 用户选项

  VSFTPD的用户分为三类:匿名用户、本地用户(local user)以及虚拟用户(guest)。

5.3.1、匿名用户

  anonymous_enable=YES|NO
  控制是否允许匿名用户登录,YES允许,NO不允许,默认值为YES。

  ftp_username=
  匿名用户所使用的系统用户名。默认下,此参数在配置文件中不出现,值为ftp。

  no_anon_password=YES|NO
  控制匿名用户登入时是否需要密码,YES不需要,NO需要。默认值为NO。
  
  deny_email_enable=YES|NO
  此参数默认值为NO。当值为YES时,拒绝使用banned_email_file参数指定文件中所列出的e-mail地址进行登录的匿名用户。即,当匿名用户使用banned_email_file文件中所列出的e-mail进行登录时,被拒绝。显然,这对于阻击某些Dos攻击有效。当此参数生效时,需追加banned_email_file参数

  banned_email_file=/etc/vsftpd.banned_emails
  指定包含被拒绝的e-mail地址的文件,默认文件为/etc/vsftpd.banned_emails。

  anon_root=
  设定匿名用户的根目录,即匿名用户登入后,被定位到此目录下。主配置文件中默认无此项,默认值为/var/ftp/。

  anon_world_readable_only=YES|NO
  控制是否只允许匿名用户下载可阅读文档。YES,只允许匿名用户下载可阅读的文件。NO,允许匿名用户浏览整个服务器的文件系统。默认值为YES。

  anon_upload_enable=YES|NO
  控制是否允许匿名用户上传文件,YES允许,NO不允许,默认是不设值,即为NO。除了这个参数外,匿名用户要能上传文件,还需要两个条件:一,write_enable参数为YES;二,在文件系统上,FTP匿名用户对某个目录有写权限。

  anon_mkdir_write_enable=YES|NO
  控制是否允许匿名用户创建新目录,YES允许,NO不允许,默认是不设值,即为NO。当然在文件系统上,FTP匿名用户必需对新目录的上层目录拥有写权限。

  anon_other_write_enable=YES|NO
  控制匿名用户是否拥有除了上传和新建目录之外的其他权限,如删除、更名等。YES拥有,NO不拥有,默认值为NO。

  chown_uploads=YES|NO
  是否修改匿名用户所上传文件的所有权。YES,匿名用户所上传的文件的所有权将改为另外一个不同的用户所有,用户由chown_username参数指定。此选项默认值为NO。

  chown_username=whoever
  指定拥有匿名用户上传文件所有权的用户。此参数与chown_uploads联用。不推荐使用root用户。

5.3.2、本地用户

  在使用FTP服务的用户中,除了匿名用户外,还有一类在FTP服务器所属主机上拥有账号的用户。VSFTPD中称此类用户为本地用户(local users),等同于其他FTP服务器中的real用户。

  local_enable=YES|NO
  控制vsftpd所在的系统的用户是否可以登录vsftpd。默认值为YES。

  local_root=
  定义所有本地用户的根目录。当本地用户登入时,将被更换到此目录下。默认值为无。

  user_config_dir=
  定义用户个人配置文件所在的目录。用户的个人配置文件为该目录下的同名文件。个人配置文件的格式与vsftpd.conf格式相同。例如定义user_config_dir=/etc/vsftpd/userconf,并且主机上有用户xiaowang,lisi,那我们可以在user_config_dir的目录新增名为xiaowang、lisi的两个文件。当用户lisi 登入时,VSFTPD则会读取user_config_dir下lisi这个文件中的设定值,应用于用户lisi。默认值为无。

5.3.3、虚拟用户

  guest_enable=YES|NO
  若是启动这项功能,所有的非匿名登入者都视为guest。默认值为关闭。

  guest_username=
  定义VSFTPD的guest用户在系统中的用户名。默认值为ftp。

5.4、安全措施

5.4.1、用户登录控制

  pam_service_name=vsftpd
  指出VSFTPD进行PAM认证时所使用的PAM配置文件名,默认值是vsftpd,默认PAM配置文件是/etc/pam.d/vsftpd。

  /etc/vsftpd.ftpusers
  VSFTPD禁止列在此文件中的用户登录FTP服务器。这个机制是在/etc/pam.d/vsftpd中默认设置的。

  userlist_enable=YES|NO
  此选项被激活后,VSFTPD将读取userlist_file参数所指定的文件中的用户列表。当列表中的用户登录FTP服务器时,该用户在提示输入密码之前就被禁止了。即该用户名输入后,VSFTPD查到该用户名在列表,VSFTPD就直接禁止掉该用户,不会再进行询问密码等后续步聚。默认值为NO。

  userlist_file=/etc/vsftpd.user_list
  指出userlist_enable选项生效后,被读取的包含用户列表的文件。默认值是/etc/vsftpd.user_list。

  userlist_deny=YES|NO
  决定禁止还是只允许由userlist_file指定文件中的用户登录FTP服务器。此选项在userlist_enable 选项启动后才生效。YES,默认值,禁止文件中的用户登录,同时也不向这些用户发出输入口令的提示。NO,只允许在文件中的用户登录FTP服务器。
  
  tcp_wrappers=YES|NO
  在VSFTPD中使用TCP_Wrappers远程访问控制机制,默认值为YES。

5.4.2、目录访问控制

  chroot_list_enable=YES|NO
  锁定某些用户在自家目录中。即当这些用户登录后,不可以转到系统的其他目录,只能在自家目录(及其子目录)下。具体的用户在chroot_list_file参数所指定的文件中列出。默认值为NO。

  chroot_list_file=/etc/vsftpd/chroot_list
  指出被锁定在自家目录中的用户的列表文件。文件格式为一行一用户。通常该文件是/etc/vsftpd/chroot_list。此选项默认不设置。

  chroot_local_users=YES|NO
  将本地用户锁定在自家目录中。当此项被激活时,chroot_list_enable和chroot_local_users参数的作用将发生变化,chroot_list_file所指定文件中的用户将不被锁定在自家目录。本参数被激活后,可能带来安全上的冲突,特别是当用户拥有上传、shell访问等权限时。因此,只有在确实了解的情况下,才可以打开此参数。默认值为NO。

  passwd_chroot_enable
  当此选项激活时,与chroot_local_user选项配合,chroot()容器的位置可以在每个用户的基础上指定。每个用户的容器来源于/etc/passwd中每个用户的自家目录字段。默认值为NO。

5.4.3、文件操作控制

  hide_ids=YES|NO
  是否隐藏文件的所有者和组信息。YES,当用户使用"ls -al"之类的指令时,在目录列表中所有文件的拥有者和组信息都显示为ftp。默认值为NO。

  ls_recurse_enable=YES|NO
  YES,允许使用"ls -R" 指令。这个选项有一个小的安全风险,因为在一个大型FTP站点的根目录下使用"ls -R"会消耗大量系统资源。默认值为NO。

  write_enable=YES|NO
  控制是否允许使用任何可以修改文件系统的FTP 的指令,比如STOR、DELE、RNFR、RNTO、MKD、RMD、APPE 以及SITE。默认值为NO,不过自带的简单配置文件中打开了该选项。

  secure_chroot_dir=
  这选项指向一个空目录,并且ftp用户对此目录无写权限。当vsftpd不需要访问文件系统时,这个目录将被作为一个安全的容器,用户将被限制在此目录中。默认目录为/usr/share/empty。

5.4.4、新增文件权限设定

  anon_umask=
  匿名用户新增文件的umask 数值。默认值为077。

  file_open_mode=
  上传档案的权限,与chmod 所使用的数值相同。如果希望上传的文件可以执行,设此值为0777。默认值为0666。

  local_umask=
  本地用户新增档案时的umask 数值。默认值为077。不过,其他大多数的FTP服务器都是使用022。如果您的用户希望的话,可以修改为022。在自带的配置文件中此项就设为了022。

5.5、提示信息

  ftpd_banner=login banner string
  此参数定义了login banner string(登录欢迎语字符串)。用户可以自行修改。预设值为无。当ftpd_banner设置后,将取代系统原来的欢迎词。

  banner_file=/directory/vsftpd_banner_file
  此项指定一个文本文件,当使用者登入时,会显示此该文件的内容,通常为欢迎话语或是说明。默认值为无。与ftpd_banner相比,banner_file是文本文件的形式,而ftpd_banner是字串格式。banner_file选项将取代ftpd_banner选项。

  dirmessage_enable=YES|MO
  控制是否启用目录提示信息功能。YES启用,NO不启用,默认值为YES。此功能启用后,当用户进入某一个目录时,会检查该目录下是否有message_file选项所指定的文档,若是有,则会出现此文档的内容,通常这个档案会放置欢迎话语,或是对该目录的说明。

  message_file=
  此选项,仅在dirmessage_enable选项激活方生效。默认值为.message。

5.6、日志设置

  xferlog_enable=YES|NO
  控制是否启用一个日志文件,用于详细记录上传和下载。该日志文件由xferlog_file选项指定。默认值为NO,但简单配置文件中激活此选项。

  xferlog_file=
  这个选项设定记录传输日志的文件名。默认值为/var/log/vsftpd.log。

  xferlog_std_format=YES|NO
  控制日志文件是否使用xferlog的标准格式,如同wu-ftpd一样。使用xferlog格式,可以重新使用已经存在的传输统计生成器。然而,默认的日志格式更为可读性。默认值为NO,但自带的配置文件中激活了此选项。

  log_ftp_protocol=YES|NO
  当此选项激活后,所有的FTP请求和响应都被记录到日志中。提供此选项时,xferlog_std_format不能被激活。这个选项有助于调试。默认值为NO。

5.7、其他设置

  setproctitle_enable=YES|NO
  YES,VSFTPD将在系统进程列表中显示每个会话(session)的状态。也就是说,进程报告将显示每个vsftpd会话在做什么(挂起、下载等),如用ps -ef|grep ftp。出于安全的目的,可以考虑将此选项关闭。NO,进程报告只显示一个vsftpd进程在运行。默认值为NO。

  text_userdb_names=YES|No
  当使用者登入后使用ls -al 之类指令时,目录列表的用户和组信息域,默认是出现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名称,则将此功能开启。默认值为NO。

  user_localtime=YES|NO
  默认为NO。YES,VSFTPD显示目录列表时使用你本地时区的时间。默认是显示GMT时间。同样,由ftp命令“MDTM”返回的时间值也受此选项影响。

  check_shell=YES|NO
  此选项仅对不使用PAM方式的VSFTPD生效。当此选项关闭后,当本地用户登录时,VSFTPD不会检查/etc/shells文件以寻找一个有效的用户shell。默认为YES。

  nopriv_user=
  指定一个用户,当VSFTPD不想要什么权限时,使用此用户身份。这用户最好是一个专用的用户,而不是用户nobody。在大多数的机器上,nobody用户被用于大量重要的事情。默认值为nobody。

  pam_service_name=
  指明VSFTPD使用用PAM验证服务时的PAM配置文件名。默认值为ftp。

Thursday, November 09, 2006

screen的特殊功能

以前还真不知道


Screen的另外一个用法要稍微特殊一些,这么说吧,比如你开了n个窗口正在工作,突然有事要停下来,暂时关闭掉作别的事,或者是在公司没作完回家接着作,抑或是到服务器的网络连接断掉了,那么你已经打开的n个窗口、你的工作状态能不能保留呢?答案当然是肯定的!这也是Screen的一大特色,遇到上述情况,你只要Ctrl+a d就从screen的工作界面中跳出来了,回到正常的shell环境,什么时候想回来了,再使用screen -r命令就又能连接到你刚才的工作状态继续工作了。即使是在公司的screen没有用Ctrl+a d命令进行deatach,还可以用screen -x把控制权“抢”过来,嘿嘿。

Screen还具有log功能,使用Screen -L命令启动,就会在用户的home目录下自动生成screenlog.?文件,其中?是你在screen中开的“窗口”号,默认第一个为0。这样用户在 screen中的所有操作就都可以记录下来了,不管是为了写文章还是存档用都很方便。不过screenlog中还记录了Escape Code信息,所以直接用vi或者less查看很不方便,cat出来倒是原汁原味,保存了彩色shell的所有颜色,但毕竟不方便,所以我自己写了一个把screenlog转换为html代码的工具,自己觉得还有点用吧。

screenlog中的颜色和linux shell中的颜色一样,都是用Escape Code中的颜色代码来实现的,关于这些颜色代码,Pradeep Padala有一篇文章介绍的比较详细,值得学习一下。



发信人: qiuxing (球星), 信区: Linux
标 题: GNU Screen -- MITBBS Linux版镇版之宝
发信站: BBS 未名空间站 (Sun Feb 17 19:04:40 2008)

GNU Screen -- MITBBS Linux版镇版之宝

* 什么是GNU Screen

常来我们版的,基本上就算没有自己用过也听说过screen的名字了,那么到底什
么是screen, 它又是干什么的呢?为什么它能称得上是我们的镇版之宝?

screen的手册上说了,screen是一个terminal multiplexer。但是对于普通人来
讲,这个定义和没有定义差不多。我觉得最通俗的解释,应该说screen相当于文
本界面下面的一个desktop,就像GNOME, KDE之于X窗口系统。其次,screen还提
供类似于远程桌面(freenx, vnc, 或者Windows下的remote desktop)的功能,
你可以在本地生成一个"桌面",然后通过网络重新连到这个"桌面",所有你开的
"窗口"都还在。从这一点上说,screen完全可以取代nohup帮助你远程跑长时间的
程序,比如说需要过夜计算的simulation之类。

* Screen的基本功能

在我们谈screen的基本功能之前,我们来看看一个现代desktop,比如说gnome,
到底都为用户提供了什么。

首先,gnome提供了一个多窗口管理机制。以前这一块由metacity提供,现在很多
情况下是由compiz fusion 3D窗口管理器管。无论是老土的metacity还是眩目的
compiz fusion,其实说穿了都不过是给用户一个机制来管理多个同时运行的图形
化程序。广而论之,X下面的virtual desktop也不过是这个机制的延伸。

其次,gnome提供了一个(或者多个)panel,这个panel上可以加载很多有用的插
件。其中最有用的是window list,显示出你当前打开的几个应用程序的名字,然
后提供一个切换的方法。

第二有用的panel插件大概就是system monitor吧,能够显示出系统当前的
loads, memory等等。有的人大概还喜欢在panel上面显示时间,机器名等等信息。

再接下来,gnome还提供了一些别的服务,比如说程序与程序间的copy/paste服务,
设置多语言编码方式,键盘热键设定,必要的时候把屏幕锁上等等。

我们很快就能看到,以上说的这些功能,都有screen下的对应。当然,gnome是个
庞然大物,里头还有无数应用程序,就是那些以g开头的无数程序。但这些严格的
讲并不是一个桌面系统的一部分。甚至连nautilus严格的讲也不能算是desktop里
头不可分割的一部分。这些应用程序其实很多在文本界面下也有对应物,只不过
不由screen负责而已。我会在本文里头附带稍微介绍一下一些文本模式下的应用
程序。

* Screen的基本操作

** 第一次启动screen

每一个screen进程本身代表一个session. 最简单的方法是在一个终端下直接输入
screen然后回车。这时你会看到一个很简陋的greeting界面,然后你随便按一个
空格它就消失了,剩下的就是普通的shell提示符,好像什么都没发生过。你可以
运行一些标准shell指令,比如说ls,你会发现这个shell和别的shell没有任何不
同。

运行如下命令

screen -ls

你会发现它告诉你有一个screen在跑:

$ screen -ls
There is a screen on:
8671.pts-1.inferno (Attached)
1 Socket in /var/run/screen/S-qiuxing.

现在你输入Ctrl-a, 然后单个字母w,会发现左下角出现一个提示,比如说:

0*$ bash

现在再按Ctrl-a然后d,这时你开头运行命令出现的那些文字都不见了。我们现在再来
跑一次screen -ls:

$ screen -ls
There is a screen on:
8671.pts-1.inferno (Detached)
1 Socket in /var/run/screen/S-qiuxing

什么都没变除了状态由Attached变成了Detached。

现在你把你刚刚用的xterm关掉,重开一个xterm,或者有条件的话换一部电脑,
ssh到你的第一部机器,然后输入screen -r。你看见了什么?是不是之前的那些
文字都又回来了?

其实真正发生的是这么一个过程:screen创建了一个socket(一般是在
/var/run/screen/下面),把它伪装成为一个虚拟文本终端(pty device)来充当
标准输入输出设备,然后调用了一个shell 程序让它运行在这个文本终端(其实
是个socket)上。当你从一个xterm里头detach掉了screen,screen下运行的程序
不会直接退出,因为它们用的标准输入输入装置已经不是你的xterm(下面跑的那
个shell)所相关的那个虚拟文本终端,而是一个socket了。

** 管理session

一般来说,我们不会裸起一个screen. 好的practice是每次新开一个screen,都
给它取一个好记的名字:

screen -S a_name

下次再用screen -ls的时候就会发现它有一个名字了(就是随机数后面的那一部
分)。

以下为和管理session有关的命令:

- 检查有多少screen session和它们的状态用screen -ls
- detach一个正在跑的session用Ctrl-a d
- reattach这个session用screen -r,
- 如果有多个detached的session, 而我们又想attach到某一个的话,就用screen
-r a_name
- 在一个正在跑的session里头改名字: 先按Ctrl-a, 然后按冒号:, 出来一个类
似vi的输入命令的界面,在里头运行这个内部命令:sessionname a_name

一个很常见的情况:有时我们需要强制reattach到一个attached session,比如
说忘记detach了,或者是ssh的时候网络断线了. 这个命令是: screen -RD
a_name. 事实上它的实现是先给a_name session发出一个detach指令,然后在发
出一个attach指令。

** 管理窗口

- 生成一个新的窗口: Ctrl-a c。这个新的窗口跑的是你的shell。
- 生成一个新的窗口,并且让它跑某个指定的程序: Ctrl-a :, 然后输入:
screen -t 其中是窗口的名字,是窗口号,
是指定的程序。这个命令主要是在配置文件里头用。
- 关闭一个窗口: 退出这个窗口的程序,则窗口自动关闭
- 在无法退出某个程序的时候强制关闭一个窗口: Ctrl-a K
- 窗口列表: Ctrl-a w
- 窗口切换:
1. Ctrl-a ", 出现一个菜单可以选择
2. Ctrl-a , 是从0到9的窗口ID,这个命令直接切换到第号窗口
3. Ctrl-a SPACE, 下一个窗口
4. Ctrl-a BACKSPACE, 前一个窗口
5. Ctrl-a Ctrl-a, 在当前和前一个窗口之间转换,相当于Alt-Tab的功能
- 窗口改名: Ctrl-a A

** 分屏

- 上下分成两个区域: Ctrl-a S (相当于emacs里的C-x 2
- 在两个区域里头切换: Ctrl-a TAB
- 合并两个区域: Ctrl-a Q (相当于emacs里的C-x 1), Ctrl-a X (相当于
emacs里头的C-x 0)

** copy/paste

正常模式下screen把所有的不以Ctrl-a开头的命令都完全透明地pass给窗口里
头的程序了。其实screen还有一个copy/paste模式,进入这个模式后screen的行
为就更像一个text editor(vi),你可以copy/paste,也可以上下移动(相当于
scroll window)。

- 进入copy/paste mode: Ctrl-a ESC或者Ctrl-a [.
- 在c/p mode下移动光标: 上下左右箭头,pgup/pgdown等。vi的hjkl,BE,/?等
等也都work
- Set mark: SPACE (类似emacs里面的Ctrl-SPACE)
- 两个mark里的内容自动进入screen的c/p buffer, 并且退出c/p mode。
- 这个c/p buffer还可以用文件写出来: Ctrl-a >

在正常模式下,Ctrl-a ]能够paste刚刚选中的内容。

** 其它有用功能/注意事项

第一重要的注意事项: 不要乱按Ctrl-a s. 它会锁死你的shell。不过不小心碰
到了也别怕,再按一下Ctrl-a q,你的shell就活过来了。

第二重要的事情: 我习惯了在shell/emacs里用Ctrl-a而不是Home跳到句首。可
是现在Ctrl-a被screen占用了。那么,我们怎么输入一个Ctrl-a? 答案: Ctrl-a
再加字母a.

推论: 如果在一个screen里头不小心attach了另外一个screen怎么办? 用Ctr-a
a d来detach里头的那个screen.

- 查看系统时间等信息: Ctrl-a t
- 查看screen本身的信息: Ctrl-a v
- 锁住屏幕: Ctrl-a x
- 清理屏幕: Ctrl-a l
- 有时候screen会显示一些信息,想要显示上一次显示的提示内容的话:
Ctrl-a m
- 给当前窗口录像(生成一个log,记录所有的信息): Ctrl-a H
- 使用visual bell: Ctrl-a Ctrl-g

* 配置文件

screen的基本配置文件是~/.screenrc(用户目录下的一个隐藏文件)。事实上在
这里控制的screen参数都可以在一个正在跑的screen里面通过进入命令行模式
(Ctrl-a :),输入相关命令来实现。但写配置文件可以省不少重复性的工作。

启动screen时有一个"-c"的参数来使用任何一个指定文件作为配置文件。比如:

screen -c .screenrc2

附录里有一个screenrc文件例子,里头详细的注释了每一行是干什么的。

* 高级用法

** 关注某个窗口

有时候我们可能开了一个窗口来跑一个要跑很久的程序,又或者那个窗口跑的是
pine/mutt,但我们在另外一个窗口干活。绝大多数时候第一个窗口都不会有任何
信息,但假设出现了变化比如说程序跑完了或者收到了新的email,我们也希望能
够在干活的当前窗口得到一个提示。

还有另外一种相反的情况,比如说编译一个大程序,不断的会出各种信息。但如
果不出了,那就说明编译完了(或者错了),这时候我们也希望得到通知。这个
功能大约对于Gentoo用户来说是最有用的.

这些都可以通过打开/关闭monitoring来实现。

- Ctrl-a M. 这样当前窗口如果出现变化,系统会通过message来通知你
- Ctrl-a _. 正好是上面的反面,如果当前窗口15秒都没动静了,则screen会发
一个msg.

** caption/hardstatus line

之前我提到过screen可以实现类似于gnome panel的功能。这个功能在screen里面
叫做caption line或者hardstatus line。它的配置看起来比较复杂,但一旦搞明
白了你就可以用它干很多很cool的事情。一个类比是配置bash的提示符,也是属
于不大好配置但很强大的东西。

我先举一个简单的例子吧:

caption always "%{+b Yk}%w"
hardstatus alwayslastline "Host: %H Load: %l "

它的效果是出现了两条panel, 第一条叫做caption line, 里头的内容是带颜色的
窗口信息, 第二条是hardstatus line, 里头有host和system load的信息。

在"%{+b Yk}%w"里头,%是escape sequence,+b是指粗体,Yk指的是亮黄(Y)字体,
配黑色(k)背景,%w是窗口号/名字。hardstatus bar里面,%H是hostname, %l是
系统load(和top里头显示的一样),其他就是一般的字符。

下面是一个比较复杂的hardstatus line配置, 视觉效果比单纯的%w要好:

hardstatus alwayslastline '%{Yk}%-w%{.Yk}%n %t%{-}%+w %=%{.w}'

更多的色彩,信息,请参阅screen manual里头关于string escapes那一章。

** Panel插件

虽然screen提供了很多string escapes, 但它们还是不可能满足所有人所有的需
要。比如说我自己就想知道系统使用了多少内存,有的人可能还想查看有没有新
邮件,等等。在gnome panel里头,这些都是通过panel插件来实现的。在screen
的caption/hardstatus line里也有一个类似的机制,让你把任何一个指定的程序
的output放在panel上。

一个简单的例子:

backtick 1 5 5 uptime
hardstatus alwayslastline "%1`"

解释一下:backtick 1 5 5 uptime的意思是定义外部命令uptime的标准输出作为
一个string escape, ID为1. 一次显示5秒钟,5秒钟之后重新运行一次。

比较复杂的例子(这也是我自己在用的screenrc):

backtick 1 5 5 /home/qiuxing/bin/my_sysload1
backtick 2 5 5 /home/qiuxing/bin/my_free

hardstatus string '%{Yk}%-w%{.Yk}%n %t%{-}%+w %=%{.w} %{.Yr}%1` %{.Yb}%2`M %
{kY}%C'

其中my_sysload1和my_free的内容如下:

my_sysload1:

#!/bin/bash
cat /proc/loadavg | cut -d" " -f1

my_free:
free -m | tail -n 2 | head -n 1 | cut -c27-29

** 256色

比较新的screen支持256色。如果自己编译,记得在编译的时候打开这个选项。
Feisty和之前的Ubuntu下的screen没有加这个编译选项,但在Gutsy里这个选项已
经有了。我知道的支持256色的程序有vi/emacs/elinks。如果你知道别的文本模
式程序支持256色,请务必让我知道。

如果你知道你的screen支持256色,请在.screenrc里头加入这么几句:

term xterm-256color
attrcolor b ".I"
termcapinfo xterm-256color 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
defbce "on"

其中第一句让screen伪装成一个xterm-256color,第二句让screen使用bold字体,
第三句告诉screen怎么定义前景背景等信息,最后一句是让screen用背景色来
erase text。

另外要确认一下你的系统上的确有xterm-256color这个term的信息。在Ubuntu里,
这个库叫做ncurses-term。

** X/鼠标支持

有一些文本程序也支持鼠标(emacs, elinks, w3m),有的甚至还支持inline
picture display(w3m)。screen对于这些都支持得很好。只要记住远程连接的时
候打开X11 forwarding开关(ssh -X),另外要检查一下shell变量DISPLAY是不
是设置对了(本地显示应该是:0.0,远程一般是:10.0之类的东西)。

** 编码转换

screen还有一个鲜为人知的功能:实现编码转换。比如说mrxvt只能支持gbk,但
不能支持unicode。可是我的中文文件都是unicode编码的。这时就可以通过
screen来实现编码转换:

encoding GBK UTF-8

只要在一个支持unicode的terminal里头生成一个screen session,detach之,下
次在一个编码为zh_CN.gbk的mrxvt里头reattach上这个session,所有的
zh_CN.utf8编码的中文文字就会自动转换为gbk格式。

** 多用户支持

screen还可以支持多用户。也就是说一个用户生成了一个session,然后让guest
来参与。具体的做法是先让screen变成一个setuid root的程序,然后在
screenrc里头允许另外一个用户连接。

如果你用过这个功能就会发现它相当的cool。但因为有一定的security concern,
我就不写太详细了。真要想用的话请参照这个Gentoo howto:

http://gentoo-wiki.com/HOWTO_Snoop_terminal_session#Screen

* 附录

** screenrc文件范例

# 和256色相关的配置
term xterm-256color
attrcolor b ".I"
termcapinfo xterm-256color 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
defbce "on"

# 编码转换
encoding GBK UTF-8

# 使用visual bell
vbell on

# 断线的时候自动detach
autodetach on

# 不要出来那个烦人的greeting
startup_message off

# make the shell in every window a login shell
# 意思是会去执行~/.bash_profile
shell -$SHELL

# 在copy/paste模式下可以回溯到5000行的历史
defscrollback 5000

#remove some stupid / dangerous key bindings
bind k
bind ^k
bind .
bind ^\
bind \\
bind ^h
bind h
#make them better
bind 'K' kill
bind 'I' login on
bind 'O' login off
bind '}' history

# default windows

screen -t work 0
screen -t shell 1
screen -t su 3 sudo su -
screen -t others 4
chdir /home/qiuxing/Documents/writing/linux
screen -t notes 5
chdir
screen -t mutt 6 mutt
select 0

# hardstatus line hack
backtick 1 5 5 /home/xqiu/bin/my_sysload1
backtick 2 5 5 /home/xqiu/bin/my_free

hardstatus alwayslastline '%{Yk}%-w%{.Yk}%n %t%{-}%+w %=%{.w} %{.Yr}%1` %{.
Yb}%2`M %{kY}%C'

** 常用文本模式程序

- 文件管理器:
1. bash
2. mc (midnight commander)
- 系统资源管理
1. top
2. htop
3. ps
- 文本编辑: emacs -nw, vi, nano, ...
- 网络浏览器: w3m(中文支持很好), elinks
- 聊天:
1. finch. 这个是pidgin/gaim的文本模式, 唯一支持QQ的text mode程序
2. centericq 很早以前用过,功能也很强大
3. irssi 最好的IRC聊天室client
4. irssi + bitlbee 如果你用这个组合,你就是真正的chat geek了!
- 邮件/新闻组
1. mutt
2. pine
3. gnus
- 文件传输
1. lftp (支持很多协议包括sftp, www)
2. wget
3. rsync
4. unison
- 科学运算 R, octave, maxima, python (scipy), ...
- 网络调试
1. tcpdump
2. nmap
3. netcat
- 音乐 mpg321, mplayer, 还有一些比较复杂的比如说cplay, moc等。
- Bittorrent: rtorrent

** 更多信息

最简单的入门:http://blogamundo.net/code/screen/
复杂一点的:http://gentoo-wiki.com/TIP_Using_screen
当然最全的信息还是screen user's manual:
http://www.delorie.com/gnu/docs/screen/screen_toc.html