【问题标题】:telnetlib write() some command not working in Pythontelnetlib write() 某些命令在 Python 中不起作用
【发布时间】:2015-05-18 04:56:41
【问题描述】:

我使用 Python 的 telnetlib.write() 函数已经有一段时间没有问题了,但在这种情况下,我想要发送的命令什么也不做。虽然通过 SecureCRT 发送的相同命令工作正常。

这或多或少是我所拥有的:

import telnetlib

tn = telnetlib.Telnet(HOST)

tn.read_until('login: ')
tn.write(user + '\n')

if pswrd:
    tn.read_until('Password: ')
    tn.write(pswrd + '\n')

tn.write('echo "" > /path/to/file.log' + '\n')

tn.write('exit\n')
tn.close()

这应该做的是清除file.log的内容,但文件保持不变。为什么会这样? 值得一提的是,telnet 服务器正在运行 SunOS。谢谢!

【问题讨论】:

  • 嗯,在 telnet 会话中来回切换的实际情况是什么?你试过set_debuglevel看看吗?
  • 另外,是什么让你认为 write() 函数不起作用,而不是 write 完美运行并执行 echo 命令失败并出现权限错误或某物?或者无法登录,所以你甚至没有和外壳说话? (例如,在许多平台上,Password: 提示符在冒号后没有空格;使用恰好在一台机器上工作的示例代码甚至没有测试它是否可以在您的机器上工作并不是一个非常好主意。)
  • @abarnert 好吧,我的问题中显示的代码是一个简化的示例,因为我的脚本中还有很多内容。所以,我知道其他一切都在工作,也许我应该开始解释这一点。如果问题是权限问题,我相信它不应该与 SecureCRT 一起使用。 - 另一方面,我尝试了 tn.set_debuglevel(1) 并且现在正在工作,如果我评论该行它不再工作了。不知道为什么,但问题似乎是这样解决的。
  • 一个简化的例子很好,但如果它被简化到实际上并没有重现问题,那就不行了。 (如果您向我们展示工作代码,我们无法告诉您其中有什么问题。)请阅读minimal, complete, verifiable example
  • 同时,如果只是添加 tn.set_debuglevel 会有所不同,那么您很可能遇到了某种时间问题。也许 SunOS 的 telnetd 只是为 shell 缓冲 16 个字符,所以如果你 write 一个命令没有等待 shell 启动它会被截断,但是写入调试信息恰好会经常减慢速度shell 会及时启动并且可以读取你的整个命令,所以现在工作的时间是 98%,而不是 2%。

标签: python telnetlib


【解决方案1】:

您的问题几乎可以肯定是时间错误。

如果无法调试它,或者无法查看调试结果,很难确定确切是什么问题,但我的猜测是这样的:

SunOS 机器的telnetd 服务器有一个相对较小的缓冲区,比如1​​6 字节。所以,如果你在 shell 启动之前发送整个命令,它只会发送 16 个字节到 shell。当然,这不会做你想做的事。但是如果你等到 shell 启动,它会得到整个命令,因此可以工作。

通过将tn_setdebuglevel(1) 添加到您的程序中,您正在改变时间——打印出调试信息所花费的额外时间刚好足以(通常)在您填满缓冲区,所以它恰好可以工作。

密码提示可能有同样的问题,你使用 `tn.read_until('Password: ') 解决了这个问题。你只需要在这里做同样的事情。例如(取决于预期的提示是什么):

# ...
tn.read_until('$')
tn.write('echo "" > /path/to/file.log\n')
tn.read_until('$')
tn.write('exit\n')
tn.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2014-10-11
    • 2019-07-31
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多