使用Apache mina sshd构建sftp server如何托管配置文件?

使用Apache mina sshd构建sftp server如何托管配置文件?,第1张

1 介绍
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接 *** 作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
2 sftp搭建
21查看openssl的版本
ssh -V
###使用ssh –V命令来查看openssh的版本,版本必须大于48p1,低于这个版本需要升级。
22创建sftp组
groupadd sftp
23创建一个sftp用户,用户名为mysftp,密码为mysftp
useradd –g sftp –s /bin/false mysftp //该用户不能通过sshd登陆到系统
passwd mysftp
23sftp组的用户的home目录统一指定到 chaodiquancom /data/sftp下,按用户名区分,这里先新建一个mysftp目录,然后指定mysftp的home为/data/sftp/mysftp
mkdir -p /data/sftp/mysftp
usermod –d /data/sftp/mysftp mysftp
24配置sshd_config
文本编辑器打开 /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
找到如下这行,用#符号注释掉。
# Subsystem sftp /usr/libexec/openssh/sftp-server
在文件最后面添加如下几行内容,然后保存。
Subsystem sftp internal-sftp
###配置一个外部子系统(例如,一个文件传输守护进程)。仅用于SSH-2协议。值是一个子系###统的名字和对应的命令行(含选项和参数)。比如"sftp /usr/libexec/openssh/sftp-server"。,###这里配置为内部的
Match Group sftp
#限定只有sftp组的才能访问
ChrootDirectory /data/sftp/%u
###设定属于用户组sftp的用户访问的根文件夹
ForceCommand internal-sftp
###强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录###shell执行(shell -c)。这可以应用于 shell 、命令、子系统的完成,通常用于 Match 块中。###这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的。
AllowTcpForwarding no
###是否允许TCP转发,默认值为"yes", 禁止TCP转发并不能增强安全性,除非禁止了用户###对shell的访问,因为用户可以安装他们自己的转发器。
X11Forwarding no
###是否允许进行 X11
转发。默认值是"no",设为"yes"表示允许。如果允许X11转发并且sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。需要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器。
如果启用了 UseLogin ,那么X11转发将被自动禁止。
25设定Chroot目录权限
chown root:sftp /data/sftp/mysftp
chmod 755 /data/sftp/mysftp
26建立SFTP用户登入后可写入的目录
照上面设置后,在重启sshd服务后,用户mysftp已经可以登录。但使用chroot指定根目录后,根应该是无法写入的,所以要新建一个目录供mysftp上传文件。这个目录所有者为mysftp,所有组为sftp,所有者有写入权限,而所有组无写入权限。命令如下:
mkdir /data/sftp/mysftp/upload
chown mysftp:sftp /data/sftp/mysftp/upload
chmod 755 /data/sftp/mysftp/upload
27重启sshd服务
service sshd restart

貌似没有,不过我在网上找,最后整理了一下!写出了这个方法!

import javaioFile;
import javaioFileInputStream;
import javaioFileOutputStream;
import javautilDate;
import javautilProperties;
import javautilVector;
 
 
import androidcontentContext;
import androidtelephonyTelephonyManager;
import androidtextformatDateFormat;
import androidtextformatTime;
 
import comjcraftjschChannel;
import comjcraftjschChannelSftp;
import comjcraftjschJSch;
import comjcraftjschSession;
import comjcraftjschSftpException;
 
 
public class Sftp_upload {
 
 /
   连接sftp服务器
   @param host 主机
   @param port 端口
   @param username 用户名
   @param password 密码
   @return
  /
 public ChannelSftp connect(String host, int port, String username,String password) {
          
     ChannelSftp sftp = null;
          try {
               JSch jsch = new JSch();
               jschgetSession(username, host, port);
               Session sshSession = jschgetSession(username, host, port);
               Systemoutprintln("Session created");
               sshSessionsetPassword(password);
               Properties sshConfig = new Properties();
               sshConfigput("StrictHostKeyChecking", "no");
               sshSessionsetConfig(sshConfig);
               sshSessionconnect();
               Systemoutprintln("Session connected");
               Systemoutprintln("Opening Channel");
               Channel channel = sshSessionopenChannel("sftp");
               channelconnect();
               sftp = (ChannelSftp) channel;
               Systemoutprintln("Connected to " + host + "");
               //Systemoutprintln("登录成功");
          } catch (Exception e) {
         
          }
          return sftp;
 }
 
