全志R329 Tina中如何使用adb/串口密码登录?
本回答来源链接:全志R329 Tina中如何使用adb/串口密码登录?
如果需要在adb shell密码登录命令行终端,可按以下步骤进行操作。
/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。
文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
adb 设置密码登录,操作如下:
1、创建密码:
这个操作可通过 makepasswd 工具创建,命令如下:
makepasswd --clearfrom=- --crypt-md5 <<< YourPass
eg:
usr # makepasswd --clearfrom=- --crypt-md5 <<< allwinner
allwinner $1$z6v447Dx$HH4Ytv0Hvi5MfxVgQ6uSE.
2、填充 /etc/shadow 文件:
在 target/allwinner/方案名/base-file/etc/shadow 文件中,添加如下信息,第二字段的信息就是上述 makepasswd 创建的密码密文:
root:$1$z6v447Dx$HH4Ytv0Hvi5MfxVgQ6uSE.:1:0:99999999999:7:::
3、修改 adb_shell 文件:
在 tina/package/utils/adb 目录下,修改当前目录的 adb_shell 文件,将该文件的 /bin/sh 替换为 /bin/login;
4、执行 make menuconfig
在 Base system —> <> busybox —> Login/Password Management Utilities —> [] login,按照上述路径选上 login;
5、重新编译烧写固件
adb shell命令之后将会需要输入用户名和密码,上述的例子,用户名为:root,密码为:allwinner;
注意:上述的操作,只是 adb shell 需要登录密码,在串口端仍不需要登录密码。
串口端也进行密码登录的操作
如果在串口端也需要进行相应的密码登录验证,需要修改 /etc/inittab 这个文件。在 target/allwinner/方案名/base-file/etc 目录下存在 inittab 文件,原文件如下:
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askconsole:/bin/ash --login
修改为
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askconsole:/bin/login
使串口终端通过 login 登录,注意,这个一样需要 login 的支持,所以 busybox 需要选上 login(参照上述adb的第 4 点选上 login)。
通过公私钥的加密验证方式登录 adb 终端
ubuntu 系统,~/.ssh 目录下,会存在一个 adb 使用的公私钥,分别是 id_rsa.pub 和 id_rsa ,而 windows 则是在系统盘的 user 目录下有 .android 目录存放公私钥。将 PC 端的公钥添加到设备端的某个路径,设备端的服务开启公私钥加密验证的方式,在使用 adb 的时候,将需要使用 PC 端的秘钥和设备端的公钥进行验证,验证通过之后才可以通过 adb 进入设备终端。
当前 Tina 系统有支持通过adb的公私钥进行验证的,patch 如下:
diff --git a/utils/adb/Makefile b/utils/adb/Makefile
index c57fc6b..28c4ddb 100755
--- a/utils/adb/Makefile
+++ b/utils/adb/Makefile
@@ -133,6 +133,9 @@ define Package/adbd_auth_service/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/auth/adbd_auth_service $(1)/bin/
+ $(INSTALL_DIR) $(1)/etc
+ $(INSTALL_DATA) ./id_rsa.pub $(1)/etc/
+
$(INSTALL_DIR) $(1)/etc/init.d
if [[ $(KERNEL_PATCHVER) == 4.* ]]; then \
$(INSTALL_BIN) ./adbd-configfs.init $(1)/etc/init.d/adbd; \
diff --git a/utils/adb/auth/Makefile b/utils/adb/auth/Makefile
index efc4816..c68e22c 100755
--- a/utils/adb/auth/Makefile
+++ b/utils/adb/auth/Makefile
@@ -22,7 +22,7 @@ $(ADB_AUTH_LIB): $(LIB_OBJS)
$(CC) -shared $(LOCAL_CFLAGS) $(LDFLAGS) -lev $^ -o $@
$(ADB_AUTH_SERVICE): $(SERVICE_OBJS)
- $(CC) $(LDFLAGS) $(SERVICE_LIB) $^ -o $@
+ $(CC) $(LDFLAGS) $(SERVICE_LIB) $^ -o $@ -lm
lib:$(ADB_AUTH_LIB)
diff --git a/utils/adb/auth/aw_adb_auth.c b/utils/adb/auth/aw_adb_auth.c
index 24519f7..9817bee 100644
--- a/utils/adb/auth/aw_adb_auth.c
+++ b/utils/adb/auth/aw_adb_auth.c
@@ -29,6 +29,37 @@ static int debug_mask = 0;
static pubkey_detector_t g_pubkey_detector_func;
static char *g_key_path = DEFAULT_KEY_PATH;
+/*
+ * Copy src to string dst of size siz. At most siz-1 characters
+ * will be copied. Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t
+strlcpy(char *dst, const char *src, size_t siz)
+{
+ char *d = dst;
+ const char *s = src;
+ size_t n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0) {
+ while (--n != 0) {
+ if ((*d++ = *s++) == '\0')
+ break;
+ }
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return(s - src - 1); /* count does not include NUL */
+}
+
void free_environment(const char *env[], int num)
{
int i;
diff --git a/utils/adb/auth/aw_adb_auth_service.c b/utils/adb/auth/aw_adb_auth_service.c
index 17a5c85..e8da189 100644
--- a/utils/adb/auth/aw_adb_auth_service.c
+++ b/utils/adb/auth/aw_adb_auth_service.c
@@ -17,7 +17,7 @@ static bool publickey_detector(const char *pubkey, int len)
{
char *ptr = NULL;
printf("get public key:\n%s\n", pubkey);
- ptr = strstr(pubkey, "forevercai");
+ ptr = strstr(pubkey, "chengwei");
if (!ptr)
return false;
return true;
@@ -35,14 +35,14 @@ int main()
printf("aw_adbd_create failed\n");
return -1;
}
- /*aw_adbd_set_key_path(handle, "/opt/adb_keys");*/
+ aw_adbd_set_key_path(handle, "/etc/id_rsa.pub");
ret = aw_adbd_start(handle);
if (ret != 0) {
printf("aw_adbd_start failed\n");
return -1;
}
- /*aw_adbd_install_pubkey_detector(publickey_detector); */
+ aw_adbd_install_pubkey_detector(publickey_detector);
aw_adbd_event_loop(handle);
printf("adbd_auth_service finish\n");
}
在上述的patch中,解析如下:
附件:FlameGraph.tar.xz (详情可查看原文链接)