Telnet 使用用户名和密码登录到邮件服务器

Posted

技术标签:

【中文标题】Telnet 使用用户名和密码登录到邮件服务器【英文标题】:Telnet to login with username and password to mail Server 【发布时间】:2015-03-12 12:34:51 【问题描述】:

我在尝试通过 telnet 连接到邮件服务器时遇到了一些问题。我遇到的主要问题是我需要创建一个脚本来记录我到目的地,但我找不到回显的方法密码。

我尝试了什么:

telnet host -l username ; echo 'password'

它仍然要求我输入密码。有什么办法可以解决这个问题还是我做错了什么?

【问题讨论】:

【参考方案1】:

您是否尝试过使用 expect 命令?您将必须创建一个脚本,您可以在其中识别来自服务器的“预期”响应,例如“密码:”,然后在脚本中提供密码。下面将解释:https://en.wikipedia.org/wiki/Expect - 这里也展示了一个很好的例子:http://en.kioskea.net/faq/4736-shell-script-for-telnet-and-run-commands

【讨论】:

【参考方案2】:

AFAIK,您将无法以这种方式自动化 telnet。但它仍然是可能的 - 即使这是一个非常糟糕的想法(我稍后会详细说明)。

首先为什么你的尝试失败了:

您启动了一个 telnet 命令,从 stdin(我想是终端)读取并写入 stdout 和 stderr(我想也是一个终端) 如果您的 telnet 相当新,它会尝试保护您的身份验证并从 /dev/tty 询问您的密码(出于安全原因) 当该命令结束时你在自己的终端上写password

你应该怎么做:

启动 telnet 并禁用自动身份验证(我的是 telnet -X SRA) 用您要传递的命令为其输入提供输入 在输入输入之前等待一些延迟,至少对于登录名和密码,因为如果您在读取之前不 telnet 清除输入并丢弃您的输入

这是一个允许我远程登录到我自己的机器的示例:

sh << EOF | telnet -X SRA localhost
sleep 2
echo my_user_name
sleep 1
echo my_password
# sleep 1 # looks like it can be removed
echo echo foo and bar
sleep 1
EOF

它正确地将我登录到我的盒子,执行echo foo and bar(基本命令:-))并断开连接


现在为什么你不应该这样做:

您在脚本文件中以明文形式写入密码,这是一种糟糕的安全做法 您使用 telnet 进行批处理,但它不打算以这种方式使用:脚本可能无法移植到另一个 telnet 版本

如果你真的想以批处理的方式将命令传递给远程服务器,你应该尝试使用ssh which:

具有安全处理身份验证的选项(脚本中没有密码,没有明文) 旨在以批处理模式和交互方式使用

如果你不能使用ssh(一些系统管理员不喜欢不受控制的输入ssh连接)你也可以尝试使用rsh。它较旧,安全性低得多,但至少是为批量使用而设计的。

【讨论】:

嘿,谢谢。我有点避免这种解决方式,但现在我很难从 imap.look 中获得结果:***.com/questions/27944984/…【参考方案3】:

试试eval:

eval " echo; 
        sleep 3;
        echo $user; 
        sleep 1; 
        echo $pass; 
        sleep 1; 
        echo '?'; 
        sleep 1; " | telnet your_host

在本例中,我的远程命令是“?” (帮助)。

需要sleeps(可能不是全部,也不是这些时间;试错...)以避免 telnet 遗漏一些输入。

用户和密码作为变量传递($user$pass)。如果您正在编写脚本,请考虑存储密码的安全建议。

【讨论】:

【参考方案4】:

首先可以使用eval:

eval " echo user_name; sleep 1; echo pass; sleep 1; echo '?'; sleep 5; " | telnet host_address

确保替换user_namepass?(这是您要运行的命令)和host_address,您的telnet 主机正在侦听;对我来说,这是一个本地 IP。

编写一组命令并将它们通过管道传输到 telnet 应用程序非常容易。您需要做的就是这样:

(echo commandname;echo anothercommand) | telnet host_address

唯一的问题是您必须通过烦人的登录……它不会立即显示出来。因此,如果您输入“echo admin”,然后输入“echo password”,它会发生得太快并且不会发送到服务器。解决方案?使用 sleep 命令!

添加几个 sleep 3 命令,等待三秒钟,解决了这个问题。首先我们将回显用户名和密码,然后我们将回显重启命令,每次我们将等待三秒钟。最后的命令会立即重启服务器:

(sleep 3;echo admin;sleep 3;echo mypassword;sleep 3;echo system reboot;sleep 3;) | telnet host_address

您可以将其放入 shell 脚本中,并在需要时运行它。或者您可以像这样(在 OS X 或 Linux 上)将它添加到您的 cron:

crontab -e

在某处添加这一行:

1 7 * * * (sleep 3;echo admin;sleep 3;echo mypassword;sleep 3;echo system reboot;sleep 3;) | telnet host_address

这将在每天早上 7:01 重新启动您的路由器。

【讨论】:

【参考方案5】:

感谢Harvix 的回答,我知道还有期待shell 的替代本机,称为sexpect。从here 获取。然后创建这个脚本(我称之为 telnetpass):

#!/bin/bash
# This script is used for automatically pass authentication by username and password in telnet prompt
# Its goal is similar as sshpass, but for telnet, so I call it telnetpass

. ~/.private/cisco_pw # should contain PASSWORD variable

export SEXPECT_SOCKFILE=/tmp/sexpect-telnetpass-$$.sock
sexpect spawn telnet $1
sexpect expect -cstring 'Username:'
sexpect send -enter $USER 
sexpect expect -cstring 'Password:'
sexpect send -enter $PASSWORD
sexpect interact

然后你可以运行:telnetpass Host125并自动通过身份验证

Trying 198.51.100.78 ...
Connected to Host125.
Escape character is '^]'.


User Access Verification

Username: ashark
Password: 

host-125>

我更喜欢这个解决方案,而不是使用另一个答案中建议的睡眠命令,因为睡眠解决方案有时会失败。

【讨论】:

以上是关于Telnet 使用用户名和密码登录到邮件服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftUI、Combine 和 Firebase,我如何在将用户的帐户链接到电子邮件/密码之前验证用户是不是已匿名登录?

Firebase忘记密码 - 如何识别用户是否使用电子邮件或Facebook登录?

忘记登录 - PHP 问题

HybridAuth 身份验证 cookie

避免在登录表单中使用 WebDriverIO 重新输入用户/电子邮件和密码

对邮件服务器的一点思考