Получение "TypeError: объект 'NoneType' не повторяется" при выполнении параллельного ssh
Я пытаюсь сделать параллельный SSH на серверах. При этом я получаю эту ошибку "TypeError: объект NoneType 'не повторяется". Пожалуйста, помогите.
Мой скрипт ниже
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 (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-agent в этом же скрипте. Заранее спасибо.
2 ответа
После чтения кода и небольшой отладки на моем ноутбуке, я считаю, что проблема в том, что у вас нет файла с именем ~/.ssh/config
, Кажется, что parallel-ssh
зависит от конфигурации OpenSSH, и это ошибка, которую вы получаете, когда этот файл отсутствует.
read_openssh_config
Здесь ничего не возвращается: https://github.com/pkittenis/parallel-ssh/blob/master/pssh/utils.py
В очереди, SSHClient.__init__
взрывается при попытке распаковать значения, которые он ожидает получить: https://github.com/pkittenis/parallel-ssh/blob/master/pssh/ssh_client.py.
Исправление, по-видимому, состоит в том, чтобы получить какой-то конфигурационный файл OpenSSH, но я сожалею, что ничего об этом не знаю.
РЕДАКТИРОВАТЬ
После очистки некоторых из parallel-ssh
обработка исключений, вот лучшая трассировка стека для ошибки:
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.92.0
версия библиотеки, которая теперь разрешена в 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)
Смотрите документацию для большего количества примеров.