我正在开发一个使用 tcpdump 获取网络数据的项目。为了简化问题,让我们用我编写的脚本替换 tcpdump。
#!/system/bin/sh
while :
do
echo print out from socket
sleep 1
done
我把它放在手机上的/system/xbin/echo_test下
-rwxr-xr-x root root 70 2017-02-08 12:15 echo_test
因此,当我输入命令“echo_test”时,它会不断打印出“从套接字打印”来模拟数据。
现在真正的事情是,要从服务运行此脚本并在手机启动时通过套接字传输数据,我获取了启动映像并修改了 ramdisk。
在 init.rc 文件中,我添加了以下几行。
service echo_test /system/xbin/echo_test
user root
group root
class late_start
seclabel u:r:init:s0
socket echo_test stream 0666 system system
在 file_contexts 文件中,我添加了带有现有 SELinux 上下文的套接字文件。
/dev/socket/echo_test u:object_r:logd_socket:s0
我选择 logd_socket 因为似乎有一个现有的 logd 套接字文件(如果我在这里做错了,请告诉我......)
/dev/socket/logd u:object_r:logd_socket:s0
然后我重新打包启动镜像并闪回手机。手机启动没有任何问题。但是当我使用 netcat 测试套接字时,我收到“连接被拒绝”错误。当我尝试从 Java 访问套接字时,我遇到了同样的错误。
root@hammerhead:/ # netcat -U /dev/socket/echo_test
Ncat: Connection refused.
Netcat 在其他 Unix 域套接字上表现良好,
root@hammerhead:/ # netcat -U /dev/socket/logd
500 Command too large for buffer
检查 kmsg 只给我这一行:
root@hammerhead:/ # cat /proc/kmsg | grep echo_test
<5>[ 3.409779] init: Starting service 'echo_test'...
Netstat 还显示套接字处于活动状态。
root@hammerhead:/ $ netstat | grep echo_test
unix 2 [ ] STREAM 6360 /dev/socket/echo_test
这是套接字文件权限,
srw-rw-rw- system system u:object_r:logd_socket:s0 echo_test
我在这里缺少什么?提前致谢。
edit:
我使用的是 Android 6.0.1 的 Nexus 5