3

目标
我正在尝试为几十个路由器自动进行复杂的配置更改,但没有获胜。尝试过 Python 的 paramiko 库、Python 结构和 Perl 的 expect 和 Rex 接口/库。

其他信息
* 路由器:Fortigate 60D
* 固件:v5.0,build0252 (GA Patch 5)
* SSH 启用:True

我可以通过 SSH 登录并手动运行这些命令!

我在过去使用了 Fortigate 60B 的 perl expect 库,但它不再有效。在我分享我想问的代码之前:

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/雷克斯:

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,尝试进行身份验证。
强化 # 未知动作 0

加强 #

蟒蛇/帕拉米科:

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

输出:无

蟒蛇/面料:

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] 运行:执行 dhcp 租用列表 wifi
[10.10.10.2] 出:Fortigate #Unknown action 0
[10.10.10.2] 出:
[10.10.10.2] 出:加强 #

完毕。
从 10.10.10.2 断开连接......完成。

结论......到目前为止

Unknown action 0意思是,“我不知道这个命令[在这种情况下]”。此命令可以在第一个提示符下手动运行。此外,正如您在 fabric 和 rex 示例中看到的那样:它确实进行了身份验证和连接!我得出的结论是,这是出于安全原因而设计的……而且更有可能出售他们的专有管理垃圾。

4

5 回答 5

2

这适用于 FortiNet 邮件设备。

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

https://github.com/knipknap/exscript

于 2014-12-18T10:50:53.290 回答
2

以下脚本对我使用 Python/Paramiko 的 FortiGate (5.2.4) 有效:

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

安迪

于 2015-10-22T12:49:56.780 回答
1

我有60B。

请尝试从 linux 终端运行此命令。

如果您没有 sshpass - 您可以安装它。

sshpass -p 'adminpassword' ssh ip_of_fw -l admin 执行 dhcp 租用列表

于 2014-05-12T13:01:37.763 回答
1

如果您想使用fabric 在fortigates 上运行命令,则需要在通过SSH 连接时禁用fabric 使用的shell 包装:

from fabric.api import run

def get_sys():
   run("get sys status",shell=False)
于 2017-06-13T22:07:13.183 回答
0

您可以升级操作系统版本,然后使用 API 与 P

于 2019-07-20T06:31:58.993 回答