O modelo de interação esperado não inclui uma separação de fluxos stdout e stderr. Quando você gera um processo, você cria um novo pseudo-TTY que se comporta quase de forma idêntica ao que um usuário veria em seu terminal, e um usuário normalmente não pode distinguir entre os dois. Experimente:
$ echo "This is stdout"
This is stdout
$ echo "This is stderr" 1>&2
This is stderr
Sem fazer alguma coisa para rotular a diferença, o Expect não pode distingui-las (assim como um usuário na linha de comando). Então, a Espera pode ser a ferramenta errada para o que você precisa fazer.
Agora, sem saber exatamente por que você precisa disso, é difícil encontrar um método alternativo para você. Para o que você precisa, parece que você pode fazer isso com um único comando ssh:
ssh -q -o StrictHostKeyChecking=no $username@$hostname "ls -lrt; df -h" 1>>successlog 2>>errorlog
Para outra linguagem de script com suporte interno para gerar um processo filho e obter seus stdout e stderr separadamente, tente o Python e seu módulo de subprocesso.
import shlex
from subprocess import Popen, PIPE
cmd = Popen(shlex.split('ssh -q -o StrictHostKeyChecking=no $username@$hostname "ls -lrt; df -h"'), stdout=PIPE, stderr=PIPE)
cmd.wait() # Wait for the command to complete
success_output = cmd.stdout
error_output = cmd.stderr
Mas se você realmente, realmente quiser fazer isso em Espera, acho que a melhor abordagem pode ser verificar o valor de saída do último processo e gravar em seu arquivo de log de erros quando ele estiver diferente de zero. Veja um exemplo de algo assim:
spawn ssh -q -o StrictHostKeyChecking=no $username@$hostname
# Receive password prompt and send the password here...
expect {
-ex $prompt { send "ls -lrt\r" }
timeout {
send_user "Everything is terrible forever.\n"
exit 1
}
}
expect {
-ex $prompt {
set output $expect_out(buffer)
send {echo RETVAL::$?::}
send "\r"
}
timeout {
send_user "Everything is terrible forever.\n"
exit 1
}
}
expect {
-ex {RETVAL::0::} {
set fp [open successlog a]
puts $fp $output
close $fp
}
-re {RETVAL::[1-9][0-9]*::} {
set fp [open errorlog a]
puts $fp $output
close $fp
}
timeout {
send_user "Everything is terrible forever.\n"
exit 1
}
}