2016-08-29 7 views
0

Ich versuche parallel ssh auf Servern zu tun. Währenddessen bekomme ich "TypeError: 'NoneType' Objekt ist nicht iterierbar" diesen Fehler. Freundlich helfen.Getting "TypeError: 'NoneType' -Objekt ist nicht iterierbar" Parallele ssh

Mein Skript ist unter

from pssh import ParallelSSHClient 
from pssh.exceptions import AuthenticationException, UnknownHostException, ConnectionErrorException 

def parallelsshjob(): 
     client = ParallelSSHClient(['10.84.226.72','10.84.226.74'], user = 'root', password = 'XXX') 
     try: 
       output = client.run_command('racadm getsvctag', sudo=True) 
       print output 
     except (AuthenticationException, UnknownHostException, ConnectionErrorException): 
       pass 
     #print output 

if __name__ == '__main__': 
     parallelsshjob() 

Und die Traceback ist unter

Traceback (most recent call last): 
    File "parallelssh.py", line 17, in <module> 
    parallelsshjob() 
    File "parallelssh.py", line 10, in parallelsshjob 
    output = client.run_command('racadm getsvctag', sudo=True) 
    File "/Library/Python/2.7/site-packages/pssh/pssh_client.py", line 520, in run_command 
    raise ex 
TypeError: 'NoneType' object is not iterable 

mir Hilfe mit der Lösung und schlagen mir auch ssh-agent in demselben Skript zu verwenden. Danke im Voraus.

Antwort

1

Aus dem Lesen des Codes und Debuggen ein bisschen auf meinem Laptop, glaube ich, das Problem ist, dass Sie keine Datei namens ~/.ssh/config haben. Es scheint, dass parallel-ssh eine Abhängigkeit von OpenSSH-Konfiguration hat, und das ist der Fehler, den Sie erhalten, wenn diese Datei fehlt.

read_openssh_config kehrt None hier: https://github.com/pkittenis/parallel-ssh/blob/master/pssh/utils.py#L79

wiederum SSHClient.__init__ sprengt, wenn die Werte zu entpacken versuchen, es zu empfangen erwartet: https://github.com/pkittenis/parallel-ssh/blob/master/pssh/ssh_client.py#L97.

Der Fix ist vermutlich, um eine Art von OpenSSH-Konfigurationsdatei an Ort und Stelle zu bekommen, aber es tut mir leid zu sagen, dass ich nichts darüber weiß.

EDIT

Nach einigen parallel-ssh ist die Ausnahmebehandlung, hier ein besserer Stack-Trace für den Fehler Reinigung:

Traceback (most recent call last): 
    File "test.py", line 11, in <module> 
    parallelsshjob() 
    File "test.py", line 7, in parallelsshjob 
    output = client.run_command('racadm getsvctag', sudo=True) 
    File "/Users/smarx/test/pssh/venv/lib/python2.7/site-packages/pssh/pssh_client.py", line 517, in run_command 
    self.get_output(cmd, output) 
    File "/Users/smarx/test/pssh/venv/lib/python2.7/site-packages/pssh/pssh_client.py", line 601, in get_output 
    (channel, host, stdout, stderr, stdin) = cmd.get() 
    File "/Users/smarx/test/pssh/venv/lib/python2.7/site-packages/gevent/greenlet.py", line 480, in get 
    self._raise_exception() 
    File "/Users/smarx/test/pssh/venv/lib/python2.7/site-packages/gevent/greenlet.py", line 171, in _raise_exception 
    reraise(*self.exc_info) 
    File "/Users/smarx/test/pssh/venv/lib/python2.7/site-packages/gevent/greenlet.py", line 534, in run 
    result = self._run(*self.args, **self.kwargs) 
    File "/Users/smarx/test/pssh/venv/lib/python2.7/site-packages/pssh/pssh_client.py", line 559, in _exec_command 
    channel_timeout=self.channel_timeout) 
    File "/Users/smarx/test/pssh/venv/lib/python2.7/site-packages/pssh/ssh_client.py", line 98, in __init__ 
    host, config_file=_openssh_config_file) 
TypeError: 'NoneType' object is not iterable 
0

Diese was seemingly a regression in the 0.92.0 version of the library, die jetzt in 0.92.1 behoben ist. Frühere Versionen funktionieren auch. OpenSSH config sollte nicht eine Abhängigkeit sein.

Um Ihre Frage zum SSH-Agenten zu beantworten, wird diese automatisch verwendet, wenn in der Benutzersitzung eine ausgeführt und aktiviert wird. Wenn Sie programmatisch einen privaten Schlüssel zu schaffen, würde es vorziehen, können Sie wie folgt vor

from pssh import ParallelSSHClient 
from pssh.utils import load_private_key 
pkey = load_private_key('my_private_key') 
client = ParallelSSHClient(hosts, pkey=pkey) 

Kann auch programmatisch einen Agenten mit mehreren Schlüsseln zur Verfügung stellen, je weiter unten

from pssh import ParallelSSHClient 
from pssh.utils import load_private_key 
from pssh.agent import SSHAgent 
pkey = load_private_key('my_private_key') 
agent = SSHAgent() 
agent.add_key(pkey) 
client = ParallelSSHClient(hosts, agent=agent) 

See documentation für weitere Beispiele.

Verwandte Themen