Using the pexpect module
More info about pexpect is at [http://www.noah.org/wiki/pexpect].
#!/usr/bin/env python2.5 """ Usage: %prog [options] file1 [file2] [extra_files] destination Downloads a file (or files) via SFTP. Example: sftp_download.py --host=sftp.example.com --path=/path/to/file/ --username=monetate --password=PaSsWoRd download_me.xml download_me_too.xml /destination/ """ from optparse import OptionParser import os import sys import pexpect ######################### parameters & settings ######################## parser = OptionParser(usage=__doc__.strip()) parser.add_option('--host', dest='host', action='store', type='string', help='SFTP host') parser.add_option('--path', dest='path', action='store', type='string', help='SFTP path') parser.add_option('--username', dest='username', action='store', type='string', help='SFTP login username') parser.add_option('--password', dest='password', action='store', type='string', help='SFTP login password') ############################### functions ############################## def download_files(files, destination, host, path, username, password): """ Log in to the SFTP server using the username and password provided and download the specified files. """ sftp_opts = ['-o', 'PasswordAuthentication=yes', '%s@%s' % (username, host)] p = pexpect.spawn('sftp', sftp_opts) p.logfile = sys.stdout try: p.expect('(?i)password:') x = p.sendline(password) x = p.expect(['Permission denied','sftp>']) if x == 0: print 'Permission denied for password:' print password p.kill(0) else: x = p.sendline('cd ' + path) for file in files: x = p.expect('sftp>') x = p.sendline('get ' + file + ' ' + destination) x = p.expect('sftp>') x = p.isalive() x = p.close() retval = p.exitstatus except pexpect.EOF: print str(p) return 'SFTP file transfer failed due to premature end of file.' except pexpect.TIMEOUT: print str(p) return 'SFTP file transfer failed due to timeout.' ############################## main block ############################## if __name__ == '__main__': options, args = parser.parse_args() if not args: parser.print_help() sys.exit(1) destination = args[-1] files = args[:-1] status = download_files(files, destination, options.host, options.path, options.username, options.password) sys.exit(status)
执行上述脚本时可能会报错:
Traceback (most recent call last):
File "./sshlinux.sh", line 10, in <module>
s.login (hostname, username, password)
File "/usr/local/python-2.7/lib/python2.7/site-packages/pxssh.py", line 243, in login
if not self.synch_original_prompt():
File "/usr/local/python-2.7/lib/python2.7/site-packages/pxssh.py", line 134, in synch_original_prompt
self.read_nonblocking(size=10000,timeout=1) # GAS: Clear out the cache before getting the prompt
File "/usr/local/python-2.7/lib/python2.7/site-packages/pexpect.py", line 824, in read_nonblocking
raise TIMEOUT ('Timeout exceeded in read_nonblocking().')
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
这个问题可以调整错误信息中的路径进行修改/usr/lib/python-2.7/lib/python2.7/site-packages/pxssh.py文件,在pxssh.py文件中:
在def synch_original_prompt (self):方法下第一个self.read_nonblocking(size=10000,timeout=1) 前面增加两行代码
self.sendline() time.sleep(0.5)
Using the paramiko module
More info about paramiko is at [http://www.lag.net/paramiko/].
#!/usr/bin/env python2.5 """ Usage: %prog [options] file1 [file2] [extra_files] destination Downloads a file (or files) via SFTP. Example: sftp_download.py --host=sftp.example.com --path=/path/to/file/ --username=monetate --password=PaSsWoRd download_me.xml download_me_too.xml /destination/ """ from optparse import OptionParser import os import sys import paramiko ######################### parameters & settings ######################## parser = OptionParser(usage=__doc__.strip()) parser.add_option('--host', dest='host', action='store', type='string', help='SFTP host') parser.add_option('--path', dest='path', action='store', type='string', help='SFTP path') parser.add_option('--username', dest='username', action='store', type='string', help='SFTP login username') parser.add_option('--password', dest='password', action='store', type='string', help='SFTP login password') ############################### functions ############################## def download_files(files, destination, host, path, username, password): """ Log in to the SFTP server using the username and password provided and download the specified files. """ transport=paramiko.Transport(host) transport.connect(username=username, password=password) sftp=paramiko.SFTPClient.from_transport(transport) for file in files: sftp.get(path + file, destination + file) ############################## main block ############################## if __name__ == '__main__': options, args = parser.parse_args() if not args: parser.print_help() sys.exit(1) destination = args[-1] files = args[:-1] status = download_files(files, destination, options.host, options.path, options.username, options.password) sys.exit(status)