telnetlib write()某些命令在Python中不起作用

telnetlib write()某些命令在Python中不起作用,python,telnetlib,Python,Telnetlib,我使用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.writ

我使用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。谢谢

您的问题几乎肯定是计时错误

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

SunOS机器的
telnetd
服务器有一个相对较小的缓冲区,比如说16字节。因此,如果在shell启动之前发送整个命令,它只会向shell发送16个字节。当然,这不是你想要的。但是如果您等待shell启动,它将获得整个命令,因此可以工作

通过将
tn_setdebuglevel(1)
添加到程序中,您正在更改时间打印调试信息所需的额外时间刚好足够(通常)让shell在填充缓冲区之前启动,因此它正好工作

密码提示可能也有同样的问题,您可以使用“tn.read_until('password:')解决这个问题。你只需要在这里做同样的事情。例如(取决于预期提示的内容):


那么,在telnet会话中,到底是什么在来回移动呢?你试过看吗?还有,是什么让你认为是
write()
函数不起作用,而不是说
write
工作得很好,执行
echo
命令时出现权限错误或其他问题?或者无法登录,所以你甚至没有和壳牌公司通话?(例如,在许多平台上,
密码:
提示符在冒号后没有空格;使用碰巧在一台机器上工作的示例代码,甚至没有测试它是否在您的机器上工作,这不是一个很好的主意。)@abarnert好吧,我的问题中显示的代码是一个简化的示例,因为我的剧本里还有很多。所以,我知道其他一切都在起作用,也许我应该开始解释这一点。如果问题是权限问题,我相信它不应该与SecureCRT一起工作另一方面,我尝试了tn.set_debuglevel(1),现在可以工作了,如果我对该行进行注释,它就不再工作了。我不知道为什么,但问题似乎是这样解决的。一个简化的例子是好的,但如果它被简化到不能再现问题的程度就不行了。(如果您向我们展示工作代码,我们无法告诉您它有什么问题。)请阅读。同时,如果仅仅添加
tn.set\u debuglevel
就有不同,那么您很可能遇到了某种时间问题。也许SunOS的
telnetd
只是为shell缓冲,比如说,16个字符,因此,如果您在不等待shell启动的情况下
编写一个命令,它会被截断,但是编写调试信息恰好会减慢速度,使shell能够及时启动并读取整个命令,因此,事情现在98%的时间都在工作,而不是2%的时间。
# ...
tn.read_until('$')
tn.write('echo "" > /path/to/file.log\n')
tn.read_until('$')
tn.write('exit\n')
tn.close()