Androiddebugging桥(adb)设备 – 没有权限

我在debugging模式下将HTC Wildfire A3333与我的Fedora Linux 17连接时出现问题。Adb说:

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

我的udev规则(三星的第一条规则工作得很好,其次是macros达电而不是):

 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 

我一直在尝试所有的答案在类似的线程wthout运气: 使用HTC野火的android开发

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

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

一切工作:)

造成这个问题的原因是系统权限(谢谢@ IsaacCisneros对于这个build议)。 不知何故HTC Wildfire(也可能是其他公司)需要比三星设备更多的东西。 简单的解决scheme是以root身份运行Eclipse,但这对于像Fedora这样的非sudo Linux系统来说并不是很舒服。

我发现了另一种实现相同目标的方法,它似乎更加用户友好,并且具有较小的安全漏洞,然后以超级用户权限运行整个IDE。 介意这只是解决问题的方法。 系统根用户应该尽量减lesspipe理任务,并且“adb”被devise为与没有SUID的普通用户帐户一起工作。 尽pipeSUID的适当设置是相当安全的,但每一次许可增加都是一个潜在的系统安全漏洞。

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,尽pipe您将使用普通的用户帐户。 您可以像普通用户那样运行Eclipse,并且您的HTC应该被正确地发现。

 ./adb devices List of devices attached HT0BPPY15230 device 

我有一个类似的问题:

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

(没有任何返回)

解决它

好。 那么有什么解决办法?

添加规则

创build一个包含以下行的文件/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 

你udev规则似乎是错的。 我用这个,它工作:

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

ATTR而不是SYSFS

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

解决scheme与Leon相同

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

斯蒂芬的答案有效(使用sudo adb kill-server),但这是暂时的。 必须在每次重新启动后重新发布。

对于永久解决scheme,必须修改udevconfiguration:

Witrant的答案是正确的想法(从Android官方文档复制)。 但这只是一个模板。 如果这不适用于您的设备,则需要填写设备的正确设备ID。

lsusb

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

在列表中find您的Android设备。

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

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

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

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

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

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

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

lsusb将帮助find总线号码和设备地址。 请注意,如果您重新插入设备地址,设备地址将会改变,如果端口对于使用哪个速度(例如,一个物理端口在一个逻辑总线或另一个逻辑总线上结束)感到困惑,那么总线编号也可能会改变。

一个lsusb线看起来类似于这样的:Bus 001 Device 115:ID 4321:fedc bla bla bla

lsusb -v可能会帮助你find设备,如果“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是未知的,你甚至不会得到“没有权限”。

我会在这里附上这个附注,所以在我以前的解释中不会迷路。

通过将USB连接types从相机(PTP)更改为媒体设备(MTP),我可以可靠地生成并解决无权限问题。 相机模式允许debugging; 媒体模式导致ADB中的无权限响应。

经过一会儿的思考之后,这个推理就显得相当明显了。 媒体服务器模式下,debugging器可以访问设备上的不安全内容。

===========

直到您接受debugging设备上的RSAencryption警告为止,设备才被允许使用。 连接后的某一时刻,设备会要求接受debugging连接。 这是一个最低限度的安全协议,确保您可以在最初的刷卡locking之外访问设备。 开发者模式需要启用,我相信。

“no permissions”标志实际上是adb将设备识别为有效的debugging目标的良好的第一指示器。 注意它没有列出你的其他USB设备。

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

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

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

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

以上所有build议,虽然有效,以确保您的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连接重build密钥文件。 有些设备会要求重新授权。

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

改变USB模式从手机对我来说是诀窍。 (我将它设置为文件传输)

我今天遇到同样的问题。

我遵循官方的指示 ,但我没有注意到我应该运行命令
“chmod a + r /etc/udev/rules.d/51-android.rules”

我把这个文件设置为世界可读,然后重新插入我的USB电缆,状态就变成了未经授权的。 然后只是授予权限,一切顺利。

这个问题的另一个可能的来源是USB共享。 如果您使用USB绑定,请将其closures,然后从USB上拔下设备的电源插头,然后重新插入

 adb kill-server adb devices 

这在我的情况下(Ubuntu 12.04,Nexus S,家庭目录中的SDK,绝不需要root来启动它)的窍门。 但是,根据您的设备,您可能需要以root身份运行adb devices

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

我同意Robert Siemer和MichaëlWitrant的意见 。 如果它不工作,尝试用strace进行debugging

 strace adb devices 

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

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

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

这比在/usr/bin/adb上设置SUID位更可取,而且可以将可以使用adb的用户限制到userNameroot

答案是在这里的各种职位编织,我会尽我所能,但它看起来像一个非常简单明显的原因。

1)是在udev规则中通常有一个“user”variables,像USER =“your_user”,可能正好在GROUP =“plugdev”之后

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

3)我还没有想出如何51 adb.rules和99 adb.rules是不同的或为什么。

4)也许尝试用“usermod -a -G plugdev your_user”添加“plugdev”组给你的用户,尽pipe这样做风险自负,尽pipe我认为它不会比以root启动一个gui更为重要,但是我相信如果有必要的话应该至less用“gksudo eclipse”代替。

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

  1. closures正在运行的adb ,可能会closures正在运行的android-studio。

  2. 列表设备,

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

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

在THL W100上运行设备(如上所述)只能与共享function一起使用(我使用的是AirDroid)。

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

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

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

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