gem 更新显示 WSL2 上的权限错误

发布于 2025-01-17 01:38:48 字数 4491 浏览 2 评论 0原文

我想按照 doc 在 WSL2 上安装 jekyll。但出现错误。

gem update
Updating installed gems                                                            
Updating fiddle                                                                    
ERROR:  While executing gem ... (Gem::FilePermissionError)                             
You don't have write permissions for the /var/lib/gems/2.5.0 
directory.

--backtrace 之后,

ERROR:  While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /var/lib/gems/2.5.0 directory.
/usr/lib/ruby/2.5.0/rubygems/installer.rb:706:in `verify_gem_home'
/usr/lib/ruby/2.5.0/rubygems/installer.rb:854:in `pre_install_checks'
/usr/lib/ruby/2.5.0/rubygems/installer.rb:281:in `install'
/usr/lib/ruby/2.5.0/rubygems/resolver/specification.rb:97:in `install'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:168:in `block in install'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:156:in `each'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:156:in `install'
/usr/lib/ruby/2.5.0/rubygems/dependency_installer.rb:409:in `install'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:213:in `update_gem'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:225:in `block in update_gems'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:224:in `each'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:224:in `update_gems'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:100:in `execute'
/usr/lib/ruby/2.5.0/rubygems/command.rb:313:in `invoke_with_build_args'
/usr/lib/ruby/2.5.0/rubygems/command_manager.rb:173:in `process_args'
/usr/lib/ruby/2.5.0/rubygems/command_manager.rb:143:in `run'
/usr/lib/ruby/2.5.0/rubygems/gem_runner.rb:59:in `run'
/usr/bin/gem:21:in `<main>'

我阅读了 stackoverflow 相关的问题,但它们不起作用。
系统信息:

  1. ruby -v ruby 2.5.8p224(2020-03-31 修订版 67882)[x86_64-linux- gnu]
  2. gem -v 2.7.6.2
  3. 发行版 - Ubuntu 20.04.4 LTS
  4. Winver - 版本 21H2(操作系统内部版本 22000.556)
    编辑:
    gem 环境的输出
/usr/lib/ruby/2.5.0/rubygems/commands/environment_command.rb:154: warning: Insecure world writable dir /mnt/c in PATH, mode 040777
RubyGems Environment:
  - RUBYGEMS VERSION: 2.7.6.2
  - RUBY VERSION: 2.5.8 (2020-03-31 patchlevel 224) [x86_64-linux-gnu]
  - INSTALLATION DIRECTORY: /var/lib/gems/2.5.0
  - USER INSTALLATION DIRECTORY: /home/raghav/.gem/ruby/2.5.0
  - RUBY EXECUTABLE: /usr/bin/ruby2.5
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - SPEC CACHE DIRECTORY: /home/raghav/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /var/lib/gems/2.5.0
     - /home/raghav/.gem/ruby/2.5.0
     - /usr/lib/ruby/gems/2.5.0
     - /usr/share/rubygems-integration/2.5.0
     - /usr/share/rubygems-integration/all
     - /usr/lib/x86_64-linux-gnu/rubygems-integration/2.5.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /home/raghav/.local/bin
     - /home/raghav/bin
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/sbin
     - /usr/bin
     - /sbin
     - /bin
     - /usr/games
     - /usr/local/games
     - /usr/lib/wsl/lib
     - /mnt/c/Program Files (x86)/Common Files/Oracle/Java/javapath
     - /mnt/c/WINDOWS/system32
     - /mnt/c/WINDOWS
     - /mnt/c/WINDOWS/System32/Wbem
     - /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
     - /mnt/c/WINDOWS/System32/OpenSSH/
     - /mnt/c/Users/Raghav/Downloads/cmake-3.20.3-windows-x86_64/cmake-3.20.3-windows-x86_64/bin
     - /mnt/c/Program Files/dotnet/
     - /mnt/c/Program Files/Microsoft SQL Server/130/Tools/Binn/
     - /mnt/c/Program Files/Microsoft SQL Server/Client SDK/ODBC/170/Tools/Binn/
     - /mnt/c/msys64/mingw64/bin"
     - /mnt/c/Users/Raghav/.dotnet/tools
     - /mnt/c/Users/Raghav/AppData/Local/Microsoft/WindowsApps
     - /mnt/c/Program Files/Java/jre1.8.0_321/bin
     - /mnt/c/Users/Raghav/AppData/Local/Programs/MiKTeX/miktex/bin/x64/
     - /snap/bin


用户名:raghav
root 是文件的所有者。

I want to install jekyll on WSL2 as per doc. But get errors.

gem update
Updating installed gems                                                            
Updating fiddle                                                                    
ERROR:  While executing gem ... (Gem::FilePermissionError)                             
You don't have write permissions for the /var/lib/gems/2.5.0 
directory.

After --backtrace

ERROR:  While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /var/lib/gems/2.5.0 directory.
/usr/lib/ruby/2.5.0/rubygems/installer.rb:706:in `verify_gem_home'
/usr/lib/ruby/2.5.0/rubygems/installer.rb:854:in `pre_install_checks'
/usr/lib/ruby/2.5.0/rubygems/installer.rb:281:in `install'
/usr/lib/ruby/2.5.0/rubygems/resolver/specification.rb:97:in `install'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:168:in `block in install'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:156:in `each'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:156:in `install'
/usr/lib/ruby/2.5.0/rubygems/dependency_installer.rb:409:in `install'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:213:in `update_gem'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:225:in `block in update_gems'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:224:in `each'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:224:in `update_gems'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:100:in `execute'
/usr/lib/ruby/2.5.0/rubygems/command.rb:313:in `invoke_with_build_args'
/usr/lib/ruby/2.5.0/rubygems/command_manager.rb:173:in `process_args'
/usr/lib/ruby/2.5.0/rubygems/command_manager.rb:143:in `run'
/usr/lib/ruby/2.5.0/rubygems/gem_runner.rb:59:in `run'
/usr/bin/gem:21:in `<main>'

