Estou trabalhando em uma ferramenta simples que transfere arquivos para um local codificado com a senha também codificada. Sou iniciante em python, mas graças ao ftplib, foi fácil:
import ftplib
info= ('someuser', 'password') #hard-coded
def putfile(file, site, dir, user=(), verbose=True):
"""
upload a file by ftp to a site/directory
login hard-coded, binary transfer
"""
if verbose: print 'Uploading', file
local = open(file, 'rb')
remote = ftplib.FTP(site)
remote.login(*user)
remote.cwd(dir)
remote.storbinary('STOR ' + file, local, 1024)
remote.quit()
local.close()
if verbose: print 'Upload done.'
if __name__ == '__main__':
site = 'somewhere.com' #hard-coded
dir = './uploads/' #hard-coded
import sys, getpass
putfile(sys.argv[1], site, dir, user=info)
O problema é que não consigo encontrar nenhuma biblioteca que suporte sFTP. Qual é a maneira normal de fazer algo assim com segurança?
Edit: Graças às respostas aqui, eu consegui trabalhar com a Paramiko e essa foi a sintaxe.
import paramiko
host = "THEHOST.com" #hard-coded
port = 22
transport = paramiko.Transport((host, port))
password = "THEPASSWORD" #hard-coded
username = "THEUSERNAME" #hard-coded
transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)
import sys
path = './THETARGETDIRECTORY/' + sys.argv[1] #hard-coded
localpath = sys.argv[1]
sftp.put(localpath, path)
sftp.close()
transport.close()
print 'Upload done.'
Obrigado novamente!
Respostas:
Paramiko suporta SFTP. Eu usei e usei o Twisted. Ambos têm o seu lugar, mas você pode achar mais fácil começar com o Paramiko.
fonte
Você deve verificar o pysftp https://pypi.python.org/pypi/pysftp , depende do paramiko, mas agrupa os casos de uso mais comuns em apenas algumas linhas de código.
fonte
with
no exemplopip install pysftp
Se você quiser fácil e simples, também pode querer olhar para o Fabric . É uma ferramenta de implantação automatizada como o Ruby's Capistrano, mas mais simples e, é claro, para o Python. É construído em cima do Paramiko.
Talvez você não queira fazer uma 'implantação automatizada', mas o Fabric atenderá perfeitamente ao seu caso de uso. Para mostrar como o Fabric é simples: o arquivo e o comando fab do seu script teriam a seguinte aparência (não testado, mas com 99% de certeza de que funcionará):
fab_putfile.py:
Em seguida, execute o arquivo com o comando fab:
E pronto! :)
fonte
Aqui está um exemplo usando pysftp e uma chave privada.
O pysftp é um módulo sftp fácil de usar que utiliza paramiko e pycrypto. Ele fornece uma interface simples para o sftp. Outras coisas que você pode fazer com o pysftp são bastante úteis:
Mais comandos e sobre PySFTP aqui .
fonte
srv.get(file_path) # Download a file from remote server
você pode explicar para onde ele baixa o arquivo?O Twisted pode ajudá-lo com o que você está fazendo, consulte a documentação deles, há muitos exemplos. Também é um produto maduro, com uma grande comunidade de desenvolvedores / usuários por trás.
fonte
Com a chave RSA, consulte aqui
Snippet:
fonte
Há várias respostas que mencionam o pysftp; portanto, no caso de você desejar um wrapper de gerenciador de contexto em torno do pysftp, aqui está uma solução com ainda menos código que acaba parecendo a seguinte quando usado
O exemplo (mais completo): http://www.prschmid.com/2016/09/simple-opensftp-context-manager-for.html
Esse gerenciador de contexto possui uma lógica de repetição automática ativada caso você não consiga se conectar pela primeira vez (o que surpreendentemente acontece com mais frequência do que você esperaria em um ambiente de produção ...)
A essência do gerenciador de contexto para
open_sftp
: https://gist.github.com/prschmid/80a19c22012e42d4d6e791c1e4eb8515fonte
Paramiko é tão lento. Use subprocesso e shell, aqui está um exemplo:
fonte
O PyFilesystem com seus sshfs é uma opção. Ele usa o Paramiko sob o capô e fornece uma interface independente de paltform melhor na parte superior.
ou
fonte
Você pode usar o módulo pexpect
Aqui está uma boa introdução
Eu não testei isso, mas deve funcionar
fonte