Android Debug Bridge(adb)设备 - 没有权限

时间:2013-01-22 14:17:41

标签: android linux debugging adb

我在调试模式下将HTC Wildfire A3333与我的Fedora Linux连接时出现问题.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

我一直在尝试用一个简单的线程给出的所有答案,但运气不错:Using HTC wildfire for android development

19 个答案:

答案 0 :(得分:345)

我自己在Debian Wheezy下遇到了这个问题。 我用sudo重新启动了adb守护进程:

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

一切正常:)

答案 1 :(得分:107)

该问题的原因与系统权限有关(感谢@ IsaacCisneros提供此建议)。不知何故,HTC Wildfire(以及其他人)需要的系统比三星设备更多。简单的解决方案是以root身份运行Eclipse,但对于像Fedora这样的非sudo Linux系统来说,这不太舒服。

我找到了实现相同目标的另一种方式,这似乎更加用户友好,并且安全漏洞较少,然后以超级用户权限运行整个IDE。请注意,这仍然只是问题的解决方法。系统根使用率应仅最小化为管理任务,“adb”旨在与没有SUID的普通用户帐户一起使用。尽管SUID的正确设置非常安全,但每次增加权限都是潜在的系统安全漏洞。

1.设置adb二进制文件的所有权(所有者 - root,所有者组 - 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 

答案 2 :(得分:88)

我有类似的问题:

$ 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. 

这显示我的三星Galaxy S3 和我的 Nexus 7(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

答案 3 :(得分:36)

你的udev规则似乎错了。我用过它并且有效:

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

ATTR代替SYSFS

答案 4 :(得分:24)

在ubuntu 12.04下,eclipse juno。我面临同样的问题。这是我在Yi Yu Blog

上找到的

解决方案与Leon相同

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

答案 5 :(得分:22)

斯蒂芬的答案有效(使用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设备。

然后使用ID的前半部分(4位数)作为idVendor(后半部分是idProduct,但没有必要让adb正常工作)。

sudo vi /etc/udev/rules.d/51-android.rules并为每个唯一的idVendor添加一条规则:

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

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

然后重启。这种变化是永久性的。 (Roger显示了一种重启udev的方法,如果你不想重启)。

答案 6 :(得分:22)

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

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

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

lsusb-line看起来与此类似: 总线001设备115:ID 4321:fedc bla bla bla

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

一旦您了解该设备,请亲眼检查相关用户是否真正可以访问ls -a /dev/bus/usb/001/115!然后检查它是否适用于chmod并修复您的udev设置。

PS1:/ dev / android_adb只能指向一个设备,因此请确保它能够满足您的需求。

PS2:与此问题无关,但鲜为人知:adb有一个固定的供应商ID列表。这个列表可以从〜/ .android / adb_usb.ini扩展,它应该包含0x4321(如果我们按照上面的示例lsusb行)。 - 此处不需要,因为如果不知道供应商ID,您甚至不会获得“无权限”。

答案 7 :(得分:8)

我会在此处附上此附言,以便在我之前的解释中不会丢失。

只需将USB连接类型从Camera(PTP)更改为Media device(MTP),即可可靠地生成并解决无权限问题。摄像头模式允许调试;媒体模式导致ADB中的无权限响应。

在反思一下后,推理似乎很明显。调试器可以在媒体服务器模式下访问设备上的不安全内容。

===========

在您接受调试设备上的RSA加密警告之前,设备将无人值守。在连接后的某个时刻,设备将要求接受调试连接。它是一种最小的安全协议,可确保您可以在初始滑动锁定之外访问设备。我相信需要启用开发者模式。

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

以下及相关页面的详细信息。

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

答案 8 :(得分:7)

Pipo S1S在升级到4月4日的4.2.2股票后出现同样的问题。

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

以上所有建议虽然对您的USB设备有效,但无法解决问题。 (在Mint 15上运行的Android Debug Bridge版本1.0.31。)

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

识别Pipo VendorID 0x2207执行以下步骤

添加到第/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

答案 9 :(得分:3)

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

我跟着official instructions,但我没有注意到我应该  运行命令
" chmod a + r /etc/udev/rules.d/51-android.rules"

将此文件设置为全球可读且重新插入我的USB电缆后,状态变为未经授权。然后只是授予许可,一切都很顺利。

答案 10 :(得分:3)

有同样的问题。这是udev规则的一个问题。尝试了上面提到的一些规则,但没有解决问题。在这里找到一组规则,https://github.com/M0Rf30/android-udev-rules。按照那里的指南,瞧,固定。

答案 11 :(得分:2)

我同意Robert SiemerMichaël Witrant。如果它不起作用,请尝试使用strace

进行调试
strace adb devices

在我的情况下,它有助于终止所有实例并删除套接字文件/tmp/ADB_PORT(默认为/tmp/5037)。

答案 12 :(得分:1)

此问题的另一个可能来源是USB网络共享。如果您使用过USB网络共享,请将其关闭,然后从USB上拔下设备,重新插入,然后再进行操作

adb kill-server
adb devices

在我的情况下(Ubuntu 12.04,Nexus S,家庭目录中的SDK,从未需要root来运行它)。根据您的设备,您可能需要以root用户身份运行adb devices

答案 13 :(得分:1)

尝试“android update adb”命令。它帮助我使用三星Galaxy装备。

答案 14 :(得分:1)

ls -al /usr/bin/adb的输出应显示其归用户root和群组root所有。您可以使用Linux ACL(访问控制列表)为您的本地用户授予adb权限,如下所示:

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

这比在/usr/bin/adb上设置SUID位更受欢迎,并且还限制了可以将adb用于 userName root 的用户。< / p>

答案 15 :(得分:0)

答案在这里的各个帖子中编织,我会尽我所能,但这看起来是一个非常简单明显的原因。

1)udev规则中通常有一个“user”变量,例如USER =“your_user”,可能就在GROUP =“plugdev”之后

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

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

4)也许尝试使用“usermod -a -G plugdev your_user”将“plugdev”组添加到您的用户,请自行承担风险,尽管我认为它不比以root身份发布gui更好,但我相信如果有必要,你至少应该使用“gksudo eclipse”。

我希望这有助于澄清一些事情,udev规则语法对我来说有点神秘,但从我听到的不同系统可能会有所不同,所以尝试一些事情,一次吃一次,然后注意什么改变有效。

答案 16 :(得分:0)

  1. 关闭正在运行adb,可能正在关闭运行android-studio。

  2. 列出设备,

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

答案 17 :(得分:-1)

在THL W100上以root身份运行设备(如上所述)只能与启用网络共享一起工作(我使用了AirDroid)。

答案 18 :(得分:-1)

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

在adb上添加SUID或SGID对我来说是另一个问题。每次adb重新启动时,设备都会脱机 - 直到您每次都在设备上确认。

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

  

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