虚拟机配置
1、创建sftp用户组
groupadd sftp
2、添加用户
useradd -g sftp mysftp
3、设置用户密码
passwd mysftp
4、创建文件根目录
mkdir /app/data
5、将该目录设置到用户上
usermod -d /app/data mysftp
6、修改配置文件
vim /etc/ssh/sshd_config
7、找到 Subsystem ,将之前的配置注释掉,增加新的配置
#注释掉下面一行,改用自定义的
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp
Match Group sftp #这行用来匹配用户组
ChrootDirectory /app/data #用chroot将用户的根目录指定到/app/data ,这样用户就只能在/app/data 下活动
AllowTcpForwarding no
ForceCommand internal-sftp #指定sftp命令
8、创建属于该用户的访问目录并设置用户组
mkdir /app/data/upload
chown -R mysftp:sftp /app/data/upload/
mkdir /app/data/download
chown -R mysftp:sftp /app/data/download/
9、重启sshd服务
service sshd restart
10、通过任意的sftp连接工具测试连接
我这边使用的是 WinSCP
连接后能看到下图说明服务正常(无法跳转到 /app/data 以外的路径才对,保护资源)
java 代码
1、测试代码
public static void main(String[] args) {
JSch jSch = new JSch();
Session session = null;
Channel channel = null;
OutputStream outputStream = null;
InputStream inputStream = null;
ChannelSftp channelSftp;
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<Message>\n" +
" <Data>我是一个测试文件</Data>\n" +
"</Message>\n";
try {
session = jSch.getSession("mysftp", "192.168.141.100", 22);
session.setPassword("xxxxxx");
Properties properties = new Properties();
properties.setProperty("StrictHostKeyChecking", "no");
session.setConfig(properties);
session.connect(30000);
channel = session.openChannel("sftp");
channel.connect(30000);
channelSftp = (ChannelSftp) channel;
channelSftp.cd("/upload");
outputStream = channelSftp.put("test.xml");
inputStream = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
byte[] b = new byte[1024];
int n;
while ((n = inputStream.read(b)) != -1) {
outputStream.write(b, 0, n);
}
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != session) {
session.disconnect();
}
if (null != channel && channel.isConnected()) {
channel.disconnect();
}
}
}
2、执行完成后,会在服务器中的 upload 文件夹内生成一个 xml 文件
3、说明
在 java 程序中 cd 的路径不是服务器的绝对路径,而是以当前用户为起点的目录(channelSftp.cd("/upload");
)
这个路径可以在服务器中查看:
[root@root /]# sftp mysftp@127.0.0.1
mysftp@127.0.0.1's password:
Connected to 127.0.0.1.
sftp> pwd
Remote working directory: /
sftp>
其他
在 linux 服务器中查看 22 端口的连接情况(连接个数,ip)
netstat -anp | grep :22 | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
这个命令的含义是:
netstat -anp
:列出所有的网络连接
grep :22
:筛选出SSH端口连接
grep ESTABLISHED
:筛选出已经建立的连接
awk '{print $5}'
:提取出连接的IP地址和端口号
cut -d: -f1
:只保留IP地址
sort
:按IP地址排序
uniq -c
:统计每个IP连接的个数
sort -n
:按连接数排序,从少到多