I have read stackoverflow related que but they did not work.

System info:

  1. ruby -v
    ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-linux-
    gnu]
  2. gem -v
    2.7.6.2
  3. Distro - Ubuntu 20.04.4 LTS
  4. Winver - Version 21H2 (OS build 22000.556)

    EDIT:

    output of gem environment
/usr/lib/ruby/2.5.0/rubygems/commands/environment_command.rb:154: warning: Insecure world writable dir /mnt/c in PATH, mode 040777
RubyGems Environment:
  - RUBYGEMS VERSION: 2.7.6.2
  - RUBY VERSION: 2.5.8 (2020-03-31 patchlevel 224) [x86_64-linux-gnu]
  - INSTALLATION DIRECTORY: /var/lib/gems/2.5.0
  - USER INSTALLATION DIRECTORY: /home/raghav/.gem/ruby/2.5.0
  - RUBY EXECUTABLE: /usr/bin/ruby2.5
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - SPEC CACHE DIRECTORY: /home/raghav/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /var/lib/gems/2.5.0
     - /home/raghav/.gem/ruby/2.5.0
     - /usr/lib/ruby/gems/2.5.0
     - /usr/share/rubygems-integration/2.5.0
     - /usr/share/rubygems-integration/all
     - /usr/lib/x86_64-linux-gnu/rubygems-integration/2.5.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /home/raghav/.local/bin
     - /home/raghav/bin
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/sbin
     - /usr/bin
     - /sbin
     - /bin
     - /usr/games
     - /usr/local/games
     - /usr/lib/wsl/lib
     - /mnt/c/Program Files (x86)/Common Files/Oracle/Java/javapath
     - /mnt/c/WINDOWS/system32
     - /mnt/c/WINDOWS
     - /mnt/c/WINDOWS/System32/Wbem
     - /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
     - /mnt/c/WINDOWS/System32/OpenSSH/
     - /mnt/c/Users/Raghav/Downloads/cmake-3.20.3-windows-x86_64/cmake-3.20.3-windows-x86_64/bin
     - /mnt/c/Program Files/dotnet/
     - /mnt/c/Program Files/Microsoft SQL Server/130/Tools/Binn/
     - /mnt/c/Program Files/Microsoft SQL Server/Client SDK/ODBC/170/Tools/Binn/
     - /mnt/c/msys64/mingw64/bin"
     - /mnt/c/Users/Raghav/.dotnet/tools
     - /mnt/c/Users/Raghav/AppData/Local/Microsoft/WindowsApps
     - /mnt/c/Program Files/Java/jre1.8.0_321/bin
     - /mnt/c/Users/Raghav/AppData/Local/Programs/MiKTeX/miktex/bin/x64/
     - /snap/bin

username : raghav

root is the owner of files.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

从此见与不见 2025-01-24 01:38:48

您尝试运行的程序尝试使用非特权帐户执行特权操作。即使您以非特权用户身份运行该目录,gem 也会尝试写入 root 拥有的目录。还有另一个问题,即 bundler 将使用 gem,因此会给您带来同样的问题,但这次您不能使用 --user-install不再标记了。为了在不影响底层操作系统的情况下克服默认行为,您可以强制 gem 使用用户帐户,并强制捆绑器使用本地目录。

TL;DR:

您需要做的是使用 gem install --user-install 而不是 gem install。这会将 gems 安装到 ~/.local/share/gem/

以及每个项目的 bundle config set --local path 'vendor/bundle' 或类似命令。或者,您可以使用bundle config set --global path ~/.local/share/gem/,它将使用与gem install --user-install相同的文件夹使用(在 Ubuntu 22.04 上)。


