Come inserire la password solo una volta in uno script bash che richiede sudo

17

dati

  • Voglio che gli utenti dell'operatore su questa macchina montino le proprie condivisioni cif
  • Il file sudoers contiene già il comando /bin/mount -t cifs //*/* /media/* -o username=* per tutti gli operatori
  • Voglio che gli utenti montino una condivisione cifs tramite uno script che digita la password solo una volta, non due volte.
  • La password sudo e la password cifs sono identiche.

Cosa ho già

Questo script funziona:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... ma richiede agli utenti di digitare la stessa password due volte!

  • Una volta per sudo
  • Una volta per il mount stesso

Funzionerebbe anche:

#!/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'

... ma questo mi richiederebbe di consentire a tutti gli utenti dell'operatore di essere in grado di sudo sh (maggiore problema di sicurezza)

Domanda

* Come montare una condivisione di cifs in bash ¹ senza mettendo sh nel file sudoers né creando un file permanente / temporaneo ?? ? *

Nota 1: no python, perl, C, Go, ... per favore?
Nota 2: So che posso semplicemente rimuovere la password attraverso il file sudoers , ma sto cercando di stringere la sicurezza senza rinunciare alla comodità ...

    
posta Fabby 20.12.2015 - 15:43

4 risposte

8

I'm dumb!

Il seguente script:

#!/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"

funziona e:

  1. Non crea file contenenti password
  2. Consente all'utente di digitare una sola password per più condivisioni (incluse quelle di Windows)
  3. Non è necessario concedere privilegi extra. : -)
risposta data Fabby 20.12.2015 - 16:16
22

Dovresti invece fare in modo che l'utente chiami l'uso di sudo come sudo script . controlla solo se lo script viene eseguito come root, altrimenti chiedilo

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

Non provare ad acquisire la password dei tuoi utenti.

    
risposta data Braiam 20.12.2015 - 23:11
3

Non richiede alcuna sudo password per l'esecuzione di questo comando; la richiesta della password per mount rimane.

In sudoers , includi qualcosa come

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

Dopo averlo incluso, sudo non richiederà più una password per questo comando specifico; l'utente deve comunque fornire una password al comando mount .

Nota : ho preso il comando testualmente da ciò che hai incluso nella domanda; Non ho verificato se i suoi caratteri jolly consentirebbero agli utenti di fare qualcosa di cattivo. Leggi la manpage sudoers per esempi di cattiveria. In particolare, nota che questa riga in sudoers consente all'utente di aggiungere qualsiasi numero di -o opzioni o altri argomenti a mount . Puoi decidere di ripensare il tuo approccio, ad es. aggiungendo uno script come @Braiam propone e consente di eseguirlo tramite sudo senza autenticazione aggiuntiva. Lo script quindi garantisce che gli utenti possano eseguire solo il modulo specifico di mount che desideri vengano eseguiti.

Inoltre, anziché consentirlo a tutti gli utenti, potresti anche limitarlo ai membri di un determinato gruppo, ad es. potresti creare un gruppo cifsmount e poi avere

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
    
risposta data Oliphaunt 20.12.2015 - 18:42
0

Una soluzione generale a questi problemi è mettere il seguente preambolo nella parte superiore del tuo sudo che richiede script:

#!/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 "[email protected]" ;;
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 ...

Ovviamente, questo ha uno svantaggio nel fatto che se alcuni comandi nello script non richiedono sudo per essere eseguiti, qui c'è un innalzamento non necessario dei privilegi.

Comunque, ho pensato di condividere questo piccolo consiglio. La cosa più bella a riguardo è che se sei già efficace-uid root (ad esempio se lo hai già chiamato sudo) fa con grazia la cosa giusta. Anche dare un errore e costringervi a ridigitare / rieseguire (con sudo) è meno amichevole.

Potresti anche voler controllare la variabile timestamp_timeout in man 5 sudoers che dice sudo di ricordare le credenziali dell'utente per un numero limitato di minuti (e può essere frazionale).

    
risposta data arielf 26.12.2015 - 04:05

Leggi altre domande sui tag