2014-02-11 201 views
2

目標
我試圖自動化幾十個路由器的fortigate配置更改,我沒有贏。已經嘗試了Python的paramiko庫,Python結構和Perl的期望以及Rex接口/庫。Fortigate自動化與perl或python

其他信息
*路由​​器:飛塔60D
*固件:V5.0,build0252(GA補丁5)
啓用* SSH:真

我可以登錄通過SSH和運行這些手動命令!

我在過去使用Fortinet 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) - 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手段, 「我不知道這個命令[在這方面]」。這個命令可以在第一次提示時手動運行。另外,正如您在面料和rex示例中所看到的那樣:確實驗證並連接!我的結論是,這是出於安全原因而設計的......並且更可能出售他們專有的管理廢話。

+0

您可能會受到[此處]描述的問題的影響(https://metacpan.org/pod/Net::OpenSSH#FAQ)! – salva

回答

1

我有60B。

請嘗試從linux終端運行此命令。

如果你沒有sshpass - 你可以安裝它。

sshpass -p 'ADMINPASSWORD' 的ssh -l ip_of_fw管理執行DHCP租約列表

+0

sshpass也不起作用。使用-V選項它只是讓許可證退出。 – Bubnoff

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

2

下面的腳本爲我工作對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() 

安迪

+0

你有沒有試過運行paraniko再次5.2.5或以上?看起來像是自5.2.5以來破碎了(見https://github.com/paramiko/paramiko/issues/687) – f0rd42

1

如果你想用面料在fortigates上運行命令時,需要禁用通過SSH連接時由結構使用的外殼包裝:

from fabric.api import run 

def get_sys(): 
    run("get sys status",shell=False)