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设备。
以下和相关页面的详细信息。
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
的用户限制到userName和root 。
答案是在这里的各种职位编织,我会尽我所能,但它看起来像一个非常简单明显的原因。
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规则的语法对我来说也有点神秘,但是从我所听到的,对于不同的系统可能会有所不同,所以尝试一些事情,一次吃掉一次,注意什么是变化。
-
closures正在运行的
adb
,可能会closures正在运行的android-studio。 -
列表设备,
/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