LoveUnix » ORACLE等数据库 » 巧用Sybase数据库的超级用户密码
让LU留住您的每

一天 让LU博客留住您的每一天
2004-11-9 08:36 threehair
<a href='http://www.pcworld.com.cn/issue/2002/0214/1409b.asp' target='_blank'>http://www.pcworld.com.cn/issue/2002/0214/1409b.asp</a><br />巧用Sybase数据库的超级用户密码 <br />谢鹏 周晓东<br />在使用Sybase数据库的过程中,我们经常会遇到Sybase数据库系统上锁的情况,而多数情况下,用户必须通过超级用户身份登录系统,以处理该进程。通常为了保障Sybase数据库系统的安全性,超级用户口令往往掌握在数据库管理员的手中。 <br /><br />当上述情况发生时,如果数据库管理员不在现场或无法通过其他方式进行处理时,口头告知密码虽然可以解决一时的燃眉之急,但数据库系统的安全无疑会受到严重的威胁;而重新启动Sybase数据库系统也是一种解决的方法,不过这种作法很有可能造成数据库中数据的丢失,甚至导致用户数据库的崩溃,不到万不得已,请不要使用此方法。 <br /><br />如果能够对用户权限加以设置,使普通用户也能够进行进程的处理,而又不用知晓Sybase数据库系统的超级用户密码,无疑是处理上述问题的最佳解决方法。现在,笔者就把针对上述情况的整个处理过程详细介绍给大家,以供参考。当然,您可以根据自己的需要设置普通用户密码,也可以限制更多的内容来处理数据库系统中的进程。具体的处理过程如下文所示。 <br /><br />1.使用C语言编写一个程序如下。 <br /><br />        #include &lt; stdlib.h&gt;<br />        #include &lt; string.h&gt;<br />        #include &lt; fcntl.h&gt;<br />        #include &lt; time.h&gt;<br />        #include &lt; sys/types.h&gt;<br />        char *passwd()  /*普通用户需要的密码: 简单加密后字符串*/<br />        {<br />        struct tm *tp;<br />        long        secs;<br />        char        *buff;<br />        buff=(char *)malloc(30);<br />        secs=time((long *)0);<br />        tp=localtime(&amp;secs);<br />        sprintf(buff,&quot;%02d%02d%d&quot;,tp-&gt;tm_mon+1+9,tp-&gt;tm_mday+2,8);<br />        return(buff);<br />        }<br />        main()<br />        {<br />        char str1[80],str2[80];<br />        int i;<br />        printf(&quot;passwd:&quot;);<br />        system(&quot;stty -echo&quot;);  /* 不显示*/<br />        gets(str1);<br />        system(&quot;stty echo&quot;);<br />        for(i=3;i&lt; 9;i++)str2[i-3]=str1[i];  /*截取输入6个字符*/<br />        str2[6]=&#39;\0&#39;;<br />        if (strcmp(str2,passwd() ) ){<br />                printf(&quot;passwd error&#33;\n&quot;);<br />                exit(1);<br />        }<br />        setuid(0);<br />        system(&quot;/sybase/atuo/sybase_kill&quot;);<br />        printf(&quot;\n&quot;); <br />        }<br />        然后进行编译。<br />        #cc c.c -o  kill-spid<br />        2.对产生的目标文件设置用户的“s”权限。<br />        #chmod u+s   obj-name<br /><br />3.将目标文件放置在执行用户的任意目录下,例如,tmp目录。 <br /><br />4.执行文件“sybase-kill”应该存放在仅可以允许访问该文件的目录下,并设置其权限。例如,只允许Sybase用户可以进行读写。 <br /><br />        # mkdir /sybase/auto<br />        #chmod 700 /sybase/atuo<br />        #chmod g+t /sybase/atuo<br />        #chown sybase:sybase /sybase/atuo  <br />        #cd  /sybase/atuo<br /><br />5.sybase-kill文件内容,具体如下。 <br /><br />        trap &#39;&#39; 1 2 3 9 15  #设置屏蔽信号,目的是不允许中断产生。<br />        for pid in ` echo &quot;set nocount on \n <br />        select  distinct blocked from master..sysprocesses <br />        where blocked&gt;0 \ngo&quot;|isql -Uaaa -Paaaaaa -w200 -SFEBS|sed &quot;1,2d&quot; ` <br />        do<br />        echo &quot;Kill &quot;$pid<br />        isql -Usa -w200 -Sserv_name &lt; &lt; EOF<br />        password123321<br />        kill $pid<br />        go<br />        EOF<br />        done<br />        echo &quot;ok&quot;<br /><br />上述内容会处理所有阻塞的进程,不管是否最终是由它引起的。当然,您也可以找出是谁引起的阻塞,然后再处理该进程,仅仅通过修改其“sybase-kill”文件内容即可完成。 <br /><br />(作者地址: 青岛山东路19号科技处,266071) <br /><br />

2005-4-6 11:48 pater
是在LIUNX下还是别的系统?<br />或者是两者皆可?!<br /><br /><br />

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.