Android 调试桥(adb)设备-没有权限

我的 Fedora Linux 17在调试模式下连接 HTC Wildfire A3333时出现问题,Adb 说:

./adb devices
List of devices attached
????????????    no permissions

我的 udev 规则(三星的第一条规则很好用,HTC 的第二条规则不好用) :

SUBSYSTEM=="usb",SYSFS{idVendor}=="04e8",SYMLINK+="android_adb",MODE="0666",GROUP="plugdev"
SUBSYSTEM=="usb",SYSFS{idVendor}=="0bb4",SYMLINK+="android_adb",MODE="0666",GROUP="plugdev"

对于三星设备来说,一切都很好:

 ./adb devices
List of devices attached
00198a9422618e  device

我一直在尝试在一个类似的线程给出的所有答案没有任何运气: 在 Android 开发中使用 HTC Wildfire

185791 次浏览

问题的原因与系统权限有关(感谢@IsaacCisneros 的建议)。不知何故,HTC Wildfire (或许还有其他公司)需要从该系统中获得比三星设备更多的东西。简单的解决方案是以根用户身份运行 Eclipse,但是对于 Fedora 这样的非 sudo Linux 系统来说,这并不是很舒服。

我找到了另一种方法来实现同样的目标,这种方法看起来更加用户友好,安全漏洞也比运行整个具有超级用户权限的 IDE 要少。请注意,这仍然只是这个问题的解决办法。系统根使用应该只对管理任务进行最小化,并且“ adb”被设计为使用没有 SUID 的普通用户帐户。尽管 SUID 的正确设置是相当安全的,但是每一次权限增加都是一个潜在的系统安全漏洞。

1. 设置 adb 二进制文件的所有权(owner-root,owner group-user _ group) :

chown root:user_group adb

2. 使用 SUID 设置权限:

chmod 4550 adb

这应该会导致类似的结果(ls-llh) :

-r-sr-x---. 1 root user_name 1.2M Jan 8 11:42 adb

在那之后,您将能够以 root 用户身份运行 adb,虽然您将使用您的普通用户帐户。您可以作为普通用户运行 Eclipse,您的 HTC 应该能够被正确发现。

./adb devices
List of devices attached
HT0BPPY15230    device

我在 Debian Wheezy 手下也遇到过这种问题。 我用 sudo 重新启动了 adb 守护进程:

sudo ./adb kill-server
sudo ./adb start-server
sudo ./adb devices

一切正常:)

在 ubuntu 12.04下,eclipsejuno。我面临同样的问题。这是我在 一语博客上发现的

解决办法和里昂一样

sudo -s
adb kill-server
adb start-server
adb devices

我将把这个附言放在上面,这样它就不会在我之前的解释中丢失。

通过简单地将 USB 连接类型从 Camera (PTP)更改为 Media 设备(MTP) ,我可以可靠地产生和解决无权限问题。相机模式允许调试; 媒体模式导致 ADB 中的无权限响应。

经过一段时间的反思,这个推理似乎相当明显。调试器将以媒体服务器模式访问设备上的不安全内容。

===========

在接受已调试设备上的 RSA 加密警告之前,设备是未被允许的。在连接之后的某个时刻,设备将要求接受调试连接。这是一个最低限度的安全协议,确保您可以访问设备以外的初始滑动锁定。我相信,需要启用开发人员模式。

“无权限”标志实际上是 adb 识别设备为有效调试目标的一个很好的第一个指示符。注意,它没有列出您的其他 USB 设备。

详情请参阅以下网页及相关网页。

Http://developer.android.com/tools/device.html

... OP 自己的答案是 错了到目前为止,没有“特殊的系统权限”。- “没有许可”的问题归结为... 没有许可。

不幸的是,它不容易调试,因为 adb 使它成为一个秘密,它试图访问哪个设备!在 Linux 上,它尝试打开手机的“ USB 串行转换器”设备,例如/dev/bus/USB/001/115(您的总线号码和设备地址会有所不同)。这有时会从/dev/android _ adb 链接并使用。

lsusb将有助于查找总线号码和设备地址。注意,如果你重新插入,设备地址肯定会发生变化,如果端口对使用哪种速度感到困惑(例如,一个物理端口最终出现在一个或另一个逻辑总线上) ,总线号码也会发生变化。

Lsusb 线看起来类似于这样: 总线001设备115: ID 4321: 联邦调查局啦啦啦啦

如果“ bla bla bla”没有足够的提示(有时它既不包含制造商,也不包含手机型号) ,lsusb -v可以帮助您找到设备。

