Agência de criação de sites no Rio de Janeiro
Pequenos Truques no Terminal Linux
server configuration command lines on a monitor

Pequenos Truques no Terminal Linux

Estar de frente a um terminal do Linux pode ser intimidante para muitas pessoas. Mesmo as pessoas que já lidaram algumas vezes com ela, podem se frustrar quando não conseguem realizar algumas coisas básicas. O objetivo aqui é consolidar algumas situações que se apresentam e mostrar como responder a elas (não é uma lista final, mas um compêndio de soluções para questões comuns).

Como faço para saber em qual terminal estou?

Use o comando tty

$ tty

/dev/pts/0

$ tty

/dev/pts/1

Como faço para direcionar toda saída dos comandos executados em um terminal para outro específico?

Considerando os TTYs listados anteriormente, para redirecionar a primeira stdout para a segunda, execute este comando no primeiro terminal:

exec 1>/dev/pts/1

Nota: Agora, a saída de todos os comandos vão ser mostrado em pts/1

Para restaurar o comportamento do stdout do pts/0:

exec 1>/dev/pts/0

E se fosse a saída de somente um comando ou script?

./script.sh >& /dev/pts/X

Neste caso, /dev/pts/X é o dispositivo tty que pertence à tela do segundo usuário.

Nota: você vai precisar de direito de escrita; isso pode ser concedido pelo segundo usuário com chmod/setfacl, ou você pode usar sudo (ou mesmo ser root).

(>& arquivo é equivalente a > arquivo 2>&1, o que redireciona tanto stdout e stderr para o arquivo informado.)

O que preciso fazer para se além da saída de um comando, eu quisesse que o outro terminal pudesse acompanhar tudo que fosse digitado / meus comandos em tempo real?

Solução que pode ser utilizada, por exemplo, quando está sendo feita uma demonstração ou uma aula.

script -f /dev/pts/1

Nota: a partir daí tudo que é digitado no seu terminal é mostrado no /dev/pts/1

Para terminar basta usar os comandos de saída (CTRL+D, por exemplo).

Como faço para ver o conteúdo do que foi digitado em um específico terminal? (curioso, né?!)

Se for tty é simples: basta executar um cat no dispositivo do vcs/vcsa  relativo ao tty em questão.

Por exemplo, para ver o que foi digitado no terminal 2  (tty2):

cat /dev/vcsa2

Nota: um tail -f travou um pseudo-terminal para entrada de comandos… Vejo cenários onde isso pode ser usado, e vocês?

Com certeza, se você tiver o screendump instalado, poderá obter o mesmo resultado (inclusive com uma aparência melhor).

Outra ferramenta é ttylog, mas eu só consegui usar bem em terminais seriais abertos por SSH.

Preciso / quero registrar todas as sessões de terminal automaticamente. Como faço?

Adicione a seguinte linha no final do arquivo .bashrc em seu diretório home, ou ainda em /etc/bash.bashrc se quiser registrar todas as sessões de todos os usuários. Basicamente testa se o processo pai não é um script e depois roda o script.

test “$(ps -ocommand= -p $PPID | awk ‘{print $1}’)” == ‘script’ || (script -f $HOME/$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}_shell.log)

Dica: Se você incluir um ponto “.” como primeiro caracter do arquivo gerado vai perceber que eles ficam ocultos na pasta, apesar de ainda poderem ser localizados com comandos especificos.

Nota: A solução não é perfeita, só atende a intenção. Alguns importantes pontos de atenção seriam que os logs poderiam ser registrados em local seguro, quem sabe um servidor externo de logs, ou movidos regularmente para lá (script de backup no cron). Outro fator é que os usuários podem ficar relutantes em ter logs de suas ações e o mesmo até poderia considerar quebra de privacidade (existe uma opção -q no script para registro silencioso). Além disso, usuários um pouco mais expertos podem passar incógnitos pedindo ao sshd para usar outro shell ou carregar um rcfile diferente para evitar que o /etc/bash.bashrc seja carregado.

https://jms1.net/ssh-record.shtml Tutorial sobre registros de sessão ssh

https://jms1.net/logssh script para gerar arquivos de logs das sessões de ssh que você inicia

https://jms1.net/log-session script para logar todas as sessões SSH/SFTP do server

 

Como faço se eu quiser enviar um comando para ser executado em outro terminal?

Na verdade, se pode escrever o comando no outro terminal, mas ainda será necessário a execução da ação.

Neste caso, julgo que a melhor solução é usar o writevt. algo como:

./writevt /dev/pts/4 “echo oi”

As distribuições recentes parecem não ter mais o comando nos repositórios, mas você pode baixar o (código) fonte no link abaixo e compilar:

https://github.com/grawity/code/blob/master/thirdparty/writevt.c

para compilar:

gcc writevt.c -o writevt

Mais informações sobre como compilar C você pode obter em:

https://vitux.com/how-to-write-and-run-a-c-program-in-linux/

É possível me comunicar com outros usuários diretamente pelo terminal?

Claro! Basta enviar uma mensagem através do comando wall e ela vai a todos os usuários por broadcast.

Você também pode enviar a mensagem para todos de um determinado grupo de usuários. Além disso, é possível enviar o conteúdo de arquivos, o que nos dá a possibilidade de usar a ferramenta para distribuir mensagens padrão pre-definidas conforme a ocorrência de eventos específicos.

wall “mensagem para todos os usuários: Happy Hour as 17:00”

wall –group admin “vou reiniciar o sshd.”

wall /etc/issue

Como faço se eu quiser conversar com determinado usuário / terminal?

Pode usar o comando write. Sejamos sinceros, não é muito prático considerando as ferramentas de hoje, e precisa de algum alinhamento entre as pontas para uma boa comunicação, mas só de pensar que você pode se comunicar com outra pessoa sem ajuda de nenhuma “interface” gráfica, continua incrível para mim.

Na prática: Você viu pelo comando w que tem um usuário erick logado em tty2. Então você começa a comunicação com:

write erick

A seguir escreve as frases que quer enviar a ele e uma a uma elas vão sendo enviadas a cada enter (return).

Quando quiser terminar a conversa basta dar um CTRL+C e ele vai receber a informação de EOF.

Como boa prática, se usa o código -o na última linha para mostrar que aguarda uma resposta (câmbio) e o-o para informar que acabou a comunicação (cambio desliga).

O usuário Erick vai receber as mensagens nos terminais em que estiver logado, inclusive com o detalhamento de quem enviou a mensagem, de qual terminal e a que horas (para que ele possa retornar)

Agora para continuar a conversa, o usuário Erick precisaria seguir o mesmo processo…, por exemplo:

write joao tty3

Neste caso as mensagens vão para o terminal indicado (se o usuário citado estiver logado nele).

Apesar disso, alternativas existem hoje como utalk e nwrite a pequena distância de um apt-get install.

Mas teria uma maneira mais legal de integrar meu grupo / equipe de trabalho?

Que tal um canal no IRC? Não, o IRC não morreu, muito pelo contrário.

Você ainda pode usar todos os recursos como criar e administrar um canal, privado inclusive, para que todos possam se conectar e conversar de forma bem mais livre que pelas opções que ofereci anteriormente. Além disso, você pode obter alternativas no celular de Apps para se conectar ao servidor/canal.

Mantendo o foco no terminal, você pode estabelecer uma conexão a um servidor de IRC através do terminal com a ferramenta irssi.

Dúvidas, sugestões? Deixa nos comentários.

Deixe uma resposta

Fechar Menu
×
×

Carrinho