使用ssh进行代码同步
put_codes.py是在上传代码的电脑用的. get_codes.py是下载代码的电脑用的.
put_codes.py在main函数里面添加了if ".py" in i or ".sh" in i:
用来筛选上传文件.
get_codes.py将文件夹里面的所有文件下载下来到本地, 文件夹下的子目录没测试. 一键下载文件这个功能在进行科研中服务器画图经常用到, 画图后直接运行代码就可以同步文件, 大大解放生产力.
github地址:GitHub - frZheng/sshSyncCode: 使用ssh进行代码同步
import paramiko,os,sys
server_dir = r"/tmp/xxx/Book_gym_20220214" #需要下载远程服务器的目标文件夹路径
local_dir = r"./Book_gym_20220214" #要保存文件的路径
hostname = 'xxx' #服务器IP地址
username = 'root' # 登录账号
password = 'xxx' #登录密码
port = 22
if __name__ == '__main__':
transport = paramiko.Transport((hostname, port))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport) # 如果连接需要密钥,则要加上一个参数,hostkey="密钥"
file_list = os.listdir(local_dir)
for i in file_list:
if ".py" in i or ".sh" in i:
print("put: ",i)
sftp.put(os.path.join(local_dir,i), server_dir + "/" + i) # 将本地的Windows.txt文件上传至服务器/root/Windows.txt
transport.close() # 关闭连接
import paramiko,os,sys
input_dir = r"/tmp/xxx/Book_gym_20220214" #需要下载远程服务器的目标文件夹路径
output_dir = r"./Book_gym_20220214" #要保存文件的路径
hostname = 'xxx' #服务器IP地址
username = 'root' # 登录账号
password = 'xxx' #登录密码
port = 22
def list_dir(root):
cmd = 'ls --file-type '+root
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()
return result.decode().split('\n')
def save_file(root,name):
try:
save_path = output_dir + root.split(input_dir)[-1]
if not os.path.exists(save_path):
os.makedirs(save_path)
save_file_path = save_path + name
cmd = 'cat '+ root + name
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()
if not result:
return
with open(save_file_path,'wb+') as fd:
fd.write(result)
print('save file:'+save_file_path)
except :
print('save path:'+save_file_path)
print("Unexpected error:", sys.exc_info()[0])
def traverse_dir(root):
nodes = list(item for item in list_dir(root) if len(item) > 0)
for node in nodes:
#如果该节点是文件夹,继续遍历
if node.endswith('/'):
traverse_dir(root + node)
else:
#如果该节点是文件 则保存该文件
save_file(root,node)
if __name__ == '__main__':
if len(output_dir) > 0 and output_dir[-1] != '/':
output_dir += '/'
if len(input_dir) > 0 and input_dir[-1] != '/':
input_dir += '/'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, port=port, username=username, password=password)
traverse_dir(input_dir)
ssh.close()