今回の困りごと
社内プロキシ傘下にあるUbuntu環境の中で、rbenvでrubyをインストールしようとしたところ、こんな具合のエラーが出ました。
というわけで、今回はこのエラーをやっつけます。
$ rbenv install 3.22
==> Downloading ruby-3.2.2.tar.gz...
-> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (35) OpenSSL SSL_connect: 接続が相手からリセットされました in connection to cache.ruby-lang.org:443
error: failed to download ruby-3.2.2.tar.gz
BUILD FAILED (Ubuntu 20.04 on x86_64 using ruby-build 20231114-4-gd312f5a)
環境
- Ubuntu20.04
- プロキシ認証
最近はWSL2上のUbuntuをいじってましたが、今回はUbuntu端末単体の話となります。
原因はcrulコマンドのプロキシ認証
「またプロキシなのか!?」「なんだこれは!?」「プロキシか!?」って疑ったら1、エラー文の中にcurl: (35) OpenSSL SSL_connect: 接続が相手からリセットされました
とあるので、やっぱりまたプロキシですね。
といわけでcurl
コマンドのプロキシ認証やっていきましょう。
curlコマンドのプロキシ認証
curl
のプロキシは
curl -U "ユーザー名":"パスワード" -x "プロキシのアドレス":"ポート番号" -L -o "ファイル名" URL
といった具合で認証させられますが、毎度毎度こんな長ったらしいコマンドライン作るのも面倒なので、別に設定ファイルを作ります。
今回はユーザーのホームディレクトリ直下に.curlrc
と設定ファイルを作成します。
$ vim ~/.curlrc
proxy = "http://proxy address:port"
proxy-user = "username:password"
Bashに干渉しているので、パスワードに記号があったらエスケープさせるのも忘れずに。
これでインストールできるでしょう。
と思いきや
code:linux
$ rbenv install 3.2.2
==> Downloading ruby-3.2.2.tar.gz...
-> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (35) OpenSSL SSL_connect: 接続が相手からリセットされました in connection to cache.ruby-lang.org:443
error: failed to download ruby-3.2.2.tar.gz
状況は変わらず。
ここまで来て駄目だったら、己の日頃の行いを疑いますが残念ながら心当たりは無いです。2
となると、rbenv
の中でruby
の構築を行ってる箇所に原因があります。
rbenv
の中でruby
の構築は~/rbenv/plugins/ruby-build/bin/ruby-build
で行ってます。
その中に以下のようなcurl
の記述がありました。この当たりが怪しいですね。
http_head_curl() {
# shellcheck disable=SC2086
curl -q -sILf $CURL_OPTS "$1" >/dev/null
}
http_get_curl() {
# shellcheck disable=SC2086
log_command curl -q -fL $CURL_OPTS -o "$2" "$1" 2>&3
}
このcurl
のオプションに-q
がありますが、これがDisable .curlrc
という挙動をとります。つまりせっかく設定した.curlrc
を無視するようになってしまいます。
というわけで以下のような具合で-q
を除外しましょう。
念の為、バックアップもとっておきます。
$ cd ~/rbenv/plugins/ruby-build/bin/
$ cp ruby-build ruby-build_org
http_head_curl() {
# shellcheck disable=SC2086
curl -sILf $CURL_OPTS "$1" >/dev/null
}
http_get_curl() {
# shellcheck disable=SC2086
log_command curl -fL $CURL_OPTS -o "$2" "$1" 2>&3
再度インストール
$ rbenv install 3.2.2
==> Downloading ruby-3.2.2.tar.gz...
-> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 21.0M 100 21.0M 0 0 4641k 0 0:00:04 0:00:04 --:--:-- 4812k
==> Installing ruby-3.2.2...
-> ./configure "--prefix=$HOME/.rbenv/versions/3.2.2" --enable-shared --with-ext=openssl,psych,+
-> make -j 12
-> make install
==> Installed ruby-3.2.2 to /home/s220125/.rbenv/versions/3.2.2
バージョンも確認しておきましょう。
$ ruby --version
ruby-3.2.2
できましたー。