首先,该教程的当前说明建议打开 power shell 并运行 bash。那已经过时了。如果您使用 Windows 应用商店中的 Ubuntu 应用程序,当您运行该应用程序时,您将在 Ubuntu 虚拟机内获得一个 shell,这就是您应该使用的。从那里您可以按照ubuntu 说明进行操作。

这是在此环境中有效的一步一步,它只会在不可避免的情况下使用 sudo 一次:

$ sudo apt-get install ruby-full build-essential zlib1g-dev
$ gem install --user-install bundler jekyll webrick

这样您就可以像往常一样在 Ubuntu 中使用 Jekyll 了。如果你想从捆绑器中使用它,那么你必须再次安装 webrick gem,因为 jekyll 会覆盖 Gemfile。另外,默认情况下,捆绑程序会尝试在系统范围内安装,因此您必须将其配置为使用本地目录。

警告:仅在您的博客目录或未来博客的新空目录中运行这些命令。

~$ sudo apt-get install ruby-full build-essential zlib1g-dev
~$ gem install --user-install bundler
~$ mkdir blog
~/blog$ cd blog
~/blog$ bundle init
~/blog$ bundle add jekyll
~/blog$ bundle config set --local path 'vendor/bundle'
~/blog$ bundle exec jekyll new --force --skip-bundle .
~/blog$ bundle add webrick
~/blog$ bundle install

使用 bundle exec jekyllserve 进行测试

如果您可以使用用户范围的 gem 文件夹,并且知道更新 jekyll 会更新它所依赖的 gems 版本,从而影响您的其他 ruby​​ 项目,那么您可以使用用户范围的方法:

~$ sudo apt-get install ruby-full build-essential zlib1g-dev
~$ gem install --user-install bundler
~$ bundle config set --global path ~/.local/share/gem
~$ mkdir blog
~/blog$ cd blog
~/blog$ bundle init
~/blog$ bundle add jekyll
~/blog$ bundle exec jekyll new --force --skip-bundle .
~/blog$ bundle add webrick
~/blog$ bundle install

当然,您也可以始终使用系统范围的方法,这是最不推荐的,因为它会破坏您的 ruby​​ 安装:

~$ sudo apt-get install ruby-full build-essential zlib1g-dev
~$ sudo gem install bundler jekyll webrick

The program you're trying to run attempts to perform privileged operations with an unprivileged account. gem will try to write to root owned directories even though you're running that as an unprivileged user. There's another problem which is bundler that will use gem which will therefore bring you to the same problem but this time you can't use the --user-install flag anymore. To overcome the default behavior without affecting the underlying operational system you can force gem to use a user account and bundler to use a local directory.

TL;DR:

What you need to do is use gem install --user-install instead of gem install. That will install gems to ~/.local/share/gem/;

And bundle config set --local path 'vendor/bundle' or a similar command for every project. Alternatively, you can use bundle config set --global path ~/.local/share/gem/, which will use the same folder that gem install --user-install uses (On Ubuntu 22.04).


First of all, the current instructions on that tutorial suggests opening power shell and running bash. That is outdated. If you're using the Ubuntu App from Windows Store, when you run that App you'll get a shell inside the Ubuntu virtual machine, that's what you should use. From there you can follow the ubuntu instructions.

This is a step by step which works in this environment, it will use sudo only once where it is unavoidable:

$ sudo apt-get install ruby-full build-essential zlib1g-dev
$ gem install --user-install bundler jekyll webrick

With just that you can already use Jekyll inside Ubuntu as usual. If you want to use it from bundler, then you'll have to install webrick gem again because jekyll will overwrite Gemfile. Also, by default, bundler tries to install system-wide, so you'll have to configure it to use a local directory.

WARNING: only run these commands inside the directory of your blog, or a new empty directory for a future blog.

~$ sudo apt-get install ruby-full build-essential zlib1g-dev
~$ gem install --user-install bundler
~$ mkdir blog
~/blog$ cd blog
~/blog$ bundle init
~/blog$ bundle add jekyll
~/blog$ bundle config set --local path 'vendor/bundle'
~/blog$ bundle exec jekyll new --force --skip-bundle .
~/blog$ bundle add webrick
~/blog$ bundle install

Test it with bundle exec jekyll serve

If you're ok with using your user-wide gem folder and is aware that updating jekyll will update the version of the gems it depends, affecting your other ruby projects, then you can use the user-wide approach:

~$ sudo apt-get install ruby-full build-essential zlib1g-dev
~$ gem install --user-install bundler
~$ bundle config set --global path ~/.local/share/gem
~$ mkdir blog
~/blog$ cd blog
~/blog$ bundle init
~/blog$ bundle add jekyll
~/blog$ bundle exec jekyll new --force --skip-bundle .
~/blog$ bundle add webrick
~/blog$ bundle install

Of course, you can always use the system-wide approach too, which is the least recommended because it'll break your ruby installation:

~$ sudo apt-get install ruby-full build-essential zlib1g-dev
~$ sudo gem install bundler jekyll webrick
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文