안녕하세요? 제가 usb에다가 만들어놓은 c언어 기반 실행파일이랑 소스코드같은 것들을 넣고 터미널에서 실행시킬려고 gui로 실행권한중에 프로그램실행관련해서
권한을 설정하는데 설정이 안되네요 (터미널에서도 권한 바꿔보았지만 불가능하고)
제발 도와 주셨으면합니다. 파일을 일일히 컴퓨터에 복사하여 실행시키기엔 시간적 문제를 지녀서말이죠
마운트 옵션에 실행차단이 포함되었는지 확인하세요.
혹은 다른 위치로 옮겨서 권한을 부여하면 됩니다.
[quote="별님":3n8mhjhk]마운트 옵션에 실행차단이 포함되었는지 확인하세요.
혹은 다른 위치로 옮겨서 권한을 부여하면 됩니다.[/quote:3n8mhjhk]
그건어떻게하죠?
유에스비가 어떤 파일 시스템으로 포멧되어 있는지 모르겠으나, 윈도우 계열 파일 시스템은 리눅스에서 사용한 권한 시스템을 적용시킬수 없습니다. 모든 파일은 운영체제에서 허가한 사용자 및 그룹에게 읽고 쓰고 언마운트하는 기능들이 개별적으로 허가됩니다.
mount 명령어로 마운트된 위치와 옵션을 확인해보세요. 만약, noexec란 옵션이 포함되어 있다면 해당 장치에선 바이너리 파일 및 스크립트를 실행할수 없습니다. 이 옵션을 제외한 채로 다시 마운트하면 됩니다.
혹은 파일을 실행 가능한 영역으로 복사한뒤 실행합니다. 홈폴더로 복사한뒤 실행시켜 보세요.
파일의 실행 속성에 대한 이해가 필요합니다.
파일에 대한 속성은 원래 파일을 어떻게 정의하냐에 따라 달라지게되고, 파일에 대한 정의가 바로 파일시스템입니다.
윈도우즈에서 사용하는 파일시스템에는 실행속성이라는 것이 존재하지 않습니다.
실행형 이진파일이라는 것은, 파일의 내용이 실행코드를 담고 있다는 것이나, 윈도우즈 운영체제는
이런 것을 따지지 않고, 파일의 확장자로 실행가능한지, 어떤 프로그램으로 실행할 지를 결정합니다.
그렇기 때문에, 윈도우즈에서 실행속성이라는 것은 파일시스템에 존재하지 않고, 그 개념은 확장자에 속해 있습니다.
이렇게 된 이유 중의 하나는 DOS에서 유래하고, DOS는 단일사용자용 운영체제이기 때문이기도 하죠.
굳이 사용자 권한을 만들 필요가 없었고, 읽기/쓰기/숨김/시스템/저장 속성을 만들어 놨었죠.
그러나, 리눅스, 유닉스의 경우, 다중사용자 운영체제이기 때문에, 처음부터 사용자 권한에 대한 개념을 만들어 놨습니다.
그래서 이 계열의 파일의 경우, 읽기/쓰기/실행 및 sticky/setuid/setgid비트 등이 존재하죠.
여기서 숨김속성이 꼭 필요하지 않았던 이유도, 간단히 보면, 다른 사용자에게 읽기 권한을 없애면 어자피 접근이 안되기 때문일 것입니다.
자 그러면, 본론으로 들어가봅시다.
NTFS 파일시스템에는 실행속성이 존재하지 않습니다.
그래서 실행속성이라는 것을 NTFS파일시스템의 파일에 저장해 둘 수 없습니다.
그러니까, 애초에 실행속성을 저장할 곳이 없기 때문에 파일에 실행속성을 부여할 수 가 없는 것이죠.
또한, 다른 속성의 경우도 리눅스와 윈도우즈 파일시스템에서 정의가 다르기 때문에 호환이 되지 않습니다.
그런데, 리눅스에서는 확장자로 실행여부를 판단하지 않고, 실행속성이 부여되거나, 그에 합당한 인터프리터가 있어야 실행이 가능합니다.
그래서, 윈도우즈 파일시스템에 실행 속성을 부여하기 위해서는 파일에 그러한 속성을 부여하지 않고,
아예 파일시스템에 그러한 정의를 집어 넣어야 합니다.
즉, 마운트할 때, 이런 파일시스템은 파일에 대해서는 모두 실행가능하게 하겠다 이런 식으로 말이죠
마운트 옵션의 noexec, exec 는 ntfs에 해당하며, showexec는 vfat에 해당됩니다.
이것에 관계없이 일괄적으로 적용하시려면, fmask, dmask등을 설정하시면 됩니다.
sudo mount /dev/sdb1 마운트위치 -o defaults,gid=사용자그룹,umask=007,fmask=007,dmask=007
이런식으로 마운트하여야 합니다.
이 예에서는 사용자그룹에게 읽기/쓰기/실행 권한을 부여한 것입니다.
uid=사용자명 으로 하여, 사용자에게 권한을 부여할 수 도 있습니다.
이렇게 수동으로 마운트하지 않고, /etc/fstab에 적는 방법도 있습니다.
/dev/disk/by-label/DATA /data ntfs defaults,utf8,umask=007,fmask=007,dmask=007,gid=사용자그룹 0 0
이렇게 말이죠.
그러나, USB 디스크의 경우, 이동식 디스크이기 때문에, 자동 마운트를 사용하게 됩니다.
보통 그래서 꽂으면 자동으로 마운트되죠, 하지만, 이런 식으로 마운트되는 경우, 마운트 옵션을 줄 수 없기 때문에, 저렇게 권한을 줄 수 없습니다.
이런식으로, 어떤 장치가 추가되거나, 제거되었을 때, 이런 이벤트를 처리하는 것이, udev라는 것입니다.
부팅시, 장치를 자동 검색하여, /dev에 장치파일을 만드는 것도 바로 이넘입니다.
실제로 /dev에는 장치파일이 원래 존재하지 않는 것인데, udev가 부팅시 검색해서 이를 메모리에 마운트해 둡니다.
GNOME에서는 udisks를 사용하여 자동마운트 하며, /etc/udev/rules.d/90-udisks.rules에서 마운트설정이 되어 있습니다.
그러나 udisks를 사용하지 않는 환경이나, 파일시스템을 판단하여 처리하는 스크립팅을 위해서는 따로 규칙을 정의하는 것이 좋습니다.
다음과 같이 /etc/udev/rules.d/89-usb-automount.rules를 만드세요.
[code:24faw06u] sudo gedit /etc/udev/rules.d/89-usb-automount.rules [/code:24faw06u]
내용은
[code:24faw06u]
ENV{ID_FS_LABEL_ENC}=="?*", ACTION=="add", SUBSYSTEMS=="usb", RUN+="/etc/udev-usb-automount.sh %k"
[/code:24faw06u]
그리고, 다음과 같이 /etc/udev-usb-automount.sh 파일을 만드신 후,
[code:24faw06u] sudo gedit /etc/udev-usb-automount.sh [/code:24faw06u]
내용은
[code:24faw06u] #!/bin/sh
#SYNC_OPT=syc,
SYNC_OPT=
device_is_mounted() {
eval $(/sbin/blkid -o udev -p /dev/${1} |sed ‘s/^/export /;s/=/="/;s/$/"/’)
}
log() {
echo "$*" >> /tmp/udev-auto-mount
}
log "udev-auto-mount:$(date +%F_%T)"
DEVICE=$1
check input
[ -z "$DEVICE" ] && log "error param:$*" && exit 1
test that this device isn’t already mounted
#device_is_mounted=grep ${DEVICE} /etc/mtab
#if [ -n "$device_is_mounted" ]; then
if [ -n "$(device_is_mounted $DEVICE)" ]; then
log "error: seems /dev/${DEVICE} is already mounted"
exit 1
fi
If there’s a problem at boot-time, this is where we’d put
some test to check that we’re booting, and then run
sleep 60
so the system is ready for the mount below.
An example to experiment with:
Assume the system is "booted enough" if the HTTPD server is running.
If it isn’t, sleep for half a minute before checking again.
The risk: if the server fails for some reason, this mount script
will just keep waiting for it to show up. A better solution would
be to check for some file that exists after the boot process is complete.
HTTPD_UP=ps -ax | grep httpd | grep -v grep
while [ -z "$HTTPD_UP" ]; do
sleep 30
HTTPD_UP=ps -ax | grep httpd | grep -v grep
done
pull in useful variables from vol_id, quote everything Just In Case
#eval /sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'
if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
log "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
exit 1
fi
test mountpoint - it shouldn’t exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then
# make the mountpoint
mkdir "/media/${ID_FS_LABEL}"
fi
mount the device
If expecting thumbdrives, you probably want
mount -t auto -o sync,noatime [...]
If drive is VFAT/NFTS, this mounts the filesystem such that all files
are owned by a std user instead of by root. Change to your user’s UID
(listed in /etc/passwd). You may also want "gid=1000" and/or "umask=022", eg:
mount -t auto -o uid=1000,gid=1000 [...]
case "$ID_FS_TYPE" in
vfat)
#mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
mount -t vfat -o defaults,${SYNC_OPT}noatime,showexec,gid=plugdev /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# I like the locale setting for ntfs
ntfs)
#mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
mount -t auto -o defaults,${SYNC_OPT}noatime,umask=007,fmask=007,dmask=007,gid=plugdev /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# ext2/3/4 don't like uid option
ext*)
#mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
mount -t auto -o defaults,${SYNC_OPT}noatime,nodiratime,data=writeback,acl /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
*)
log "${ID_FS_LABEL}(/dev/${DEV}) is not compatible file system."
esac
if [ $? -ne 0 ]; then
log "${ID_FS_LABEL}(/dev/${DEV}) not be mounted."
else
# all done here, return successful
log "${ID_FS_LABEL}(/dev/${DEV}) mounted."
fi
exit 0
[/code:24faw06u]
터미널에서, 다음 명령으로 실행 속성을 부여하세요.
[code:24faw06u]
sudo chmod +x /etc/udev-usb-automount.sh
[/code:24faw06u]
또한, 일반 사용자들이 USB 디스크에 접근하게 하기 위해서는,
사용자들을 plugdev 그룹에 추가해 주면 됩니다.
[code:24faw06u]
sudo groupadd -r plugdev 2>/dev/null
sudo usermod -a -G plugdev 사용자
[/code:24faw06u]
위 예에서, SYNC_OPT를 sync,로 지정하시면, USB의 내용이 변경될 때, 자동으로 sync합니다.
이것은, 변경될 때 바로 저장하기에, USB를 안전제거 없이 뽑아도 되지만, 전체적으로 접근 속도에 많이 떨어질 수 있고,
USB 플래시 디스크의 경우, 쓰기횟수에 제한이 있기 때문에 수명이 단축될 수 있습니다.
그러니까, SYNC_OPT를 주지 않은 경우, 뽑기 전에, 반드시 언마운트하여야 안전합니다.