쉘 스크립트를 통해 텔넷을 사용하는 대화형 SMTP 명령

쉘 스크립트를 통해 텔넷을 사용하는 대화형 SMTP 명령

command.txt위에 표시된 대로 텔넷과 해당 SMTP 서버로 전송된 명령이 포함된 명령 파일을 사용하여 원격 셸을 통해 SMTP 원격 서버에 액세스하려고 합니다.https://tecadmin.net/ways-to-send-email-from-linux-command-line/#(참고: 위 웹사이트에서는 이 작업이 대화형으로 수행되었습니다.) 그러나 여기서는 명령 파일(노란색/빨간색(사용자 입력)을 복사했습니다)에서 이 작업을 명령 파일에 수행하고 싶습니다.

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

Hey
This is test email only

Thanks
.

quit

그런 다음 Always를 사용하여 telnet IP smtp < command.txt다음을 반환합니다.

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

그리고 내가 상호작용할 때:

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

반환 코드를 받았습니다 220 250 554.

나는 또한 다음과 같은 here-doc 쉘 스크립트에서 그것을 시도했습니다.

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

동일한 결과를 얻습니다.

이 문제를 해결하고 스크립트가 대화형으로 작동하도록 하려면 어떻게 해야 합니까?

답변1

telnet여러 가지 이유로 실패했습니다. 첫째, 표준 입력에 TTY가 필요하지만 (리디렉션으로 인해) TTY가 없다는 strace관련 오류가 발견 되면 실패합니다.telnettelnet

$ 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)

nc대신 OR을 사용하면 netcat비대화형 전송이 여전히 문제가 될 수 있습니다. 한 번에 너무 많은 데이터가 전송되거나(원격 서버를 혼란스럽게 함) 서버가 너무 많은 데이터를 너무 빨리 거부합니다. SMTP는 대화형 대화입니다. 한쪽이 폭탄을 터뜨리면 다른 쪽이 지연하거나 거부할 수 있습니다(너무 빨리 보내는 경우 스팸 발송자가 될 수 있음). 당신이 nc지지 --delay하고 원격 메일 서버가 당신을 용서 한다면가능한보낼 수 있습니다.

$ 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",

여기서 OpenSMTPD는 전송을 거부하고 다른 서버(여기에는 표시되지 않음)에서 위의 전송을 허용합니다.

실제로는 SMTP 프로토콜을 사용하는 SMTP 클라이언트를 사용해야 합니다.expect https://stackoverflow.com/questions/12320592/telnet-smtp-with-expect-or-shell-script그렇지 않으면 TLS, SMTP AUTH, 오류 처리 등을 지원하는 다양한 언어로 된 다양한 SMTP 라이브러리가 있습니다. 여기서 쉘은 좋은 선택이 아닙니다... ZSH와 같은 쉘의 TCP 기능을 사용하지 않는 한, "여기에서 발명되지 않은" 다른 SMTP 클라이언트보다 더 나은 작업이 있을 수 있습니다...

관련 정보