【问题标题】:System Shell Scripts Can't Find my Command in PATH系统外壳脚本在 PATH 中找不到我的命令
【发布时间】:2015-10-31 12:40:48
【问题描述】:

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

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

  1. sudo visudo

    Defaults  secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/scripts"
    
  2. sudo nano /etc/profile

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

  3. 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/local/games:/usr/games:/usr/local/脚本

  4. sudo nano /root/.bashrc

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

  5. sudo nano /etc/environment

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

这在大多数情况下都有效,但是...

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

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

第二个是/usr/local/scripts/notif-login,它是由/etc/pam.d/sshdpam以root身份运行的:

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

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

还有其他需要设置路径的地方吗?

【问题讨论】:

  • 为什么不直接使用完整路径?
  • 因为我想知道如果他们的目录在路径中,为什么没有完整路径就不能工作

标签: linux bash shell root


【解决方案1】:

Bash/sh 不会为“非交互式 shell”读取 /etc/profile,例如运行您提到的脚本的 shell。我不确定您使用的是哪个发行版,但您应该可以将其添加到/etc/environmentPATH 定义中。以 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"

编辑

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

【讨论】:

  • 我正在使用树莓派。我已经尝试过您的解决方案(编辑 /etc/environment),但问题仍然存在
  • 这很奇怪。 /etc/environment/ 是否已经存在?它应该在 Raspbian 上。我想知道以后是否有什么东西会覆盖路径。
  • 确保它只是PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/scripts",而不是export PATH=...;这不是一个合适的 shell 脚本。
  • 是的,我知道。我写了PATH="/usr/l...
  • 我添加了echo "$SHELL" | mail mymail@gmail.com` 来检查外壳,我收到了一封空邮件。
猜你喜欢
  • 2022-08-05
  • 1970-01-01
  • 2021-11-21
  • 2010-09-07
  • 2017-06-15
  • 2012-12-19
  • 2023-03-10
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多