파이썬의 SFTP? (플랫폼 독립적)


181

암호가 하드 코딩 된 하드 코딩 된 위치로 파일을 전송하는 간단한 도구를 사용하고 있습니다. 저는 파이썬 초보자이지만 ftplib 덕분에 쉬웠습니다.

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)

문제는 sFTP를 지원하는 라이브러리를 찾을 수 없다는 것입니다. 이와 같은 것을 안전하게 수행하는 일반적인 방법은 무엇입니까?

편집 : 여기에 대한 답변 덕분에 Paramiko와 함께 작동했으며 구문입니다.

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.'

다시 감사합니다!


1
감사 ! 5 분 안에 SFTP 업로드 스크립트가 작동 함 :)
Ohad Schneider

1
python ftplib가 TLS en.m.wikipedia.org/wiki/FTPS를 통해 FTPS-ftp를 지원한다는 원래의 질문에 대한 일반적인 참고 사항입니다 . FTPS 서버는 ssh / sftp의 생략으로 인해 Unix 세계에서 덜 사용되지만, FTP 환경이 더 일반적인 Windows 환경에서는 sftp 서버가 훨씬 적습니다.
Gnudiff

확장 클래스 소스를 사용하여 FTPS 지원이 Python 3.2에 추가 된 것 같습니다 : class ftplib.FTP_TLS (host = '', user = '', passwd = '', acct = '', keyfile = None, certfile = None, context = 없음, timeout = 없음, source_address = 없음)
mgrollins 2016 년

답변:


109

Paramiko 는 SFTP를 지원합니다. 나는 그것을 사용했고, Twisted를 사용했습니다. 둘 다 자리가 있지만 Paramiko로 시작하는 것이 더 쉽다는 것을 알 수 있습니다.


2
그렇습니다. paramiko는 pycrypto의 Windows 패키지를 찾는 것이 까다로운 방법입니다.
Mauli

감사합니다. readme에 설치 지침이 없기 때문에 패키지를 설치하는 방법을 알아내는 데 시간이 걸렸지 만 정확히 필요한 것입니다!
Mark Wilbur

15
Jeff Forcier가 ssh가 더 이상 사용되지 않으며 paramiko가 앞으로 나아가고 있다고 설명하는 bitprophet.org/blog/2012/09/29/paramiko-and-ssh 를 참조하십시오 .
Christopher Mahan

2
또한 Paramiko를 기반으로하지만 사용하기 쉬운 code.google.com/p/pysftp 도 있습니다.
franzlorenzon


78

pysftp를 확인해야합니다 https://pypi.python.org/pypi/pysftp paramiko에 의존하지만 가장 일반적인 사용 사례를 몇 줄의 코드로 묶 습니다.

import pysftp
import sys

path = './THETARGETDIRECTORY/' + sys.argv[1]    #hard-coded
localpath = sys.argv[1]

host = "THEHOST.com"                    #hard-coded
password = "THEPASSWORD"                #hard-coded
username = "THEUSERNAME"                #hard-coded

with pysftp.Connection(host, username=username, password=password) as sftp:
    sftp.put(localpath, path)

print 'Upload done.'

4
with예를 들어 투표 하십시오
Roman Podlinov

2
pip install pysftp
Bob Stein

2
알려진 호스트에 새 sftp 호스트를 자동으로 추가하는 옵션이 있습니까?
user443854

1
@ user443854 예이 pysftp.readthedocs.io/en/release_0.2.9/... 그러나 다른 known_host 파일을 추가 할 수 있지만 나는 확실히 그것을 권하고 싶지 않다
애 스터

15

쉽고 간단하게 원한다면 Fabric 을보고 싶을 수도 있습니다 . Ruby의 Capistrano와 같은 자동화 된 배포 도구이지만 더 간단하고 물론 Python 용입니다. 그것은 Paramiko 위에 구축되었습니다.

'자동 배포'를 원하지는 않지만 Fabric은 사용 사례에 완벽하게 적합합니다. Fabric이 얼마나 간단한 지 보여주기 위해 : 스크립트에 대한 fab 파일과 명령은 다음과 같습니다 (테스트되지는 않지만 99 % 작동 함).

fab_putfile.py :

from fabric.api import *

env.hosts = ['THEHOST.com']
env.user = 'THEUSER'
env.password = 'THEPASSWORD'

def put_file(file):
    put(file, './THETARGETDIRECTORY/') # it's copied into the target directory

그런 다음 fab 명령으로 파일을 실행하십시오.

fab -f fab_putfile.py put_file:file=./path/to/my/file

그리고 당신은 끝났습니다! :)


12

다음은 pysftp 및 개인 키를 사용하는 샘플입니다.

import pysftp

