Запретить автоматизацию с помощью Perl или Python
Цель
Я пытаюсь автоматизировать автоматическое изменение конфигурации для нескольких десятков маршрутизаторов и не выигрываю. Испытал библиотеку Paramiko в Python, Python Fabric и Perl, а также интерфейсы и библиотеки Rex.
Другая информация
* Маршрутизаторы: Fortigate 60D
* Прошивка: v5.0, build0252 (GA Patch 5)
* SSH включен: True
Я могу войти через SSH и запустить эти команды вручную!
В прошлом я использовал библиотеку Perl Expect для Fortigate 60B, но она больше не работает. Прежде чем поделиться кодом, я хочу спросить:
Есть ли какая-то новая функция в Fortigate, которая предотвращает этот тип автоматизации?
Простая и безвредная команда для тестирования [список текущих аренды dhcp]:
execute dhcp lease-list wifi
Код
Perl / Ожидать:
my $timeout = 10;
$ssh->expect($timeout, [ qr/password: /i ]);
$ssh->send("$passwd\r\n");
$ssh->expect($timeout, [ qr/#/i ]);
$ssh->send("execute dhcp lease-list wifi\r");
$ssh->expect($timeout, [ qr/#/i ]);
$ssh->send("exit\r");
$ssh->soft_close();
Выход: нет
Perl/Rex:
desc "List all dhcp leases";
task "leases", group => "forti", sub {
my $output = run "execute dhcp lease-list wifi";
say $output;
};
Выход:
[2014-02-11 13:14:48] (30011) - ИНФОРМАЦИЯ - Выполнение задачи: аренда [2014-02-11 13:14:48] (30022) - ИНФОРМАЦИЯ - Подключение к 10.10.10.2 (администратор) [2014-02-11 13:14:49] (30022) - ИНФОРМАЦИЯ - Подключен к 10.10.10.2, пытается аутентифицироваться. Fortigate # Неизвестное действие 0 Fortigate #
Python/ paramiko:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.10.10.2',username='fake_root',password='fake_pass')
stdin, stdout, stderr=ssh.exec_command("execute dhcp lease-list wifi")
stdout.readlines()
ssh.close()
Выход: нет
Python/ Ткань:
def view_dhcp_leases():
print("Viewing dhcp leases")
run("execute dhcp lease-list wifi")
Выход:
[10.10.10.2] Выполнение задачи 'view_dhcp_leases' Просмотр dhcp аренды [10.10.10.2] run: выполнить dhcp lease-list wifi [10.10.10.2] out: Fortigate # Неизвестное действие 0 [10.10.10.2] out: [10.10.10.2] out: Fortigate # Готово. Отключение от 10.10.10.2... сделано.
Выводы... пока
Unknown action 0
означает "я не знаю эту команду [в этом контексте]". Эта команда может быть запущена вручную при первой подсказке. Кроме того, как вы можете видеть на примерах рекс и фабрика: он аутентифицируется и подключается! Я пришел к выводу, что это сделано по соображениям безопасности... и, скорее всего, продаст свое собственное дерьмо управления.
4 ответа
Следующий скрипт работал для меня против FortiGate (5.2.4) с Python/Paramiko:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('1.1.1.254',username='admin',password='password')
stdin, stdout, stderr=ssh.exec_command("get system status")
type(stdin)
stdout.readlines()
Энди
Это работает для меня на FortiNet Mail Appliance.
from Exscript.util.interact import Account
from Exscript.protocols import SSH2
account = Account('USERNAME', 'PASSWORD')
conn = SSH2()
conn.connect('IP')
conn.login(account)
conn.execute('COMMAND')
conn.send('exit \r')
conn.close()
Если вы хотите использовать матрицу для запуска команд на fortigates, вам нужно отключить оболочку оболочки, используемую фабрикой при подключении через SSH:
from fabric.api import run
def get_sys():
run("get sys status",shell=False)
У меня 60Б.
Пожалуйста, попробуйте запустить эту команду из терминала Linux.
Если у вас нет sshpass - вы можете установить его.
sshpass -p 'adminpassword' ssh ip_of_fw -l admin выполнить список аренды dhcp