fileserver文件分享,scp远程文件传输服务(Linux系统)
前言
- 把你的文件封装成服务,然后直接将链接甩给别人是不是一件很帅气的工作。
- 其他同学可以通过
scp
或者网页拖拽
远程文件传输给你。(尤其是录制视频,表演等资料较大时使用,方便得很)
Fileserver文件分享
安装
准备:一台本地服务器(云的更好),没了。
首先安装docker和docker-compose
此处省略docker的安装(改天更新),docker-compose安装如下:
1 | curl -L https://github.com/docker/compose/releases/download/v2.22.0/docker-compose-linux-x86_64 -o ~/Downloads/docker-compose |
然后找个地方配置docker-compose.yml
文件
1 | cd /srv |
在该路径下新建resources文件,并赋予权限
1 | cd /srv/nas |
然后执行docker-compose
1 | docker-compose up -d # 注意需要在刚才的yml文件路径下执行 |
使用
在校园网或者同一个局域网内,通过curl下载即可
1 | curl <link_address> -o <file name> |
远程文件传输服务
基于scp
如何让其他同学只能通过scp传送文件给我的服务器,而不能拉取文件和其他所有操作呢??
可以利用SSH的ForceCommand指令,结合一个自定义的shell脚本来进行限制。下面是一个示例步骤:
1 | # 创建一个新的系统用户: |
配置SSH:编辑/etc/ssh/sshd_config
文件,为scpuser
用户添加以下配置:
1 | Match User scpuser |
这里,ForceCommand
会强制连接到scpuser
的SSH会话运行指定的脚本。
重启SSH服务:
1 | sudo systemctl restart sshd |
现在,scpuser
只能使用scp
将文件上传到服务器的/home/scpuser/uploads
目录。任何尝试执行其他命令或下载文件的操作都会被脚本拒绝,并且会输出提示信息。
客户端可以使用如下指令传送文件:
1 | scp /path/to/local/file.txt scpuser@server_ip:/home/scpuser/uploads/ |
输入创建scpuser用户时的密码即可。
基于Streamlit构建的网页
想让其他同学可以通过拖拽的方式传送文件给你,写个Streamlit应用程序,并在服务器上运行:
-
安装Streamlit:如果你还没有安装Streamlit,可以通过以下命令安装:
1
pip install streamlit
-
创建一个名为
file_uploader.py
的文件,并添加以下内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52import 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
应用程序:1
streamlit run file_uploader.py --server.port 9010
-
配置Streamlit:根据需要配置Streamlit,例如设置端口号、开启/关闭访问控制等。你可以在~/.streamlit/config.toml中添加配置,或者通过命令行参数来配置。
找不到这个文件就新建一个,然后将下面的内容写入,将默认的200M上传限制改为10G
1
2[server]
maxUploadSize = 10240 # 设置最大上传大小为 10GB -
内网其他用户访问:
1
2# 服务器上输入这行指令,将9010换成你服务的实际端口,内网其他同学就可以用IP+Port访问你的服务了
sudo iptables -A INPUT -p tcp --dport 9010 -j ACCEPT -
设置反向代理:如果你的服务器已经运行了Web服务器(如Nginx或Apache),你可能需要设置一个反向代理,将外部请求转发到Streamlit应用程序。这样可以通过标准的HTTP/HTTPS端口访问应用程序。
-
保护你的应用程序:如果你的应用程序可以从互联网访问,确保你实施了适当的安全措施,例如使用HTTPS,设置访问控制等
小结
现在既可以文件分享,又可以文件传输,快去试试吧。