У меня странное поведение на моем raspberry pi.
Я написал небольшую C-программу для обновления RPi. Он просто вызывает через system() «apt-get update && apt-get dist-upgrade && apt-get upgrade && rpi-update && reboot»
С битом setuid программа будет работать как root.
Почему программа на Си? Потому что бит setuid не работает со сценариями bash.
Для суперпользователя проблем нет.
Если я запускаю программу как обычный пользователь, я получаю эту ошибку после "apt-get update" (извините за немецкую версию):
E: Unable to write to /var/cache/apt/
E: The package lists or status file could not be parsed or opened.
Бит setuid установлен, и владельцем исполняемого файла является root. Так почему у меня другое поведение?
Вот код:
основной.с:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
int status = 0;
if (status == 0) {
status = system("apt-get -y update"); }
if (status == 0) {
status = system("apt-get -y dist-upgrade");
}
if (status == 0) {
status = system("apt-get -y upgrade");
}
if (status == 0) {
status = system("rpi-update");
}
if (status == 0) {
status = system("reboot");
}
return status;
}
Makefile:
CC=gcc
TARGET=update-system
PREFIX=/usr/bin
all: main.o
${CC} -o ${TARGET} main.c
make clean
main.o: main.c
${CC} -c main.c
.PHONY: clean
clean:
rm ./*.o
install:
chown root ${TARGET}
chgrp root ${TARGET}
chmod +s ${TARGET}
mv ${TARGET} ${PREFIX}
ln -s /bin/bash ~/bin/rpi-update; PATH=~/bin:$PATH; update-system
Как сообщил @Michi, для этого предназначенsudo
. - person Andrew Henle   schedule 29.10.2015passwd
имеет очень специфическое использование и не выполняет никаких внешних программ. - person dbush   schedule 29.10.2015