我遇到了一些问题,试图通过telnet连接邮件服务器。我遇到的主要问题是我需要创建一个脚本来登录目标服务器,但我找不到一种方法来回显密码。
我尝试过以下方法:
telnet host -l username ; echo 'password'
它仍然要求我输入密码。有没有办法修复这个问题,或者是我做错了什么?
首先,您可以使用eval
:
eval "{ echo user_name; sleep 1; echo pass; sleep 1; echo '?'; sleep 5; }" | telnet host_address
请确保替换user_name
,pass
,?
(要运行的命令)和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,这将重新启动您的路由器。
感谢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>
password
。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
(必要的命令:-)),然后断开连接。
为什么你永远不应该那样做:
如果您真的想以批处理方式将命令传递到远程服务器,则应尝试使用ssh
,因为它具有以下功能:
如果您无法使用ssh
(某些系统管理员不喜欢有不受控制的ssh连接输入),您还可以尝试使用rsh
。它比较老,远不如安全,但至少是为批处理使用而设计的。
尝试使用eval
:
eval "{ echo;
sleep 3;
echo $user;
sleep 1;
echo $pass;
sleep 1;
echo '?';
sleep 1; }" | telnet your_host
sleep
(可能不是所有的,也不是这些时间;试错...)以避免 telnet 错过一些输入。$user
和 $pass
)。如果您正在编写脚本,请考虑安全建议来存储密码。