前言

  1. 把你的文件封装成服务,然后直接将链接甩给别人是不是一件很帅气的工作。
  2. 其他同学可以通过scp或者网页拖拽远程文件传输给你。(尤其是录制视频,表演等资料较大时使用,方便得很)

Fileserver文件分享

安装

准备:一台本地服务器(云的更好),没了。

首先安装docker和docker-compose
此处省略docker的安装(改天更新),docker-compose安装如下:

1
2
3
4
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文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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文件,并赋予权限

1
2
3
4
cd /srv/nas
sudo mkdir resources
sudo chown jerry resources # 将resources的所有权修改为jerry
# 以上操作便于后期迁移nas文件夹

然后执行docker-compose

1
2
docker-compose up -d  # 注意需要在刚才的yml文件路径下执行
# docker-compose down # 关闭服务

使用

在校园网或者同一个局域网内,通过curl下载即可

1
2
3
4
5
6
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

远程文件传输服务

基于scp

如何让其他同学只能通过scp传送文件给我的服务器,而不能拉取文件和其他所有操作呢??

可以利用SSH的ForceCommand指令,结合一个自定义的shell脚本来进行限制。下面是一个示例步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建一个新的系统用户:
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用户添加以下配置:

1
2
3
4
5
6
7
8
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服务:

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应用程序,并在服务器上运行:

  1. 安装Streamlit:如果你还没有安装Streamlit,可以通过以下命令安装:

    1
    pip install streamlit
  2. 创建一个名为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
    52
    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()
  3. 指定9010端口运行Streamlit应用程序:

    1
    streamlit run file_uploader.py --server.port 9010
  4. 配置Streamlit:根据需要配置Streamlit,例如设置端口号、开启/关闭访问控制等。你可以在~/.streamlit/config.toml中添加配置,或者通过命令行参数来配置。找不到这个文件就新建一个,然后将下面的内容写入,将默认的200M上传限制改为10G

    1
    2
    [server]
    maxUploadSize = 10240 # 设置最大上传大小为 10GB
  5. 内网其他用户访问:

    1
    2
    # 服务器上输入这行指令,将9010换成你服务的实际端口,内网其他同学就可以用IP+Port访问你的服务了
    sudo iptables -A INPUT -p tcp --dport 9010 -j ACCEPT
  6. 设置反向代理:如果你的服务器已经运行了Web服务器(如Nginx或Apache),你可能需要设置一个反向代理,将外部请求转发到Streamlit应用程序。这样可以通过标准的HTTP/HTTPS端口访问应用程序。

  7. 保护你的应用程序:如果你的应用程序可以从互联网访问,确保你实施了适当的安全措施,例如使用HTTPS,设置访问控制等

小结

现在既可以文件分享,又可以文件传输,快去试试吧。