SSH一键上传/下载代码

使用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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值