通过 Bash 脚本通过 Telnet 发送命令
Posted
技术标签:
【中文标题】通过 Bash 脚本通过 Telnet 发送命令【英文标题】:Sending Commands through Telnet via Bash Script 【发布时间】:2014-11-02 05:25:41 【问题描述】:我正在尝试在 Debian 中自动执行 telnet 会话,但在发送命令时遇到了困难。
通过查看here,我很清楚自己需要做什么。
spawn telnet localhost
expect "login:"
send "test\n"
expect "Password:"
send "password\n"
sleep 10 //Time for the connection to be established
send "ls\n"
运行脚本,它正确输入了用户名。它进入了密码字段,我假设它输入了它(尽管我不能确定,因为输入时密码在 Debian 中是空白的)。它停止等待,然后将我带回我的帐户(root)。它从未连接到“测试”。
修改我的代码,使其更像我的参考:
spawn telnet localhost
expect "login:"
send "test\n"
expect "Password:"
send "password\n"
interact
这导致它立即登录并连接到我的“测试”帐户。 从这里我尝试在使用发送、回显和输入命令进行交互后添加命令。在我退出 telnet 会话之前什么都不会发生,然后我会收到此错误。
发送:
send: spawn id exp6 not open
while executing
"send "ls\n""
(file ".telnet.sh" line 8)
对于回声:
invalid command name "echo"
while executing
"echo "ls\n""
(file ".telnet.sh" line 8)
只有命令名称“ls” 无效的命令名称“ls” 在执行时 “ls” (文件“.telnet.sh”第 8 行)
我意识到交互将控制权交还给用户,但出于某种原因,这是让我真正连接到帐户的唯一方式。
有谁知道为什么没有交互就无法连接?如果没有,为什么我不能在 telnet 会话结束之前发送这些命令?
编辑 经过一番研究,我发现了这个link,它最终解决了一个期望脚本在一切完成后立即结束,关闭远程登录会话。他们说他们通过添加一个expect“$”来解决这个问题,让脚本知道更多的命令正在被发送。我尝试像网站建议的那样使用“$”符号,但它又一次踢了我。所以我尝试了这个。
这是我更新的代码:
#!/usr/bin/expect
spawn telnet localhost
expect "debian login"
send "test\n"
expect "Password:"
send "password\n"
expect "test@debian:~$"
send "ls\n"
现在我仍在 telnet 会话中大约 10 秒钟,然后它就把我踢走了。如果我尝试在那个时间输入命令,它会暂停一段时间,然后在 telnet 会话关闭后运行我输入的命令。
正在取得进展。缓慢但肯定地。
【问题讨论】:
【参考方案1】:问题可能是因为您在期待终端之前发送了 ls 命令, 输入密码后,代码期望 "*$*" 期望终端,正则表达式 (*$*) 可能会因 telnet 会话的 PS1 环境变量而异,下面是列出内容的代码当前工作目录并注销
spawn telnet localhost
set timeout 10
expect "debian login"
send "test\r"
expect "Password:"
send "password\r"
expect "*$*"
send "ls\r"
expect "*$*"
send "logout\r"
【讨论】:
虽然正则表达式有所不同,但在我的更新中,我考虑了确切的表达式。但是,您的代码帮助我找到了解决方案。【参考方案2】:我通过在发送命令后再次期待 bash 解决了这个问题。
当这样运行时:
send "password\r"
expect "*$*"
send "ls\r"
telnet 会话立即结束。最终起作用的是期待 bash 脚本再次启动。因为脚本在发送最后一条命令后结束,所以它没有机会显示输入的命令的结果。
我通过添加一个额外的期望来解决这个问题,然后允许我的命令处理并获得结果。
这是我的最终代码。
#!/usr/bin/expect
spawn telnet localhost
set timeout 10
expect "debian login"
send "test\r"
expect "Password:"
send "password\r"
expect "*$*"
send "ls\n"
expect "*$*"
send "command2"
expect "*$*"
send "command3"
expect "*$*"
send "exit\r"
【讨论】:
以上是关于通过 Bash 脚本通过 Telnet 发送命令的主要内容,如果未能解决你的问题,请参考以下文章