Simple-Tracker / qBittorrent-ClientBlocker

一款适用于 qBittorrent/Transmission (Beta)/BitComet (Beta, Partial) 的客户端屏蔽器, 默认屏蔽包括但不限于迅雷等客户端. A client blocker compatible with qBittorrent/Transmission (Beta)/BitComet (Beta, Partial) which is prohibited to include but not limited to clients such as Xunlei.
MIT License
1.02k stars 26 forks source link

建议使用基于用户权限的 Systemd 配置 #9

Closed amefs closed 8 months ago

amefs commented 8 months ago

在添加了指定配置文件的参数后,完全可以在用户权限下运行该程序。以下是一个新的 Systemd unit 示例

sudo tee /etc/systemd/system/qbittorrent-clientblocker@.service >/dev/null <<EOF
[Unit]
Description=qBittorrent-ClientBlocker service
Wants=network-online.target
After=qbittorrent-nox.service

[Service]
Type=simple
Restart=always
User=%I
WorkingDirectory=/home/%I/.config/qBittorrent-ClientBlocker/
ExecStart=/usr/local/bin/qBittorrent-ClientBlocker -c /home/%I/.config/qBittorrent-ClientBlocker/config.json

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl start qbittorrent-clientblocker@${whoami}
sudo systemctl enable qbittorrent-clientblocker@${whoami}
Simple-Tracker commented 8 months ago

很好的配置, 有几点疑惑:

  1. 若是指定 WorkingDirectory 的话, -c 参数是否有些不太必要?;
  2. 在我的 AlmaLinux 机器上, 若是由 root 用户运行的话, /home/root 目录是不存在的, 这也许会影响服务运行;
  3. 若是不手动指定 user 的话, 能否为其设定一个默认值 (如 nobody 等);

若将配置文件放在 /etc/qBittorrent-ClientBlocker/ 下, 并在 /tmp/qBittorrent-ClientBlocker/ 下运行的话 (日志默认跟随 WorkingDirectory), 或许可以解决 root 用户的问题, 但这对普通用户来说可能不合理? (另: 若该配置与原有配置文件共存的话, 没有此问题, 已追加至 Wiki, 同时出于用户友好的角度已将所有 Systemd 的命名转化为小写)

amefs commented 8 months ago
  1. 确实,在此次修改逻辑后只需要用 WorkingDirectory 即可同时解决 configlogs 的路径问题。
  2. 根据你的说明我认为比较好的方案是分两种情况。这是因为 systemd 用户权限只能用 --user,root 权限下则无法使用 --user:
    • 普通用户权限:
mkdir -p ~/.local/share/systemd/user/
tee ~/.local/share/systemd/user/qbittorrent-clientblocker.service >/dev/null <<EOF
[Unit]
Description=qBittorrent-ClientBlocker service
Wants=network-online.target
After=qbittorrent-nox.service

[Service]
Type=simple
Restart=always
WorkingDirectory=%h/.config/qBittorrent-ClientBlocker/
ExecStart=/usr/local/bin/qBittorrent-ClientBlocker

[Install]
WantedBy=multi-user.target
EOF

启动参数

systemctl --user daemon-reload
systemctl --user start qbittorrent-clientblocker.service
systemctl --user enable qbittorrent-clientblocker.service

[Service] Type=simple Restart=always WorkingDirectory=%h/.config/qBittorrent-ClientBlocker/ ExecStart=/usr/local/bin/qBittorrent-ClientBlocker

[Install] WantedBy=multi-user.target EOF


  启动参数

```bash
systemctl daemon-reload
systemctl start qbittorrent-clientblocker.service
systemctl enable qbittorrent-clientblocker.service
Simple-Tracker commented 8 months ago

谢谢! 已经提交至 Wiki! (另: 原有实例化配置仍保留, 但稍做修改)

Simple-Tracker commented 8 months ago

systemd[1]: /etc/systemd/system/qbittorrent-clientblocker.service:9: Neither a valid executable name nor an absolute path: cd //.config/qBittorrent-ClientBlocker/ && /usr/local/bin/qBittorrent-ClientBlocker 经过测试, 使用 %h 会在部分系统引起 Root 目录为根目录的情况, 原因不明, 导致使用时因工作目录找不到出现如下错误: (code=exited, status=200/CHDIR)

由于工作目录不能设定为相对目录, 即使使用包含用户的字符串也是如此 (~%u/.config/qBittorrent-ClientBlocker/), 故还是回到修改 ExecStart 以期解决此问题. 因此现时配置文件将更改为如下:

[Unit]
Description=qBittorrent-ClientBlocker service
Wants=network-online.target
After=qbittorrent-nox.service

[Service]
Type=simple
Restart=always
ExecStart=/bin/sh -c "/usr/bin/cd ~%u/.config/qBittorrent-ClientBlocker/ && /usr/local/bin/qBittorrent-ClientBlocker"

[Install]
WantedBy=multi-user.target

(cd ~%u 同样可起到进入用户工作目录的作用, 是一种 workaround)