WSL中安装Ruby及one_gadget(gem扩展)失败的解决求助
问题描述
因Pwnable需求,需在WSL中安装Ruby并通过gem安装one_gadget扩展,但执行sudo apt install ruby时出现Snap相关错误,错误输出如下:
The following additional packages will be installed: fonts-lato libgmp-dev libgmpxx4ldbl libruby3.0 rake ri ruby ruby-dev ruby-net-telnet ruby-rubygems ruby-webrick ruby-xmlrpc ruby3.0 ruby3.0-dev ruby3.0-doc rubygems-integration unzip zip Suggested packages: gmp-doc libgmp10-doc libmpfr-dev bundler E: Sub-process [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true returned an error code (100) E: Failure running hook [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true E: Sub-process [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true returned an error code (100) E: Failure running hook [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true
再次执行sudo apt install ruby仍出现相同错误:
# sudo apt install ruby Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: fonts-lato libruby3.0 rake ruby-net-telnet ruby-rubygems ruby-webrick ruby-xmlrpc ruby3.0 rubygems-integration unzip zip Suggested packages: ri ruby-dev bundler E: Sub-process [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true returned an error code (100) E: Failure running hook [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true E: Sub-process [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true returned an error code (100) E: Failure running hook [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true
解决方法
一、修复apt的Snap钩子错误
该错误由apt的Snap建议钩子执行失败导致,按以下步骤处理:
- 检查Snap状态:
which snap- 若输出为空(未安装Snap),直接执行下一步;
- 若存在Snap,先重启服务:
sudo systemctl restart snapd.service
- 临时禁用Snap钩子:
sudo sed -i 's/^APT::Update::Pre-Invoke/#APT::Update::Pre-Invoke/' /etc/apt/apt.conf.d/20snapd.conf sudo sed -i 's/^DPkg::Pre-Install-Pkgs/#DPkg::Pre-Install-Pkgs/' /etc/apt/apt.conf.d/20snapd.conf - 重新安装Ruby:
sudo apt update && sudo apt install ruby -y - (可选)安装完成后恢复钩子:
sudo sed -i 's/^#APT::Update::Pre-Invoke/APT::Update::Pre-Invoke/' /etc/apt/apt.conf.d/20snapd.conf sudo sed -i 's/^#DPkg::Pre-Install-Pkgs/DPkg::Pre-Install-Pkgs/' /etc/apt/apt.conf.d/20snapd.conf
二、其他安装one_gadget的方式
方式1:使用预编译二进制文件
直接下载编译好的二进制包,无需安装Ruby:
# 替换为最新版本的下载链接 wget https://github.com/david942j/one_gadget/releases/download/v1.8.0/one_gadget-linux-amd64.tar.gz tar -xzf one_gadget-linux-amd64.tar.gz sudo mv one_gadget /usr/local/bin/ # 验证安装 one_gadget --version
方式2:用rbenv安装Ruby(绕过apt问题)
rbenv是Ruby版本管理工具,可避免apt的Snap冲突:
- 安装依赖:
sudo apt update && sudo apt install git curl libssl-dev libreadline-dev zlib1g-dev -y - 安装rbenv:
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash - 配置shell环境:
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc - 安装Ruby并设置全局版本:
rbenv install 3.2.2 rbenv global 3.2.2 - 安装one_gadget:
gem install one_gadget
内容的提问来源于stack exchange,提问作者김준원
相关产品推荐
相关产品推荐

