需要操作系统启动协助的身份验证

需要操作系统启动协助的身份验证

是否可以在启动时设置身份验证?如果身份验证失败,设备将重新启动。身份验证可以是任何内容,例如系统身份,例如 Mac ID。

答案1

这取决于您所说的启动是什么意思,但最有可能的是,您可以通过在 systemd 中添加自定义条目来实现。
https://www.freedesktop.org/wiki/Software/systemd/-systemd 维基。
https://wiki.archlinux.org/index.php/systemd#Writing_unit_files- 有关 systemd 的 arch wiki 条目。


设法创建与您的要求相近的服务,并添加解决方案。

免责声明:我已经在 Ubuntu MATE 17.04 中实现并测试了此过程。它应该可以在 16.04 或更高版本中运行,但在旧版本中可能会出现问题。同样值得注意的是,systemd 也没有在更早版本的 Ubuntu 中使用。

创建 bash 脚本,通过检查特定 USB 设备是否已连接来执行我们的身份验证检查。

首先,我们需要创建 bash 脚本来执行“身份验证”检查。以下是根据连接的 USB 设备 ID 执行检查的脚本示例:

#!/bin/bash
# test usb auth script
CHECKID="0461:4de3"
READID=$( lsusb -d "$CHECKID" | awk '{print $6}' )
wait
printf "Required: ${CHECKID} \nObtained: ${READID}\n"
if [ "$CHECKID" == "$READID" ]
then
    echo "Usb-auth check passed!"
else
    echo "Usb-auth check failed!"
    echo 'Calling for shutdown...'
    shutdown 0
fi

CHECKID包含设备制造商和设备本身的预定义 ID。
READID变量将获得执行包含在内的命令的结果$( ),在本例中为lsusb -d "$CHECKID" | awk '{print $6}'
lsusb -d "$CHECKID"将尝试查找 ID 保存在 $CHECKID 变量中的设备,而awk '{print $6}'将解析结果以仅保存结果行中的第 6 个字。例如,lsusb -d "0461:4de3"在我的系统中返回以下内容:
Bus 002 Device 003: ID 0461:4de3 Primax Electronics, Ltd
此输出中的第 6 个字恰好是设备 ID。
wait调用将告诉脚本等到我们之前的任何子命令完成后再进行比较。
printf仅用于日志记录\调试目的。
if [ "$CHECKID" == "$READID" ]是实际运行检查的地方。在与进行比较时CHECKIDREADID如果它们相等,则我们通过了检查,否则我们没有通过并且将执行关机。

逐步过程:

1.创建 bash 脚本文件。
在具有 root 权限的情况下导航到/usr/local/bin(如果您使用的是 nautilus\caja,则可以打开/usr/local,右键单击“bin”文件夹并使用“以管理员身份打开”选项)。此文件夹用于查找系统范围的自定义脚本。可以/home/[user]/bin改为在创建本地用户脚本。创建空文件并使用您喜欢的文本编辑器打开它。用您的检查脚本填充它,例如,我将使用上面的 USB 设备检查:

#!/bin/bash
# test usb auth script
CHECKID="0461:4de3"
READID=$( lsusb -d "$CHECKID" | awk '{print $6}' )
wait
printf "Required: ${CHECKID} \nObtained: ${READID}\n"
if [ "$CHECKID" == "$READID" ]
then
    echo "Usb-auth check passed!"
else
    echo "Usb-auth check failed!"
    echo 'Calling for shutdown...'
    #shutdown 0
fi  

我使用“#”注释掉实际的关机调用,以防止在设置和测试期间关机。为了简化示例,我们假设脚本已命名usb-auth且完整路径为/usr/local/bin/usb-auth。我将在后续步骤中使用它,因此如果您使用不同的文件名或路径,请务必修改它们。

2.赋予你的脚本执行权限。 您可以通过运行命令来执行此操作sudo chmod +x [file],就我而言,它是:
sudo chmod +x /usr/local/bin/usb-auth

3. 找出您想要使用的设备的 ID。

要列出连接到系统的 USB 设备,您可以使用命令lsusb。连接您的 USB 设备,运行命令,断开设备,lsusb再次运行,检查现在缺少哪个设备,将CHECKID脚本中的变量替换为您的设备变量。
这是我执行此命令的部分输出:

lsusb
Bus 002 Device 006: ID 0480:b206 Toshiba America Inc 
Bus 002 Device 005: ID 8086:0189 Intel Corp. 
Bus 002 Device 004: ID 0b38:0010 Gear Head 107-Key Keyboard
Bus 002 Device 003: ID 0461:4de3 Primax Electronics, Ltd 

在这种情况下,设备 003 是我的鼠标,它将用于我们的检查,因此我们需要 ID“0461:4de3“。得到它之后,我们可以将它存储在我们的脚本中作为检查的基础,在以下行中:
CHECKID="0461:4de3"

4. 在终端中检查您的脚本以确保它按预期工作。
确保在测试期间注释掉关机调用。只需在终端中输入脚本的名称,它就会自动拾取它,因为我们将其定位在“/usr/local/bin/”中。
检查连接的设备:

ethuil~$ usb-auth 
Required: 0461:4de3 
Obtained: 0461:4de3
Check passed!

断开设备,再次检查:

ethuil~$ usb-auth 
Required: 0461:4de3 
Obtained: 
Check failed!
Executing shutdown...

