服务器把ssh的端口号改了,在linux终端怎么用sftp连接
从技术角度来分析,几个要求:
1、从安全方面看,sftp会更安全一点
2、线上服务器提供在线服务,对用户需要控制,只能让用户在自己的home目录下活动
3、用户只能使用sftp,不能ssh到机器进行操作
提供sftp服务,可以用系统自带的internal-sftp,也可以使用vsftpd,这里需求不多,直接选用internal-sftp。
限制用户只能在自己的home目录下活动,这里需要使用到chroot,openssh 48p1以后都支持chroot,我现在用的是CentOS 63,自带的openssh已经是53p1,足够了。
可以输入:
# ssh -V
来查看openssh的版本,如果低于48p1,需要自行升级安装,不在这里具体介绍了。
假设,有一个名为sftp的组,这个组中的用户只能使用sftp,不能使用ssh,且sftp登录后只能在自己的home目录下活动
1、创建sftp组
# groupadd sftp
2、创建一个sftp用户,名为mysftp
# useradd -g sftp -s /bin/false mysftp
# passwd mysftp
3、sftp组的用户的home目录统一指定到/data/sftp下,按用户名区分,这里先新建一个mysftp目录,然后指定mysftp的home为/data/sftp/mysftp
# mkdir -p /data/sftp/mysftp
# usermod -d /data/sftp/mysftp mysftp
4、配置sshd_config
编辑 /etc/ssh/sshd_config
# vim +132 /etc/ssh/sshd_config
找到如下这行,并注释掉
Subsystem sftp /usr/libexec/openssh/sftp-server
添加如下几行
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
解释一下添加的几行的意思
Subsystem sftp internal-sftp
这行指定使用sftp服务使用系统自带的internal-sftp
Match Group sftp
这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割
当然,也可以匹配用户
Match User mysftp
这样就可以匹配用户了,多个用户名之间也是用逗号分割,但我们这里按组匹配更灵活和方便
ChrootDirectory /data/sftp/%u
用chroot将用户的根目录指定到/data/sftp/%u,%u代表用户名,这样用户就只能在/data/sftp/%u下活动,chroot的含义,可以参考这里:http://wwwibmcom/developerworks/cn/linux/l-cn-chroot/
ForceCommand internal-sftp
指定sftp命令
AllowTcpForwarding no
X11Forwarding no
这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉
5、设定Chroot目录权限
# chown root:sftp /data/sftp/mysftp
# chmod 755 /data/sftp/mysftp
错误的目录权限设定会导致在log中出现”fatal: bad ownership or modes for chroot directory XXXXXX”的内容
目录的权限设定有两个要点:
1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root
2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限
所以遵循以上两个原则
1)我们将/data/sftp/mysftp的所有者设置为了root,所有组设置为sftp
2)我们将/data/sftp/mysftp的权限设置为755,所有者root有写入权限,而所有组sftp无写入权限
6、建立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
7、重启sshd服务
# service sshd restart
到这里,mysftp已经可以通过sftp客户端登录并可以上传文件到upload目录。
如果还是不能在此目录下上传文件,提示没有权限,检查SElinux是否关闭,可以使用如下指令关闭SElinux
关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html
修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。或者
# setenforce 0
package jsch;
import javaioFile;
import javaioFileInputStream;
import javautilProperties;
import comjcraftjschChannel;
import comjcraftjschChannelSftp;
import comjcraftjschJSch;
import comjcraftjschJSchException;
import comjcraftjschSession;
public class Test {
protected String host;//sftp服务器ip
protected String username;//用户名
protected String password;//密码
protected String privateKey;//密钥文件路径
protected String passphrase;//密钥口令
protected int port = 22;//默认的sftp端口号是22
/
获取连接
@return channel
/
public ChannelSftp connectSFTP() {
JSch jsch = new JSch();
Channel channel = null;
try {
if (privateKey != null && !""equals(privateKey)) {
//使用密钥验证方式,密钥可以使有口令的密钥,也可以是没有口令的密钥
if (passphrase != null && ""equals(passphrase)) {
jschaddIdentity(privateKey, passphrase);
} else {
jschaddIdentity(privateKey);
}
}
Session session = jschgetSession(username, host, port);
if (password != null && !""equals(password)) {
sessionsetPassword(password);
}
Properties sshConfig = new Properties();
sshConfigput("StrictHostKeyChecking", "no");// do not verify host key
sessionsetConfig(sshConfig);
// sessionsetTimeout(timeout);
sessionsetServerAliveInterval(92000);
sessionconnect();
//参数sftp指明要打开的连接是sftp连接
channel = sessionopenChannel("sftp");
channelconnect();
} catch (JSchException e) {
eprintStackTrace();
}
return (ChannelSftp) channel;
}
/
上传文件
@param directory
上传的目录
@param uploadFile
要上传的文件
@param sftp
/
public void upload(String directory, String uploadFile, ChannelSftp sftp) {
try {
sftpcd(directory);
File file = new File(uploadFile);
sftpput(new FileInputStream(file), filegetName());
} 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);
sftpget(downloadFile,saveFile);
} 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();
}
}
public void disconnected(ChannelSftp sftp){
if (sftp != null) {
try {
sftpgetSession()disconnect();
} catch (JSchException e) {
eprintStackTrace();
}
sftpdisconnect();
}
}
}
windows中可以使用Core FTP,FileZilla, WinSCP,Xftp来连接SFTP进行上传,下载文件,建立,删除目录等操作。
以winscp软件为例:
1、将之前下载的sftp服务端解压缩,然后直接运行主程序。点“NEXT”按钮进行下面的操作。
2、在许可协议窗口处填写“同意”并点“下一步”按钮继续。
3、在接下来的配置窗口中选择要安装的组件,从界面中可以看到包括client(客户端)与server(服务器端),实际上只需要服务器端,而客户端使用之前下载的WinSCP 382即可。选择相应的服务器端组件后点“下一步”完成安装
4、 接下来就要启动该服务了,通过“开始->运行->输入CMD后回车”进入到命令提示窗口,然后通过cd命令定位到c:\programfiles\openssh\bin目录。
5、依次执行mkgroup -l >> \etc\group mkpasswd -l >> \etc\passwd命令,这样你目前windows本地帐户中的用户就都可以登录该sftp服务器了,自对文件目录的访问权限和NTFS权限一致。此步骤相当于FTP中的建立访问帐号。
6、添加完各个访问帐户后就可以使用了。
SFTP:sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。
tcp。
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。
扩展资料:
FTP客户端发起FTP会话,与FTP服务器建立相应的连接。FTP会话期间要建立控制信息进程与数据进程两个连接。控制连接不能完成传输数据的任务,只能用来传送FTP执行的内部命令以及命令的响应等控制信息;数据连接是服务器与客户端之间传输文件的连接,是全双工的,允许同时进行双向数据传输。当数据传输完成后,数据连接会撤消,再回到FTP会话状态,直到控制连接被撤消,并退出会话为止。
-ftp
-tcp
0条评论