![Как запустить программу с измененным argv[0] с помощью оболочки busybox ash?](https://rvso.com/image/110476/%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%83%20%D1%81%20%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%20argv%5B0%5D%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8%20busybox%20ash%3F.png)
В bash
я бы просто использовал exec -a
. Как это сделать в busybox? Возможно ли это вообще, или мне придется писать свою собственную программу на C для exec(3)
прямого вызова?
решение1
Какая у вас версия busybox?https://git.busybox.net/busybox/tree/shell/ash.cЕсли покопаться, то exec
можно обнаружить где-то в строке 9352 следующий код, который, по-видимому, поддерживаетexec [-a customname] ...
execcmd(int argc UNUSED_PARAM, char **argv)
{
optionarg = NULL;
while (nextopt("a:") != '\0')
/* nextopt() sets optionarg to "-a ARGV0" */;
argv = argptr;
if (argv[0]) {
char *prog;
iflag = 0; /* exit on error */
mflag = 0;
optschanged();
/* We should set up signals for "exec CMD"
* the same way as for "CMD" without "exec".
* But optschanged->setinteractive->setsignal
* still thought we are a root shell. Therefore, for example,
* SIGQUIT is still set to IGN. Fix it:
*/
shlvl++;
setsignal(SIGQUIT);
/*setsignal(SIGTERM); - unnecessary because of iflag=0 */
/*setsignal(SIGTSTP); - unnecessary because of mflag=0 */
/*setsignal(SIGTTOU); - unnecessary because of mflag=0 */
prog = argv[0];
if (optionarg)
argv[0] = optionarg;
shellexec(prog, argv, pathval(), 0);
решение2
exec -a
поддерживается с Busybox 1.27, см. также ответы наСуществует ли POSIX-способ установки нулевого аргумента целевого приложения?как этого добиться другим способом.