문제
나는 암호도 하드 코딩 된 암호로 하드 코딩 된 위치로 파일을 전송하는 간단한 도구를 연구하고 있습니다. 나는 파이썬 초보자이지만 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.'
다시 한 번 감사드립니다!
해결책
파라 미코 SFTP를 지원합니다. 나는 그것을 사용했고 Twisted를 사용했습니다. 둘 다 자리가 있지만 파라 미코로 시작하기가 더 쉽다는 것을 알 수 있습니다.
다른 팁
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.'
쉽고 간단하게 원한다면보고 싶을 수도 있습니다. 구조. Ruby 's Capistrano와 같은 자동 배포 도구이지만 더 간단하고 물론 Python. Paramiko 위에 있습니다.
당신은 '자동 배치'를하고 싶지 않을 수도 있지만 패브릭은 사용 사례에 완벽하게 어울릴 것입니다. 단순한 패브릭이 얼마나 간단한지를 보여주기 위해 : 스크립트의 팹 파일과 명령은 다음과 같을 것입니다 (테스트되지는 않지만 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
그리고 당신은 끝났습니다! :)
다음은 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에 대해 여기.
꼬인 당신이하고있는 일에 당신을 도울 수 있고, 그들의 문서를 확인하고, 많은 예가 있습니다. 또한 큰 개발자/사용자 커뮤니티가있는 성숙한 제품입니다.
당신은 사용할 수 있습니다 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')
나는 이것을 테스트하지 않았지만 작동해야합니다
파라 미코는 너무 느립니다. 하위 프로세스 및 쉘 사용 예는 다음과 같습니다.
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)
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)
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.")
(Fuller) 예 : http://www.prschmid.com/2016/09/simple-opensftp-context-manager-for.html
이 컨텍스트 관리자는 처음으로 연결할 수없는 경우 자동 도리 로직을 구운 것입니다 (놀랍게도 프로덕션 환경에서 기대하는 것보다 더 자주 발생합니다 ...)
컨텍스트 관리자는 요트를위한 것입니다 open_sftp
: https://gist.github.com/prschmid/80a19c22012e42d4d6e791c1e4eb8515