在 Ubuntu 上配置 SFTP 使用密钥登录(而不是密码),通常步骤如下。下面以 OpenSSH Server 为例,假设你是服务器管理员,客户端是 Linux / macOS / Windows(WSL 或 PuTTY)。
sudo apt update
sudo apt install openssh-server
sudo adduser sftpuser
推荐在客户端生成,然后把公钥传到服务器。
如果你在服务器上生成:
ssh-keygen -t rsa -b 4096
生成:
~/.ssh/id_rsa~/.ssh/id_rsa.pubssh-keygen -t rsa -b 4096
一路回车(或设置密码)
ssh-copy-id sftpuser@server_ip
或手动复制:
cat ~/.ssh/id_rsa.pub
服务器上:
mkdir -p ~/.ssh
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
sudo nano /etc/ssh/sshd_config
添加或修改:
Match User sftpuser
PasswordAuthentication no
PubkeyAuthentication yes
ForceCommand internal-sftp
ChrootDirectory /home/sftpuser
X11Forwarding no
AllowTcpForwarding no
⚠️
ChrootDirectory目录权限要求:
- 属主必须是 root
- 权限不能超过 755
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser
如果要可写目录:
sudo mkdir /home/sftpuser/upload
sudo chown sftpuser:sftpuser /home/sftpuser/upload
PubkeyAuthentication yes
PasswordAuthentication no
重启 SSH:
sudo systemctl restart ssh
sftp -i ~/.ssh/id_rsa sftpuser@server_ip
或在 ~/.ssh/config:
Host sftp-server
HostName server_ip
User sftpuser
IdentityFile ~/.ssh/id_rsa
然后:
sftp sftp-server
Permission denied (publickey)
检查:
.ssh 700authorized_keys 600fatal: bad ownership or modes for chroot directory
Chroot 目录必须是 root 拥有,且不能有组写权限。
如果你愿意,可以告诉我:
我可以直接给你一份完整可复制的配置。