前言

今日在WSL中安装Ros2的时候发现使用下面命令添加ROS2 GPG key的时候下载失败。

1
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

终端提示curl: (6) Could not resolve host: raw.githubusercontent.com

于是我想到为WSL配置代理

为WSL添加代理

在主机打开代理软件后,在WSL终端中输入以下命令

1
export all_proxy="socks5://172.29.80.1:10808"

再次尝试使用curl下载key发现依然失败。同时,我发现直接curl www.google.com是有正常的输出的,说明代理是正常配置的。

思索并查了一下资料,了解到通过export添加的环境变量只对当前用户生效,对于sudo指令,sudo执行时会重置环境变量

解决办法

知道原因后就简单了,下面列举两种解决办法

1. 利用sudo -E 使用当前的环境变量执行命令

1
sudo -E curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

但每次想要通过代理使用sudo时,都需要加上 ‘-E‘ 这个参数。

2. 通过visudo编辑sudoers文件,将all_proxy环境变量保留到sudo中

visudo是Linux下专门编辑sudoers文件的工具,因为直接通过vi /etc/sudoers修改,如果添加的规则有误将会直接导致sudo无法使用。

通过visudo工具编辑sudoes文件,在保存时会检测并提示错误

命令行打开visudo后,在编辑器中添加一行Defaults env_keep += "all_proxy",如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults use_pty
Defaults env_keep += "all_proxy"

使用Ctrl+o回车保存tmp文件,Ctrl+x退出编辑器。

如果规则无误的话则会自动将sudoers.tmp文件保存为sudoers。

保存后可以通过sudo cat /etc/sudoers看看是否保存成功。

再次使用下面命令

1
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

发现已经可以正常使用代理了。