Ответ 1
Хорошо, я нашел решение. Прежде чем я ввел ls и выходил, мне нужно было сначала указать тип терминала. Добавление
tn.write("vt100\n")
прежде чем "ls" исправил проблему для меня.
Итак, я пробую этот простой пример, заданный документами python:
import getpass
import sys
import telnetlib
HOST = "<HOST_IP>"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()
tn = telnetlib.Telnet(HOST)
tn.read_until("login: ")
tn.write(user + "\n")
if password:
tn.read_until("Password: ")
tn.write(password + "\n")
tn.write("ls\n")
tn.write("exit\n")
print tn.read_all()
Моя проблема в том, что она зависает в конце read_all()... Она ничего не печатает. Я никогда раньше не использовал этот модуль, поэтому я стараюсь, чтобы этот действительно простой пример работал, прежде чем продолжить. BTW, я использую python 2.4 Спасибо.
Хорошо, я нашел решение. Прежде чем я ввел ls и выходил, мне нужно было сначала указать тип терминала. Добавление
tn.write("vt100\n")
прежде чем "ls" исправил проблему для меня.
Если вы используете Windows, обязательно добавьте возврат каретки (\r
) перед новым символом строки:
tn.write(user.encode('ascii') + "\r\n".encode('ascii'))
У меня нет сервера telnet для тестирования, но я думаю, проблема в том, что вы не читаете ответы сервера до подсказки после каждой команды, которую вы пишете.
PROMPT = ':~$'
tn = telnetlib.Telnet(HOST)
tn.read_until('login: ')
tn.write(user + '\n')
if password:
tn.read_until('Password: ')
tn.write(password + '\n')
tn.read_until(PROMPT)
tn.write('ls\n')
print tn.read_until(PROMPT)
tn.write('exit\n')
btw, telnetnetlib может быть сложным, и все зависит от вашего FTP-сервера и настройки среды. вам может быть лучше изучить что-то вроде pexpect для автоматизации входа и взаимодействия с пользователем по telnet.
Я знаю, что это поздно, но может помочь другим. Я также старался получить это право, но вот мой кусок кода. Мой telnet будет следовать определенному потоку, как если бы он запрашивал loginID
, а затем Password
, а затем вам нужно было ожидать, что определенная строка будет отображаться здесь, что для моего случая было "DB>"
, тогда вы можете продолжить команду и все. Мой вывод будет сохранен в "out"
varible
import os,re,telnetlib
host = "10.xxx.xxx.xxx"
port = 23
telnet = telnetlib.Telnet()
telnet.open(host, port)
telnet.write('loginID\r\n')
telnet.write('Password\r\n')
out = telnet.read_until("DB>", 5)
telnet.write('show cable modem reg\r\n') #Mycommand
out = telnet.read_until("DB>", 5)
telnet.write('quit\r\n')
telnet.close()
Дополнительные варианты и помощь см. на веб-сайте nullege
Я долго пытался изо всех сил пытаться писать на силовой полосе SynAccess. Вот как я это сделал:
import sys
import telnetlib
HOST = < your SynAccess switch ip address >
user = < user name >
password = < password >
tn = telnetlib.Telnet(HOST, 23, 5)
tn.write("login\r\n")
tn.write(user + "\r\n")
tn.write(password + "\r\n")
tn.write("rb 3\r\n") # this reboots plug 3
tn.write("rb 1\r\n") # this reboots plug 1
tn.write("logout\r\n")
tn.close
используйте python 2.7 или используйте более высокую версию с "(", ")" в последней строке