我需要一种方法来让脚本在所有用户下始终运行,并在生成任何新 shell 时自动启动。有什么想法吗?
答案1
...为什么?也许有更好的解决方案,所以如果你说为什么也许我们可以提出一些更合理的解决方案。请记住,shell 不仅由用户使用,还由许多系统进程使用。
无论如何,bash
(默认 shell)在启动时将(但稍后见)执行一系列系统范围的脚本。shell 可以作为交互或非交互启动,也可以作为登录或非登录 shell 启动(man bash
有关详细信息,请参阅并搜索“INVOCATION”)。
基本上,当用户在图形会话中的终端中启动 shell 时,bash 将被调用为交互式非登录 shell,并将执行/etc/bash.bashrc
:
当启动非登录 shell 的交互式 shell 时,如果 /etc/bash.bashrc 和 ~/.bashrc 存在,bash 将从这些文件读取并执行命令。可以使用 --norc 选项禁止此操作。--rcfile file 选项将强制 bash 从 file 而不是 /etc/bash.bashrc 和 ~/.bashrc 读取并执行命令。
因此您可以在此处添加命令。但请小心,此处的错误可能会导致您的系统很难恢复。
执行摘要(已测试)
编辑/etc/bash.bashrc
并,在以下行之后
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
添加例如:
echo "Hello $USER, you started a new shell"
并从终端:
[romano:~] % bash
Hello romano, you started a new shell
romano@RRyS:~$
如果你想在这里运行脚本,请小心并仔细检查,例如
if [ -x /full/path/to/script ]; then
/full/path/to/script # double check here
fi
仔细检查是否/full/path/to/script
未bash
在交互模式下调用,否则您将在这里遇到一个很好的无限循环。
警告:
这根本不是强制执行:其他 shell(zsh
、tcsh
、dash
)的行为会有所不同,并使用不同的文件。显然,任何用户都可以使用以下命令调用 shell
bash --norc --noprofile
并跳过脚本文件。
14.04 中甚至有一个示例/etc/bash.bashrc
(可能是 Ubuntu 切换到时留下的遗留问题sudo...
)提示用户使用sudo
而不是以 root 身份登录:
# sudo hint
if [ ! -e "$HOME/.sudo_as_admin_successful" ] && [ ! -e "$HOME/.hushlogin" ] ; then
case " $(groups) " in *\ admin\ *)
if [ -x /usr/bin/sudo ]; then
cat <<-EOF
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
EOF
fi
esac
fi
...但这是代码考古学;-)。
答案2
我不确定你说的‘一直运行’是什么意思,所以我无法回答这一部分,但可以回答其余部分。
https://help.ubuntu.com/community/EnvironmentVariables在‘系统范围的环境变量’部分下有很好的解释。
但您需要知道的是,登录 shell 和交互式非登录 shell 由不同的文件控制。因此,如果您希望脚本在所有 shell 启动时运行,则需要在两个地方获取脚本,或将其放在两个地方。
在执行任何登录 shell 时运行脚本:
引用上述来源:每当进入 bash 登录 shell 时(例如从控制台或通过 ssh 登录时),/etc/profile.d 目录中带有 .sh 扩展名的文件都会被执行,并且当桌面会话加载时,DisplayManager 也会执行这些文件。
因此,只需将脚本放在 /etc/profile.d 目录中,并为其添加 .sh 扩展名。
在执行任何交互式非登录 shell 时运行脚本:
与以前几乎相同,只是这次它不是一个目录,而是一个文件。
执行任何交互式非登录 shell 时,都会调用 /etc/bash.bashrc。这意味着您可以将脚本的内容直接放在 /etc/bash.bashrc 中,也可以从那里调用脚本。如果您的脚本位于 /etc/myscript.sh 中,您可以通过将 添加source /etc/myscript.sh
到 /etc/bash.bashrc 文件来调用它。