Tenho utilizado a biblioteca ExpectJ Java para automatizar alguns jobs em um servidor Linux, porém agora preciso automatizar um job que envie uma resposta de texto diferente para cada execução. Aqui está a saída:
Last unsuccessful login: Fri Mar 30 15:21:31 CST 2012
********************************************************************************
********************************************************************************
[YOU HAVE NEW MAIL]
local-login [/home/user]%
E no meu código tenho o seguinte:
s.expect("Login as:");
s.send("userlogin\n");
s.expect("userlogin@iphost's password:");
s.send("password\n");
Recebo a saída mostrada, mas não consegui enviar o próximo comando porque não sei como ler a última resposta, tentei usar uma expressão regular mas não funcionou.
Responder1
O texto do banner anterior não precisa ser tratado. Expect irá esperar até que uma das condições seja atendida (como combinar uma string/regexp ou expirar). O texto anterior é armazenado em buffer para possível uso posterior, mas não faz parte da correspondência. O que você precisa fazer é procurar a string de prompt: local-login [/home/user]%
. Se você tiver uma boa ideia de como será (por exemplo, sempre terá '[' diretório ']%', então você pode escrever uma expressão regular para corresponder a isso:
.*\[(/[^/]+)+\]%
Certifique-se de não ter uma nova linha/retorno de carro na expressão regular, pois a saída não terá um.
Responder2
Eu não acho que você seja capaz de usar expressões regulares para combinarEspereJ.
Parececomo se eles estivessem contando String.indexOf
para encontrar a correspondência
if (line.toString().trim().toUpperCase().indexOf(pattern.toUpperCase()) != -1)
onde pattern
está a String fornecida a ser esperada.
Então tente combinar uma substring e veja se funciona melhor.