sftp服务
Secure File Transfer Protocol,也就是安全文件传输协议
与 SSH 一样,SFTP 也使用加密和加密哈希函数保护您的数据完整性。此外,它还支持多种安全身份验证方法,包括密码和基于密钥的身份验证。此外,它减少了服务器对外部网络的开放端口,因为它与 SSH 协议在同一端口上运行。
安装
环境: 阿里云服务器
操作系统: Ubuntu 20.04
sh
# 查看已安装的ssh服务版本信息
dpkg -l | grep ssh
# 安装 openssh-sftp-server 服务
sudo apt install openssh-sftp-server
# 创建一个用户组,用来添加用户
sudo groupadd sftpgroup
# 创建一个用户
sudo useradd -G sftpgroup -d /srv/sftpuser -s /sbin/nologin sftpuser
# 设置用户密码
passwd sftpuser # 1234567890
# 创建sfpt用户主目录
mkdir -p /srv/sftpuser
# 将sfpt用户主目录的权限设置为root用户所有,防止其他用户访问
sudo chown root /srv/sftpuser
# 授予sftpgroup组读取和执行权限,但不能写入。
sudo chmod g+rx /srv/sftpuser
# 接下来,在“ /srv/sftpuser ”目录中创建一个新的“data”目录,并将该“ data ”目录的所有权更改为用户“ sftpuser ”。
mkdir -p /srv/sftpuser/data
chown sftpuser:sftpuser /srv/sftpuser/data
在 SSH 服务器上启用 SFTP
bash
# 修改配置文件
# vim /etc/ssh/sshd_config
# 备份配置文件
if [ -f /etc/ssh/sshd_config.bak ]; then
echo "配置文件已存在"
else
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
echo "备份配置文件成功"
fi
# 注释以下配置以禁用独立的“ sftp-server ”功能。
#Subsystem sftp /usr/lib/openssh/sftp-server
sed -i -r 's/^Subsystem\s+sftp\s+\/usr\/lib\/openssh\/sftp-server/# &/' /etc/ssh/sshd_config.bak1
# 将以下配置粘贴到该行的底部。
cat << 'EOF' >> /etc/ssh/sshd_config
Subsystem sftp internal-sftp
# sftpgroup 用户组名
Match Group sftpgroup
ChrootDirectory %h
X11Forwarding no
AllowTCPForwarding no
ForceCommand internal-sftp
EOF
# 重启服务
sudo systemctl restart ssh
nodejs 连接
ssh2-sftp-client nodejs 连接sftp服务器
ts
/**
* 将构建后的文件上传到服务器。
*/
import * as path from "path";
import url from "url";
import Client from "ssh2-sftp-client";
import { configDotenv } from "dotenv";
import { exit } from "process";
const isDevMode = process.env.NODE_ENV === "development";
let sftp = new Client();
// 连接成功事件
sftp.on("ready", () => {
console.log("==ready==: 链接成功");
});
// 加载.env文件
configDotenv({
path: isDevMode
? ".env.development"
: process.env.NODE_ENV === "procuction"
? ".env.procuction"
: ".env",
});
try {
// 服务区sftp连接信息
sftp
.connect({
host: process.env.VITE_SFTP_host,
port: process.env.VITE_SFTP_port,
username: process.env.VITE_SFTP_username,
password: process.env.VITE_SFTP_password,
})
.then(() => {
/**
* sfpt在服务器上的真实目录: /srv/sftpuser
* 当前登录用户可访问的目录: /srv/sftpuser/data
* list: 列出当前登录用户可访问的目录下的所有文件信息。
* input: / 而不是 /srv/sftpuser
* output: /data
*/
return sftp.list("/", () => true);
/**
* will be false or d, -, l (dir, file or link)
*/
// return sftp.exists("/data");
})
.then((data) => {
console.log(data, "the data info");
exit();
})
.catch((err) => {
console.log(err, "catch error");
exit();
});
} catch (error) {
console.log(error);
}