首页 文章

系统Shell脚本无法在PATH中找到我的命令

提问于
浏览
3

我在 /usr/local/scripts/ 中放了一个自定义命令(shell脚本) .

为了查看 /usr/local/scripts 中的命令,我使用以下方法设置PATH:

  • sudo visudo
Defaults  secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/scripts"
  • sudo nano /etc/profile

PATH =“$ PATH:/ usr / local / scripts”导出路径

  • sudo nano /etc/login.defs

ENV_SUPATH PATH = / usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin:/ usr / local / scripts ENV_PATH PATH = / usr / local / sbin:/ USR / local / bin目录:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中:在/ usr /本地/游戏:在/ usr /游戏:在/ usr /本地/脚本

  • sudo nano /root/.bashrc

PATH =“$ PATH:/ usr / local / scripts”导出路径

  • sudo nano /etc/environment

PATH =“在/ usr / local / sbin中:在/ usr / local / bin目录:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中:在/ usr /游戏:在/ usr /本地/游戏:在/ usr /本地/脚本”

这在大多数情况下都适用,但......

我有两个脚本,在他们的代码中,从 /usr/local/scripts/ 调用脚本,它找不到我的脚本!

第一个是 /etc/network/if-up.d/sendip ,它在初始化网络堆栈时以root身份运行 .

第二个是 /usr/local/scripts/notif-login ,它是从 pam/etc/pam.d/sshd 为根运行的: /etc/pam.d/sshd

session optional pam_exec.so /usr/local/scripts/notif-login

如果我从我的终端shell运行这两个脚本,另一个用sudo,没有sudo的用户,su或root用户登录后,它可以正常运行 . 但是当它被系统运行时(首先是网络初始化,第二次通过SSH)都无法从 /usr/local/scripts 运行脚本 .

还有另一个我必须设置路径的地方吗?

1 回答

  • 1

    对于"non-interactive shells",Bash / sh不会读取 /etc/profile ,例如您提及的脚本运行的shell . 我'm not sure which distribution you'正在使用,但您应该只能将其添加到 /etc/environmentPATH 定义中 . Ob Ubuntu,例如:

    更改:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    

    至:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/scripts"
    

    Edit

    这应该在Raspbian下工作;它在Debian下完成 . 如果没有,您可能只需要在其中一个脚本的开头修改路径 . 在Bash下,所有正常启动文件都不会执行非交互式会话 . 还可以尝试输出 $SHELL 并确保脚本在您认为的shell下运行 .

相关问题