Shell中关于切换用户的问题整理

  1. 问题:在shell脚本中执行“su - 用户名”后,脚本终止执行,并且切换到su 中指定用户名的交互式界面
    现象:我在root中执行一个脚本,但是其中的一些命令或脚本必须用oracle用户来执行。

    #!/bin/sh
    。。。。
    #----------oracle用户执行
    su - oracle  
        /bin/cd /xxxx/xxx
        /bin/rm -rf *
    #----------下面的命令需要用root来执行
    。。。。。。
    

    现在的现象是执行到su - oracle后,shell变为:

    oracle@localhost$

    然后脚本不再继续执行,需要手动输入exit才能继续,但是在脚本中加入exit也不好使
    分析:
    a、su - 之后就直接切换环境并且等待用户的交互式访问了,不在继续执行脚本中的命令;
    b、su后的bash是一个子shell,脚本里写exit没有用,这些都要等su这个进程结束后才会执行。
    解决方案:

    su - 用户 -c 命令

    或者

    sudo -u 用户 命令

    参考示例:

    localhost ~ # cat switchUser.sh
    #!/bin/bash
    whoami
    su - yanu <<!
    whoami
    exit
    !
    whoami
    localhost ~ # ./switchUser.sh
    root
    yanu
    root
    localhost ~ # 

    参考资料:
    Shell 中切换用户:http://bbs.chinaunix.net/thread-2306026-1-1.html

  2. 问题:在shell脚本中执行“su - 用户 -c 命令”后,命令中for循环变量为空
    现象:

    #!/bin/sh
    IP="192.168.1.2 192.168.1.3"
    
    su - www <<!
    for i in $IP
    	do
    		echo $i
    	done	
    !
    

    脚本中$i的输出的内容为空
    分析:在shell中,变量会先被转换,然后再执行。就是-c 后面跟着的字符串在传递给su - www 用户前已经被处理过了。在这里$i 由于在root用户下未定义,故为空。
    解决方案:
    在$i前面加一个“\”就可以了,就是使$i从root用户传递给www用户前先不被解析,然后到了www用户后再解析,这样就正常了
    参考示例:

    su - www -c "\$ORACLE_HOME/a.sh"

    参考资料:
    su -c命令与环境变量的困惑:http://bbs.chinaunix.net/thread-2003718-1-1.html

  3. 问题:在/etc/rc.local中,能以非root用户运行shell程序吗?
    现象:在/etc/rc.local中增加了一条shell程序,系统重启时,默认是以root用户运行的,能以别的用户身份运行吗?
    分析:能。只要程序权限正确,主要是有可执行权限。
    解决方案:

    su - username -c "/path/program.name"

    su - username /path/program.name

    参考示例:

    su - www /home/start_server.sh

    su - username -c "/home/start_server.sh"

    参考资料:
    /etc/rc.d/rc.local中,能以非root用户运行shell程序吗?:http://bbs.chinaunix.net/thread-2145267-1-1.html

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据