我不太喜欢 Linux,并且我遇到了以下与如何永久取消设置某些环境变量有关的问题。
问题是每次我登录系统时,执行env命令我都会获得一些我必须永久删除的变量,特别是:
my.username@VHCLWSO2AS02:~$ env
..........................................
HTTP_PROXY=http://127.0.0.1:3128
HTTPS_PROXY=http://127.0.0.1:3128
http_proxy=http://127.0.0.1:3128
https_proxy=http://127.0.0.1:3128
.........................................
.........................................
.........................................
这些与代理相关的变量必须永久删除(对于所有用户,也对于 root 用户),我不知道该怎么做。
登录用户主目录中的.profile文件包含:
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
我在这个文件中看不到环境变量声明。
登录用户主目录中的.bashrc文件包含:
# sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'$
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# 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 ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
/etc/environment文件应包含影响整个系统(而不仅仅是特定用户)的 evironmnet 变量声明,其中包含:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
#http_proxy=http://10.173.17.92:3128
#https_proxy=http://10.173.17.92:3128
#HTTP_PROXY=http://10.173.17.92:3128
#HTTPS_PROXY=http://10.173.17.92:3128
这包含我的变量定义,我之前注释掉了这些变量以永久取消设置它们。我从来没有重新启动系统,因为它是一个服务器,我不能这样做。我不确定这种没有重启的情况是否会导致我的问题(我可以注销会话)。
为什么每次通过 SSH 再次登录系统时仍会获取这些变量?我该怎么做才能永久删除这些变量?我错过了什么?
不,
unset
不能永久删除环境变量,就像export
不永久设置它们一样,因为根本不存在“永久”环境之类的东西——它总是由登录进程和脚本重新组装。(所有环境变量都是每个进程的,并且从您的登录进程一直复制到所有程序。但是,更改永远不会从子进程复制到父进程。)
export
和unset
命令都只改变它们正在运行的当前进程(即“bash”外壳)的环境,而这一切都与您放置这些命令的位置有关,这些命令会使它们的效果“永久”与否。例如,如果您将此类命令放在 ~/.profile 中,它们将在每次登录时执行,因此看起来是永久的。不重新启动可能是问题所在。例如,如果这些变量曾经由 /etc/environment 设置,那么它们也可能是为接受您的登录的主进程设置的,因此当该进程启动您的登录 shell 时会一直继承下来。
但是,这不应该是 SSH 的问题,因为 sshd 总是为每个连接清除其环境。寻找其他来源:
确保 envvars 不是由
/etc/profile
or设置的/etc/profile.d/*.sh
。确保它们没有被
/etc/bash.bashrc
任何一个设置。检查
~/.pam_environment
,这是一个在 shell 启动之前读取的特殊配置文件。如果您使用 Bash,请检查
~/.bash_profile
-~/.bash_login
如果其中任何一个文件存在,则它具有优先权,并且“一般” ~/.profile 将被完全忽略。检查该位置的
~/.ssh/environment
、~/.ssh/rc
和其他文件。运行搜索
grep -r HTTP_PROXY /etc
以发现其他可能的隐藏位置。最后,如果没有其他方法,放置
unset HTTP_PROXY
在您的配置文件脚本中将导致它在您每次登录时删除变量,从而使效果有些永久。