Digamos hipoteticamente que eu esteja executando um script bash de longa duração e, enquanto ele estiver em execução, eu acidentalmente clico com o botão direito do mouse no terminal e colo uma senha sensível (recém-copiada de um gerenciador de senhas) no terminal.
~$ process_data.sh
[useful data 1]
[useful data 2]
...
[useful data N-1]
hunter2[useful data N]
[useful data N+1]
Existe alguma maneira de remover o texto (hunter2) de exibição no terminal, preservando os dados úteis? Ctrl-L e clear
apaga tudo na tela. Ctrl-H funciona para apagar caracteres na linha atual, mas não consigo mover o cursor para cima.
Não preciso excluir o texto de ~/.bash_history
, só quero que os dados úteis apareçam no terminal sem o texto ofensivo.
Presumo que a resposta possa depender das capacidades/implementação do terminal. Estou usando o Ubuntu 18, mas soluções para qualquer terminal comum seriam apreciadas.
Não.
Você pode usar Ctrlupara cancelar o buffer de entrada para não inseri-lo acidentalmente como um comando com Enter. Mas não é possível remover texto que foi colado em uma linha acima da atual.
Sim.
Se você tiver acesso a outra sessão de terminal na mesma máquina, poderá enviar as sequências de caracteres apropriadas para a sessão de terminal problemática para sobrescrever o texto indesejado. Ou, se o aplicativo já tiver sido finalizado, você pode simplesmente executá-lo diretamente. Por exemplo:
Se necessário, redirecione tudo isso como um único bloco para o seu terminal ofensivo
Se você executar:
Depois, você poderá se mover pela tela com as teclas de seta, substituir o que precisar, como espaços, e pressionar Enterpara retornar ao prompt.
t=$(stty -g)
salva as configurações atuais do ttystty -echoctl
Desativa o comportamento que altera o eco da maioria dos caracteres de controle^X
(como^[
para ESC). Em vez disso, eles serão enviados brutos para o terminal.tput rmkx
Certifique-se de que o terminal não esteja no modo teclado numérico. Fora do modo teclado numérico, na maioria dos terminais, acontece que a sequência de caracteres (o primeiro dos quais são os caracteres de controle ESC) enviada ao pressionar as teclas de seta corresponde à sequência de escape que o terminal, ao recebê-la, reconhece para mover o cursor na direção correspondente. Por exemplo, pressionar Upenvia a<ESC>[A
sequência, e essa sequência, quando enviada ao terminal (como aqui pelo eco do que você digita), move o cursor para cima. Sem ormkx
, você pode descobrir que o terminal envia,<ESC>OA
em vez disso, cujo eco não moveria o cursor para cima e mostraria umA
.tput sc
s
aves ac
posição do ursoread -r _
lê até você pressionarEntertput rc
r
restaura ac
posição do ursostty "$t"
restaura as configurações tty salvas anteriormente.Não estamos fazendo isso
stty smkx
porque não sabemos se o modo de teclado foi habilitado previamente (e, pelo que sei, não há um equivalente fácil/portátilstty -g
para salvar o estado interno do terminal nesse sentido).Observe que você não poderá alterar o texto que já foi rolado para fora da tela dessa maneira.
Se estiver usando o multiplexador de terminal GNU
screen
, você pode fazer o mesmo como parte de umexec
filtro , mesmo enquanto houver um aplicativo ainda em execução em um terminal: abra oscreen
prompt (por padrão Crtl+ a, :) e digite:E faça o mesmo lá. Não é necessário salvar e restaurar as configurações de tty nesse caso, pois
exec
isso gera um novo dispositivo pseudoterminal.Isso realmente parece um XYProblem: sua real necessidade pode ser não exibir "hunter2"? Mas você pergunta sobre uma possível "solução": como apagá-lo depois?
Se o problema real é evitar que algo (aqui, provavelmente algo que você insere em uma "leitura"?) seja exibido:
Se você precisar que a entrada contenha Enter também, você pode colocar o tty no modo raw também (mas isso fica um pouco mais complicado)