一旦你知道设备,用你自己的眼睛检查,ls -a /dev/bus/usb/001/115是真的可以为用户的问题!然后检查它是否与 chmod一起工作,并修复你的 udev 设置。

/dev/android _ adb 只能指向一个设备,因此请确保它满足您的要求。

PS2: 与这个问题无关,但不太为人所知: adb 有一个固定的供应商 ID 列表。这个列表可以从 ~/扩展。Android/adb _ usb.Ini,它应该包含0x4321(如果我们遵循上面的示例 lsusb 行)。- 这里不需要,因为如果不知道供应商 ID,您甚至不会得到“无权限”。

你的乌德夫规则似乎是错误的。我使用了这个,它起作用了:

SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"

(ATTR代替 SYSFS)

这个问题的另一个可能来源是 USB 连接。如果你已经使用了 USB 连接,关闭它,然后从 USB 断开设备,插回来,然后做

adb kill-server
adb devices

这在我的案例中起到了作用(Ubuntu 12.04,Nexus S,SDK 在 home 目录中,从不需要 root 来让它运行)。但是,根据设备的不同,您可能需要以 root 用户身份运行 adb devices

我也有类似的问题:

$ adb devices
List of devices attached
4df15d6e02a55f15    device
????????????    no permissions

调查

如果我运行 lsusb,我可以看到我连接了哪些设备,以及在哪里:

$ lsusb
...
Bus 002 Device 050: ID 04e8:6860 Samsung Electronics Co., Ltd GT-I9100 Phone ...
Bus 002 Device 049: ID 18d1:4e42 Google Inc.

这是显示我的 Samsung Galaxy S III和我的 Nexus7(2012)连接。

检查这些权限:

$ ls -l /dev/bus/usb/002/{049,050}
crw-rw-r--  1 root root    189, 176 Oct 10 10:09 /dev/bus/usb/002/049
crw-rw-r--+ 1 root plugdev 189, 177 Oct 10 10:12 /dev/bus/usb/002/050

等等,什么? 那个“ plugdev”组从哪儿来的?

$ cd /lib/udev/rules.d/
$ grep -R "6860.*plugdev" .
./40-libgphoto2-2.rules:ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="6860", \
ENV{ID_GPHOTO2}="1", ENV{GPHOTO2_DRIVER}="proprietary", \
ENV{ID_MEDIA_PLAYER}="1", MODE="0664", GROUP="plugdev"
./40-libgphoto2-2.rules:ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860", \
ENV{ID_GPHOTO2}="1", ENV{GPHOTO2_DRIVER}="proprietary", \
ENV{ID_MEDIA_PLAYER}="1", MODE="0664", GROUP="plugdev"

(我已经包好了那些线)

请注意 GROUP="plugdev"行。还要注意的是,这不适用于其他设备 ID:

$ grep -Ri "4e42.*plugdev" .

(没有返回)

修好它

好吧,那解决办法是什么?

添加一条规则

创建一个包含以下行的文件 /etc/udev/rules.d/99-adb.rules:

ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="4e42", ENV{ID_GPHOTO2}="1",
ENV{GPHOTO2_DRIVER}="proprietary", ENV{ID_MEDIA_PLAYER}="1",
MODE="0664", GROUP="plugdev"

这应该是一行,为了便于阅读,我把它包装在这里了

重启 Udev

$ sudo udevadm control --reload-rules
$ sudo service udev restart

就是这样

拔掉/重新插上你的设备。

试试看

$ adb devices
List of devices attached
4df15d6e02a55f15    device
015d2109ce67fa0c    device

答案在这里的各个帖子之间交织,我会尽我最大的努力,但它看起来是一个非常简单和明显的原因。

1)在 udev 规则中通常有一个“ USER”变量,比如可能就在 GROUP = “ plugdev”之后的 USER = “ your _ USER”

2)您需要为您的设备/s 使用正确的 SYSFS { idVendor } = = “ # # # #”和 SYSFS { idProduct } = = “ # # # #”值。如果你有不止一个制造商的设备,比如三星和 HTC,那么你需要为每个供应商提供一个条目(规则) ,不是为每个设备提供一个条目,而是为每个你将使用的不同供应商提供一个条目,所以你需要为 HTC 和三星提供一个条目。看起来你有你的条目,三星现在你需要另一个。记住 USER = “ your _ USER”。像 Robert Seimer 建议的那样使用“ lsusb”来查找 idVendor 和 idProduct,它们通常是一些数字和字母,格式为 X # X # : # X # X 我认为第一个是 idVendor,第二个是 idProduct,但是你需要对你拥有的每个品牌的手机/平板电脑都这样做。

