使用su

时间:2019-05-06 20:32:46

标签: bash environment-variables su

我编写的脚本调用了另一个脚本,但未指定该脚本的位置,因为它的位置应该已经在用户的PATH中。默认情况下,用户从ksh开始,我已经设置了.kshrc文件以在PATH变量中定义我需要的所有各种目录。如果我以用户身份运行它,那么它将运行良好,但是如果我尝试以su命令运行它,则它将失败。例如,这不起作用

su - user1 -c "myscript.sh"

给我的印象是,通过在su命令中使用破折号,它将加载该用户环境。那不正确吗?有没有办法解决这个问题,然后指定我正在调用的另一个脚本的完整路径?

3 个答案:

答案 0 :(得分:1)

  

给我的印象是,通过在su命令中使用破折号,它将加载该用户环境。那不正确吗?

不完全是。它使外壳成为“登录”外壳。这意味着shell命令名称以短划线开头。如果键入man ksh并滚动到“ Invocation”部分,您将看到shell启动时读取“点”文件的规则是不可思议的。请注意,默认情况下,〜/ .kshrc 仅对于交互式外壳读取。由于您正在执行脚本,因此它将不是交互式外壳。您可以使用-E标志来强制读取.kshrc。但是请注意,通常不应在.kshrc文件中设置PATH之类的环境变量。

答案 1 :(得分:0)

您可以这样做:

su - user1 -c "bash myscript.sh"

如果它不起作用:

su - user1 -c "bash /full-path-to-the-file-from-root/myscript.sh"

答案 2 :(得分:0)

我假设您要使用user1的登录环境运行脚本。假设user1的登录shell是bash,则可以

su - user1 -lc myscrip.sh

,它将-l选项传递给bash:这意味着什么,请参见Bash Startup Files