fileserver文件分享,scp远程文件传输服务(Linux系统)

一、前言

  1. 把你的文件封装成服务,然后直接将链接甩给别人是不是一件很帅气的工作。
  2. 其他同学可以通过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应用程序,并在服务器上运行:

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

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

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

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

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

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

四、小结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值