我在尝试通过telnet连接到邮件服务器时遇到了一些问题。我遇到的主要问题是我需要创建一个脚本,将我登录到目的地,我无法找到回应的方法密码。
我尝试了什么:
telnet host -l username ; echo 'password'
仍然要求我输入密码。有什么方法可以解决这个问题,或者我做错了什么?
答案 0 :(得分:4)
首先,您可以使用eval
:
eval "{ echo user_name; sleep 1; echo pass; sleep 1; echo '?'; sleep 5; }" | telnet host_address
请务必替换您要运行的user_name
,pass
,?
以及您的telnet主机正在侦听的host_address
;对我来说,这是一个本地知识产权。
编写一组命令并将它们传输到telnet应用程序中非常容易。你需要做的就是这样:
(echo commandname;echo anothercommand) | telnet host_address
唯一的问题是您需要通过的唠叨登录...它不会立即显示。因此,如果您使用“echo admin”然后“回显密码”,它将发生得太快而且不会被发送到服务器。解决方案?使用sleep命令!
添加几个睡眠3命令,等待三秒,解决了问题。首先我们将回显用户名和密码,然后我们将回显reboot命令,每次我们等待三秒钟。最后一个命令将立即重启服务器:
(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重新启动路由器。
答案 1 :(得分:2)
AFAIK,你不可能以这种方式自动化telnet。但它仍然有可能 - 即使它是一个非常糟糕的想法(我稍后会详细说明)。
首先为什么尝试失败:
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
。它更老,安全性更低,但至少是为批量使用而设计的。
答案 2 :(得分:1)
您是否尝试过使用expect命令?您必须创建一个脚本,以便识别“预期的”#39;服务器的响应,例如&#39;密码:&#39;然后在脚本中提供密码。以下将解释:https://en.wikipedia.org/wiki/Expect - 此处还显示了一个很好的示例:http://en.kioskea.net/faq/4736-shell-script-for-telnet-and-run-commands
答案 3 :(得分:1)
多亏了Harvix的答案,我知道还期望有替代外壳的原生外壳,称为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>
我比其他答案更喜欢使用此解决方案,因为睡眠解决方案有时会失败。
答案 4 :(得分:0)
尝试eval
:
eval "{ echo;
sleep 3;
echo $user;
sleep 1;
echo $pass;
sleep 1;
echo '?';
sleep 1; }" | telnet your_host
在这个例子中,我的远程命令是&#39;?&#39; (帮助)。
需要sleep
s(可能不是全部,也不是这些时间;试错...),以避免telnet错过某些输入。
用户和密码作为变量传递($user
和$pass
)。如果您正在编写脚本,请考虑存储密码的安全建议。