在 inittab 中,我有一个如下所示的条目:
scpt:234:once:RSYNC_OPTIONS=-q /path/to/script/script.sh arg1 arg2 arg3 2>&1
但是,它失败了,因为它实际上正在尝试执行RSYNC_OPTIONS=-q
.我也尝试过:
scpt:234:once:export RSYNC_OPTIONS=-q;/path/to/script/script.sh arg1 arg2 arg3 2>&1
但这也失败了。有办法做到这一点还是我必须修改脚本?
答案1
查看Linux sysvinit实现的源代码,当它看到shell特殊字符时,它确实会运行shell,但它会exec
在字符串之前添加,这使得可以在参数中放置重定向和使用特殊字符,但不能设置环境变量这样。
} else if (strpbrk(proc, "~`!$^&*()=|\\{}[];\"'<>?")) { /* See if we need to fire off a shell for this command */ /* Give command line to shell */ args[1] = SHELL; args[2] = "-c"; strcpy(buf, "exec "); strncat(buf, proc, sizeof(buf) - strlen(buf) - 1); args[3] = buf; args[4] = NULL;
一个简单的解决方案是运行env
.
scpt:234:once:env RSYNC_OPTIONS=-q /path/to/script/script.sh arg1 arg2 arg3 2>&1
一些可能的解决方法来说明如何运行任意命令:
scpt:234:once:>&1; RSYNC_OPTIONS=-q exec /path/to/script/script.sh arg1 arg2 arg3 2>&1
scpt:234:once:2>&1; RSYNC_OPTIONS=-q exec /path/to/script/script.sh arg1 arg2 arg3