目标
我正在尝试为几十台路由器自动化强制配置更改并且没有获胜。尝试过Python的paramiko库,Python结构和Perl的期望以及Rex接口/库。
其他信息
*路由器:Fortigate 60D
*固件:v5.0,build0252(GA Patch 5)
*启用SSH:True
我可以通过SSH登录并手动运行这些命令!
我过去使用了perl expect库和Fortigate 60B,但它不再有效。在我分享我想问的代码之前:
Fortigate中是否有一些阻止此类自动化的新功能?
一个简单且无害的命令来测试[list current dhcp leases]:
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) - INFO - Running task: leases [2014-02-11 13:14:48] (30022) - INFO - Connecting to 10.10.10.2 (admin) [2014-02-11 13:14:49] (30022) - INFO - Connected to 10.10.10.2, trying to authenticate. Fortigate # Unknown action 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] Executing task 'view_dhcp_leases' Viewing dhcp leases [10.10.10.2] run: execute dhcp lease-list wifi [10.10.10.2] out: Fortigate # Unknown action 0 [10.10.10.2] out: [10.10.10.2] out: Fortigate # Done. Disconnecting from 10.10.10.2 ... done.
结论......到目前为止
Unknown action 0
表示“我不知道这个命令[在此上下文中]”。此命令 可以 在第一个提示时手动运行。另外,正如您在fabric和rex示例中看到的那样: 进行身份验证和连接!我的结论是出于安全原因这是出于设计......并且更有可能出售他们的专有管理废话。
答案 0 :(得分:2)
这适用于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()
答案 1 :(得分: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()
安迪
答案 2 :(得分:1)
我有60B。
请尝试从linux终端运行此命令。
如果你没有sshpass - 你可以安装它。
sshpass -p' adminpassword' ssh ip_of_fw -l admin execute dhcp lease-list
答案 3 :(得分:1)
如果要使用fabric在fortigates上运行命令,则需要在通过SSH连接时禁用fabric使用的shell包装:
from fabric.api import run
def get_sys():
run("get sys status",shell=False)
答案 4 :(得分:0)
Youc可以升级操作系统版本,然后将API与P一起使用