栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

项目实训(八)—文件结构生成及Java通过SSH-2连接远程服务器

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

项目实训(八)—文件结构生成及Java通过SSH-2连接远程服务器

一、文件结构生成:

根据用户ID和视频名称VideoName,在服务器生成一个用于保存原视频、中间结果和最终结果的目录结构。

——EasyCut
  ——ID
    ——ID_VideoName
      ——Original_Video  #存储原视频
      ——SceneSeg_Video  #存储场景划分结果
      ——Key_Frame       #存储视频摘要结果
      ——SceneFeature    #存储视频摘要后视频的场景特征
      ——SceneSimilar    #存储相似场景的视频聚类结果
      ——Resources       #人脸检测结果
        ——video
        ——result
        ——gif
        ——featureMean
        ——featureDB
        ——faceS

代码实现:

create_files.py:

import os
def create_dir(ID,VideoName):
    filename=ID+'_'+VideoName
    path='/opt/data/private/xuyunyang/EasyCut/'
    path0=path+ID+'/'+filename
    path1=path0+'/Original_Video'
    path2=path0+'/SceneSeg_Video'
    path3=path0+'/Resources'
    path4=path0+'/Key_Frame'
    path41=path3+'/video'
    path42=path3+'/result'
    path43=path3+'/gif'
    path44=path3+'/featureDB'
    path45=path3+'/featureMean'
    path46=path3+'/faceS'
    path47=path3+'/ScenePhoto'
    path5=path0+'/SceneFeature'
    path6=path0+'/SceneSimilar'

    isExists=os.path.exists(path0)

    if not isExists:
        os.makedirs(path0)
        os.makedirs(path1)
        os.makedirs(path2)
        os.makedirs(path3)
        os.makedirs(path4)
        os.makedirs(path41)
        os.makedirs(path42)
        os.makedirs(path43)
        os.makedirs(path44)
        os.makedirs(path45)
        os.makedirs(path46)
        os.makedirs(path47)
        os.makedirs(path5)
        os.makedirs(path6)

if __name__ == '__main__':
    parser = argparse.ArgumentParser("Create Files")
    parser.add_argument('ID')
    parser.add_argument('VideoName')
    args = parser.parse_args()
    create_dir(args.ID,args.VideoName)

二、SSH-2实现java连接远程服务器并进行视频传输及命令执行 1、SSH:

Secure Shell Protocol,安全外壳协议,是专门为了远程登录会话和其他网络服务提供的安全性协议,是一种非对称加密协议,使用SSH协议可以有效的防止远程连接会话的时候出现信息泄密,在数据传输的时候SSH会先对联机的数据包通过加密技术进行加密处理,加密后在进行数据的传输,确保了传输中的安全性,SSH服务主要提供两个服务功能:一个是远程联机的SSH服务,一个是借助SSH协议来传输数据的SFTP服务。

2、SSH原理:

① 服务端开启ssh服务监听22端口
② 客户端发送联机请求(携带IP和端口)
③ 客户端服务端进行联机加密认证
④ 认证通过联机成功

3、SSH的两种认证方式:

(1) 基于密码口令的认证:
只要知道服务器的SSH连接账号和密码(当然也要知道服务器的IP和端口(默认22)),就可以通过客户端远程登录到主机了,所以的传输过程都是加密的。

(2) 基于秘钥的安全认证:
① 运行SSH服务,生成密钥对
② 客户端发送公钥到服务端(通过ssh-copy-id或者其他的方式)
③ 客户端发送连接请求
④ 服务端进行对密钥的验证
⑤ 验证成功服务端将用公钥加密质询,发送给客户端
⑥ 客户端用自己的私钥解密质询
⑦ 客户端将解密后的质询发送给服务端
⑧ 服务端验证质询
⑨ 验证通过,建立连接

4、导入jar包:

需要导入3个jar包:

5、代码实现:

注:使用用户名密码方式远程登录linux服务器

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.log4j.Logger;
import  org.apache.commons.lang.StringUtils;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;


public class Connection_to_Sever {
    private static final Logger logger = Logger.getLogger(Connection_to_Sever.class);

    private static String DEFAULTCHARTSET = "UTF-8";
    private static Connection conn;

    //用户名密码方式  远程登录linux服务器
    public static Boolean login(RemoteConnect remoteConnect) {
        boolean flag = false;
        try {
            conn = new Connection(remoteConnect.getIp(),remoteConnect.getPort());
            conn.connect();// 连接
            flag = conn.authenticateWithPassword(remoteConnect.getUserName(), remoteConnect.getPassword());// 认证
            if (flag) {
                logger.info("认证成功!");
            } else {
                logger.info("认证失败!");
                conn.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

    //远程执行shell脚本或者命令,命令执行成功后返回的结果值,如果命令执行失败,返回空字符串,不是null
    public static String executeSuccess(String cmd){
        String result = "";
        //int ret=-1;
        try {
            Session session = conn.openSession();// 打开一个会话
            session.execCommand(cmd);// 执行命令
            result = processStdout(session.getStdout(), DEFAULTCHARTSET);
            //ret = session.getExitStatus();
            conn.close();
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    //解析脚本执行的返回结果
    public static String processStdout(InputStream in, String charset){
        InputStream stdout = new StreamGobbler(in);
        StringBuffer buffer = new StringBuffer();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
            String line = null;
            while ((line = br.readLine()) != null) {
                buffer.append(line + "n");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer.toString();
    }

    //通过用户名和密码关联linux服务器
    public static boolean connectLinux(String ip,int port,String userName,String password,String commandStr) {

        logger.info("ConnectLinuxCommand  scpGet===" + "ip:" + ip +"  port:"+port+ "  userName:" + userName + "  commandStr:"
                + commandStr);

        String returnStr = "";
        boolean result = true;
        RemoteConnect remoteConnect = new RemoteConnect();
        remoteConnect.setIp(ip);
        remoteConnect.setPort(port);
        remoteConnect.setUserName(userName);
        remoteConnect.setPassword(password);
        try {
            if (login(remoteConnect)) {
                returnStr = executeSuccess(commandStr);
                System.out.println(result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (StringUtils.isBlank(returnStr)) {
            result = false;
        }
        return result;
    }

    //从其他服务器获取文件到本服务器指定目录
    public static void scpGet(String ip,int port, String userName, String password, String remoteFile, String localDir)
            throws IOException {

        logger.info("ConnectLinuxCommand  scpGet===" + "ip:" + ip +"  port:"+port+ "  userName:" + userName + "  remoteFile:"
                + remoteFile + "  localDir:" + localDir);
        RemoteConnect remoteConnect = new RemoteConnect();
        remoteConnect.setIp(ip);
        remoteConnect.setPort(port);
        remoteConnect.setUserName(userName);
        remoteConnect.setPassword(password);
        if (login(remoteConnect)) {
            SCPClient client = new SCPClient(conn);
            client.get(remoteFile, localDir);
            conn.close();
        }
    }

    //将文件复制到其他计算机中
    public static void scpPut(String ip,int port, String userName, String password, String localFile, String remoteDir)
            throws IOException {
        logger.info("ConnectLinuxCommand  scpPut===" + "ip:" + ip +ip +"  port:"+port+ "  userName:" + userName + "  localFile:"
                + localFile + "  remoteDir:" + remoteDir);
        RemoteConnect remoteConnect = new RemoteConnect();
        remoteConnect.setIp(ip);
        remoteConnect.setPort(port);
        remoteConnect.setUserName(userName);
        remoteConnect.setPassword(password);
        if (login(remoteConnect)) {
            SCPClient client = new SCPClient(conn);
            client.put(localFile, remoteDir);
            conn.close();
        }
    }

}

public class RemoteConnect {
    private String ip;
    private int port;
    private String userName;
    private String password;

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }
    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

定义一些操作的函数并进行测试,四个操作:
1、创建目录结构,执行服务器命令python create_files.py
2、在faceS下建立一个以照片名为文件名的文件夹,上传人脸照片到该文件夹下,用于第三阶段人脸检测算法
3、上传本地文件(视频)到服务器
4、下载服务器的文件到本地(返回给用户)

public class FileOperate {
    //创建目录结构,执行服务器命令python create_files.py
    public static void  createDir(String ID,String VideoName){
        String commandStr="cd ../opt/data/private/xuyunyang/2022419/SceneSeg/lgss/;python create_files.py "+ID+" "+VideoName;
        Boolean result=Connection_to_Sever.connectLinux("222.206.4.160",25935,"root","shixun123",commandStr);
    }
    //在faceS下建立一个以照片名为文件名的文件夹,上传照片到该文件夹下
    public static void file_to_faces(String local_dir,String ID,String VideoName,String picture_name){
        try {
            String commandStr="cd ../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Resources/faceS/;mkdir "+picture_name;
            Boolean result=Connection_to_Sever.connectLinux("222.206.4.160",25935,"root","shixun123",commandStr);
            Connection_to_Sever.scpPut("222.206.4.160",25935,"root","shixun123", local_dir,"../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Resources/faceS/"+picture_name);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     //上传照片到ScenePhoto
    public static void file_to_scenePhoto(String local_dir,String ID,String VideoName){
        try {
            String commandStr="cd ../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Resources/ScenePhoto/";
            Boolean result=Connection_to_Sever.connectLinux("222.206.4.160",25935,"root","shixun123",commandStr);
            Connection_to_Sever.scpPut("222.206.4.160",25935,"root","shixun123", local_dir,"../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Resources/ScenePhoto/");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //上传本地文件到服务器
    public static void upload(String local_dir,String ID,String VideoName){
        try {
            Connection_to_Sever.scpPut("222.206.4.160",25935,"root","shixun123", local_dir,"../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Original_Video");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //下载服务器的文件到本地
    public static void download(String remote_dir,String local_dir){
        try {
            Connection_to_Sever.scpGet("222.206.4.160",25935,"root","shixun123", remote_dir,local_dir);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String [] args){
        upload("D:/study/项目实训/SceneSeg1/data/demo/video/S01E01.mp4","ID","VideoName");
        download("../opt/data/private/xuyunyang/EasyCut/ID/ID_VideoName/Original_Video/S01E01.mp4","D:/study/项目实训/SceneSeg1/data/demo/video");
        createDir("00","testvideo");
        file_to_faces("D:/study/项目实训/SceneSeg1/data/demo/video/2.png","ID","VideoName","2");
        file_to_scenePhoto("D:/study/项目实训/SceneSeg1/data/demo/video/2.png","ID","VideoName");
    }
}

经过测试,四个操作都执行成功。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/962963.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号