为什么我不能以 /bin/false 作为登录 shell 的用户身份运行命令?

Ass*_*lov 2 shell login su

我附加到已经使用此命令创建用户的 docker 映像:

RUN useradd -r -u 200 -m -c "nexus role account" -d /nexus-data -s /bin/false nexus
Run Code Online (Sandbox Code Playgroud)

我想以该用户身份运行命令,但什么也没发生。试图解决这个问题,我发现我无法使用 /bin/false 作为登录名的用户运行任何东西:

# useradd xxx
# su xxx -c 'ls >>/t/t1'
# ls /t
t1
# useradd -s /bin/false
# su xxx1 -c 'ls >>/t/t2'
# ls /t
t1
Run Code Online (Sandbox Code Playgroud)

我原以为在没有-. 我用谷歌搜索,我发现如果我添加-s /bin/bash,我可以运行命令,但为什么会这样?该-选项是su的意思是“使用登录shell”,为什么是登录shell相关的不-

Ste*_*ris 8

如果不指定-sor--preserve-environment则使用目标用户的 shell。在您的示例中,这将运行/bin/false -c 'ls >> /t/t2',当然,它不会运行任何有用的东西。

“登录外壳”具有特定含义,会导致正常外壳,例如shbash运行登录脚本,例如.profile.