如果 stdin 被重定向,为什么 su 会要求输入密码?我该如何避免这种情况?

如果 stdin 被重定向,为什么 su 会要求输入密码?我该如何避免这种情况?

我正在使用(对这个问题的目的su不感兴趣)并观察以下行为:sudo

$ su USER -s /bin/bash -c "echo hi"
hi
$ printf "" | su USER -s /bin/bash -c "echo hi"
Password: su: Authentication failure
$ su USER -s /bin/bash -c "echo hi" < /dev/null
Password: su: Authentication failure
$ su USER -s /bin/bash -c "echo hi" < /dev/tty
Password:
$ su USER -s /bin/bash -c "echo hi" < /dev/tty1
hi

我一生都不明白为什么标准输入的重定向会导致出现密码提示。我su在 stdin 已经重定向的上下文中 使用,所以我无法避免这种情况。

这是什么原因,如何避免sustdin 重定向时出现提示?

答案1

为了澄清,OP 评论说 USER 帐户没有设置密码。

man pam_unixpam_unix是下面引用的模块):

努洛克

该模块的默认操作是如果用户的官方密码为空,则不允许用户访问服务。 nullok 参数会覆盖此默认值,并允许任何具有空白密码的用户访问该服务。

nullok_secure

此模块的默认操作是,如果用户的官方密码为空,则不允许用户访问服务。nullok_secure 参数会覆盖此默认设置,只要 PAM_TTY 的值设置为 /etc/securetty 中的值之一,即可允许任何使用空密码的用户访问服务。

我猜您的 PAM 设置正在使用nullok_secure. Debian 10 就是这种情况。

只需替换nullok_securenullok即可使其工作。在 Debian 上/etc/pam.d/common-auth,不同的 Unix 或 Linux 发行版可能会将其放在其他地方(例如,在特定文件中su

附加说明:为了使命令在使用时无需密码就能成功nullok_secure,它需要在存​​在于中的 TTY 上运行/etc/securetty 或者缺少/etc/securetty(这使得语句“PAM_TTY 设置为 /etc/securetty 中找到的值之一”始终为真)。如果没有 TTY,这将无关紧要并且总是会失败。

相关内容