- 问题:在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 - 问题:在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 - 问题:在/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 条评论。