LINUX.ORG.RU

Как отдебажить питон скрипт?

 


1

2

Написал скрипт на python 3, который гасит wi-fi на роутере:

#!usr/bin/python
import getpass
import sys
import telnetlib

HOST = "192.168.1.1"
PORT=23
TIMEOUT=10
user = "admin"
password = "xxx"

tn = telnetlib.Telnet(HOST)

tn.read_until(b"Login: ")
tn.write((user + "\n").encode('ascii'))
if password:
    tn.read_until(b"Password: ")
    tn.write((password + "\n").encode('ascii'))

tn.write(("interface WifiMaster0 down\n").encode('ascii'))
tn.write(("exit\n").encode('ascii'))

В питоновской командной строке оно отрабатывает нормально. Могу скопипастить весь текст в терминал и wi-fi погаснет. Т.е. отрабатывает как надо.

Если я это все сохраняю в файл и запускаю: *python turn_off_wifi.py*

то ничего не просходит. Он чета там в себе делает несколько секунд и ничего не происходит. Ошибок никаких не выдает. В чем может быть затык?

#!usr/bin/python

anonymous
()

Так у тебя же #!usr/bin/python а надо #!/usr/bin/python - это важное отличие. И действительно, в командной строке работать будет, а вот при вызове - не отработает.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

Написал скрипт на python 3
и запускаю: *python turn_off_wifi.py*

А надо делать так: python3 turn_off_wifi.py

Goury ★★★★★
()
Ответ на: комментарий от Goury

Нашел решение. Оказывается там нужно было паузы между командами выставить.

Short answer:

Use time.sleep(1) in between write commands

Long answer:

When you enter a command on a Cisco IOS console, it blocks until the command completes. Any input you enter into the console while the command was running is piped into the running command, much like STDIN works on a bash shell. However in bash, if a commands doesn't explicitly read the input, upon the exit of the program bash takes the unconsumed input and interprets it as a shell command. So if you want to run two commands one after another, where the first command does not read from STDIN, you can enter the second command while first command is running, i.e. you don't have to wait for the first command to finish before you enter another command. This sort of a buffering mechanism makes telnet scripting easy and we have grown to expect this from mature shells. Apparently Cisco IOS lacks this feature, and so you have to make sure you don't enter your commands too soon. There are two ways I can think of, to go about it:

Wait for a fixed amount of time between commands. Usually 1 second is a safe bet for most commands. Parse the output after each command until you find the prompt, then enter the next command, then parse again, and so on.

dopedopedope
() автор топика
Ответ на: комментарий от Goury

Еще можно запустить сразу через ipdb:

python -m ipdb script.py

ei-grad ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.