悄悄地在脚本中更改Linux密码

Joe*_*hew 5 unix linux bash shell passwd

作为尝试在root ssh会话中实施安全措施的一部分,我试图设计一种在root用户登录n秒后启动脚本的方法,并更改用户密码并自动注销用户。

我陷入尝试静默更改密码的困境。我有以下代码:

echo -e "new\nnew" | passwd -q
Run Code Online (Sandbox Code Playgroud)

这不是在手册页中提到的“悄悄地”更改密码,而是输出:

~/php-pastebin-v3 #echo -e "new\nnew" | passwd -q
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
Run Code Online (Sandbox Code Playgroud)

这没有太大帮助。

我尝试使用stdout和stderr进行管道传输,但是我认为我对管道传输有误解。

~/php-pastebin-v3 #echo -e "new\nnew" | passwd -q > /dev/null
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

~/php-pastebin-v3 #echo -e "new\nnew" | passwd -q /dev/null 2>&1
passwd: user '/dev/null' does not exist
Run Code Online (Sandbox Code Playgroud)

悄悄地通过脚本更改密码的正确方法是什么?

小智 5

如果您想同时重定向 stdout 和 sterr:

echo "..." | passwd &> /dev/null
Run Code Online (Sandbox Code Playgroud)

这相当于

echo "..." | passwd > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

这意味着“将 stdout 重定向到 /dev/null,然后将 stderr 重定向(重复)到 stdout”。通过这种方式,您可以将 stdout 和 stderr 重定向为 null ...但这可能还不够(我相信在这种情况下)。但理论上程序可以直接写入终端。例如这个脚本

$ cat test.sh
echo stdout
echo stderr 1 1>&2
echo stderr 2 >/dev/stderr
echo stderr 3 >/dev/fd/2
echo bad luck > /dev/tty

$ ./test.sh &> /dev/null
bad luck
Run Code Online (Sandbox Code Playgroud)

要甚至摆脱此输出,您必须强制程序在伪终端中运行,例如http://empty.sourceforge.net/。但这只是一个旁注 &> /dev/null 可以正常工作。