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批量管理如何一键完成:
一键创建及分发秘钥:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)