2016-08-29 1 views
0

Я пытаюсь выполнять параллельные ssh на серверах. При этом я получаю «TypeError: объект« NoneType »не является итерируемой» этой ошибкой. Незлая помощь.Получение «TypeError: объект« NoneType »не является итерабельным» при параллельной работе ssh

Мой сценарий ниже

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() 

И Traceback ниже

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 

Помогите мне с решением, а также предложить мне использовать SSH-агент в этом же скрипте. Заранее спасибо.

ответ

1

От чтения кода и отладки немного на моем ноутбуке, я считаю, что проблема заключается в том, что у вас нет файла с именем ~/.ssh/config. Похоже, что parallel-ssh имеет зависимость от конфигурации OpenSSH, и это ошибка, которую вы получаете, когда этот файл отсутствует.

read_openssh_config возвращает None здесь: https://github.com/pkittenis/parallel-ssh/blob/master/pssh/utils.py#L79

В свою очередь, SSHClient.__init__ взрывается при попытке распаковать значения, которые он ожидает получить: https://github.com/pkittenis/parallel-ssh/blob/master/pssh/ssh_client.py#L97.

Возможно, исправление должно получить какой-то файл конфигурации OpenSSH, но, к сожалению, я ничего не знаю об этом.

EDIT

После очистки некоторые обработки исключений parallel-ssh «s, вот лучше трассировки стека для ошибки:

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

Это was seemingly a regression in the 0.92.0 version of the library, который сейчас решается в 0.92.1. Предыдущие версии также работают. Конфигурация OpenSSH не должна быть зависимой.

Чтобы ответить на ваш вопрос агента SSH, если он включен и включен в сеансе пользователя, он автоматически используется. Если вы предпочитаете, чтобы обеспечить закрытый ключ программно можно сделать следующие

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

Может также обеспечить агента с несколькими ключами программно, на рисунке

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 для большего количества примеров.

 Смежные вопросы

  • Нет связанных вопросов^_^