在确保脚本在运行系统中按预期工作后,我们可以开始创建服务并在实际系统启动时执行初步检查。

创建 systemd 服务来调用 bash 脚本

5. 创建服务文件并将其定位在 /etc/systemd/system/
您需要再次获得 root 权限。创建扩展名为 的空文件.service,我将我的命名为auth-usb.service
使用文本编辑器打开它并填充如下内容:

[Unit]
Description=usb-auth bash script
After=network-online.target

[Install]
WantedBy=sysinit.target

[Service]
ExecStart=/bin/bash /usr/local/bin/usb-auth
Type=oneshot
RemainAfterExit=yes  

分解一下这部分:

Description- 当 systemd 尝试启动此服务时,您将在 systemd 日志或控制台中看到此内容。

After- 此属性指定我们需要在哪个服务之后启动我们的脚本。在此示例中,我们有“network-online.target”,这意味着我们的脚本仅在网络联机后才会启动。如果您的脚本使用受其他服务影响的系统部分(例如此示例中的网络连接),则此部分可能很重要。您可以使用命令列出所有主要目标服务:
systemctl list-units --type=target
如果您希望在运行脚本时启动特定服务,则可以使用命令列出所有服务:
systemctl list-unit-files

WantedBy- 这是重要的部分,它将定义我们的服务将在何时被调用。通常,自定义脚本将使用“WantedBy=multi-user.target”并在系统启动并完全工作后运行。在我们的例子中,我们将使用“sysinit.target”使其在系统初始化期间运行。如果您想在不同时间运行脚本,您可以使用systemctl list-units --type=target与之前相同的方法列出可能的值。在我的例子中,我将坚持使用“sysinit.target”。

关于 [Unit] 和 [Install] 部分的更多信息:
https://www.freedesktop.org/software/systemd/man/systemd.unit.html#%5BUnit%5D%20Section%20Options

ExecStart- 在这里我们告诉您我们到底想要运行什么服务。“/bin/bash”将执行 bash 解释器,并且“/usr/local/bin/usb-auth”作为参数传递以告诉它要运行的脚本的位置。如果您计划不使用 bash 脚本,而是使用实际的自制程序,则可以指定程序的路径而不是“/bin/bash *”。
Type=oneshot- 这是我们服务的类型。 RemainAfterExit=yes- 这部分告诉系统将把我们的服务视为活动服务,即使所有调用的进程都已退出。

关于不同类型和[服务]部分的更多信息:
https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=

6.启用我们新创建的服务。
现在我们创建了/etc/systemd/system/auth-usb.service/usr/local/bin/usb-auth文件,我们可以通过运行命令来启用我们的服务systemctl enable [service filename]

ethuil~$ systemctl enable auth-usb.service
Created symlink /etc/systemd/system/sysinit.target.wants/auth-usb.service → /etc/systemd/system/auth-usb.service.

有关systemctl命令的更多信息:
https://www.freedesktop.org/software/systemd/man/systemctl.html#start%20PATTERN%E2%80%A6
7.检查我们的服务是否正常运行。
运行命令systemctl restart auth-usb.service来运行我们的检查服务。
完成后,使用命令检查日志以查看它是否按预期工作journalctl -u auth-usb
就我而言:

ethuil~$ systemctl restart auth-usb.service
ethuil~$ journalctl -u auth-usb
-- Logs begin at Tue 2017-07-25 19:15:23 EEST, end at Tue 2017-07-25 19:15:52 EEST. --
Jul 25 19:15:49 ethuil-300E5Z systemd[1]: Starting usb-auth bash script...
Jul 25 19:15:49 ethuil-300E5Z bash[1262]: Required: 0461:4de3
Jul 25 19:15:49 ethuil-300E5Z bash[1262]: Obtained: 0461:4de3
Jul 25 19:15:49 ethuil-300E5Z bash[1262]: Check passed!
Jul 25 19:15:52 ethuil-300E5Z systemd[1]: Started usb-auth bash script.

如果脚本存在一些问题,现在是时候修改它并确保它按预期工作了。

8. 重新启动系统并查看它是否按预期在系统启动期间启动。 不言自明。只需重新启动 PC 并运行,journalctl -u auth-usb即可查看服务是否正常运行。如果在启动过程中某些功能与在完全运行的系统期间不同,您可以通过重新启动并检查日志来检查它。您还可以运行journalctl -t systemd以查看您的服务在系统启动的哪个时间点启动,并查看是否需要更改它。

9. 取消注释脚本中的“shutdown”命令
取消注释检查失败时应运行的脚本部分,然后重新启动系统以查看检查脚本是否有效。这是最终检查,尝试在连接和不连接设备的情况下运行 PC,以查看它是否正常工作。如果您无法自行通过检查,请确保您有访问脚本的方法,例如,通过在系统中使用外部 USB 记忆棒,您可以从中加载和修改脚本。

10. 就这样,我们完成了。现在您可以改进流程以满足您的个人需求。
此时,您可以修改整个过程以满足您的需求。制作更复杂的 bash 脚本或创建功能齐全的程序,使其检查您将设备连接到哪个 USB 端口,执行其他操作而不是关机(例如,静默记录未经授权的活动,而不仅仅是关机)等。无论如何,这超出了这个答案的范围。我确实尝试过让它与 MAC 地址一起工作,这是可能的,但我当前的设置没有正确和可靠的方法来正确和稳定地测试它,所以我没有包括那个例子。

相关内容