如何在启动时以 root 身份运行 bash 脚本?

如何在启动时以 root 身份运行 bash 脚本?

我遇到了一些问题,我有一个脚本应该在启动时启动 airodump-ng,但它通常只运行脚本的第一部分,仅此而已。

我尝试创建一个 systemd 服务文件并启用它,但脚本无法以 root 身份运行。

我在 arch linux 和 debian 中都尝试过这个,但是在 debian 中我选择了 init 脚本路线,但脚本仍然无法以 root 身份运行。

我的脚本:

!#/bin/bash
ifconfig wlan0 down
sleep 5
airmon-ng start wlan0
sleep 5
airodump-ng mon0

exit 0

服务文件:

[Unit]
Description=auto start airmon

[Service]
ExecStart=~/scripts/cap.sh
Type=oneshot
User=root


[Install]
WantedBy=multi-user.target

编辑*这是 systemctl status 的输出:

ap.service - auto start airmon
Loaded: error (Reason: Invalid argument)
Active: inactive (dead)

Jan 13 13:03:44 alarmpi systemd[1]: [/etc/systemd/system/cap.service:5] Executable   path is not absolute, ignoring: ~/scripts/cap.sh
Jan 13 13:03:44 alarmpi systemd[1]: cap.service lacks ExecStart setting. Refusing.
Jan 13 13:47:08 alarmpi systemd[1]: [/etc/systemd/system/cap.service:5] Executable path is not absolute, ignoring: ~/scripts/cap.sh
Jan 13 13:47:08 alarmpi systemd[1]: cap.service lacks ExecStart setting. Refusing.

答案1

日志实际上正在告诉您为什么您的服务无法启动。

它说的是服务单元不是 shell 脚本。除了一些非常专用项目,例如~服务单元中的扩展或环境变量。您传递给 的名称ExecStart必须是要运行的程序的普通绝对路径。您的名字是~/system/cap.sh,它(当然)是相对路径,而不是绝对路径。这不是 shell。 ~不是元字符。它是一个普通字符,表示名为 的当前目录的某个子目录~

systemd 拒绝接受ExecStart带有相对路径名的。并且,很明显,它拒绝启动没有有效ExecStart描述服务启动方式的服务。

修复该问题后,您需要修复脚本,以便它实际上是一个可执行的脚本。它需要具有执行权限,并且#!第一行拼写正确。还请注意,它不需要 Bourne Again shell,因此最好遵循Debian 在系统引导过程中运行的脚本中率先使用 Almquist 而不是 Bourne Again shell

您可能需要调整您的服务文件,以便它不会在系统初始化网络接口的同时摆弄网络接口。 这意味着什么取决于你的系统,因此您必须弄清楚After=在您的单元文件中要放什么。

相关内容