毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
Ubuntuには、curlコマンドが標準では入っていません。
なので、インストールすることになります。
しかし、その時にsnapでインストールしたcurlを使ったら
/tmp/以下にファイルをダウンロードできなかった。
というお話です。
1. curlをsnapでインストール
$ sudo snap install curl
2. GitHubからファイルを/tmpへダウンロード
ダウンロードしているファイルは問題ではありません。
保存先が問題です。
$ curl -sSLJ https://github.com/alexellis/arkade/releases/download/0.7.23/arkade --output /tmp/arkade
以下のようなエラーがでます。
curl: (23) Failure writing output to destination
3. GitHubからファイルを/home/$user/へダウンロード
次は、ログインユーザーのホームディレクトリへファイルを保存します。
$ /snap/bin/curl -sSLJ https://github.com/alexellis/arkade/releases/download/0.7.23/arkade --output /home/$USER/arkade
以下のようにエラーもなく保存できました。
$ ls -la /home/$USER/arkade
-rw-rw-r-- 1 user user 7811072 7月 25 12:12 /home/$USER/arkade
4. /tmp/へ保存できない理由
snapは独自のsandbox機構を持っています。
書き込める場所が制限されていてどこにでも書き込めるわけではありません。
該当のsnapパッケージ(ここではcurl)で書き込める/tmpは、/tmp/snap.curl/tmp/
というディレクトリになります。
5. 問題になるケース
以下のようなケースです。
最近増えているcurlでインストールするスクリプトをダウンロードしてコマンドをインストールする場合
curl -sLS https://get.arkade.dev | sudo sh
上記のcurlコマンドはsudo sh
にリダイレクトされるので問題ありませんが、ダウンロードされたシェルスクリプト内でcurlが実行されており、ファイルが/tmp/配下にダウンロードされるように書かれている場合、/tmp/配下にはファイルをダウンロードできないので、エラーになります。
6. 対処方法
snapでインストールされたcurlをremoveしてaptでインストールし直しましょう。
$ sudo snap remove curl
$ sudo apt install curl
以下のIssueで報告があがっていますが、
Curl can't write files in dot-leading directories on 21.04 · Issue #2 · woutervb/snap-curl
https://github.com/woutervb/snap-curl/issues/2
Ubuntu社としては、--classicオプション(sandbox制限のないインストール)を認める気はないようです。
Classic confinement request for curl - store-requests - snapcraft.io
https://forum.snapcraft.io/t/classic-confinement-request-for-curl/24611