当 su 到 ssh 会话中的另一个用户时,Android 常规用户登录会丢失组信息

Posted

技术标签:

【中文标题】当 su 到 ssh 会话中的另一个用户时,Android 常规用户登录会丢失组信息【英文标题】:Android regular user login loses group information when su to another user in an ssh session 【发布时间】:2012-12-31 16:17:51 【问题描述】:

我在做什么:

我已经构建了 GNU emacs 以在手机上本地使用。 我在手机上以守护程序模式运行 emacs,因此我随时使用 emacsclient 连接到它,以继续处理常规文件、运行进程等。

从手机终端登录时,我目前是用户10157,一切正常:

$ id

uid=10157(10157) gid=10157(10157) 组=10157(10157),1015(1015),1023(1023),1028(1028),3003(3003)

当我通过 ssh 从 PC 连接到手机时(我在手机上使用 DigiSSHd),它以普通用户 10282 的身份登录,一切正常:

$ id

uid=10282 gid=10282 组=1015(1015),1023(1023),1028(1028),3003(3003)

Emacs 运行良好等。但是,这样我无法通过 emacsclient 连接到在用户 10157 下运行的 emacs 进程。这是可取的,因为我不想启动两个 emacs 进程,因为我想继续工作包含我在用户 10157 下的 emacs 中打开的文件。

因此: $ su - 10157

好的,我可以运行 emacs 等。但是,我无法访问网络。

$ ping -c1 google.com
You must have internet permissions to use ping.  Aborting.
$ id

uid=10157(10157) gid=10157(10157) groups=10157(10157)

因此,我不再属于 3003 组,这是访问互联网所必需的,除了其他组。

为什么这个组信息会被删除,我该如何解决这个问题,这样当我在 ssh 下 su 作为这个用户时,我可以继续访问网络?

【问题讨论】:

#justsaying 多么巧合:“27ca8cd Merge “ping: remove group check” by Nick Kralevich - 14 天前”android.googlesource.com/platform/external/ping 我很确定问题出在您的超级用户应用程序上。检查我的答案。 @mcandre 而不是 I'm pretty sure it's a problem in the AndroidManifest. 【参考方案1】:

当我运行命令时:

busybox --list

我在列表中没有看到 su。

su --help

在帮助文本中显示 Superuser.apk。这意味着 su 由超级用户应用程序提供。

我按照您描述的步骤操作,我可以作为另一个用户使用,并且仍然拥有互联网权限,如下所示。

我安装了以下应用程序。

BusyBox v1.18.5-Stericson 超级用户 v3.0.7 终端模拟器 v1.0.45 SSHDroid v1.9.6

建议: 我认为问题出在您设备上的 su 上。你可以试试这个。 https://play.google.com/store/apps/details?id=com.noshufou.android.su

如果我只使用 adb shell 而不运行 SSHDroid,我仍然可以作为另一个具有 Internet 权限的用户。

注意:BusyBox id 命令并不总是显示组信息。

【讨论】:

@mcandre 我可以确认这一点。 su 二进制文件可以在 /system/bin/su/system/xbin/su 中找到,它不是 BusyBox 的一部分。您从哪里获得您的 su - Superuser、SuperSu 或其他? @appsroxcom 是的,我正在使用来自 Superuser 应用程序的 su。您能否提供一个使用用户名而不是 ID 的示例? @appsroxcom 再看看你的截图。缺少组。像这样。 i.imgur.com/9hSXwQe.png当我su - <sameuser>时,我失去了这些群体。 @mcandre,没关系。但是当你 su - 时你能 ping 或读取 sdcard 吗?我可以。 @mcandre,BusyBox id 命令在显示组信息时似乎存在问题。检查这个。 i.imgur.com/sKzHieu.png【参考方案2】:

根据su 的标准手册页(来自 linux 机器)

使用 - 时,必须将其指定为最后一个 su 选项。其他形式(-l 和 --login)没有这个限制。

基于此,试试

$ su 10157 -

【讨论】:

在我的设置中,我什至没有使用su -,我使用的是su someuser 您需要使用- 来“提供与用户直接登录时所期望的环境相似的环境。” BusyBox su -l u0_a41 删除我手机上的群组,su u0_a41 - 也是如此。【参考方案3】:

我可能在这里遗漏了一些东西,因为这似乎太明显了,但为什么不只是 'sudo -u 10157' 你的 emacs 程序呢?

您仍然可以访问网络,并且您的 emacs 可以正常工作。还是我错过了什么重要的事情?

【讨论】:

我需要保留家长的组权限,否则我将无法访问 SD 卡。可悲的是,BusyBox su 正在 Android 中删除组权限。【参考方案4】:

权限不是可以通过su -继承的环境变量。

另外,gid为hard coded,安装后无法更改与各个APP uid的关联。

10157 应该是 DigiSSHd 应用程序的 uid,因此您可以在将 AndroidManifest.xml 更改为需要正确的 permission 后尝试重建它。

您可以找到有用的东西here 和here。

BusyBox 也应如此(请参阅here)。

但是,您可以通过通过此类应用程序启用 NETWORK 访问来打开一些安全漏洞。

【讨论】:

以上是关于当 su 到 ssh 会话中的另一个用户时,Android 常规用户登录会丢失组信息的主要内容,如果未能解决你的问题,请参考以下文章

解决ssh或ftp下root用户认证失败问题

session and cookie

Linux学习笔记——su_sudo_ssh_pdsh命令

用ssh远程登录服务器时,怎么直接以root用户登录?(需要修改配置,如果不想修改,可以先用普通用户登录再su切换到root用户)

在 gitlab 管道中运行“sudo su”

当用户会话处于活动状态时使用 Laravel 5.7 中的 Auth 重定向到页面的方法