废话不多说,直接上脚本
需要paramiko和six模块,注意,paramiko版本建议2.8.1,太高了不能用
pip install paramiko==2.8.1 pip install six
脚本内容如下,请自行修改一些配置
import os
import sys
import paramiko
def main():
host = 'fasteda.cn'
port = 22
username = 'fasteda'
prefix = '.'
local_paths = ['/sftp/v-test/aa', '/sftp/v-test/ab', '/sftp/v-test/ac']
remote_paths = ['/bbb/Tester/Advantest', '/bbb/Prober/Taaa']
private_key = paramiko.RSAKey.from_private_key_file('~/.ssh/id_rsa')
try:
transport = paramiko.Transport((host, port))
transport.connect(username=username, pkey=private_key)
transport.set_keepalive(60)
sftp = paramiko.SFTPClient.from_transport(transport)
except Exception as e:
print('Error connecting to SFTP server: %s' % e)
sys.exit(1)
for i, local_path in enumerate(local_paths):
remote_path = remote_paths[0] if i < 2 else remote_paths[1]
print('Uploading files from %s to %s' % (local_path, remote_path))
upload_files(sftp, local_path, remote_path, prefix)
def upload_files(sftp, local_path, remote_path, prefix):
for item in os.listdir(local_path):
if os.path.isfile(os.path.join(local_path, item)):
if item.startswith(prefix):
continue
local_file = os.path.join(local_path, item)
remote_file = os.path.join(remote_path, item)
remote_file_prefix = os.path.join(remote_path, prefix + item)
try:
sftp.stat(remote_file)
print('File %s already exists, skipping' % item)
continue
except IOError:
pass
print('Uploading file %s' % item)
sftp.put(local_file, remote_file_prefix)
if sftp.stat(remote_file_prefix).st_size != os.stat(local_file).st_size:
print('Upload of file %s failed, deleting incomplete file' % item)
sftp.remove(remote_file_prefix)
continue
sftp.rename(remote_file_prefix, remote_file)
elif os.path.isdir(os.path.join(local_path, item)):
remote_dir = os.path.join(remote_path, item)
try:
sftp.stat(remote_dir)
except IOError:
print('Creating remote directory %s' % remote_dir)
sftp.mkdir(remote_dir)
upload_files(sftp, os.path.join(local_path, item), remote_dir, prefix)
sftp.close()
transport.close()
if __name__ == '__main__':
main()20230227做一些更新,解决上传失败后无法删除,加了删除重新传
import os
import sys
import paramiko
def upload_files(sftp, local_path, remote_path, prefix):
for item in os.listdir(local_path):
if os.path.isfile(os.path.join(local_path, item)):
if item.startswith(prefix):
continue
local_file = os.path.join(local_path, item)
remote_file = os.path.join(remote_path, item)
remote_file_prefix = os.path.join(remote_path, prefix + item)
try:
sftp.stat(remote_file)
print('File %s already exists, skipping' % item)
continue
except IOError:
pass
print('Uploading file %s' % item)
try:
sftp.put(local_file, remote_file_prefix)
except IOError as e:
print('Error uploading file %s: %s' % (item, e))
if sftp.stat(remote_file_prefix).st_size != os.stat(local_file).st_size:
print('Upload of file %s failed, deleting incomplete file' % item)
sftp.remove(remote_file_prefix)
continue
sftp.rename(remote_file_prefix, remote_file)
elif os.path.isdir(os.path.join(local_path, item)):
remote_dir = os.path.join(remote_path, item)
try:
sftp.stat(remote_dir)
except IOError:
print('Creating remote directory %s' % remote_dir)
sftp.mkdir(remote_dir)
upload_files(sftp, os.path.join(local_path, item), remote_dir, prefix)
paramiko.util.log_to_file('paramiko.log')
def main():
host = 'aaaaaa'
port = 22
username = 'bbbbbb'
prefix = '.'
local_paths = ['/path1', '/path2', '/path3']
remote_paths = ['/remote_path1', '/remote_path1', '/remote_path1']
private_key = paramiko.RSAKey.from_private_key_file('/../rsa')
try:
transport = paramiko.Transport((host, port))
transport.connect(username=username, pkey=private_key)
transport.set_keepalive(60)
sftp = paramiko.SFTPClient.from_transport(transport)
except Exception as e:
print('Error connecting to SFTP server: %s' % e)
sys.exit(1)
for i, local_path in enumerate(local_paths):
remote_path = remote_paths[0] if i < 2 else remote_paths[1]
print('Uploading files from %s to %s' % (local_path, remote_path))
upload_files(sftp, local_path, remote_path, prefix)
sftp.close()
transport.close()
if __name__ == '__main__':
main()


网友留言: