Oi,
Estou criando um roteiro para executar comandos automatizados.
Mas estou com problema na saída de erros.
Minha dificuldade é capturar mensagens de erro, tentei es.leia("*t")
A única forma que encontrei foi redirecionando a saída para um arquivo 2>/tmp/erros
mas acho que tem uma forma de capturar diretamente na variável
// ┌────────────────────────────────────────────────────────────────────┐ \\
// │████████████████████████████████████████████████████████████████████│ \\
// ├────────────────────────────────────────────────────────────────────┤ \\
// │ CRIADO POR RAFAEL ALVES LEMOS - NA LINGUAGEM PRISMA │ \\
// │ Não há qualquer licença ou garantia de funcionamento │ \\
// ├────────────────────────────────────────────────────────────────────┤ \\
// │████████████████████████████████████████████████████████████████████│ \\
// └────────────────────────────────────────────────────────────────────┘ \\
imprima("Digite o endereço IP desta forma 1.1.1. \n será varrida uma rede /24 ou 254 endereços:")
endereco = leia()
comando_inicial = 'sshpass -p SENHA ssh -o UserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -oKexAlgorithms=+diffie-hellman-group1-sha1 -o ConnectTimeout=1 USUÁRIO@'
comando_final = ' \'cat /etc/version\' 2>/tmp/erros '
local err = '/tmp/erros'
funcao principal();
para i=1,254 inicio
f = es.pabra(comando_inicial..endereco..i..comando_final );
se f entao
local tela = f:leia('*t');
f:feche();
se tela entao
es.entrada(err);
x = es.leia("*t"); //colocando o "*t" o arquivo é lido inteiro
es.feche();
imprima(x)
esgotado = tela:procure("Connection timed out")
imprima (x)
fim
fim
fim //para
fim //fim funcao
Adicionando 2>&1 na linha de comando, a saída de erro é forçada como retorno para leia'*t';
Veja um exemplo abaixo:
cmd = "prisma -e 'imprima(8+a)' 2>&1 ";
f = es.pabra(cmd);
se f entao
s = f:leia'*t';
f:feche();
fim
imprima( s );
inclua 'igbr'
ig.msg(nulo,'',s);
sis.saia(0);
Obs. Essa dica é dependente da plataforma, testado em linux Mint.
Até logo...
Boa noite Adalberto,
Consegui capturar a tela trocando os números:
2>&1 para 1>&2
Mas não consigo fazer meu programa automaticamente passar uma entrada para o terminal (stdin)
Ele executa o comando passwd no terminal mas fica esperando digitar a senha
Tem uma luz?
Estranho ter que inverter o 2>&1 para 1>&2
aqui na minha distro o primeiro funciona.
Veja se os comandos abaixo atendem sua necessidade:
//mudando senha com passwd:
inclua'igbr';
cmd = 'prisma -e "poe\'%s\'; poe\'%s\\n%s\'" | sudo -S passwd %s';
senha_atual = 'senha_atual';
nova_senha = 'nova_senha';
usuario = 'seu_usuario';
cmd = string.formate(cmd, senha_atual, nova_senha, nova_senha, usuario);
a = es.pabra( cmd .. ' 2>&1' );
ig.msg(nulo,'',a:leia'*t');
a:feche();
sis.saia(0);
Falou, até mais...