一、前言
- 把你的文件封装成服务,然后直接将链接甩给别人是不是一件很帅气的工作。
- 其他同学可以通过
scp
或者网页拖拽
远程文件传输给你。(尤其是录制视频,表演等资料较大时使用,方便得很)
二、Fileserver文件分享
2.1 安装
准备:一台本地服务器(云的更好),没了。
首先安装docker和docker-compose
此处省略docker的安装(改天更新),docker-compose安装如下:
curl -L https://github.com/docker/compose/releases/download/v2.22.0/docker-compose-linux-x86_64 -o ~/Downloads/docker-compose
chmod +x docker-compose # 赋予执行权限
sudo mv docker-compose /usr/bin # 添加到环境变量可以读取到的地方
docker-compose -v # 测试是否成功
然后找个地方配置docker-compose.yml
文件
cd /srv
sudo mkdir nas
cd nas
sudo vim docker-compose.yml
# 将下面一段拷贝到该配置文件中
version: '3'
services:
fileserver:
container_name: fileserver
image: halverneus/static-file-server:latest
volumes:
- ./resources:/web
ports:
- "9080:8080"
#environment:
# - URL_PREFIX=/cubenlp
restart: always
# 将上面拷贝到该配置文件中
:wq # 保存退出
在该路径下新建resources文件,并赋予权限
cd /srv/nas
sudo mkdir resources
sudo chown jerry resources # 将resources的所有权修改为jerry
# 以上操作便于后期迁移nas文件夹
然后执行docker-compose
docker-compose up -d # 注意需要在刚才的yml文件路径下执行
# docker-compose down # 关闭服务
2.2 使用
在校园网或者同一个局域网内,通过curl下载即可
curl <link_address> -o <file name>
wget -c <link_address>
# example 两种方式均可
curl http://127.0.0.1:9080/test.txt -o test.txt
wget -c http://127.0.0.1:9080/test.txt # -c 表示断了continue
三、远程文件传输服务
3.1 基于scp
如何让其他同学只能通过scp传送文件给我的服务器,而不能拉取文件和其他所有操作呢??
可以利用SSH的ForceCommand指令,结合一个自定义的shell脚本来进行限制。下面是一个示例步骤:
# 创建一个新的系统用户:
sudo adduser scpuser
# 创建一个上传目录:为用户创建一个目录,用于存放上传的文件。
sudo mkdir /home/scpuser/uploads
sudo chown scpuser:scpuser /home/scpuser/uploads
# 创建限制shell脚本:创建一个shell脚本来限制用户只能上传文件。
sudo vim /home/scpuser/limited-scp.sh
# 在编辑器中添加以下内容:
#!/bin/bash
if [[ $SSH_ORIGINAL_COMMAND =~ ^scp\ -t.*$ ]]; then
$SSH_ORIGINAL_COMMAND
else
echo "This account is limited to scp upload only."
exit 1
fi
# :wq 保存退出,使脚本可执行
sudo chmod +x /home/scpuser/limited-scp.sh
配置SSH:编辑/etc/ssh/sshd_config
文件,为scpuser
用户添加以下配置:
Match User scpuser
ForceCommand /home/scpuser/limited-scp.sh
AllowTCPForwarding no
X11Forwarding no
PermitTunnel no
GatewayPorts no
AllowAgentForwarding no
PasswordAuthentication yes
这里,ForceCommand
会强制连接到scpuser
的SSH会话运行指定的脚本。
重启SSH服务:
sudo systemctl restart sshd
现在,scpuser
只能使用scp
将文件上传到服务器的/home/scpuser/uploads
目录。任何尝试执行其他命令或下载文件的操作都会被脚本拒绝,并且会输出提示信息。
客户端可以使用如下指令传送文件:
scp /path/to/local/file.txt scpuser@server_ip:/home/scpuser/uploads/
输入创建scpuser用户时的密码即可。
3.2 基于Streamlit构建的网页
想让其他同学可以通过拖拽的方式传送文件给你,写个Streamlit应用程序,并在服务器上运行:
-
安装Streamlit:如果你还没有安装Streamlit,可以通过以下命令安装:
pip install streamlit
-
创建一个名为
file_uploader.py
的文件,并添加以下内容:import streamlit as st import os import time # 设置页面布局为宽模式 # st.set_page_config(layout="wide") # 设置上传目录 UPLOAD_DIRECTORY = "/home/scpuser/uploads" # 确保上传目录存在 if not os.path.exists(UPLOAD_DIRECTORY): os.makedirs(UPLOAD_DIRECTORY) def save_uploaded_files(uploaded_files): progress_bar = st.progress(0) status_text = st.empty() total_files = len(uploaded_files) for index, uploaded_file in enumerate(uploaded_files): if uploaded_file is not None: file_path = os.path.join(UPLOAD_DIRECTORY, uploaded_file.name) # 保存文件 with open(file_path, "wb") as f: f.write(uploaded_file.getbuffer()) # 更新进度条 progress_bar.progress((index + 1) / total_files) status_text.text(f"Uploading {index + 1}/{total_files} files...") status_text.text("Upload complete!") time.sleep(2) status_text.empty() progress_bar.empty() return True def main(): st.title('File Upload to Server') # 使用容器来放置文件上传器和按钮 container = st.container() # 允许选择多个文件 uploaded_files = container.file_uploader("Choose files to upload", type=None, accept_multiple_files=True, key="file_uploader") # col1, col2, col3, col4, col5 = container.columns(5) if st.button('Upload Files', key="upload_button"): # 保存上传的文件 if uploaded_files and save_uploaded_files(uploaded_files): st.success('Files uploaded successfully!') else: st.error('Error in uploading files.') if __name__ == "__main__": main()
-
指定9010端口运行
Streamlit
应用程序:streamlit run file_uploader.py --server.port 9010
-
配置Streamlit:根据需要配置Streamlit,例如设置端口号、开启/关闭访问控制等。你可以在~/.streamlit/config.toml中添加配置,或者通过命令行参数来配置。
找不到这个文件就新建一个,然后将下面的内容写入,将默认的200M上传限制改为10G
[server] maxUploadSize = 10240 # 设置最大上传大小为 10GB
-
内网其他用户访问:
# 服务器上输入这行指令,将9010换成你服务的实际端口,内网其他同学就可以用IP+Port访问你的服务了 sudo iptables -A INPUT -p tcp --dport 9010 -j ACCEPT
-
设置反向代理:如果你的服务器已经运行了Web服务器(如Nginx或Apache),你可能需要设置一个反向代理,将外部请求转发到Streamlit应用程序。这样可以通过标准的HTTP/HTTPS端口访问应用程序。
-
保护你的应用程序:如果你的应用程序可以从互联网访问,确保你实施了适当的安全措施,例如使用HTTPS,设置访问控制等
四、小结
现在既可以文件分享,又可以文件传输,快去试试吧。