引言
其实这篇文章和上一篇klash都是最近在做的一件事情的笔记,把学到的东西整理了一下思维导图,供大家参考。
一、 shell与shell变量、环境变量
1.1 概念
- 当通过诸如 XShell、PuTTY 等软件远程登录 Linux 时,出现的黑窗口终端就是 shell。一个 Shell 窗口相当于创建了一个 Shell 进程。打开多个 Shell 窗口会创建多个独立的 Shell 进程,它们之间互不影响,并拥有不同的进程 ID。
- shell变量可以配置脚本中的各种参数和选项,使脚本更加灵活。例如可以使用Shell变量来存默认参数,然后在执行命令时使用
$变量名
作为命令参数。
- 环境变量一般与系统功能配置相关,适用于需要跨进程传递参数的情况。例如PATH环境变量用于指定可执行文件的路径。当用户执行命令时,系统会在PATH的路径中查找该命令对应的文件执行;
http_proxy
环境变量用于指定HTTP协议的代理服务器地址和端口号,当用户使用curl、wget等命令下载时,这些工具会通过http_proxy
环境变量指定的代理联网。
- 变量不区分大小写,比如
http_proxy
和HTTP_PROXY
是一个东西。
1.2 作用域
- Shell 变量仅在当前 shell 进程中可见和访问。比如在 shell 中执行
my_var=123
后,在 shell 中使用 echo $my_var
可以输出 123,但如果运行一个内容为 echo $my_var
的 .sh 脚本,则不会有任何输出。
- 环境变量可以被当前进程及其子进程访问。与上述情况相反,当使用
export my_var=123
后,如果在脚本中运行一个子进程,则该子进程也可以访问该变量。
- 在Docker中,如果宿主机设置了
http_proxy
,那么Docker里面的线程不会自动使用代理。需要在Dockerfile中添加ENV http_proxy $http_proxy
和 ENV https_proxy $https_proxy
,这样Docker容器就可以使用宿主机的代理了。
- 如果在脚本中使用
source
命令或.
命令来执行脚本,则该脚本中定义的变量会被当前shell进程所继承和使用。
1.3 SSH 连接 Linux 服务器的环境变量处理流程
- SSH 连接到远程 Linux 服务器并进行身份验证,成功后用户登录到服务器的 shell 环境中。
- 根据用户的 shell 类型,分别从
/etc/environment
和 /etc/profile
读取系统级别的环境变量
- 根据登陆的用户,在
~/.bash_profile
、~/.profile
和 ~/.bashrc
读取用户级别的环境变量。
- 用户可以在登录后手动设置或修改环境变量,例如通过
export
命令设置 PATH 环境变量。
- 当用户从 SSH 客户端断开连接时,shell 环境也会随之结束。
- 上述过程中,后面的环境变量定义会覆盖前面的定义
- 如果使用类似tmux或screen等会话管理工具,那么在同一个会话中所有的窗口都共享同一个shell环境,因此在其中修改或设置的环境变量会影响到其他窗口和进程。
1.4 环境变量文件
-
用户级别
-
~/.bashrc
、 ~/.bash_profile
和 ~/.profile
在每次打开shell时都会执行,伴有环境变量设置。
- 并不是全部执行,而是在不同场景下选择性执行的。
~/.bash_profile
在登录 shell 中执行,如果这个文件不存在,那么会尝试执行 ~/.profile
。~/.bashrc
文件通常在交互式非登录 shell 中执行,但是很多用户在 ~/.bash_profile
或 ~/.profile
中加入了执行 ~/.bashrc
的命令。
- 用于方便地为不同用户做配置,隔离不同用户的环境变量。
-
系统级别
-
/etc/environment
是一个系统级别的环境变量文件,在登录时为所有用户设置环境变量,无论使用哪种shell。
- 登录时用户的 shell 会读取
/etc/environment
文件中的变量,并将其作为用户的环境变量设置。当用户使用sudo
命令切换到root用户时,也会读取 /etc/environment
文件中的变量。
- 只对shell运行的进程有效,对于一些不依赖shell环境的应用程序,如 Apache、Nginx 等,则需要修改对应应用程序的配置文件。
二、变量增删改查
2.1 查看变量
- 查看单个变量:
echo $VAR
- 查看所有 Shell 变量:
set
- 查看所有 Environment 变量:
env
2.2 设置/修改变量
- Shell 变量:
VAR=value
或 declare VAR=value
,都是设置局部变量
- Environment 变量:
export VAR=value
2.3 删除变量
- 删除 Shell 变量:
unset VAR
- 删除 Environment 变量:
export -n VAR
2.4 source命令快速设置环境变量
- source 命令的作用是执行 shell 脚本文件(如 .sh),将文件里的环境变量、函数等导入当前 shell 环境中。
- 仅影响当前shell,不会在其他shell中生效
- 也可以使用 . 命令来代替 source 命令。比如source abc.sh 可以写成 . abc.sh。
三、在Linux上配置代理
3.1 相关环境变量
-
http_proxy
: HTTP 协议代理地址和端口号。
-
https_proxy
: HTTPS 协议代理地址和端口号。
-
ftp_proxy
: FTP 协议代理地址和端口号。
-
socks_proxy
: SOCKS 协议代理地址和端口号。
-
all_proxy
: 所有协议的代理地址和端口号。
- 注意:在使用
all_proxy
变量时可能会和其他的变量冲突,应该把 http_proxy
、https_proxy
和 ftp_proxy
变量置空或删除。
3.2 设置代理
export PROXY="http://127.0.0.1:7890"
export http_proxy="$PROXY"
export https_proxy="$PROXY"
export ftp_proxy="$PROXY"
export socks_proxy="$PROXY"
3.3 取消代理设置
`export -n http_proxy https_proxy ftp_proxy socks_proxy all_proxy`
3.4 在系统级别上设置代理
在 /etc/environment
文件中添加相应的环境变量定义:
http_proxy="http://127.0.0.1:7890"
https_proxy="http://127.0.0.1:7890"
ftp_proxy="http://127.0.0.1:7890"
socks_proxy="http://127.0.0.1:7890"