编写 Bash 脚本以在登录时出错时注销。需要指导

Writing Bash Script to Log Out if Incorrect upon Login. Need guidance

我正在尝试编写一个 Bash 脚本,如果用户无法获得安全问题,它将注销用户。

我需要找到一个数组或多个 if 条件来反映这一点。我知道有很多子内容,例如停止任何覆盖输入(CTRL+Z 等)。

以下是我目前使用的脚本,但出现以下错误。我不想要答案,只想要寻找的方向。在这种情况下,它甚至不会提示安全问题,只是直接注销 root 用户。

./txtscript: line 13: [: =: unary operator expected

#!/bin/bash

echo "What is your name?"
read ISNAME
if [ $ISNAME = "root" ];
then
    echo "Nice to meet you, root."
    echo "Login as root" | mail -s "Login for root" root
    echo "Next for the Security Question! "  
fi

echo "What is the codename?"
if [ $codename = "Cole Server" ];
then
    echo "Hello, Welcome"
else
    echo "Away from me, Not Root"
    echo "Unauthorized" | mail -s "INTRUDER ALERT" root
    pkill -KILL -u $ISNAME;
fi

*****更新*******

好的,我已经修复了那个部分。现在脚本具有以下内容。

回声"What is the codename?" 阅读代码 如果 [ $CODENAME = "Cole Server" ]; 然后

当我 运行 脚本时,出现错误“./txtscript: line 14: [: =: unary operator expected]

第 14 行是:if [ $CODENAME = "Cole Server" ];

总的来说,我什至没有找到一个很好的 website/article 来真正解释一元运算符预期的错误,所以我不知道它是什么意思。非常感谢任何帮助。

嗯,问题是$codename没填

所以第 13 行是 运行:

if [ = "Cole Server" ];  # note: the $codename was expanded to emptiness

你想在脚本中写的是:

if [ "$codename" = "Cole Server"];

这将评估为

if [ "" = "Cole Server"];

这至少在语法上是有效的。您仍然需要实际分配给 codename 某个地方,您目前没有这样做。

但是,我认为这整个方法可能是错误的。 您正在为他们提供交互式 bash 会话,他们可以在那里做各种事情 - 例如按 Ctrl+Z 暂停它。

作为一个有趣的小游戏,这很好,但如果你想做严肃的安全,我担心 (:

我也将读取的 $CODEAME 设置为不是 $CODENAME,这是导致问题的原因。

这是固定的并且工作完美。现在我将实施一个陷阱命令来阻止人们试图绕过脚本..

如果有人有任何资源或示例陷阱来阻止 CTRL C、CTRL Z 和 SIG 术语,请告诉我!