目标
我正在尝试为几十个路由器自动进行复杂的配置更改,但没有获胜。尝试过 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 示例中看到的那样:它确实进行了身份验证和连接!我得出的结论是,这是出于安全原因而设计的……而且更有可能出售他们的专有管理垃圾。