奇趣技术网 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 技术论坛
中华网络安全联盟 >> 操作系统 >> Linux >> 如何实现Linux操作系统的自动登录
操作系统
Windows XP
Windows 2000
Windows Vista
Windows 2003
Windows 9x
DOS
Linux
Unix
  • FreeBSD从零学起图文手

  • Linux系统下查找漏洞的

  • FreeBSD服务器的安装与

  • FreeBSD服务器的安装与

  • FreeBSD服务器的安装与

  • FreeBSD+IPFILTER实现

  • FreeBSD下vmware的网络

  • FreeBSD 5.x 中 gbfs 

  • 如何实现Linux操作系统的自动登录
    字体:

    中华网络安全联盟    作者:佚名    来源:网络转载    时间:2006-3-23

      开机自动登录Linux,并自动运行XWindow应用程序,有其特殊的应用背景,如基于Linux平台的监控系统,Linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合Linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X Window自动运行应用程序。

      一、Linux启动的最后阶段的工作

      Linux在启动过程的最后阶段(具体启动步骤略),init会根据/etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm-nodaemon运行/etc/X11/prefdm脚本,(Redhat7.2缺省时是这样的)。prefdm脚本的主要任务是完成X Window的启动,可以有几种启动X Window的方法,都包含在prefdm脚本中,几种主要方法有:

      运行xdm启动X Window;
      运行gdm,进入gnome桌面环境;
      运行kdm进入kde桌面环境;
      自动登录进入Linux;

      prefdm脚本框架大致如下:

      #!/bin/sh
      PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
      . /etc/profile.d/lang.sh
      # 第一步:查看是否为自动登录
      if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
      if /usr/sbin/autologin; then  
        exit 0
      fi
      fi

      # 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
      ......
      # 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。

      二、自动登录的实现(autologin的实现)

      在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X Window的操作。

      自动登录实质上就是绕过身份验证,直接启动X Window。X Window的启动可以由xinit来完成。

      Xinit用来启动X Window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行.xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行.xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X:0。实际上,用startx来启动X更为方便。对于运行单一会话的XWindow系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找.xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。startx脚本的最基本框架是:

      a、 寻找.xinitrc,如果没有则使用xinitrc;
      b、 寻找.xserverrc,如果没有则使用xserverrc;
      c、 根据找到的脚本确定xinit的参数;

      由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:

      #!/bin/sh
      PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
      . /etc/profile.d/lang.sh
      # 第一步:查看是否为自动登录
      #if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
      #注释掉上边的条件测试,直接运行startx
        if /usr/X11R6/bin/startx; then  
          exit 0
        fi
      #fi

      当然,应确保/etc/inittab中的启动级别为5。

      重新启动系统,会发现系统不验证用户身份,直接进入XWindow,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。


      三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)

      观察原来/etc/X11/prefdm脚本的自动登录部分:

      ......
      # 第一步:查看是否为自动登录
      if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
        if /usr/sbin/autologin; then  
          exit 0
        fi
      fi
      ......

      不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。
      1、/etc/sysconfig/autologin配置文件的实现:
      #config for autologin
      USER=root
      EXEC=/usr/X11R6/bin/startx
      说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。
      2、/usr/sbin/autologin可执行文件的实现
      /*********************
      **** autologin.c ****
      *********************/
      #include
      #include
      #include
      #include
      #include
      #include
      #include
      int main(int argc, char **argv)
      {
      struct stat st;
      FILE *f;
      char *cfg;
      struct passwd *pw;
      uid_t uid;
      gid_t gid;
      char *dir, *shell;
      char *user=NULL;
      char *cmd=NULL;
      user="root";
      /*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上,
      登陆用户名应该从/etc/sysconfig/autologin中得到,
      程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
      cmd="/usr/X11R6/bin/startx";
      /*同样,这里直接指定启动X Window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
      pw = getpwnam(user);
      //getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
      if(pw) {
      uid=pw->pw_uid;    
      gid=pw->pw_gid;    dir=strdup(pw->pw_dir);
      shell=strdup(pw->pw_shell);
      }
      //获得用户相关信息
      else {
      printf("ERROR: No such user %s!\n", user);
      return 1;
      }
      chown("/dev/console", uid, gid);
      chown("/dev/tty", uid, gid);    
      //为控制台和终端设置用户ID及组ID
      
      //下面是设置用户相关ID
      setregid(gid, gid);
      setegid(gid);
      setgid(gid);
      setreuid(uid, uid);
      seteuid(uid);
      setuid(uid);    
      setenv("HOME", dir, 1);
      setenv("SHELL", shell, 1);
      setenv("USER", user, 1);
      setenv("LOGNAME", user, 1);
      //设置用户相关环境变量
      chdir(dir);
      //切换到用户根目录
      user=NULL;
      execvp(cmd, argv);
      /*在配置完用户的相关信息后,执行启动X Window操作。注意这里默认执行/usr/X11R6/bin/startx */
      printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
      return 2;
      }

      运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X Window并保留用户原来所有的风格。
      
      如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:
      ......
      # 第一步:查看是否为自动登录
        if /usr/sbin/autologin; then  
          exit 0
        fi
      //第二步  ......
      ......

      即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。

      四、选择进入kde或者gnome,并自动启动X Window应用程序

      如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。 一般系统自动登录的目的是启动X Window后自动运行某个XWindow程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在XWindow启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。
    字体:
     
    设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
    Copyright©2006-2008 中华网络安全联盟 All rights reserved.