Eu tenho um arquivo de texto em minha máquina local que é gerado por um script Python diário executado no cron.
Eu gostaria de adicionar um pouco de código para que esse arquivo seja enviado com segurança ao meu servidor por SSH.
python
ssh
automation
scp
Alok
fonte
fonte
Respostas:
Você pode chamar o
scp
comando bash (ele copia arquivos por SSH ) comsubprocess.run
:Se você estiver criando o arquivo que deseja enviar no mesmo programa Python, convém chamar o
subprocess.run
comando fora dowith
bloco que está usando para abrir o arquivo (ou chamar.close()
o arquivo primeiro se não estiver usando umwith
bloco), para que você saiba que é liberado para o disco a partir do Python.Você precisa gerar (na máquina de origem) e instalar (na máquina de destino) uma chave ssh de antemão para que o scp seja autenticado automaticamente com sua chave ssh pública (em outras palavras, para que seu script não peça uma senha) .
fonte
subprocess.check_call(['scp', srcfile, dest])
pode ser usado desde Python 2.5 em vez derc = Popen(..).wait(); if rc != 0: raise ..
Para fazer isso em Python (ou seja, sem envolver scp por meio de subprocesso.Popen ou semelhante) com a biblioteca Paramiko , você faria algo assim:
(Você provavelmente gostaria de lidar com hosts desconhecidos, erros, criar quaisquer diretórios necessários e assim por diante).
fonte
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
após a instanciaçãossh
.Você provavelmente usaria o módulo de subprocesso . Algo assim:
Onde
destination
está provavelmente da formauser@remotehost:remotepath
. Obrigado a @Charles Duffy por apontar a fraqueza em minha resposta original, que usava um único argumento de string para especificar a operação scpshell=True
- que não lidaria com espaços em branco nos caminhos.A documentação do módulo tem exemplos de verificação de erros que você pode querer executar em conjunto com esta operação.
Certifique-se de configurar as credenciais adequadas para que possa executar um scp autônomo e sem senha entre as máquinas . Já existe uma questão stackoverflow para isso .
fonte
subprocess.check_call(['scp', myfile, destination])
poderia ser usado em vez disso desde Python 2.5 (2006)Existem algumas maneiras diferentes de abordar o problema:
Cada abordagem tem suas peculiaridades. Você precisará configurar as chaves SSH para habilitar logins sem senha se estiver agrupando comandos do sistema como "ssh", "scp" ou "rsync". Você pode inserir uma senha em um script usando Paramiko ou alguma outra biblioteca, mas pode achar a falta de documentação frustrante, especialmente se você não estiver familiarizado com os fundamentos da conexão SSH (por exemplo, trocas de chaves, agentes, etc). Provavelmente nem é preciso dizer que as chaves SSH quase sempre são uma ideia melhor do que as senhas para esse tipo de coisa.
NOTA: é difícil superar o rsync se você planeja transferir arquivos via SSH, especialmente se a alternativa for o scp antigo.
Usei Paramiko com o objetivo de substituir chamadas de sistema, mas me vi atraído de volta para os comandos agrupados devido à sua facilidade de uso e familiaridade imediata. Você pode ser diferente. Dei uma olhada em Conch há algum tempo, mas não me agradou.
Se optar pelo caminho de chamada do sistema, Python oferece uma variedade de opções, como os.system ou os comandos / módulos de subprocesso. Eu iria com o módulo de subprocesso se estiver usando a versão 2.4+.
fonte
Alcançou o mesmo problema, mas em vez de "hackear" ou emular linha de comando:
Encontrou esta resposta aqui .
fonte
Você pode fazer algo assim, para lidar com a verificação da chave do host também
fonte
fabric
pode ser usado para fazer upload de arquivos vis ssh:fonte
Você pode usar o pacote vassalo, que é projetado exatamente para isso.
Tudo que você precisa é instalar o vassalo e fazer
Além disso, você salvará as credenciais de autenticação e não precisará digitá-las novamente.
fonte
Usei sshfs para montar o diretório remoto via ssh e shutil para copiar os arquivos:
Então, em python:
Esse método tem a vantagem de poder transmitir dados se estiver gerando dados, em vez de armazenar em cache localmente e enviar um único arquivo grande.
fonte
Tente fazer isso se não quiser usar certificados SSL:
fonte
Usando o recurso externo paramiko;
fonte
Chamar o
scp
comando via subprocesso não permite receber o relatório de progresso dentro do script.pexpect
pode ser usado para extrair essa informação:Veja o arquivo de cópia do python na rede local (linux -> linux)
fonte
Uma abordagem muito simples é a seguinte:
Nenhuma biblioteca python é necessária (apenas sistema operacional) e funciona, no entanto, o uso desse método depende de outro cliente ssh para ser instalado. Isso pode resultar em um comportamento indesejado se executado em outro sistema.
fonte
Tipo de hacky, mas o seguinte deve funcionar :)
fonte