Telnet не работает для вызова os.system

Почему я не могу вызвать следующее в python, используя os?

import os
os.system('telnet 1.1.1.1')

тем не менее, когда я открываю терминал и использую точную команду, я могу использовать telnet. Я получаю следующее при запуске кода:

'telnet' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.

Я включил TelnetClient и TelnetServer


person JonStanley91    schedule 23.07.2013    source источник
comment
Итак, если вы откроете оболочку и наберете which telnet, что вы получите? (в окнах используйте where telnet.exe)   -  person Joran Beasley    schedule 23.07.2013
comment
Windows 7 - C:\Windows\System32\telnet.exe   -  person JonStanley91    schedule 23.07.2013
comment
попробуйте напечатать sys.path включено ли C:\Windows\System32 в путь?   -  person Joran Beasley    schedule 23.07.2013
comment
В качестве примечания: вам лучше использовать Popen для взаимодействия с telnet: docs. python.org/2/library/subprocess.html#popen-constructor . Если только ваша идея не заключается в том, чтобы позволить пользователю взаимодействовать с ним, а не с вашим скриптом Python.   -  person snf    schedule 23.07.2013
comment
Можно ли использовать python для отправки информации для входа в telnet? Например, отправить имя пользователя (user) и пароль (pass) на хост (1.1.1.1), чтобы он автоматически вошел в систему? как-то отправить строку процессу, который только что вызвал telnet? Я хочу избежать использования внешних программ, но методы или жестко закодированные решения работают   -  person JonStanley91    schedule 23.07.2013
comment
Проверьте эту функцию Popen, она позволит вам управлять stdin, stderr и stdout. Также метод @mK7 с использованием библиотеки telnet чище.   -  person snf    schedule 23.07.2013


Ответы (2)


@Jon S.: Такие программы, как Telnet и SSH, интерактивны по своей природе. Поэтому, когда вы открываете telnet, он возвращает что-то из запущенной оболочки для обработки этого конкретного соединения. Я не пробовал запускать команду, как вы упомянули выше, но я успешно использовал «telnetlib» python в Windows в прошлом и до сих пор использую ее. Вот фрагмент, который может помочь.

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()

Надеюсь это поможет.

person mK7    schedule 23.07.2013
comment
это немного помогает - я уже смотрел на такие вещи. Моя проблема с этим типом кода заключается в том, что мой код отстой при попытке чтения - я только что выполнил вышеприведенное, и он завис на печати tnet_hndl.read_until(blogin: ). Я не уверен, почему, но я не могу обойти ни одну из функций .read_until. - person JonStanley91; 23.07.2013
comment
Вам придется заменить blogin: любым приглашением, которое вы получаете, когда используете telnet из Windows на целевой компьютер. - person mK7; 23.07.2013
comment
Имеет ли значение интервал? Когда я обычно использую telnet, я получаю имя пользователя: a, где a представляет собой начало того, где я могу ввести имя пользователя. Я предполагаю, что хотел бы сделать это? print (tnet_hndl.read_until(bUser Name:)) с одним пробелом? Я пробовал 1 и 2 пробелы, но все равно не повезло... - person JonStanley91; 23.07.2013
comment
Удивительно, что может сделать небольшая отладка ... моя проблема заключалась в том, что «#» на самом деле был «›», спасибо за помощь! - person JonStanley91; 23.07.2013
comment
Не забудьте отметить ответ 1, если он показался вам полезным. :-) - person mK7; 23.07.2013
comment
мне нужно 15 повторений ... или я бы полностью! ›.‹ - person JonStanley91; 23.07.2013

Просто попробуйте os.system('C:/Windows/System32/telnet.exe 1.1.1.1 <port number>') и посмотрите, что произойдет?

person user2547836    schedule 23.07.2013
comment
«C:\Windows\System32\telnet.exe» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл. - person JonStanley91; 23.07.2013
comment
Порт 23 - разве это не должно быть хорошо, поскольку он установлен по умолчанию? - person JonStanley91; 23.07.2013
comment
Итак, я попытался вызвать следующее: os.startfile(C:/Windows/System32/telnet.exe) и получил интересный результат: Нет такого файла: C:\\Windows\\System32\telnet.exe Почему добавляется дополнительный косые черты, хотя я их не предоставляю? - person JonStanley91; 23.07.2013
comment
Первая косая черта предназначена для экранирования второй. В строках \ используется для создания escape-символов, таких как перевод строки (\n) или табуляция (\t), поэтому вам нужно добавить два из них, чтобы сказать, что это просто косая черта. - person snf; 23.07.2013