Создание сценария для сеанса Telnet?
Кто-нибудь знает простой способ создания сценария, который может подключаться к серверу telnet, выполнять какие-то обычные действия telnet, а затем выходить из системы? Я имею дело с пользователями, которые не знакомы с telnet и командами, которые они должны будут выполнить. Все, что я хочу, это чтобы они дважды щелкнули по сценарию, и чтобы этот сценарий автоматически выполнял команды для них.
Вы, наверное, задаетесь вопросом: "На какой платформе пользователи?" Они будут как на Windows, так и на Linux. Реализации на таких языках, как Perl, Java или Python, являются приемлемыми. Я вижу, что в Perl есть модуль Net:: Telnet. Кто-нибудь использовал это?
Мое идеальное решение было бы создать два файла сценария. BAT-файл для Windows и сценарий оболочки для Linux. В то время как это сделало бы проблему двойного обслуживания, это означало бы, что мне не пришлось бы устанавливать Perl/Java/Python/etc... на каждую машину. К сожалению, я не видел способа автоматизировать сеанс telnet с помощью пакетных файлов или сценариев оболочки.
Благодарю.
12 ответов
Expect создан для этого и может обрабатывать ввод / вывод плюс таймауты и т. Д. Обратите внимание, что если вы не являетесь поклонником TCL, существуют модули Expect для Perl/Python/Java.
РЕДАКТИРОВАТЬ: выше страница предполагает, что запись в Википедии Ожидание является полезным ресурсом:-)
Я использовал различные методы для сценариев сеансов telnet под Unix, но самый простой из них, вероятно, представляет собой последовательность команд echo и sleep с выводом их по конвейеру в telnet. Передача вывода в другую команду также возможна.
Глупый пример
(пароль эха; эхо "show ip route"; сон 1; эхо "выход") | Telnet Myrouter
Это (в основном) извлекает таблицу маршрутизации маршрутизатора Cisco.
Другой метод заключается в использовании netcat (или nc, в зависимости от того, какой posix) в том же формате, что и vatine, или вы можете создать текстовый файл, содержащий каждую команду в отдельной строке.
Я обнаружил, что некоторые Telnet от Posix неправильно обрабатывают перенаправление (вот почему я предлагаю netcat)
Этот скрипт vbs перезагружает коммутатор cisco, убедитесь, что telnet установлен на windows.
Option explicit
Dim oShell
set oShell= Wscript.CreateObject("WScript.Shell")
oShell.Run "telnet"
WScript.Sleep 1000
oShell.Sendkeys "open 172.25.15.9~"
WScript.Sleep 1000
oShell.Sendkeys "password~"
WScript.Sleep 1000
oShell.Sendkeys "en~"
WScript.Sleep 1000
oShell.Sendkeys "password~"
WScript.Sleep 1000
oShell.Sendkeys "reload~"
WScript.Sleep 1000
oShell.Sendkeys "~"
Wscript.Quit
Это может показаться не очень хорошей идеей, но я использовал java и использовал простое программирование сокетов TCP/IP для подключения к серверу telnet и обмена сообщениями. И это работает отлично, если вы знаете, реализованный протокол. Для SSH и т. Д. Это может быть сложно, если вы не знаете, как делать рукопожатие и т. Д., Но простой telnet работает как удовольствие.
Еще один способ, которым я пытался, - использовать внешний процесс в java System.exec() и т. Д., А затем позволить окнам, встроенным в telnet, делать работу за вас, а вы просто отправляете и получаете данные в локальный системный процесс.
Проверьте инструмент SendCommand.
Вы можете использовать его следующим образом:
perl sendcommand.pl -i login.txt -t cisco -c "show ip route"
import telnetlib
user = "admin"
password = "\r"
def connect(A):
tnA = telnetlib.Telnet(A)
tnA.read_until('username: ', 3)
tnA.write(user + '\n')
tnA.read_until('password: ', 3)
tnA.write(password + '\n')
return tnA
def quit_telnet(tn)
tn.write("bye\n")
tn.write("quit\n")
Bash shell поддерживает это из коробки, например
exec {stream}<>/dev/tcp/example.com/80
printf "GET / HTTP/1.1\nHost: example.com\nConnection: close\n\n" >&${stream}
cat <&${stream}
Чтобы отфильтровать и показать только несколько строк, выполните: grep Example <&${stream}
,
Пара вопросов:
- Можете ли вы положить что-то на устройство, на которое вы звоните?
- Команды, выполняемые сценарием, одинаковы или различаются в зависимости от компьютера / пользователя?
- Вы хотите, чтобы человек, щелкающий по значку, должен указать ИД пользователя и / или пароль?
Тем не менее, я написал некоторое время на Java, чтобы поговорить с парой разветвителей с поддержкой IP (BayTech RPC3), которые могут быть вам полезны. Если вам интересно, я посмотрю, смогу ли я выкопать это и опубликовать где-нибудь.
Мне нравится пример, приведенный Active State с использованием Python. Вот полная ссылка. Я добавил простую часть журнала по ссылке, но вы можете понять суть того, что вы можете сделать.
import telnetlib
prdLogBox='142.178.1.3'
uid = 'uid'
pwd = 'yourpassword'
tn = telnetlib.Telnet(prdLogBox)
tn.read_until("login: ")
tn.write(uid + "\n")
tn.read_until("Password:")
tn.write(pwd + "\n")
tn.write("exit\n")
tn.close()
Хотя это не имеет прямого отношения к вашему вопросу, я бы порекомендовал вам использовать ssh, поскольку вы можете выполнять через него определенные команды (плюс по умолчанию он более безопасный).