sudo가 필요한 bash 스크립트에서 암호를 한 번만 입력하는 방법 cifs 비밀번호는 동일합니다. 내가

데이터

  • 이 컴퓨터의 운영자 사용자가 자신의 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"

그냥 작동하고 :

  1. 비밀번호가 포함 된 파일을 만들지 않습니다
  2. 사용자가 여러 공유 (Windows 공유 포함)에 대해 하나의 비밀번호 만 입력 할 수 있습니다.
  3. 추가 권한을 부여 할 필요가 없습니다. 🙂

답변

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 sudoerssudo