comando SMTP interativo usando telnet via script de shell

0

Eu estou tentando acessar um servidor remoto SMTP através de um shell remoto usando telnet e um comando comando command.txt contendo arquivo para enviar para esse servidor SMTP como visto em link (note que no site acima isso é feito de forma interativa) mas aqui eu quero fazer isso dentro de um arquivo de comando (eu Acabei de copiar o amarelo / vermelho (a entrada do usuário)) para o arquivo de comando.

HELO yahoo.com
mail from: [email protected]
rcpt to: [email protected]
data

Hey
This is test email only

Thanks
.

quit

usar telnet IP smtp < command.txt sempre retorna:

Trying 1.1.65.49...
Connected to 1.1.65.49.
Escape character is '^]'.
Connection closed by foreign host.

ao passo que quando interage com:

perlhook@bbis:~/temp_25$ telnet 1.1.65.49 smtp
Trying 1.1.65.49...
Connected to 1.1.65.49.
Escape character is '^]'.
220 miraino-manabi.jp ESMTP Postfix
HELO yahoo.com
250 miraino-manabi.jp
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
554 5.7.1 <[email protected]>: Relay access denied
^]
telnet> quit

Eu recebo os códigos de retorno 220 250 554 .

Eu também tentei dentro de um script de shell do aqui-doc da seguinte forma:

telnet 1.1.65.49 smtp <<END_SCRIPT
HELO yahoo.com
mail from: [email protected]
rcpt to: [email protected]
data

Hey
This is test email only

Thanks
.

quit
END_SCRIPT

e obtenha os mesmos resultados.

Como posso contornar isso e fazer o script agir como se fosse interativo?

    
por user2901196 19.10.2018 / 02:10

1 resposta

3

telnet falha por diversos motivos. Primeiro, se você strace os erros relevantes são telnet desejando um TTY na entrada padrão, dos quais não há nenhum (por causa do redirecionamento), então telnet falha.

$ strace telnet mx.example.edu 25 < input
...
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B0 -opost -isig -icanon -echo ...}) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(0, SNDCTL_TMR_START or TCSETS, {B0 -opost -isig -icanon -echo ...}) = -1 ENOTTY (Inappropriate ioctl for device)

Se, em vez disso, nc ou netcat for usado, o envio não interativo ainda pode ser um problema; ou muito é enviado de uma só vez (o que confundirá o servidor remoto) ou o servidor se oporá a muitos dados muito rapidamente; SMTP é uma conversa interativa. Se um lado estiver detonando, o outro pode atrasar ou rejeitar isso (o envio rápido demais pode ser uma indicação de um spammer). Se o seu nc suportar --delay e o servidor de correio remoto estiver perdoando, maio poderá enviar.

$ strace -s 80 nc --crlf --delay 1 mx.example.edu 25 < input
...
recvfrom(3, "220 mx.example.edu ESMTP OpenSMTPD\r\n", 8192, ...
...
sendto(3, "HELO client.example.edu\r\nmail from: [email protected]\r\n...
...
shutdown(3, SHUT_WR)                    = 0
...
recvfrom(3, "500 5.5.1 Invalid command: Pipelining not supported\r\n",

O OpenSMTPD aqui rejeita o envio; O postfix em um servidor diferente (não mostrado aqui) permite o envio acima.

Um cliente SMTP que fala o protocolo SMTP deve ser usado em vez disso; isso pode ser feito junto com algo como expect link ou de outra forma existem várias bibliotecas SMTP em vários idiomas que suportarão TLS, SMTP AUTH, erros de identificador e assim por diante. O shell não é uma boa escolha aqui ... a menos que você use os recursos TCP de um shell como o ZSH, mas provavelmente há coisas melhores para fazer do que "não inventado aqui", mas outro cliente SMTP ...

    
por 19.10.2018 / 06:12