科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道让Unix环境变量永远有效

让Unix环境变量永远有效

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在Unix操作系统中可以在shell中通过set命令给环境变量赋值。但是如果采用这种方式对环境变量进行赋值的话,当重新启动操作系统或者重新启动这个会话的话,原先设置的环境变量就会丢失。也就是说,如果在shell会话中设置环境变量,这只对当前的会话有效。当系统工程师退出这个会话、下次重新登陆时,操作系统又会采用默认值。但是大部分时候系统工程师可能希望这些环境变量能够永久生效。此时就需要把这些环境变量定义在启动脚本中。

来源:中国IT实验室 2009年8月13日

关键字: 系统安全 unix

  • 评论
  • 分享微博
  • 分享邮件

  在Unix操作系统中可以在shell中通过set命令给环境变量赋值。但是如果采用这种方式对环境变量进行赋值的话,当重新启动操作系统或者重新启动这个会话的话,原先设置的环境变量就会丢失。也就是说,如果在shell会话中设置环境变量,这只对当前的会话有效。当系统工程师退出这个会话、下次重新登陆时,操作系统又会采用默认值。但是大部分时候系统工程师可能希望这些环境变量能够永久生效。此时就需要把这些环境变量定义在启动脚本中。

  启动脚本是用户登录到Unix操作系统中第一个执行的程序。通常情况下,每个shell都需要有一个启动脚本,以用来初始化用户的使用环境。笔者现在就已profile启动脚本为例,谈谈如何通过这个脚本文件让环境变量永远有效,以及在配制过程中需要注意的地方。

  一、.profile与profile 的关系。

  通常情况下,在为每个用户创建帐号的时候,操作系统会在这个用户帐号的主目录下面创建一个启动脚本(.profile)文件。默认情况下,这个账户的环境变量都是保存在这个文件中。也就是说,不同的用户有不同的启动脚本,可以设置不同的环境变量。不同用户之间的环境变量是不共享的。

  但是在/etc目录下面还有一个profile文件。这个文件跟用户目录下的profile文件类似,也是一个启动脚本,也可以用来保存环境变量的设置。通常情况下,操作系统启动的时候,是先执行这个脚本文件,然后再去执行用户目录下的.profile脚本文件。那么这两个启动脚本文件,对于环境变量的设置有什么不同呢?在谈这个不同之前,大家先来回顾一下在Windows操作系统中设置环境变量的时候,有“用户环境变量”与“系统环境变量”的区别。在用户环境变量中设置的环境变量,只对这个用户有效。而在系统环境变量中设置的环境变量,在对登陆到这个操作系统的所有用户都有效。其实在Unix操作系统中,这个两个脚本文件对于环境变量的设置,跟Windows操作系统差不多。在/etc/profile中设置的环境变量,是所有用户在登陆时都必须采用的环境变量,就相当于Windows操作系统中的系统环境变量,供所有用户使用。而在用户主目录下的profile启动脚本,则只对当前用户有效,这相当于Windows操作系统中的用户环境变量。

  所以在环境变量设置过程中,如果系统工程师认为所有用户都需要这个环境变量,那么就需要在/etc/profile脚本文件中进行设置。相反,如果只有某个特殊的用户需要使用这个环境变量的话,那么就只对当前用户进行设置。如在Unix操作系统上部署Oracle数据库系统时,往往是创建一个Oracle用户。然后在这个用户下部署Oracle操作系统。同时必须给Oracle用户设置一个$ORACLE_HOME环境变量,否则的话,系统无法正常启动Oracle操作系统。此时该在什么地方设置这个环境变量呢?一般来说,在/etc/profile下设置环境变量的话,也未尝不可。因为在这个地方设置环境变量的话,对全体用户都有效,当然也包括Oracle用户了。但是这么操作的话,会导致一个问题。就是各个用户下跑的应用程序可能会发生相互干扰的情况。而如果只在Oracle用户下设置$ORACLE_HOME环境变量,那么对于其他用户来说是不起作用的。这就可以保障在Unix服务器操作系统上跑的各个应用相对来说是独立的。

  所以系统工程师在设置环境变量的时候,如果只是个别用户使用的,那么最好是在用户主目录下的启动脚本文件中进行设置。只有那些对于全局用户都有影响的环境变量,才在/etc/profile脚本文件中进行设置,如采用的语言等等。

  二、特权帐户临时需要用到某些环境变量。

  有时候,特权帐户root在进行某些作业时,可能临时需要某些帐户的环境变量。此时该如何处理呢?由于按照第一个规则,这些环境变量可能是设置在用户主目录下的脚本文件中,所以对于特权用户root来说,这些环境变量也是无效的。而现在root账户在执行某个作业时,又需要这些环境变量。如就如上面所说,在Unix操作系统上部署了一个Oracle数据库系统。此时系统工程师需要使用iexpdb工具来备份数据库系统。为此系统工程师可能设置了一个备份的脚本程序。系统利用cron命令来周期性的自动执行。可是这个命令必须要在root帐户下才能够运行。当在root账户下运行这个脚本程序的时候,就会提示一个错误信息(提示说找不到这个命令)。可是在Oracle账户下执行这个脚本程序命名没有问题,这到底是什么原因所造成的呢?原来在这个备份的脚本程序中需要用到iexpdb命令,而这个命令是Oracle数据库系统所特有的,而不是Unix操作系统的命令。而在root用户下没有Oracle数据库的环境变量,为此其就不能够识别Oracle数据库系统的下的相关命令。

  遇到这种情况该如何处理呢?在root用户的主目录下的profile的配置文件中也设置Oralce数据库系统的环境变量呢?这个解决方案是可行的,但是却有一点小题大作。如果在root账户目录下的脚本文件中配置这个环境变量的话,那么其在从root账户登陆开始就会生效。这可能与系统工程师的希望有点远。系统工程师可能只希望只在备份的会话中这个环境变量有效。而当会话结束时,这个环境变量自动失效。如此的话,仍然可以保持包环境变量的独立性。这个需求是否可以实现呢?其实笔者现在就是这么做的。笔者在备份的脚本程序开头部分,通过set等关键字设置了所需要的环境变量。当root 用户执行这个备份的脚本程序时,会首先这些开头定义的环境变量设置语句。那么当执行后面的备份命令时,root用户就可能设别这个命令。当这个会话结束时,这些环境变量又会自动失效。

  所以说,如果root等特权用户只有在特定的情况下才使用某些环境变量的时候,虽然在帐户启动脚本文件中设置环境变量可以实现。但是这么做并不是最好的处理方法。通常情况下,笔者建议是在某些需要执行的脚本程序中直接加入设置环境变量的值。这么做的好处就是保证某些环境变量只对特定的会话有效。当这个会话结束的时候,这些环境变量就会失效。这可以在很大程度上确保环境变量的独立性。

  三、如何让配置文件中的环境变量及时有效。

  在谈这个话题之前,大家先回顾一下在Windows操作系统中设置环境变量的生效时间。如果系统工程师先打开一个COMMAND命令行窗口,然后再设置这个环境变量。那么此时这个新设置的环境变量对于刚刚打开的命令行窗口是无效的。此时如果再重新打开一个命令行窗口的话,则这个新设置的环境变量就会生效的。也就是说,新设置的环境变量(用户环境变量),在不需要重新登陆的情况下,就会生效,只需要重新打开一个命令行窗口即可。

  那么在Unix操作系统中,这个环境变量的生效时间又是如何呢?一般来说,修改用户主目录下的.profile脚本文件,需要先注销或者重新启动操作系统,然后再重新登陆才会有效。不过如果想不退出操作系统就让其生效的话,那么只需要在命令行中使用..profile即可,也就是说利用.命令来执行.profile这个配置文件。此时新设置的环境变量在新打开的会话中就会生效。也就是说,在Unix操作系统中环境变量的生效时间跟Unix操作系统下略有不同。前者要对新打开的会话有效的话,必须手工的执行..profile命令才行。而后者的话,只需要重新打开一个命令行窗口新的环境变量即生效。这个差异是大部分系统工程师从Windows向Unix操作系统转型过程中经常忽视的地方,也是在环境变量配置中最容易犯的错误。

  总之,系统工程师可以通过配置启动脚本让环境变量永远生效(每次登录时操作系统自动初始化)。不过有时候会了考虑环境变量的独立性,在某些脚本程序中配置环境变量是代替profile脚本文件的一个比较有效的处理方式。因为其可以保证某些环境变量只在特定的会话中有效。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章