Como exibir comandos em um terminal diferente?

5

Eu tenho um pi de framboesa com uma tela anexada a ele. Ele inicializa para um prompt de login. Eu não tenho nenhum teclado nem mouse conectado a ele e gostaria de mantê-lo assim. Eu procuro fazer o login nele via ssh da rede, mas gostaria de ver os comandos que eu entro através do ssh e sua saída na tela anexada. Isso seria possível?

    
por Euphorbium 14.06.2015 / 11:00

3 respostas

3

Não tenho certeza se pode haver uma solução mais "direta" envolvendo apenas redirecionamentos de entradas e saídas, mas consegui fazer algo parecido com esse trabalho usando tela . A ideia é fazer todo o seu trabalho dentro de uma sessão screen e anexar duas vezes à sessão, uma vez a partir do terminal SSH de trabalho e uma vez a partir da exibição anexada.

Primeiro, você precisará saber o nome do terminal para a exibição anexada. Eu não tenho um rpi para testar, mas suponho que a tela diretamente conectada seja mapeada para o console de vídeo normal do Linux, então provavelmente será /dev/tty1 .

  1. Verifique se screen está instalado
  2. Fazer login com o SSH
  3. Crie uma nova sessão de tela

    screen
    
  4. Anexar à mesma sessão de tela do outro terminal.

    A forma como esse recurso deve ser usado é que você faça login usando um teclado local e digite screen -r -x (para -r retomar sessão e -x multi-anexar a uma sessão existente), mas neste caso você não está logado no terminal a partir do qual você gostaria de anexar a sessão. Portanto, redirecionamos a entrada e a saída para o terminal pretendido para "convencer" a tela que é o terminal que queremos anexar. É hackish, mas funcionou para mim.

    screen -r -x </dev/tty1 >/dev/tty1 2>&1 & disown
    

Se o nome do terminal para o console de vídeo do rPI não for /dev/tty1 , mas alguma outra coisa, você poderá descobrir o que é conectando um teclado apenas uma vez e efetuando login localmente e digitando tty no prompt.

    
por 14.06.2015 / 11:35
3

Interessante, também pensei em screen -x ou tmux attach como a solução da Celada, mas eu preferiria configurar o init (em /etc/inittab ou /etc/init ou /etc/systemd ) ou supervisor para iniciar automaticamente uma sessão de getty-on-screen na inicialização.

Configuração de trabalho para o supervisor:

[program:screen]
command=bash -c 'chvt 9 && TERM=linux exec screen getty tty </dev/tty9 >/dev/tty9 2>&1'
autostart=true
autorestart=true

Ele alterna automaticamente para /dev/tty9 e inicia a execução da tela getty para mostrar o prompt de login. De outras sessões ssh você pode executar sudo screen -x para anexar a esta sessão de console, então digite Ctrl + A D para desanexar da sessão.

Você precisa de privilégios de root para anexar a sessão de tela, porque ela é executada por root. Você pode querer ativar o modo multiusuário da tela, mas precisa setuid em /usr/bin/screen , o que causa algumas preocupações de segurança. Consulte o manual de tela para obter detalhes.

    
por 14.06.2015 / 13:34
2

Se você tiver xterm instalado no pi , ele deve ter incluído o aplicativo luit terminal UTF-8 - que é um pequeno programa que é usado com frequência para traduzir para outros tipos de aplicativos de terminal que não são UTF -8 consciente. luit funciona alocando um pseudo-terminal - da mesma forma que screen faz, mas com muito menos sobrecarga.

Uma coisa que o luit pode fazer muito facilmente é a entrada de cópia (ou saída - que pode ser diferente) para algum arquivo especificado conforme ele chega. Para luit embora (como o terminal mestre ) entrada significa toda a saída da sua sessão de terminal (mesmo incluindo possivelmente o seu próprio stty echo output) e output significa tudo o que ele gravaria em um dispositivo terminal depois de processar toda a saída da sua sessão de terminal. Ele faz isso ao mesmo tempo que copia o seu stdin (que deve vir de um terminal - e assim significa seu teclado) para o programa que ele envolve - como um shell. Eu sei - pty i / o pode ser um pouco estranho - mas, o ponto é, ele pode fazer um meio conveniente de duplicar a saída de uma sessão de terminal para vários dispositivos de exibição em tempo real.

Por exemplo:

ssh me@machine -t 'luit -olog /dev/tty2 sh'

Acabei de executar (basicamente) o comando acima do meu terminal do tablet Android depois de sair de X para vt2 com CTRL + ALT + F2 na área de trabalho computador para um novo prompt login . O terminal android me pediu a senha da maneira usual, e então eu estava no meu shell no tablet e tudo escrito no terminal do meu tablet (prompts, minha entrada, cat file , etc) também foi exibido na tela da minha área de trabalho. Cada tecla que eu digitei (ou tocou ou qualquer outra coisa) no tablet foi ecoada instantaneamente para a área de trabalho vt2.

Para que isso funcione, se o processo de geração de tty (geralmente getty ou similar) criar os dispositivos de terminal com algum nível de permissão que sua conta de usuário não pode atender por padrão, precisará alterar isso. Pode ser tão simples como:

chown me /dev/tty[num]

... se você quer que seja. No meu sistema, minha conta de usuário é membro do grupo tty - e, portanto, isso não é um problema. Acredito que na maioria das distribuições de linux que colocam uma conta de usuário no grupo tty deve ser suficiente para que funcione.

ls -l /dev/tty2
crw--w---- 1 root tty 4, 2 Jun 14 05:14 /dev/tty2 

... como você pode ver, é um arquivo de dispositivo de propriedade da raiz, mas é designado para o grupo tty .

Em qualquer caso, a execução do comando luit acima pode ser tudo o que você precisa. Soluções mais complexas - e possivelmente desejáveis - podem ser obtidas com screen , tmux , et al., Mas se tudo que você quer fazer é ver a saída em algum outro dispositivo, então geralmente tudo que você precisa fazer é escrever para ele.

    
por 14.06.2015 / 14:30