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

7

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

我尝试过以下方法:

telnet host -l username ; echo 'password'

它仍然要求我输入密码。有没有办法修复这个问题,或者是我做错了什么?

5个回答

16

首先,您可以使用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”,它会发生得太快,无法发送到服务器。解决方案?使用睡眠命令!

添加几个睡眠3命令,等待三秒钟,就可以解决问题了。首先我们将回显用户名和密码,然后我们将回显重启命令,并且每次操作之间都会等待三秒钟。最后一个命令将立即重新启动服务器:

(sleep 3;echo admin;sleep 3;echo mypassword;sleep 3;echo system reboot;sleep 3;) | telnet host_address
你可以将此内容放入一个 shell 脚本中,并在需要时运行它。或者你可以像这样将其添加到你的 cron 里面(在 OS X 或 Linux 上):
crontab -e
请将以下内容添加到某个位置:
1 7 * * * (sleep 3;echo admin;sleep 3;echo mypassword;sleep 3;echo system reboot;sleep 3;) | telnet host_address

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


4

感谢Harvix的回答,我知道除了expect外,还有用于shell的另一种本地替代工具,叫做sexpect。你可以从这里获取它。然后创建这个脚本(我称之为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>

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

3
据我所知,您无法以这种方式自动化telnet。但是仍然有可能 - 即使这是一个非常糟糕的主意(稍后我会详细解释)。
首先,为什么你的尝试失败了:
- 您启动了一个从stdin(我假设终端)读取并写入stdout和stderr(我也假设是终端)的telnet命令。 - 如果您的telnet相当新,则会尝试保护您的身份验证,并要求您从/dev/tty(出于安全原因)输入密码。 - 当该命令结束时,您在自己的终端上输入password
你应该怎么做:
- 使用自动身份验证禁用启动telnet(在我的机器上是telnet -X SRA)。 - 将其输入与您想要传递的命令一起提供。 - 在输入之前等待一些延迟,至少要进行登录和密码,因为如果您不这样做,telnet会在读取之前清除输入并丢弃您的输入。
以下是一个示例,允许我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,因为它具有以下功能:

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

如果您无法使用ssh(某些系统管理员不喜欢有不受控制的ssh连接输入),您还可以尝试使用rsh。它比较老,远不如安全,但至少是为批处理使用而设计的。


嘿,谢谢。我有点避免使用这种解决方法,但现在我正在尝试从imap获取结果时遇到困难。看这里:http://stackoverflow.com/questions/27944984/fetched-results-in-imap2-to-display-in-console - tudoricc

2

0

尝试使用eval

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

在这个例子中,我的远程命令是“?”(帮助)。
需要 sleep(可能不是所有的,也不是这些时间;试错...)以避免 telnet 错过一些输入。
用户和密码作为变量传递($user$pass)。如果您正在编写脚本,请考虑安全建议来存储密码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接