我正在使用(对这个问题的目的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 已经重定向的上下文中 使用,所以我无法避免这种情况。
这是什么原因,如何避免su
stdin 重定向时出现提示?
答案1
为了澄清,OP 评论说 USER 帐户没有设置密码。
从man pam_unix
(pam_unix是下面引用的模块):
努洛克
该模块的默认操作是如果用户的官方密码为空,则不允许用户访问服务。 nullok 参数会覆盖此默认值,并允许任何具有空白密码的用户访问该服务。
nullok_secure
此模块的默认操作是,如果用户的官方密码为空,则不允许用户访问服务。nullok_secure 参数会覆盖此默认设置,只要 PAM_TTY 的值设置为 /etc/securetty 中的值之一,即可允许任何使用空密码的用户访问服务。
我猜您的 PAM 设置正在使用nullok_secure
. Debian 10 就是这种情况。
只需替换nullok_secure
为nullok
即可使其工作。在 Debian 上/etc/pam.d/common-auth
,不同的 Unix 或 Linux 发行版可能会将其放在其他地方(例如,在特定文件中su
)
附加说明:为了使命令在使用时无需密码就能成功nullok_secure
,它需要在存在于中的 TTY 上运行/etc/securetty
或者缺少/etc/securetty
(这使得语句“PAM_TTY 设置为 /etc/securetty 中找到的值之一”始终为真)。如果没有 TTY,这将无关紧要并且总是会失败。