def upload_file(file_path):

    private_key = "~/.ssh/your-key.pem"  # can use password keyword in Connection instead
    srv = pysftp.Connection(host="your-host", username="user-name", private_key=private_key)
    srv.chdir('/var/web/public_files/media/uploads')  # change directory on remote server
    srv.put(file_path)  # To download a file, replace put with get
    srv.close()  # Close connection

pysftp는 paramiko 및 pycrypto를 사용하는 사용하기 쉬운 sftp 모듈입니다. sftp에 대한 간단한 인터페이스를 제공합니다. pysftp로 할 수있는 다른 작업은 매우 유용합니다.

data = srv.listdir()  # Get the directory and file listing in a list
srv.get(file_path)  # Download a file from remote server
srv.execute('pwd') # Execute a command on the server

더 많은 명령과 PySFTP에 대한 여기에 .


srv.get(file_path) # Download a file from remote server파일을 어디로 다운로드 하는지 설명 할 수 있습니까?
Markus Meskanen 2016 년

당신이 처형을 위해 지역을 시도 했습니까?
radtek

예, 파일 시스템의 어디에 있습니까? 모든 것이 성공적으로 완료되었지만 어디서나 파일을 찾을 수없는 것 같습니다.
Markus Meskanen

미안하지만 로컬 디렉토리를 의미했습니다. 홈 디렉토리에서 스크립트를 실행하고 파일이 있는지 확인하십시오.
radtek


1

RSA 키로 여기 를 참조 하십시오

단편:

import pysftp
import paramiko
from base64 import decodebytes

keydata = b"""L+WsiL5VL51ecJi3LVjmblkAdUTU+xbmXmUArIU5+8N6ua76jO/+T""" 
key = paramiko.RSAKey(data=decodebytes(keydata)) 
cnopts = pysftp.CnOpts()
cnopts.hostkeys.add(host, 'ssh-rsa', key)


with pysftp.Connection(host=host, username=username, password=password, cnopts=cnopts) as sftp:   
  with sftp.cd(directory):
    sftp.put(file_to_sent_to_ftp)

0

pysftp를 언급하는 많은 답변이 있으므로 pysftp를 둘러싼 컨텍스트 관리자 래퍼를 원할 경우 다음과 같이 사용하면 코드가 적은 솔루션이 있습니다.

path = "sftp://user:p@ssw0rd@test.com/path/to/file.txt"

# Read a file
with open_sftp(path) as f:
    s = f.read() 
print s

# Write to a file
with open_sftp(path, mode='w') as f:
    f.write("Some content.") 

(풀러) 예 : http://www.prschmid.com/2016/09/simple-opensftp-context-manager-for.html

이 컨텍스트 관리자는 처음 연결할 수없는 경우 자동 재시도 로직을 시작합니다 (놀랍게도 프로덕션 환경에서 예상보다 더 자주 발생합니다 ...)

컨텍스트 관리자 요지 open_sftp: https://gist.github.com/prschmid/80a19c22012e42d4d6e791c1e4eb8515


0

파라 미코는 너무 느립니다. 서브 프로세스와 쉘을 사용하십시오. 예는 다음과 같습니다.

remote_file_name = "filename"
remotedir = "/remote/dir"
localpath = "/local/file/dir"
    ftp_cmd_p = """
    #!/bin/sh
    lftp -u username,password sftp://ip:port <<EOF
    cd {remotedir}
    lcd {localpath}
    get {filename}
    EOF
    """
subprocess.call(ftp_cmd_p.format(remotedir=remotedir,
                                 localpath=localpath,
                                 filename=remote_file_name 
                                 ), 
                shell=True, stdout=sys.stdout, stderr=sys.stderr)

문제는 "파이썬 (Python)"에 관한 것인데, 일반적으로 그 안에 고집하는 것을 의미합니다. 특히 그렇게하는 많은 옵션이있을 때 말입니다. 더 중요한 것은 "플랫폼 독립"이라고 말합니다. 그래도 귀하의 답변이 더 빨리 작동하는지 아닌지는 말할 수 없습니다. 혹시?
BuvinJ

0

PyFilesystem 그와 SSHFS는 하나 개의 옵션입니다. 그것은 후드 아래에서 Paramiko를 사용하며 상단에 더 멋진 paltform 독립 인터페이스를 제공합니다.

import fs

sf = fs.open_fs("sftp://[user[:password]@]host[:port]/[directory]")
sf.makedir('my_dir')

또는

from fs.sshfs import SSHFS
sf = SSHFS(...

-1

pexpect 모듈을 사용할 수 있습니다

좋은 소개 글이 있습니다.

child = pexpect.spawn ('/usr/bin/sftp ' + user@ftp.site.com )
child.expect ('.* password:')
child.sendline (your_password)
child.expect ('sftp> ')
child.sendline ('dir')
child.expect ('sftp> ')
file_list = child.before
child.sendline ('bye')

나는 이것을 테스트하지 않았지만 작동해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.