我有一个脚本,可以根据连接自动设置代理,因此它位于 /etc/network/if-up.d/ 文件夹中。我使用 gsettings 工具设置代理,然后我想在桌面上显示通知。
我使用通知OSD如下:
notify-send -u 'critical' -i /home/vivek/Downloads/proxy.ico 'SetProxy Status' 'proxy set to auto'
脚本运行良好,因为我尝试将一些日志消息打印到文件中,这表明脚本正在运行,但是当我检查我的代理设置,系统设置->网络代理时,我没有看到任何明显的变化,我看到代理没有变化,虽然它实际上已经改变了[我检查了浏览器并且代理设置已应用],我也没有看到任何通知。
令人惊奇的是,如果我按如下方式明确运行脚本:
cd /etc/network/if-up.d/
sudo ./setproxy
我立即看到了通知,而且更改也反映在网络代理设置中。为什么会发生这种情况?我该如何解决这个问题?我使用的是 ubuntu 12.04 系统。
答案1
为了在多用户系统中保证安全,任何不在主文件夹中的内容都需要 root 权限才能执行。将代理设置脚本放在主文件夹中的一个特殊文件夹中,例如~/commands
。PATH=$PATH:~/commands
在.bashrc
echo ‘PATH=$PATH:~/commands’ >> .bashrc
现在,每次运行setproxy
任何其他命令(如ls
或date
)时,都会设置代理。只需sudo
在脚本中添加即可避免权限冲突。
或者1:
选择2:
只需在您的系统上启用 root 帐户并始终使用该帐户。
警告:如果您不熟悉系统功能,这对系统来说是危险的,您很容易犯愚蠢或草率的错误,或者由于某种原因分心而在不知不觉中犯错误。
答案2
我建议将脚本添加到 /etc/bash_completion,每次打开终端时都会用到它,因为它包含在 ~/.bashrc 的末尾。或者,您也可以直接将脚本添加到 ~.bashrc 的末尾。如果您选择将其添加到 bash_completion,它应该包含以下行
. /etc/network/if-up.d/setproxy
你应该检查 ~./bashrc 以确保使用了 bash_completion(它位于文件末尾)。我的 ~./bashrc 的末尾看起来像
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
这样你就可以确保 bash_completion 没有被注释掉。