데이터
- 이 컴퓨터의 운영자 사용자가 자신의 cifs 공유를 마운트하기를 원합니다
sudoers
파일이 이미 포함되어/bin/mount -t cifs //*/* /media/* -o username=*
있는 모든 사업자들에게 명령을- 사용자가
cifs
암호를 두 번이 아니라 한 번만 입력하는 스크립트를 통해 공유 를 마운트하기를 원합니다 . - sudo 비밀번호와 cifs 비밀번호는 동일합니다.
내가 이미 가지고있는 것
이 스크립트는 작동합니다 :
#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
… 하지만 사용자는 동일한 비밀번호를 두 번 입력해야합니다!
- 한번
sudo
- 마운트 자체에 한 번
이것은 또한 작동합니다 :
#!/bin/bash
echo -n Password:
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
… 하지만 모든 운영자 사용자가 할 수 있어야합니다sudo sh
(주요 보안 문제)
의문
어떻게 CIFS 공유 마운트 bash는을 주지 않고 ¹ sh
에서 sudoers
파일 이나 영구 / 임시 파일을 생성 ???
참고 1 : 파이썬, 펄, C, 고, … 제발?
참고 2 :sudoers
파일을 통해 비밀번호를 제거 할 수 있다는 것을 알고 있지만 편의를 포기하지 않으면 서 보안을 강화하려고 시도합니다.
답변
대신 sudo as를 사용하여 사용자가 호출하도록해야합니다 sudo script
. 요청하지 않으면 스크립트가 루트로 실행되고 있는지 확인하십시오.
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root, use sudo "$0" instead" 1>&2
exit 1
fi
사용자의 비밀번호를 캡처하려고 시도하지 마십시오.
답변
난 바보 야!
다음 스크립트 :
#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"
그냥 작동하고 :
- 비밀번호가 포함 된 파일을 만들지 않습니다
- 사용자가 여러 공유 (Windows 공유 포함)에 대해 하나의 비밀번호 만 입력 할 수 있습니다.
- 추가 권한을 부여 할 필요가 없습니다. 🙂
답변
sudo
이 명령을 실행하기 위해 비밀번호가 필요하지 않습니다 . 암호 프롬프트가 mount
남아 있습니다.
에 sudoers
다음과 같은 것을 포함
ALL ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
이것을 포함시킨 후에 sudo
는 더 이상이 특정 명령에 대한 암호를 요구하지 않습니다. 사용자는 여전히 mount
명령에 암호를 제공해야합니다 .
참고 : 나는 당신이 질문에 포함 된 명령을 그대로 사용했습니다. 와일드 카드로 인해 사용자가 불쾌한 일을 할 수 있는지 여부는 확인하지 않았습니다. sudoers
불쾌감의 예 는 맨 페이지를 읽으십시오 . 특히,이 줄 sudoers
은 사용자가 -o
스위치 또는 다른 인수를 여러 개 추가 할 수 있도록 mount
합니다. 예를 들어 @Braiam 제안과 같은 스크립트를 추가하여 sudo
추가 인증 없이이 방법을 실행할 수 있도록 접근 방식을 다시 생각할 수 있습니다 . 그러면 스크립트는 사용자가 mount
원하는 특정 형식 만 실행할 수 있도록합니다.
또한 모든 사용자에게이를 허용하는 대신이를 특정 그룹의 구성원으로 제한 할 수도 있습니다. 예를 들어 그룹 cifsmount
을 만든 다음
%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
답변
이러한 문제에 대한 일반적인 해결책은 스크립트를 요구하는 sudo의 맨 위에 다음과 같은 프리앰블을 두는 것입니다.
#!/bin/bash
case $EUID in
0) : cool we are already root - fall through ;;
*) # not root, become root for the rest of this session
# (and ask for the sudo password only once)
sudo $0 "$@" ;;
esac
# now the present process is effective-UID (root)
# so there's no need to put sudo in front of commands
any more commands here will run as superuser ...
스크립트의 일부 명령 sudo
을 실행할 필요가없는 경우 여기에는 불필요한 권한 상승이 있다는 단점이 있습니다.
어쨌든, 나는이 작은 팁을 공유 할 것이라고 생각했습니다. 그것에 대한 가장 좋은 점은 이미 유효한 루트 루트 (예를 들어 이미 sudo에서 호출 한 경우)라면 올바른 일을 정상적으로 수행한다는 것입니다. 또한 오류가 발생하고 sudo를 사용하여 다시 입력 / 재실행하도록하는 것이 덜 친숙합니다.
제한된 시간 동안 사용자 자격 증명을 기억하도록 지시 하는 timestamp_timeout
변수 를 체크 아웃 할 수도 있습니다 (분수 일 수도 있음).man 5 sudoers
sudo