 /
   上传文件
   @param directory 上传的目录
   @param uploadFile 要上传的文件
   @param sftp
  /
 public void upload(String directory, String uploadFile, ChannelSftp sftp) {
   
     try {
               sftpcd(directory);
               File file=new File(uploadFile);
               
               String currentTime=DateFormatformat("yyyy_MM_dd_hh_mm_ss", new Date())toString(); //获取时间
               String filename=currentTime+"wav"; //文件名为当前时间来保存
               sftpput(new FileInputStream(file), filename);   
               
             
             
               Systemoutprintln("上传成功!");
        } catch (Exception e) {
           eprintStackTrace();
          }
 }
 
 /
   下载文件
   @param directory 下载目录
   @param downloadFile 下载的文件
   @param saveFile 存在本地的路径
   @param sftp
  /
 public void download(String directory, String downloadFile,String saveFile, ChannelSftp sftp) {
         
       try {
           sftpcd(directory);
           File file=new File(saveFile);
           sftpget(downloadFile, new FileOutputStream(file));
          } catch (Exception e) {
           eprintStackTrace();
          }
 }
 
 /
   删除文件
   @param directory 要删除文件所在目录
   @param deleteFile 要删除的文件
   @param sftp
  /
 public void delete(String directory, String deleteFile, ChannelSftp sftp) {
     
     try {
       sftpcd(directory);
       sftprm(deleteFile);
      } catch (Exception e) {
       eprintStackTrace();
      }
 }
 
 /
   列出目录下的文件
   @param directory 要列出的目录
   @param sftp
   @return
   @throws SftpException
  /
 public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException{
   
     return sftpls(directory);
  
 }
  
 //上传文件
  
  
 public static void Sftp_server(String file,String imsi) {
 
      String Imsi = imsi;   
      Sftp_upload sf = new Sftp_upload(); 
      String host = "192168160";
      int port = 22;
      String username = "root";
      String password = "123456";
      String directory = "/data/test/wav";
      //String uploadFile = "c:\\audiocheck\\testwav";
      String uploadFile = file;
     // String downloadFile = "/data/test/wav/lamesh";
    // String saveFile = "c:\\audiocheck\\contenttxt";
     // String deleteFile = "c:\\audiocheck\\contenttxt";
      ChannelSftp sftp=sfconnect(host, port, username, password);
       
      //sfdownload(directory, downloadFile, saveFile, sftp);
      //sfdelete(directory, deleteFile, sftp);
             
          try{
               sftpcd(directory);
               sftpmkdir(Imsi); //创建目录
               Systemoutprintln("finished");
              }catch(Exception e){
                  eprintStackTrace();
              }
              directory = "/data/test/wav/"+imsi;
              sfupload(directory, uploadFile, sftp);//上传文件到服务器
              
 }
  
}

这是源代码

这个是上传

//imsi也就是 手机的型号来创建文件夹的,这些你都可以修改的。
 
String file = mWorkdir+"/"+"resFilewav"; //要上传的文件
Sftp_uploadSftp_server(file,imsi); //上传文件
Systemoutprintln("已上传");

管理服务

SSH基础服务,SSH是远程连接Linux,管理Linux的服务。
Secure Shell Protocol简写SSH 安全的shell协议
使用的默认的端口为22(一台机器的不同功能就用端口区分)

ssh参数:
-p 指定端口
格式:命令 -p 端口 用户@IP相当于ssh IP

scp命令参数:
-P端口
-r递归
-p保持属性
-l 限制速度
推:
scp -P 22 -rp /data root@1721617:/tmp
scp -P -rp /data 1721617:/tmp

scp -P 22 -rp root@1721617:/data /tmp
scp -P -rp 1721617:/data /tmp
对比下scp和rsync
scp每一次都是全量考本,加密拷贝。
rsync第一次全量拷贝,远程shell也是加密拷贝

sftp命令:加密的ftp服务,默认缺点不能锁定家目录。
ftp:vsftp。

sftp服务也支持windows ftp客户端:
winscp,flashftp,xshell也支持

常规和服务器交互数据文件:
rz/sz 属于lrzsz

ssh服务配置:
s

使用用户名密码登录

不需要密码登录,使用密钥文件就可以连接服务器。

实践密钥认证:
项目实践:批量管理、批量分发内容项目

1、基于root用户做Linux之间的秘钥认证。
2、生成密钥对(去超市买把锁),不需要指定服务器。
3、在61上生成密钥对(方便)。

4、把锁放到7/8上

C6:

5、ssh-copy-id:原理

6、测试远程执行命令:

7、写个脚本

8、开发脚本实现批量管理服务器:

9、批量发文件:

复杂分发文件脚本:

SSH批量管理如何一键完成:
一键创建及分发秘钥:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/12686378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存