You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本中ADB Shell命令执行失败报错error: closed问题排查

解决Bash脚本执行adb shell sudo命令报"error: closed"的问题

问题原因

核心矛盾在于脚本是非交互式执行环境:当你在脚本里调用adb shell 'sudo ip -f inet addr show'时,设备端的sudo会要求输入密码,但脚本无法像终端那样弹出交互输入框让你输密码,最终导致adb连接被强制关闭,触发"error: closed"错误。而终端属于交互式环境,你能手动输入sudo密码,所以命令能正常运行。

解决方法

方案1:配置设备端sudo免密(推荐)

通过让设备允许当前用户无需密码执行ip命令,彻底解决交互问题:

  1. 先在终端进入设备的adb shell:
    adb shell
    
  2. 切换到root权限(如果设备需要):
    su
    
  3. 用visudo编辑sudoers文件(必须用这个命令,避免语法错误导致sudo失效):
    visudo
    
  4. 添加一行规则,允许目标用户免密执行ip命令:
    <你的设备用户名> ALL=(ALL) NOPASSWD: /sbin/ip
    
    如果你不确定用户名,也可以临时用全局规则(仅限测试,不推荐长期使用):
    ALL ALL=(ALL) NOPASSWD: /sbin/ip
    
  5. 保存退出后,重新运行脚本即可正常执行。

方案2:移除sudo(如果设备允许)

部分Android或嵌入式设备中,普通adb用户本身就有权限查看网络配置,你可以先在终端测试:

adb shell ip -f inet addr show

如果能正常输出IP信息,直接修改脚本去掉sudo:

#!/usr/bin/bash
ip=$(adb shell ip -f inet addr show)

这个方法最简单,也避免了sudo带来的权限问题。

方案3:用expect自动化输入密码(不推荐)

如果必须保留sudo且无法配置免密,可以用expect工具自动化输入密码,但需要设备端提前安装expect,且脚本会明文暴露密码,存在安全风险。示例脚本如下:

#!/usr/bin/bash
ip=$(expect << EOF
spawn adb shell sudo ip -f inet addr show
expect "Password:"
send "你的sudo密码\r"
expect eof
EOF
)

内容的提问来源于stack exchange,提问作者Pro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:40:46