8

このサイトと他の複数の場所を検索しましたが、1 つのコマンドの後、ssh セッションの接続と維持の問題を解決できませんでした。以下は私の現在のコードです:

#!/opt/local/bin/python

import os  

import pexpect

import paramiko

import hashlib

import StringIO

while True:

      cisco_cmd = raw_input("Enter cisco router cmd:")

      ssh = paramiko.SSHClient()

      ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

      ssh.connect('192.168.221.235', username='nuts', password='cisco', timeout =  30)

      stdin, stdout, stderr = ssh.exec_command(cisco_cmd)

      print stdout.read()

      ssh.close()

      if  cisco_cmd == 'exit': break

複数のコマンドを実行できますが、コマンドごとに新しい ssh セッションが作成されます。ssh セッションが再利用されないため、構成モードが必要な場合、上記のプログラムは機能しません。この問題を解決するための支援をお願いします。

4

4 に答える 4

7

paramiko の代わりに Exscript を使用したところ、IOS デバイスで永続的なセッションを取得できるようになりました。

#!/opt/local/bin/python
import hashlib
import Exscript

from Exscript.util.interact import read_login
from Exscript.protocols import SSH2

account = read_login()              # Prompt the user for his name and password
conn = SSH2()                       # We choose to use SSH2
conn.connect('192.168.221.235')     # Open the SSH connection
conn.login(account)                 # Authenticate on the remote host
conn.execute('conf t')              # Execute the "uname -a" command
conn.execute('interface Serial1/0')
conn.execute('ip address 114.168.221.202 255.255.255.0')
conn.execute('no shutdown')
conn.execute('end')
conn.execute('sh run int Serial1/0')
print conn.response

conn.execute('show ip route')
print conn.response

conn.send('exit\r')                 # Send the "exit" command
conn.close()                        # Wait for the connection to close
于 2011-03-13T13:32:55.497 に答える
1

sshセッションが再利用されないため、設定モードが必要な場合、上記のプログラムは機能しません

sshセッションは、ループの外に移動すると再利用されますがそれぞれが新しいシェルで(新しいチャネルを介して)発生し、無関係です。シェルからの状態を必要としないように、コマンドをフォーマットする必要があります。connectcloseexec_command()

私の記憶が正しければ、一部のCiscoデバイスは、単一のexecのみを許可してから、接続を閉じます。その場合は、を使用し、モジュール(既にインポートしたが使用していない)をinvoke_shell()使用してインタラクティブに作業する必要があります。pexpect

于 2011-03-08T20:48:35.220 に答える
1

while ループの外側で接続を作成、接続、および閉じる必要があります。

于 2011-03-08T20:38:54.830 に答える
1

あなたのループはそれを行います

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.221.235', username='nuts', password='cisco', timeout =  30)
while True:
      cisco_cmd = raw_input("Enter cisco router cmd:")
      stdin, stdout, stderr = ssh.exec_command(cisco_cmd)
      print stdout.read()
      if  cisco_cmd == 'exit': break
ssh.close()

初期化とセットアップをループの外に移動します。編集: close() を移動しました

于 2011-03-08T20:39:18.720 に答える