Estou escrevendo um script para automatizar alguns comandos de linha de comando em Python. No momento eu estou fazendo chamadas assim:
cmd = "some unix command"
retcode = subprocess.call(cmd,shell=True)
No entanto, preciso executar alguns comandos em uma máquina remota. Manualmente, eu entraria usando ssh e depois executaria os comandos. Como eu automatizaria isso em Python? Preciso fazer login com uma senha (conhecida) na máquina remota, para não poder usar apenas cmd = ssh user@remotehost
, estou me perguntando se há um módulo que devo usar?
k = paramiko.RSAKey.from_private_key_file(keyfilename)
ORk = paramiko.DSSKey.from_private_key_file(keyfilename)
THENssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
e finalmentessh..connect(hostname=host, username=user, pkey=k)
.def run_cmd(host, cmd):
que faça o que você quer a princípio, mas suas necessidades evoluem. Você acaba alterando o auxiliar para o novo caso de uso, que altera o comportamento do uso existente mais antigo. Planeje adequadamente.Ou você pode simplesmente usar commands.getstatusoutput :
Eu o usei extensivamente e funciona muito bem.
No Python 2.6 ou superior, use
subprocess.check_output
.fonte
Você já deu uma olhada no Fabric ? Ele permite que você faça todo tipo de coisas remotas sobre SSH usando python.
fonte
Achei que o paramiko era um pouco baixo demais e o Fabric não era especialmente adequado para ser usado como biblioteca, então montei minha própria biblioteca chamada spur, que usa o paramiko para implementar uma interface um pouco mais agradável:
Se você precisar executar dentro de um shell:
fonte
spur
. Você gera comandos adicionais do shell e termina com: qual 'mkdir'> / dev / null 2> & 1; eco $ ?; exec 'mkdir' '-p' '/ data / rpmupdate / 20130207142923'. Eu também gostaria de ter acesso a uma planícieexec_command
. Também falta capacidade de executar tarefas em segundo plano:nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &
. Por exemplo, eu gero um script zsh (rpmbuildpackages) usando o modelo e depois apenas para deixá-lo em execução na máquina. Talvez a capacidade de monitorar esses trabalhos em segundo plano também seja boa (salvando PIDs em alguns ~ / .spur).spur
aparentemente, só funciona em sistemas unix porque dependetermios
. Alguém conhece uma boa biblioteca para Windows?SshShell
, agora existe a opção de definir o tipo de shell. Se um shell mínimo for usado passandoshell_type=spur.ssh.ShellTypes.minimal
, apenas o comando bruto será enviado. A implementação direta de tarefas em segundo plano parece um pouco fora do escopo para o Spur, mas você poderá executar o comando que descreveu invocando um shell, por exemploshell.run(["sh", "-c", "nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &"]
).Mantenha simples. Nenhuma biblioteca necessária.
fonte
Todos já declaramos (recomendado) o uso de paramiko e estou apenas compartilhando um código python (API pode-se dizer) que permitirá que você execute vários comandos de uma só vez.
para executar comandos em diferentes nós, use:
Commands().run_cmd(host_ip, list_of_commands)
Obrigado!
fonte
Eu usei um monte de paramiko (legal) e pxssh (também legal). Eu recomendaria também. Eles funcionam de maneira um pouco diferente, mas têm uma sobreposição relativamente grande no uso.
fonte
O paramiko finalmente funcionou para mim depois de adicionar uma linha adicional, que é realmente importante (linha 3):
Verifique se o pacote paramiko está instalado. Fonte original da solução: Source
fonte
fonte
Funciona perfeitamente...
fonte
A resposta aceita não funcionou para mim, aqui está o que eu usei:
Como alternativa, você pode usar sshpass :
Referências:
1. https://github.com/onyxfish/relay/issues/11
2. https://stackoverflow.com/a/61016663/797495
fonte
Dê uma olhada
spurplus
, um invólucro que desenvolvemosspur
que fornece anotações de tipo e alguns truques menores (reconectando SFTP, md5 etc. ): Https://pypi.org/project/spurplus/fonte
Solicitando ao Usuário que insira o comando de acordo com o dispositivo em que está efetuando login.
O código abaixo é validado pelo PEP8online.com.
fonte
Abaixo, exemplo, caso deseje entradas de usuário para nome do host, nome de usuário, senha e número da porta.
fonte