我遇到了一些问题,我有一个脚本应该在启动时启动 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=
在您的单元文件中要放什么。