种子下载完成后传输将不会运行 shell 脚本
Posted
技术标签:
【中文标题】种子下载完成后传输将不会运行 shell 脚本【英文标题】:Transmission will not run shell script after torrent download completed 【发布时间】:2014-12-05 22:11:05 【问题描述】:我希望让传输 bittorrent 客户端执行一个脚本,在种子下载完成时更改已完成文件夹中所有种子的所有者和权限。
我在 /etc/transmission-daemon/settings.json 中使用了以下相关设置:
"download-dir": "/data/transmission/completed",
"script-torrent-done-enabled": true,
"script-torrent-done-filename": "/home/user/script.sh",
种子完成后脚本似乎没有执行,我知道除了脚本本身的内容之外还有其他问题。脚本文件的所有者是 debian-transmission,我的权限设置为 777,所以传输访问脚本应该没有问题,除非我在这里遗漏了什么。
/home/user/script.sh 文件如下:
#!/bin/bash
echo sudopassword | /usr/bin/sudo -S /bin/chmod -f -R 777 /data/transmission/completed
echo sudopassword | /usr/bin/sudo -S /bin/chown -f -R user /data/transmission/completed
我知道以这种方式使用 sudo 命令是一种糟糕的形式,但我可以自己执行脚本并且它会正常工作。我不确定为什么传输不执行脚本。传输支持一些环境变量,例如 TR_TORRENT_NAME,一旦脚本被触发,我想使用它们。我没有在文件中设置什么会阻止脚本正常工作以及我将如何使用环境变量?
【问题讨论】:
脚本是否设置为可执行? 您的主文件夹的权限如何。例如,如果它是750
,那么赋予脚本的权限就无关紧要了。至于环境变量,你应该可以在你的脚本中使用它们......例如chmod 777 /data/transmission/completed/$TR_TORRENT_NAME
。
我将脚本移动到 /etc/transmission-daemon 并能够确认脚本正在触发,在脚本中放置一个简单的触摸命令。但是,它似乎不适用于“/bin/echo sudopassword | /usr/bin/sudo -S /bin/chmod -f -R 777 /data/transmission/completed”命令。由于任何其他权限设置,脚本是否无法对文件夹执行操作?
啊!好的,这是很好的故障排除。使用sudo -s
,您是否在回显密码的末尾包含换行符,例如:echo "password\n" | sudo -s <command>
?
chmod 777
是一个可怕的想法;它甚至可以让不受信任的帐户修改您的其他帐户正在执行的脚本;实际上,它完全破坏了系统的安全模型——在从 Internet 下载不受信任内容的机器上,您最不想做的事情。
【参考方案1】:
我可能会在这里回答一个不同的问题,但如果您只是为了获得传输守护进程向您的用户下载的写入权限,请尝试不同的方法。
我正在使用我的用户名运行我的传输守护程序,正如它在systemd
服务文件中设置的那样。 (在我的情况下为/etc/systemd/system/multi-user.target.wants/transmission-daemon.service
)
[Unit]
Description=Transmission BitTorrent Daemon
After=network.target
[Service]
User=myuser # set user here
Group=mygroup # set group here :)
UMask=0022 # 0022 gives 644 permissions on files (u+w), 0002 gives 644 (g+w), 0000 gives 666 (a+w)
Type=notify
ExecStart=/usr/bin/transmission-daemon -f --log-error
ExecStop=/bin/kill -s STOP $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
注意 User
、Group
和 UMask
(大写 M)指令。
见Execution environment configuration for Systemd manpage。
然后运行:
sudo chown -fR user /data/transmission/completed
sudo systemctl daemon-reload
sudo service transmission-daemon restart
你应该设置:)
【讨论】:
【参考方案2】:将执行脚本的用户添加到具有默认sudo访问权限的组。
Fedora - 将用户添加到wheel
组
sudo usermod -aG wheel $(whoami)
Ubuntu - 用户组:sudo
或 admin
(已弃用)
【讨论】:
传输也可以作为用户执行:传输sudo cat /etc/passwd | grep transmission
以上是关于种子下载完成后传输将不会运行 shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章
将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法
将 stdout 和 stderr 管道传输到 shell 脚本中的两个不同进程?