Por que redirecionar 'script' para / dev / null / permite que 'screen' funcione enquanto é processado como outro usuário?

37

Eu fui su'ed em um usuário para executar um script de execução longa em particular. Eu queria usar a tela, mas recebi a mensagem de erro "Não é possível abrir o seu terminal '/ dev / pts / 4' - verifique."

Então, pesquisei no Google e me deparei com uma postagem no fórum que instruía a execução $ script '/dev/null/'. Fiz isso e depois pude rastrear.

Por que isso funciona? O que o su está fazendo nessa tela não pode ser executado como o usuário su'ed? Por que redirecionar 'script' para / dev / null faz com que seja evitado de outra forma? Está usando script para gravar um log como usuário original em algum lugar?

Ichorus
fonte
2
O limpador seria executado a supartir de uma sessão de tela.
Justarobert
@justarobert, não se você quiser que vários usuários possam se conectar à mesma tela para uma conta de serviço / lote de scripts em execução.
2525 Ashley

Respostas:

41

Bem, tecnicamente você não está redirecionando nada aqui.

Chamando script /dev/nullsó faz scriptsalvar todo o texto datilografado em /dev/nullque na prática significa descartar o conteúdo.

Veja man scriptpara informações detalhadas e pacote util-linux-ng para implementação ( misc-utils/script.c).

Isso não tem nada a ver com screenverdade. Por que isso funciona está chamando scripttem um efeito colateral de criar um pseudo-terminal para você em /dev/pts/X. Dessa forma, você não precisa fazer isso sozinho, e a tela não terá problemas de permissão - se você sudo usuário A ao usuário B , invocando diretamente screenvocê tenta se apossar do pseudo-terminal do usuário A. Isso não terá sucesso, a menos que você seja root . É por isso que você vê a mensagem de erro.

Karol J. Piczak
fonte
6

Para enviar diretamente para a janela do seu terminal, o programa em execução precisa poder gravar no seu terminal de controle. Se você estiver usando um xterm ou ssh ou alguma outra conexão virtual (em oposição a um terminal diretamente conectado ao vivo), seu terminal de controle é um pseudo-tty (pty).

Seu arquivo é configurado com permissão de gravação somente para você quando você faz logon; caso contrário, outros usuários podem rabiscar no seu monitor (ou lê-lo). Portanto, quando você faz um SU para outro usuário (e esse usuário não é root), esse usuário não tem acesso ao pty subjacente.

No entanto, E / S mais complexas, como a tela, exigem acesso direto ao pty para funcionar, é mágico controlar toda a tela. É quando você se depara com problemas com a pessoa que está executando o comando que não tem acesso adequado ao terminal de controle.

Redirecionar o script para / dev / null faz com que a tela não tente gravar no terminal de controle, para que não atinja o problema de permissão.

Phil Hollenback
fonte
2
Então, como posso ver o que a tela grava se for para / dev / null? Tenho certeza de que não entendi direito e ele realmente não vai para / dev / null, mas para onde ele vai?
user63623
"it", que significa saída de tela, não é acessado /dev/null. Primeiro: roteiro registra sua sessão (veja a página de manual), e você não precisa dele em tudo: assim que vai para / dev / null. Mas isso não tem um efeito colateral: cria um pseudo terminal, e agora você está usando isso, e a tela pode escrever para esta resposta. Veja @ karol-piczak.
Nanne