오늘 DEBIAN이 설치되었으며 XXXXX 응용 프로그램이 설치되었습니다.debian의 소유자 및 사용 권한
이 응용 프로그램은 ~/.XXXXX/폴더 구성을 만듭니다.
~/.XXXXX 폴더는 root가 소유하고 있습니다. 예를 들어 변경 사항을 적용한 다음 XXXXX를 닫고 다시 열면 적용된 변경 사항이 반영되어야합니다. 그러나 채널이나 설정 변경은 즉시 잊어 버립니다.
간단한 chown 명령은 모두를 해결합니다.
나는 내 설정을 저장할 수 없을 때 약간 혼란스러워했지만 약간 파고가 문제를 보여줍니다. 그것은 조금 성가며, 내가 지금까지 설치 한 유일한 추가 어플리케이션으로, 이런 식으로 행동합니다.
이 응용 프로그램에는 관리자가 없으므로 다른 사용자에게이 문제를 해결하고 싶습니다.
은 내가 proble 데비안 /는 postinst 파일에 있음을 beleve :
set -e
setuid() {
db_get XXXXX/setuid
if [ -x /usr/bin/XXXXX ] && [ "$RET" = "false" ] ; then
if [ ! -x /usr/sbin/dpkg-statoverride ] ||\
! /usr/sbin/dpkg-statoverride --list /usr/bin/XXXXX >/dev/null; then
chown root:root /usr/bin/XXXXX
chmod u=rwx,go=rx /usr/bin/XXXXX
fi
else
if [ ! -x /usr/sbin/dpkg-statoverride ] || \
! /usr/sbin/dpkg-statoverride --list /usr/bin/XXXXX >/dev/null; then
chown root:root /usr/bin/XXXXX
chmod u=rwxs,go=rx /usr/bin/XXXXX
fi
fi
}
# Parse the option requested from XXXXX-configure
get_option() {
OPTION=`XXXXX-configure --$1 2>/dev/null | awk -F: '{ print \$2 }'`
}
suck_XXXXX_xml() {
# If XXXXX-configure was not there at Debconf, but
# /etc/XXXXX/XXXXX.xml was, then we presume that the
# administrator knew what he was doing. We will therefore suck
# this information into the Debconf database now that
# XXXXX-configure is installed.
if [ -f /etc/XXXXX/debconf.XXXXX.xml ]; then
get_option norm
db_set XXXXX/norm "$OPTION"
get_option frequencies
db_set XXXXX/frequencies-ntsc "$OPTION"
db_set XXXXX/frequencies-jp "$OPTION"
db_set XXXXX/frequencies-pal "$OPTION"
get_option device
db_set XXXXX/v4ldevice "$OPTION"
get_option vbidevice
db_set XXXXX/vbidevice "$OPTION"
get_option priority
db_set XXXXX/processpriority "$OPTION"
fi
}
### MAIN POSTINST ###
case "$1" in
configure)
# Load Debconf library
. /usr/share/debconf/confmodule
# Handle the setuid bit.
setuid
# Load /etc/XXXXX/XXXXX.xml into Debconf, if necessary
suck_XXXXX_xml
# Try to set the /var/run/XXXXX directory to video group
if [ -d /var/run/XXXXX ] ; then
if [ ! -x /usr/sbin/dpkg-statoverride ] || \
! /usr/sbin/dpkg-statoverride --list /var/run/XXXXX >/dev/null; then
chmod ug=rwx,o=rxt /var/run/XXXXX
chown root:video /var/run/XXXXX
fi
fi
CONFIGFILE=/etc/XXXXX/XXXXX.xml
db_get XXXXX/norm
NORM=$RET
case "$NORM" in
NTSC|PAL-M|PAL-Nc)
db_get XXXXX/frequencies-ntsc
case "$RET" in
Cable) FREQTABLE=us-cable ;;
Broadcast) FREQTABLE=us-broadcast ;;
*) FREQTABLE=us-cable100 ;;
esac
;;
NTSC-JP)
db_get XXXXX/frequencies-jp
case "$RET" in
Cable) FREQTABLE=japan-cable ;;
*) FREQTABLE=japan-broadcast ;;
esac
;;
PAL|PAL-60|PAL-N|SECAM)
db_get XXXXX/frequencies-pal
case "$RET" in
Europe) FREQTABLE=europe ;;
France) FREQTABLE=france ;;
Russia) FREQTABLE=russia ;;
Australia) FREQTABLE=australia ;;
"New Zealand") FREQTABLE=newzealand ;;
"China Broadcast") FREQTABLE=china-broadcast ;;
"Australia Optus cable") FREQTABLE=australia-optus ;;
*) FREQTABLE=custom ;;
esac
;;
*)
FREQTABLE=custom
;;
esac
db_get XXXXX/v4ldevice
V4LDEV=$RET
db_get XXXXX/vbidevice
VBIDEV=$RET
db_get XXXXX/processpriority
PRI=$RET
db_stop
# Create the configuration file if it doesn't exist
if [ ! -f $CONFIGFILE ]; then
cp /usr/share/doc/XXXXX/examples/default.XXXXX.xml $CONFIGFILE
fi
# Configure XXXXX.
XXXXX-configure --configfile="$CONFIGFILE" --norm="$NORM" \
--frequencies="$FREQTABLE" --device="$V4LDEV" \
--vbidevice="$VBIDEV" --priority="$PRI" 2>/dev/null
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
어떤 도움을 환영합니다, 감사합니다. 응용 프로그램 코드에서
는
int mkdir_and_force_owner(const char *path, uid_t uid, gid_t gid)
{
if(mkdir(path, S_IRWXU) < 0) {
if(errno != EEXIST) {
lfprintf(stderr, _("Cannot create %s: %s\n"),
path, strerror(errno));
} else {
/* It exists, make sure it's a directory. */
DIR *temp_dir = opendir(path);
if(!path) {
lfprintf(stderr, _("Cannot open %s: %s\n"),
path, strerror(errno));
} else {
closedir(temp_dir);
return 1;
}
}
} else {
/* We created the directory, now force it to be owned by the user. */
if(chown(path, uid, gid) < 0) {
lfprintf(stderr, _("Cannot change owner of %s: %s.\n"),
path, strerror(errno));
} else {
return 1;
}
}
return 0;
}
ct->uid = getuid();
/* Make the ~/.XXXXX directory every time on startup, to be safe. */
if(asprintf(&temp_dirname, "%s/.XXXXX", getenv("HOME")) < 0) {
/* FIXME: Clean up ?? */
return 0;
}
mkdir_and_force_owner(temp_dirname, ct->uid, getgid());
free(temp_dirname);
이 가정에서 초기 디렉토리를 생성와 주요 응용 프로그램입니다. 가능한 한 일찍 루트 권한을 삭제하십시오. 실시간 스케줄러에 액세스 할 수있게 다시 활성화하십시오. 이것은 데비안에서는 작동하지 않습니다.
int main(int argc, char **argv)
{
rtctimer_t *rtctimer = 0;
int read_stdin = 1;
int result = 0;
int realtime = 0;
uid_t priv_uid = geteuid();
uid_t user_uid = getuid();
/*
* Temporarily drop down to user-level access, so that files aren't
* created setuid root.
*/
if(seteuid(user_uid) == -1) {
lfprintf(stderr, _("\n"
" Failed to drop root privileges: %s.\n"
" motv will now exit to avoid security problems.\n\n"),
strerror(errno));
return 1;
}
setup_i18n();
setup_utf8();
lfprintf(stderr, _("Running %s.\n"), PACKAGE_STRING);
/* Steal system resources in the name of performance. */
/* Get maximum priority before dropping root privileges. We'll drop back */
/* to the value specified in the config file (or the default) later. */
seteuid(priv_uid);
setpriority(PRIO_PROCESS, 0, -19);
if(set_realtime_priority(0)) {
realtime = 1;
}
rtctimer = rtctimer_new(0);
if(rtctimer) {
if(!rtctimer_set_interval(rtctimer, 1024) &&
!rtctimer_set_interval(rtctimer, 64)) {
rtctimer_delete(rtctimer);
rtctimer = 0;
} else {
rtctimer_start_clock(rtctimer);
if(rtctimer_get_resolution(rtctimer) < 1024) {
rtctimer_delete(rtctimer);
rtctimer = 0;
}
}
}
/* We've now stolen all our root-requiring resources, drop to a user. */
if(setuid(user_uid) == -1) {
/*
* This used to say "Unknown problems", but we're printing an
* error string, so that didn't really make sense, did it?
*/
lfprintf(stderr, _("\n"
" Failed to drop root privileges: %s.\n"
" motv will now exit to avoid security problems.\n\n"),
strerror(errno));
return 1;
}
/* Ditch stdin early. */
if(isatty(STDIN_FILENO)) {
read_stdin = 0;
close(STDIN_FILENO);
}
/* Run motv. */
for(;;) {
if(result == 2) {
char *new_argv[ 2 ];
new_argv[ 0 ] = "motv";
new_argv[ 1 ] = 0;
result = motv_main(rtctimer, read_stdin, realtime, 0, new_argv);
} else {
result = motv_main(rtctimer, read_stdin, realtime, argc, argv);
}
if(result != 2) break;
}
if(rtctimer) {
rtctimer_delete(rtctimer);
}
return result;
}
이 스크립트에서 ~/.XXXXX (이 패키지를 실제로 무엇이라고 부르는 것입니까?) 파일/디렉토리를 만드는 것은 보이지 않습니다. 일반적으로 이러한 디렉토리는 사용자가 문제의 응용 프로그램을 처음 실행할 때 만들어집니다. –
어떤 응용 프로그램입니까? postinst는 ~에서 아무 것도 건드리지 않지만 바이너리 setuid root를 설치하는 것처럼 보이므로 버그는 아마도 응용 프로그램 자체에 있습니다. (문제는 간단한 그룹 + udev 규칙으로 해결할 수 있습니다) – Flexo
awoodland - 여기에 기본 앱을 넣습니다. 당신이 생각한다면 당신이 환상적 일 수 있도록 도울 수 있습니다. 감사. – iattila