Dados
- Quero que os usuários do operador nesta máquina montem seus próprios compartilhamentos cifs
- O
sudoers
arquivo já contém o/bin/mount -t cifs //*/* /media/* -o username=*
comando para todos os operadores - Quero que os usuários montem um
cifs
compartilhamento por meio de um script digitando a senha apenas uma vez, não duas. - A senha do sudo e a senha do cifs são idênticas.
O que eu já tenho
Este script funciona:
#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
... mas exige que os usuários digitem a mesma senha duas vezes!
- Uma vez para
sudo
- Uma vez para a própria montagem
Isso também funcionaria:
#!/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'
... mas isso exigiria que eu permitisse a todos os usuários da operadorasudo sh
(grande problema de segurança)
Questão
Como montar um compartilhamento cifs no bash ¹ sem colocar sh
no sudoers
arquivo nem criar um arquivo permanente / temporário ???
Nota 1: sem python, perl, C, Go, ... por favor?
Nota 2: Eu sei que posso remover a senha através do sudoers
arquivo, mas estou tentando aumentar a segurança, não afrouxá-la, sem abrir mão da conveniência ...
printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...
?Respostas:
Em vez disso, você deve fazer com que o usuário faça a chamada usando sudo as
sudo script
. basta verificar se o script está sendo executado como root, se não pedirNão tente capturar a senha dos seus usuários.
fonte
sudo
e depois (após a autenticação com êxito) novamentemount
. No caso de uso, essas senhas são idênticas, portanto, posso ver por que o OP gostaria que o usuário tivesse que digitar essa senha apenas uma vez. Não acredito que sua solução ajude com isso. Concordo que não se deve capturar senhas.1>&2
), está no arranque automático e costumava ser apenas um compartilhamento CIF, mas agora são três, então realmente uma senha é preciso. (Ele já contém esse teste no caso de outra pessoa, que não seja membro do grupo de operadores, tenta executá-lo)~/.smbcredentials
por exemplo) e mesmo sem a necessidade do sudo (se você usar gvfs, umount ou polkit).Eu sou estúpido!
O seguinte script:
apenas funciona e:
fonte
<<<
também poderia ser usado em vez deprintf
, mas uma abordagem melhor seria abandonarread
completamente e usar apenassudo --stdin
sozinha. Algo como$ printf "Type out your password\n" && sudo --stdin apt-get update
Usuário ainda pode digitar a senha do sudo. e isso não será colocado na lista de processos. Mas é claro que há quantidade infinita de possíveis outros problemas de segurança, como keyloggers, vulnerabilidades potenciais emsudo
, e blá e blá, blá e até o infinitoNão requer
sudo
senha para executar este comando; a solicitação de senhamount
permanece.Em
sudoers
, inclua algo comoApós incluir isso,
sudo
não solicitará mais uma senha para este comando específico; o usuário ainda precisa fornecer uma senha para omount
comando.Nota : Eu peguei o comando literalmente do que você incluiu na pergunta; Não verifiquei se seus curingas permitiriam que os usuários fizessem algo desagradável. Leia a página de
sudoers
manual para exemplos de maldade. Em particular, observe que essa linhasudoers
permite que o usuário adicione qualquer número de-o
opções ou outros argumentosmount
. Você pode repensar sua abordagem, por exemplo, adicionando um script como o @Braiam propõe e permitir executar issosudo
sem autenticação extra. O script garante que os usuários possam executar apenas a forma específicamount
que você deseja que eles executem.Além disso, em vez de permitir isso para todos os usuários, você também pode limitar isso aos membros de um determinado grupo; por exemplo, você pode criar um grupo
cifsmount
e, em seguida, terfonte
Uma solução geral para esses problemas é colocar o seguinte preâmbulo no topo do seu sudo, exigindo scripts:
Obviamente, isso tem uma desvantagem: se alguns comandos no script não precisarem
sudo
ser executados, haverá uma elevação desnecessária de privilégios aqui.Enfim, pensei em compartilhar essa pequena dica. A coisa mais legal sobre isso é que, se você já é um usuário-uid root eficaz (por exemplo, se você já o chamou no sudo), ele faz a coisa certa com elegância. Também dar um erro e forçá-lo a redigitar / executar novamente (com sudo) é menos amigável.
Você também pode verificar a
timestamp_timeout
variável naman 5 sudoers
qual ésudo
necessário lembrar as credenciais do usuário por um número limitado de minutos (e pode ser fracionário).fonte
#test if root: if not: bail out if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi
O ponto é que ele também contém várias montagens, todas com a mesma senha (novamente: removidas), mas, de qualquer forma, obrigado ...