Gosto de copiar/colar comandos bash ao construir um novo sistema para tornar as coisas mais rápidas. Anos atrás, eu configurei isso e poderia usar o mouse para selecionar dezenas de comandos que colaria no gnome-terminal. Eu os deixaria terminar antes de colar no próximo lote. Isso funcionou bem por anos.
Então (Fedora 39 eu acho) isso parou de funcionar. Eu ainda poderia copiar e colar, mas a execução pararia assim que um sudo
comando fosse executado. O comando restante ecoaria na tela, mas não seria executado.
Ambiente:
- Plataforma : X86_64
- SO : Fedora 40
- Núcleo : 6.9.9-200
- Bash : GNU bash, versão 5.2.26(1)-release (x86_64-redhat-linux-gnu)
- terminal gnome : 3.50.1
- sudoers : O usuário está listado com (ALL=ALL) nunca solicita senha
Como reproduzir:
Copie estes comandos e cole em um terminal:
sudo ls
date
sudo ps
sudo uname -a
Resultado esperado:
A saída esperada é a saída dos quatro comandos. A saída real é a saída do ls
comando e é isso. Os outros comandos não são executados.
Soluções alternativas:
No momento, ainda posso copiar e colar, mas apenas até o próximo sudo
comando inclusive. Isso está me deixando tremendamente lento, pois há centenas de comandos para executar. Colar todos os comandos em um .bash
arquivo e executá-los funciona. Colar todos os comandos em um arquivo de texto e source
executá-lo também funciona.
O que estou pedindo:
Eu fiz uma tonelada de pesquisas ao longo do último ano e não cheguei a lugar nenhum. Estou perguntando aqui porque finalmente fiquei frustrado o suficiente para pedir ajuda. O que eu gostaria é voltar ao comportamento antigo, ou seja, antes de qualquer 'novo recurso' fazer com que a execução de copiar/colar parasse de funcionar.
Análise
Uma possível causa pode ser a
use_pty
bandeira. Vejaman 5 sudoers
[ênfase minha]:With
use_pty
sudo
atua como um relé e lerá seu stdin o mais rápido possível, mesmo que o comando interno não leia seu stdin. A situação é semelhante ao quessh
acontece .O comportamento padrão mudou no passado; isso explica por que as coisas pararam de funcionar para você.
Solução
Você pode restaurar o comportamento antigo. Inicie um shell elevado com
sudo -i
, deixe que seja um shell "por precaução". Em outro lugar, executesudo visudo
e desligue o sinalizador:Salve o arquivo e saia do editor. Verifique se
sudo
ainda funciona para seu usuário regular. Se não funcionar, use o shell elevado para corrigir osudoers
arquivo. Saia do shell elevado somente depois de confirmar quesudo
funciona para seu usuário normal.Observação
Com
!use_pty
, o comando executado comsudo
pode ler diretamente do terminal e consumir o que você colou. Um comando executado semsudo
também pode. Seus comandos de exemplo não fazem isso, mas em geral um comando pode. E se vocêsudo
fosse pedir senha, também consumiria parte do que você colou.Isso é algo que a pasta entre colchetes pode resolver. Para evitar contratempos, habilite a colagem entre colchetes em seu Bash:
e certifique-se de que seu emulador de terminal use a funcionalidade ao colar. Se a colagem entre colchetes funcionar, um trecho de várias linhas colado (como o em questão) não será executado instantaneamente (permitindo que comandos anteriores consumam mais entradas). Ele será armazenado em buffer pelo shell e executado após você clicar em Enter.
Com a pasta entre colchetes, seu snippet funcionará, não importa se
use_pty
está definido ou não. Pelo motivo explicado no manual citado é bom definir a bandeira.Colar entre colchetes ativado e funcionando, e
use_pty
definidosudoers
é a configuração mais segura e robusta quando você deseja colar trechos de várias linhas contendo arquivossudo
. Funcionará corretamente mesmo sesudo
for solicitar sua senha.A preocupação do seu comentário "Não vejo qual saída acompanha qual comando" pode ser resolvida com
set -v
e/ouset -x
. Vejahelp set
para detalhes.