【问题标题】:Telnet not working for os.system callTelnet 不适用于 os.system 调用
【发布时间】:2013-07-23 17:43:09
【问题描述】:

为什么我不能在 python 中使用 os 调用以下命令?

import os
os.system('telnet 1.1.1.1')

然而,当我打开终端并使用确切的命令时,我可以远程登录。运行代码时我得到以下信息:

'telnet' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

我已启用 TelnetClient 和 TelnetServer

【问题讨论】:

  • 所以如果你打开一个shell并输入which telnet你会得到什么? (在 Windows 上使用 where telnet.exe
  • windows 7 - C:\Windows\System32\telnet.exe
  • 尝试打印sys.path 是否包含在路径中?
  • 附带说明,您最好使用 Popen 与 telnet 交互:docs.python.org/2/library/subprocess.html#popen-constructor。除非你的想法只是让用户与之交互,而不是你的 python 脚本。
  • 是否可以使用python将登录信息发送到telnet?例如,将用户名(user)和密码(pass)发送到主机(1.1.1.1),以便它自动登录?以某种方式将字符串发送到刚刚调用 telnet 的进程?我想避免使用外部程序,但方法或硬编码解决方案有效

标签: python command-line telnet os.system telnetlib


【解决方案1】:

@Jon S.:Telnet 和 SSH 等程序本质上是交互式的。因此,当您打开 telnet 时,它会从正在运行的 shell 返回一些内容以处理该特定连接。我没有尝试像你上面提到的那样运行命令,但我过去在 Windows 中成功使用过 python 的 'telnetlib' 并且仍在使用它。这是一个可以提供帮助的 sn-p。

import telnetlib
import os

host_ip = "1.1.1.1"
user = "user"
password = "password"

tnet_hndl = telnetlib.Telnet(host_ip)
print (tnet_hndl.read_until(b"login: "))
tnet_hndl.write(user.encode('ascii') + b"\n")
print (tnet_hndl.read_until(b"Password: "))
tnet_hndl.write(password.encode('ascii') + b"\n")
print (tnet_hndl.read_until(b"# "))
#tnet_hndl.set_debuglevel(1) #enable this if you want to debug more
tnet_hndl.write(b"<enter some windows cmd here>" + b"\n")
print (tnet_hndl.read_until(b"# "))
tnet_hndl.close()

希望这会有所帮助。

【讨论】:

  • 这有点帮助 - 我已经看过类似的东西了。我对这种类型的代码的问题是我的代码在尝试阅读时变得很糟糕——我刚刚执行了上面的代码,它在 print tnet_hndl.read_until(b"login:") 处挂断了。我不知道为什么,但我无法通过任何 .read_until 函数
  • 您必须将 b"login:" 替换为从 Windows 使用 telnet 到目标计算机时收到的任何提示。
  • 间距重要吗?当我正常远程登录时,我得到“用户名:a”,其中 a 代表我可以输入用户名的开始。我想我会想这样做吗? print (tnet_hndl.read_until(b"User Name: ")) 有一个空格?我已经尝试了 1 和 2 个空格,但仍然没有运气......
  • 令人惊讶的一点调试可以做什么......我的问题是'#'实际上是一个'>'谢谢你的帮助!
  • 如果您发现它有用,请不要忘记将答案加分。 :-)
【解决方案2】:

试试os.system('C:/Windows/System32/telnet.exe 1.1.1.1 &lt;port number&gt;') 看看会发生什么?

【讨论】:

  • 'C:\Windows\System32\telnet.exe' 不是内部或外部命令、可运行程序或批处理文件。
  • 端口是 23 - 因为它被设置为默认值,那应该没问题吗?
  • 好的,所以我尝试调用以下命令:os.startfile("C:/Windows/System32/telnet.exe") 并得到了一个有趣的结果:没有这样的文件:C:\\Windows\\ System32\telnet.exe 为什么即使我没有提供斜杠,它也会添加额外的斜杠?
  • 第一个斜线是为了转义第二个。在字符串中,\ 用于创建转义字符,如换行符 (\n) 或制表符 (\t),因此您必须添加其中两个才能说它只是一个斜线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2011-10-03
  • 2017-11-29
  • 2014-02-09
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多