诉求
使用公网服务器进行数据交换,复用已有的ssh端口进行文件传输。
要求限制用户只能传文件无法范文shell也无法访问指定路径之外的目录。
实现
文件传输复用ssh端口很容易想到scp和sftp两种方式
考虑到scp可能要通过command
在authorized_keys
中进行匹配,故该用支持更好的sftp方式。
创建用户
sudo adduser --shell /bin/false sftpuser
sudo mkdir -p /var/sftp/files
sudo chown sftpuser:sftpuser /var/sftp/files
sudo chown root:root /var/sftp
sudo chmod 755 /var/sftp
限制权限
sudo vim /etc/ssh/sshd_config
# add content
Match User sftpuser
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
# save and restart service
sudo systemctl restart ssh
上传脚本
sftp默认使用shell方式进行交互,自动化脚本如下
#!/bin/bash
sftp -P <port> -i <path_to_private_key> sftpuser@<server_ip> <<EOF
cd files
put <my_file>
quit
EOF
# Best practice is to assign the sftp return code to a variable for further use, because
# ${?} is fleeting and only shows the condition code of the immediately preceding command
SFTP_RETURN_CODE=${?}
# If the return code is non-zero then the upload was not successful
if [[ 0 != ${SFTP_RETURN_CODE} ]]
then
echo "uploadfailed"
exit ${SFTP_RETURN_CODE}
else
echo "upload successed"
fi
exit 0
后记
如遇报错packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe
检查ChrootDirectory
目录权限和owner是否配置正确
sudo chown root:root /var/sftp
sudo chmod 755 /var/sftp
ChrootDirectory
子目录可根据需要授予具体权限
sudo -R sftpuser:sftpuser /var/sftp/files
结合这篇文章利用find实现自动清理过期文件 - azureology - 博客园
可以实现服务器文件到期自动清
参考
linux - Limit SSH key to SCP only - Server Fault
How to Create SFTP Only User in Ubuntu 20.04 – TecAdmin
Upload files using SFTP or SCP commands - OCLC Support
sftp搭建後首次登陸packet_write_wait + Broken pipe + Connection closed問題原因 - 台部落