开发者社区> 问答> 正文

Linux下的su - 以后的PATH环境变量的问题

以下的程序都是在一个docker容器中跑的
1.首先在root 的权限在运行:

$su - scidb -c "echo $PATH"
screenshot
我有个命令必须要在有后面的那个环境中才能运行成功, 不然会报没找到命令。。。

只要让环境变量和切换到scidb的用户下一样,命令就可以运行成功了。

有哪位前辈知道解决方法的,希望告知答案

展开
收起
a123456678 2016-06-22 14:57:34 3339 0
1 条回答
写回答
取消 提交回答
  • 我打开/etc/login.defs看了一下:

    ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    这正是使用-后,PATH被重置时的值。
    
    所以,不管有没有指定-,或-m或-p,都无法保留当前的PATH环境变量给要su的用户(可能出自安全考虑?),我建立了一个test.sh:
    
    #!/bin/sh
    echo 'PATH='$PATH
    验证了这一结果:
    
    root@acer:/home/jk# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/path/to/demo
    root@acer:/home/jk# su - jk -s /home/jk/test.sh
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    root@acer:/home/jk# su jk -s /home/jk/test.sh
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
    那么,如何把当前的PATH付给用户jk,并在test.sh中使用呢?我想到的方法就是直接把PATH作为test.sh的参数传入,把test.sh改成这样:
    
    #!/bin/sh
    echo 'PATH='$PATH
    echo 'ARG1='$1
    
    export PATH=$PATH:$1  #直接把参数接上去或替换
    echo 'PATH='$PATH
    然后测试:
    
    root@acer:/home/jk# su - jk -s /home/jk/test.sh $PATH
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    ARG1=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/path/to/demo

    可以看到/path/to/demo已经拿到了,这时在test.sh接着执行位于/path/to/demo的命令,就应该可以找到。

    2019-07-17 19:45:35
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载