Sudo como usuário diferente e tela de execução

167

Descobri hoje que a tela em execução como um usuário diferente em que eu sudo não funcionará!

ie

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails: Cannot open your terminal '/dev/pts/0'

Eu tenho um script que é executado como o usuário "monitor". Nós o executamos em uma sessão de tela para ver a saída na tela. O problema é que temos um número de usuários que efetuam login com sua própria conta (ou seja, bob, james, susie, etc ...) e, em seguida, fazem o sudo no usuário "monitor". Dar a eles acesso ao usuário "monitor" está fora de questão.

luckytaxi
fonte
13
É este o erro que você está recebendo? "Não foi possível abrir o seu terminal '/ dev / pts / 0' - verifique."
25410 Jim
Sim, é esse. Entendo por que está acontecendo, mas há uma solução alternativa?
luckytaxi
4
Um comentário sobre seus comandos - continuo vendo pessoas correndo sudo su "user" -. Por que não usar sudo -u user -s?
Andrew Aylett
2
@ Jim: +1 por fornecer a mensagem de erro ausente.
Dennis Williamson
1
@ Andrew A maioria dos caras que conheço sudo su- acho que é exatamente com o que as pessoas se acostumam (no meu caso, é porque você não precisa conhecer nenhum sinalizador de sudo) sudo su- acho que nunca li a página de manual do sudo :)
voretaq7

Respostas:

246

Tente executar script /dev/nullcomo o usuário suantes de iniciar a tela - é um pequeno truque, mas deve deixar a tela feliz.

voretaq7
fonte
5
Re: implicações de segurança, nenhuma que eu saiba (mas isso não significa que não exista :) - O IIRC se baseia no efeito colateral de "script" que abre um novo dispositivo de terminal (conforme o usuário o invoca) , e como você está enviando a saída do script para / dev / null, não há nada para capturar. Também é definitivamente mais seguro do que a adição de usuários ao grupo tty (IMHO)
voretaq7
2
@ francamente Francamente, você não deve achar várias conchas confusas se for um administrador de sistemas Unix - isto é, scriptpode ser usado para iniciar screen. Então você só precisa sair duas vezes (uma vez para screen, uma vez para su). (Isso é algo a scriptpágina homem pode esclarecer para você, se você tomar o tempo para lê-lo ...)
voretaq7
10
Ou apenas corra sudo -u bob script -q -c 'screen -dr myscreen' /dev/null. Então você tem apenas um terminal para sair / desconectar.
Andy Shulman
4
Obrigado, isso me salvou. Mas por que isso corrige isso? Pelo que entendi, ele imprime tudo, desde stdout até ... lugar nenhum. E isso de alguma forma corrige a tela.
Sudo
3
@sudo Para fazer isso, ele scriptabre seu próprio dispositivo tty, de propriedade do usuário que o executou (veja /deve você verá ele aparecer depois de executar script). screenentão pega o dispositivo tty (que pertence ao usuário em execução, screenpara que não tenha problemas para acessá-lo). É um trabalho total de hackers, mas funciona. Olhando para algumas de minhas máquinas, parece que novas versões da tela parecem instalar o setuid-root, o que também funciona, mas significa que você tem outro binário do setuid-root flutuando, o que deixa algumas pessoas justificadamente desconfortáveis.
voretaq7
33

Eu estou usando uma função de invólucro screenpara os usuários que eu devo sudo su. Esta é a função do wrapper que eu adicionei ao (s) usuário (s) ~/.bashrc:

tela de função () {
  / usr / bin / script -q -c "/ usr / bin / tela $ {*}" / dev / null
}

Isso me permite usar todas as opções e parâmetros screenque eu possa querer usar. Estou pensando em colocar essa função em todo o sistema.

steviethecat
fonte
1
Funciona perfeitamente. Para aqueles que desejam esse sistema, recomendo adicioná-lo ao /etc/bash.bashrc - funciona em todos os usuários.
precisa saber é o seguinte
2
Isso não citará argumentos para a tela corretamente, caso contrário, uma boa solução.
Aug
7

Supondo que eles estejam SSHing no host de qualquer maneira, você pode adicionar as chaves públicas ssh para cada usuário que precisar acessar a conta do monitor no arquivo ~ monitor / .ssh / allowed_keys. Em seguida, na máquina remota de cada usuário, eles podem executar

tela ssh -t [email protected] -RD

Alex
fonte
Essa é outra boa abordagem - você teria que especificar comandos forçados no arquivo de chaves autorizadas (de acordo com a luckytaxi, "dar a eles acesso ao usuário 'monitor' está fora de questão" nota acima - comandos forçados podem limitá-los a apenas anexando a sessão da tela)
voretaq7 25/02
2
Eu não tinha certeza de como lidar com isso na minha resposta, porque ele disse que "dar acesso a eles ... está fora de questão", mas também disse "... eles sudo no usuário 'monitor'". Mas eu concordo, forçar a restrição de comando nas teclas_autorizadas deve cuidar disso.
25410 Alex
7

Supondo que estamos falando sobre este erro:

$ sudo su - bob
$ screen
Cannot open your terminal '/dev/pts/5' - please check.

Aqui está uma lista (pode ser usada como "alias gobob", por exemplo):

sudo su - bob -c "script -c bash /dev/null"'

Explicação:

Isso iniciará um shell (como o shell de login) como usuário bob. O usuário bob inicia script, que é instruído a chamar um bash (poderia ser dash ou ksh ...) e uma cópia da sessão é descartada.

basic6
fonte
0

Provavelmente teria que alterar as permissões no dispositivo em questão ou adicionar monitor a um grupo que tenha permissão para ler esse dispositivo, essa seria minha primeira inclinação. Mas você teria que avaliar as implicações de segurança de fazer isso.

Bart Silverstrim
fonte
0

Você diz que faz:

sudo su "monitor" -

Eu estou pensando sobre o traço à direita. Eu costumo fazer:

sudo su - username

O traço (de acordo com a página de manual do su) diz ao su para "tornar o shell um shell de login". Isso significa que ele fornecerá todos os scripts de inicialização comuns do shell e definirá coisas como PATH e HOME corretamente.

Doug Harris
fonte
3
Não. sudo su - usernamee sudo su username -faça a mesma coisa.
Tim Ludwinski
-4

Acabei de acertar este problema. Resolvido com chmod +rw $(tty)antes de executar o sudo. O problema com esta solução é que qualquer pessoa pode se conectar e bisbilhotar seu terminal depois disso.

Amos Shapira
fonte
2
Parece uma ótima solução.
Evan Carroll
10
@EvanCarroll É uma ótima solução, exceto a parte em que fornece ao mundo inteiro acesso de leitura e gravação ao seu terminal. Apenas um pequeno problema de segurança - Nenhum programa se importaria com isso, exceto, é claro, qualquer coisa que verifique a segurança do terminal antes de aceitar senhas ( gpgpor exemplo). E certamente ele nunca vai ser em um sistema com os usuários mal-intencionados que iria assistir ao ttye sniff senhas ...
voretaq7
Esteja avisado : nunca tente isso em casa! isso é perigoso!!!
Ruizpauker 30/08/19