3)我还没弄明白51-adb. rules 和99-adb. rules 有什么不同或者为什么不同。

4)也许可以尝试用“ usermod-a-G plugdev your _ user”将“ plugdev”组添加到你的用户中,尝试这样做是你自己的风险,虽然我不认为这比启动一个 gui 作为 root 用户更危险,但我相信如果必要的话,你至少应该使用“ gksudo eclipse”。

我希望这有助于澄清一些事情,udev 规则的语法对我来说也是一个谜,但是据我所知,它可以不同于不同的系统,所以尝试一些东西,一次吃一个,并注意什么改变工作。

Stephan 的回答可以正常工作(使用 sudo adb kill-server) ,但是它是临时的,必须在每次重新启动后重新发布。

对于永久性解决方案,必须修改 udev 配置:

Witrant 的答案是正确的(从官方 Android 文档复制)。但这只是个模板。如果这对您的设备不起作用,您需要为您的设备填写正确的设备 ID。

lsusb

Bus 001 Device 002: ID 05c6:9025 Qualcomm, Inc.
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
...

在列表中找到您的 Android 设备。

然后为 idVendor 使用 ID 的前半部分(4位数字)(最后一半是 idProduct,但是不需要让 adb 工作)。

为每个惟一的 idVendor 添加一条规则:

SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev"

就是这么简单。你不需要在一些答案中给出所有其他字段。保存文件。

然后重新启动。更改是永久的。(Roger 展示了一种重新启动 udev 的方法,如果你不想重新启动的话)。

在 THLW100上,以 root 身份运行的设备(如上所述)只能在启用了共享的情况下工作(我使用 AirDroid)。

PipoS1S 从6月4日升级到4.2.2库存后也出现了同样的问题。

$ adb devices
List of devices attached
????????????    no permissions

以上所有的建议,虽然有效得到你的 USB 设备认可,但不能为我解决问题。(Android Debug Bridge 版本1.0.31在 Mint 15上运行。)

更新 android sdk 工具等重置 ~/.android/adb_usb.ini

要识别 PipoVendorID0x2207,请执行以下步骤

添加到 /etc/udev/rules.d/51-android.rules

SUBSYSTEM=="usb", ATTR{idVendor}=="0x2207", MODE="0666", GROUP="plugdev"

~/.android/adb_usb.ini添加一行:

0x2207

然后删除 adbkey 文件

rm -f ~/.android/adbkey ~/.android/adbkey.pub

并重新连接您的设备,以重建与正确的 adb 连接的关键文件。 有些设备会要求重新授权。

sudo adb kill-server
sudo adb start-server
adb devices

尝试“ android 更新 adb”命令。它帮助我与三星星系齿轮。

我同意 Robert SiemerMichaël Witrant。如果它不工作,尝试与 strace调试

strace adb devices

在我的例子中,它帮助杀死所有实例并删除套接字文件 /tmp/ADB_PORT(默认值是 /tmp/5037)。

  1. 关闭运行 adb,可以关闭运行 android-Studio。

  2. 列表设备,

/usr/local/android-studio/sdk/platform-tools/adb devices

我遇到过同样的情况,三台设备连接到同一台主机,但只有一台设备没有“权限”,其他设备都在线。

在 adb 上添加 SUID 或 SGID 是我的另一个问题。每次 adb 重新启动时都会看到离线的设备-直到你每次确认设备。

我通过为设备文件添加“ o + w”权限来解决这个“无权限”问题。

Chmod o + w/dev/bus/usb/00n/xxx

ls -al /usr/bin/adb的输出应该显示它属于用户 root和组 root。您可以使用 Linux ACL (访问控制列表)为 adb提供本地用户权限,如下所示:

setfacl -m "u:userName:rwx" /usr/bin/adb

这比在 /usr/bin/adb上设置 SUID 位更可取,并且还限制了可以使用 adb的用户使用 用户名

我今天也遇到了同样的问题。

我跟随 官方指示,但是我没有注意到我应该 运行命令
“ chmod a + r/etc/udev/rules es.d/51-android. rules” < br >

当我把这个文件设置为世界可读和 重新插上我的 usb 电缆,状态变得未经授权。那就批准吧,一切都会好起来的。

有同样的问题。这是 Udev 规则的问题。尝试了上面提到的一些规则,但没有解决这个问题。我找到了一套规则 https://github.com/M0Rf30/android-udev-rules。跟着导游到了那里,瞧,修好了。

从手机改变 USB 模式为我做了技巧。(我设置为文件传输)