Я пишу скрипт для автоматизации некоторых команд командной строки в Python. На данный момент я делаю звонки таким образом:
cmd = "some unix command"
retcode = subprocess.call(cmd,shell=True)
Однако мне нужно выполнить некоторые команды на удаленной машине. Вручную, я бы войти в систему с помощью ssh и затем запустить команды. Как бы я автоматизировал это в Python? Мне нужно войти в систему с (известным) паролем на удаленную машину, поэтому я не могу просто использовать cmd = ssh user@remotehost
, мне интересно, есть ли модуль, который я должен использовать?
k = paramiko.RSAKey.from_private_key_file(keyfilename)
ИЛИk = paramiko.DSSKey.from_private_key_file(keyfilename)
ТОssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
и , наконецssh..connect(hostname=host, username=user, pkey=k)
.def run_cmd(host, cmd):
что-то, что сначала делает то, что вы хотите, но ваши потребности развиваются. В итоге вы меняете помощника для нового варианта использования, который меняет поведение старого существующего использования. Планируйте соответственно.Или вы можете просто использовать command.getstatusoutput :
Я много использовал его, и он отлично работает.
В Python 2.6+ используйте
subprocess.check_output
.источник
Вы смотрели на Fabric ? Это позволяет вам делать все виды удаленных вещей через SSH, используя python.
источник
Я обнаружил, что paramiko слишком низкоуровневый, а Fabric не особенно хорошо подходит для использования в качестве библиотеки, поэтому я собрал свою собственную библиотеку под названием spur, которая использует paramiko для реализации немного более приятного интерфейса:
Если вам нужно запустить оболочку:
источник
spur
. Вы генерируете дополнительные команды оболочки и в итоге получаете: which 'mkdir'> / dev / null 2> & 1; echo $ ?; exec 'mkdir' '-p' '/ data / rpmupdate / 20130207142923'. Я хотел бы также иметь доступ к равнинеexec_command
. Кроме того, отсутствует возможность выполнения фоновых задач:nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &
. Например, я генерирую скрипт zsh (rpmbuildpackages), используя шаблон, а затем просто оставляю его работать на машине. Возможно, было бы неплохо иметь возможность отслеживать такие фоновые задания (сохранение PID в некоторых ~ / .spur).spur
по-видимому, работает только в системах Unix, потому что это зависит отtermios
. Кто-нибудь знает хорошую библиотеку для Windows?SshShell
, теперь есть возможность установить тип оболочки. Если для передачи используется минимальная оболочкаshell_type=spur.ssh.ShellTypes.minimal
, то отправляется только необработанная команда. Внедрение фоновых задач напрямую выходит за рамки Spur, но вы должны иметь возможность запустить команду, которую вы описали, например, вызвав оболочкуshell.run(["sh", "-c", "nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &"]
).Будь проще. Библиотеки не требуются.
источник
Все уже заявили (рекомендовали) использовать paramiko, и я просто делюсь кодом Python (можно сказать, API), который позволит вам выполнять несколько команд за один раз.
выполнять команды на разных узлах использования:
Commands().run_cmd(host_ip, list_of_commands)
Спасибо!
источник
Я использовал paramiko a bunch (красиво) и pxssh (тоже красиво). Я бы порекомендовал либо. Они работают немного по-другому, но имеют относительно большое совпадение в использовании.
источник
Парамико, наконец, сработало для меня после добавления дополнительной строки, которая действительно важна (строка 3):
Убедитесь, что пакет paramiko установлен. Первоначальный источник решения: Source
источник
источник
Работает отлично ...
источник
Принятый ответ не работал для меня, вот что я использовал вместо этого:
В качестве альтернативы вы можете использовать sshpass :
Ссылки:
1. https://github.com/onyxfish/relay/issues/11
2. https://stackoverflow.com/a/61016663/797495
источник
Взгляните на
spurplus
созданную нами оболочку,spur
которая предоставляет аннотации типов и некоторые мелкие уловки (переподключение SFTP, md5 и т . Д.): Https://pypi.org/project/spurplus/источник
Попросить пользователя ввести команду в соответствии с устройством, в которое они входят.
Код ниже подтвержден PEP8online.com.
источник
Ниже приведен пример, если вы хотите, чтобы пользователь вводил имя хоста, имя пользователя, пароль и номер порта.
источник