因国家法律规定,部分内容已删除,完整内容请查看文章末尾链接

Web 界面

一般 OpenWrt 安装好之后会已经默启用了 Web 管理界面(LuCI),默认地址是 192.168.1.1,默认账号是 root,无密码,直接点击登录即可进入

汉化

默认界面是英文的,可以在 系统-软件 中搜索中文包安装进行汉化

  • 点击 UPDATE LIST... 耐心等待软件包的更新
  • 然后在 Filter: 下的输入框中输入 luci-i18n-base-zh-cn,在筛选出来的结果中点击 INSTALL...,安装勾上 Overwrite files from other package(s),然后点击 INSTALL,耐心等待安装完成之后刷新网页(Ctrl+F5)可以看见大部分界面已经汉化了
  • 同理安装 luci-i18n-opkg-zh-cn 包用于 系统-软件 界面的汉化
  • 同理安装 luci-i18n-firewall-zh-cn 包用于 网络-防火墙 界面的汉化

root 密码

进入管理界面后进入 系统-管理-密码 界面修改路由器密码,同时也是系统的 root 账号的密码

ssh

然后在 系统-管理-ssh 可以配置 ssh 登录,参考配置如下

  • 接口:不指定 → 内网以及外网都可以 ssh 登录
  • 端口:22 → ssh 默认端口,不做修改
  • 密码验证:不勾选 → 推荐使用 ssh 登录
  • 允许 root 用户凭密码登录:不勾选 → 推荐使用 ssh 登录
  • 网关端口:根据需要勾选

按照上面配置完成后将只能通过 ssh 密钥进行登录,所以还得在 系统-管理-ssh密钥 添加设备的公钥

升级 LuCI

ssh 登入路由器后执行以下命令:

# 更新软件源
opkg update
# luci-compat 包有时可以帮助解决一些兼容性问题,推荐一同安装
opkg install luci luci-base luci-compat

美化

原始的 bootstrap 主题个人不太喜欢,在空间足够的情况下我个人额外安装了 material,主题的切换在 系统-系统-语言和界面

opkg update
opkg install luci-theme-material

锐捷认证

很多学校校园网通常采用锐捷认证,并且限制了用户账号的登陆数量,但是我们可以通过在路由器上进行锐捷认证来接入校园网,之后连接路由器的所有设备都会直接接入校园网而不需要认证了

MentoHUST

MentoHUST 是华中科技大学的 HustMoon 最初在校内 BBS 白云黄鹤上发布的一款可以在 Linux 系统上进行锐捷认证的软件。不过原始项目已经归档,不在开发,GitHub 上有加入 v4 支持的新项目

而在 OpenWrt 可以通过 Github 上的两个项目手动编译 .ipk 文件,然后 opkg install xxx.ipk 进行安装即可

手动编译 ipk 文件的过程可以参考这里

MiniEAP

MiniEAP 是一个实现了标准 EAP-MD5-Challenge 算法的 EAP 客户端,支持通过插件来修改标准数据包以通过特殊服务端的认证。同时含有支持锐捷 v3 (v4) 算法的插件,可以用来进行锐捷认证

而在 OpenWrt 可以通过 Github 上的两个项目手动编译 .ipk 文件,然后 opkg install xxx.ipk 进行安装即可

补充:如果想要掉线自动重新认证,在配置文件中不要配置 no-auto-reauth,参考该 minieap@issue#43

防火墙

防火墙规则的详细配置可以参考 官方的介绍 以及部分 例子

开放端口

以开放 80 端口,用于外网直接访问 Web 界面为例:

  1. 首先要在 网络-防火墙-通信规则 点击新增,进行如下配置

    • 名称:可以随意设置
    • 协议:根据需要进行选择即可
    • 源区域:选择 WAN 表示是从外网进行访问
    • 源地址以及源端口:主要用于限制来访的设备,可以根据需要进行配置
    • 目标区域:选择 设备 代表这是一个入站的规则
    • 目标地址:因为是访问设备,此时不需要配置
    • 目标端口:Web 的默认端口是 80
    • 操作:开放端口,当然是选择接受
  2. 然后在 状态-防火墙 根据需要对 IPv4、IPv6 防火墙进行重启即可

如果这时外网还是不能访问 LuCI 的 Web 界面,可以尝试路由器重启,确认路由器的 IP 是否能够 ping 通,以及确认 80 端口有没有被运营商封禁

端口转发

以将 Windows 的远程连接的端口 3389 为例:

  1. 首先要在 网络-防火墙-端口转发 点击新增,进行如下配置

    • 名称:可以随意设置
    • 协议:根据需要进行选择即可
    • 源区域:选择 WAN 表示是从外网进行访问
    • 外部端口:这里配置成 13389
    • 目标区域:选择 LAN
    • 内部 IP 地址:配置成内网需要远程连接的主机
    • 内部端口:远程连接的默认端口是 3389
  2. 然后在 状态-防火墙 根据需要对 IPv4、IPv6 防火墙进行重启即可

后续就可以通过访问路由器 WAN_IP:13389 来远程连接内网的 Windows 主机了

IPv6

在校园网环境下发现 WAN 口默认能自动获取到 IPv6 地址(但是 /128 的地址),并且在路由器上测试也能正常访问 IPv6 网站,但是局域网内的设备不能正常访问 IPv6 网站,于是选择 NAT6 的方式来解决

参考 官网的 NAT6 文档,需要在路由器内依次进行如下配置:

  1. 安装 kmod-ipt-nat6 包

    # Install packages
    opkg update
    opkg install kmod-ipt-nat6
  2. 配置 IPv6 ULA 前缀,使得内网设备默认使用 IPv6

    # Using IPv6 by default
    NET_ULA="$(uci get network.globals.ula_prefix)"
    uci set network.globals.ula_prefix="d${NET_ULA:1}"
    # 默认 network.lan.ip6assign 配置可能有误,需要根据 ula_prefix 重新配置
    IP6_ASSIGN="$(echo ${NET_ULA} | grep -E '(\d+)$' -o)"
    uci set network.lan.ip6assign="${IP6_ASSIGN}"
    uci commit network
    /etc/init.d/network restart
  3. 配置默认 IPv6 路由

    # Announcing default IPv6 route
    uci set dhcp.lan.ra_default="1"
    uci commit dhcp
    /etc/init.d/odhcpd restart
  4. 配置防火墙

    # Configure firewall
    uci set $(uci show firewall | sed -n -e "/\.name='wan'$/s//.masq6='1'/p" | sed -n -e "1p")
    uci set $(uci show firewall | sed -n -e "/\.name='Allow-ICMPv6-Forward'$/s//.enabled='0'/p" | sed -n -e "1p")
    uci commit firewall
    # Configure firewall
    cat << "EOF" > /etc/firewall.nat6
    # NAT6 + masquerading firewall script
    # https://github.com/akatrevorjay/openwrt-masq6
    # trevorj <github@trevor.joynson.io>
    #
    # You can configure in /etc/config/firewall per zone:
    # * IPv4 masquerading
    # option masq 1
    # * IPv6 masquerading
    # option masq6 1
    # * IPv6 privacy extensions
    # option masq6_privacy 1 set -e -o pipefail . /lib/functions.sh
    . /lib/functions/network.sh
    . /usr/share/libubox/jshn.sh log() {
    logger -t nat6 -s "${@}"
    } get_ula_prefix() {
    uci get network.globals.ula_prefix
    } validate_ula_prefix() {
    local ula_prefix="${1}"
    if [ $(echo "${ula_prefix}" | grep -c -E -e "^([0-9a-fA-F]{4}):([0-9a-fA-F]{0,4}):") -ne 1 ] ; then
    log "Fatal error: IPv6 ULA ula_prefix=\"${ula_prefix}\" seems invalid. Please verify that a ula_prefix is set and valid."
    return 1
    fi
    } ip6t() {
    ip6tables "${@}"
    } ip6t_add() {
    if ! ip6t -C "${@}" &> /dev/null; then
    ip6t -I "${@}"
    fi
    } nat6_init() {
    iptables-save -t nat \
    | sed -e "
    /\sMASQUERADE$/d
    /\s[DS]NAT\s/d
    /\s--match-set\s\S*/s//\06/
    /,BROADCAST\s/s// /" \
    | ip6tables-restore -T nat
    } masq6_network() {
    # ${config} contains the ID of the current section
    local network_name="${1}" local device
    network_get_device device "${network_name}" || return 0 local done_net_dev
    for done_net_dev in ${DONE_NETWORK_DEVICES}; do
    if [ "${done_net_dev}" = "${device}" ]; then
    log "Already configured device=\"${device}\", so leaving as is."
    return 0
    fi
    done log "Found device=\"${device}\" for network_name=\"${network_name}\"." if [ "${zone_masq6_privacy}" -eq 1 ]; then
    log "Enabling IPv6 temporary addresses for device=\"${device}\"." log "Accepting router advertisements on ${device} even if forwarding is enabled (required for temporary addresses)"
    echo 2 > "/proc/sys/net/ipv6/conf/${device}/accept_ra" \
    || log "Error: Failed to change router advertisements accept policy on ${device} (required for temporary addresses)" log "Using temporary addresses for outgoing connections on interface ${device}"
    echo 2 > "/proc/sys/net/ipv6/conf/${device}/use_tempaddr" \
    || log "Error: Failed to enable temporary addresses for outgoing connections on interface ${device}"
    fi append DONE_NETWORK_DEVICES "${device}"
    } handle_zone() {
    # ${config} contains the ID of the current section
    local config="${1}" local zone_name
    config_get zone_name "${config}" name # Enable masquerading via NAT6
    local zone_masq6
    config_get_bool zone_masq6 "${config}" masq6 0 log "Firewall config=\"${config}\" zone=\"${zone_name}\" zone_masq6=\"${zone_masq6}\"." if [ "${zone_masq6}" -eq 0 ]; then
    return 0
    fi # IPv6 privacy extensions: Use temporary addrs for outgoing connections?
    local zone_masq6_privacy
    config_get_bool zone_masq6_privacy "${config}" masq6_privacy 1 log "Found firewall zone_name=\"${zone_name}\" with zone_masq6=\"${zone_masq6}\" zone_masq6_privacy=\"${zone_masq6_privacy}\"." log "Setting up masquerading nat6 for zone_name=\"${zone_name}\" with zone_masq6_privacy=\"${zone_masq6_privacy}\"" local ula_prefix="$(get_ula_prefix)"
    validate_ula_prefix "${ula_prefix}" || return 1 local postrouting_chain="zone_${zone_name}_postrouting"
    log "Ensuring ip6tables chain=\"${postrouting_chain}\" contains our MASQUERADE."
    ip6t_add "${postrouting_chain}" -t nat \
    -m comment --comment "!fw3" -j MASQUERADE local input_chain="zone_${zone_name}_input"
    log "Ensuring ip6tables chain=\"${input_chain}\" contains our permissive DNAT rule."
    ip6t_add "${input_chain}" -t filter -m conntrack --ctstate DNAT \
    -m comment --comment "!fw3: Accept port forwards" -j ACCEPT local forward_chain="zone_${zone_name}_forward"
    log "Ensuring ip6tables chain=\"${forward_chain}\" contains our permissive DNAT rule."
    ip6t_add "${forward_chain}" -t filter -m conntrack --ctstate DNAT \
    -m comment --comment "!fw3: Accept port forwards" -j ACCEPT local DONE_NETWORK_DEVICES=""
    config_list_foreach "${config}" network masq6_network log "Done setting up nat6 for zone=\"${zone_name}\" on devices: ${DONE_NETWORK_DEVICES}"
    } main() {
    nat6_init
    config_load firewall
    config_foreach handle_zone zone
    } main "${@}"
    EOF
    cat << "EOF" >> /etc/sysupgrade.conf
    /etc/firewall.nat6
    EOF

    经过此步骤后会生成一个 /etc/firewall.nat6 脚本,并且加入了 /etc/sysupgrade.conf,保证系统升级后也不会丢失该脚本

    # Configure firewall
    uci -q delete firewall.nat6
    uci set firewall.nat6="include"
    uci set firewall.nat6.path="/etc/firewall.nat6"
    uci set firewall.nat6.reload="1"
    uci commit firewall
    /etc/init.d/firewall restart
    # Configure firewall
    uci set firewall.@zone[1].masq6="1"
    uci set firewall.@zone[1].masq6_privacy="1"
    uci commit firewall
    /etc/init.d/firewall restart

USB

很多路由器有 USB 端口,通过插入 U 盘或者接入磁盘、SSD 等设备可以拓展存储空间,这样就可以安装更多的插件,或者搭建一个简单的 FTP、SMB 服务器用于共享数据

安装 USB 驱动

依次执行以下命令进行驱动基本包的安装

opkg update
opkg install kmod-usb-core
insmod usbcore
opkg install kmod-usb-storage

如果设备是 USB 2.0

opkg install kmod-usb2
insmod ehci-hcd

如果设备是 USB 3.0

opkg install kmod-usb3
insmod xhci-hcd

通常移动硬盘或者移动 SSD 还需要安装 UAS/UASP 支持

opkg install kmod-usb-storage-uas

然后热插拔存储设备,通常就能在 /dev 目录下看见 sda 设备了

自动挂载

  • 安装块设备工具包

    opkg install block-mount
  • 分区

    个人已经提前将存储设备划分了两个分区,一个分区较小(sda5)用于后续的 Extroot,剩余的空间(sda6)全用于存储个人数据

  • 创建文件系统

    推荐移动磁盘用 ext4 文件系统,而移动 SSD 推荐使用 f2fs 文件系统

    分区和创建文件系统可以参考 官网的指导

  • 配置挂载

    配置挂载可以通过直接在网页端的 系统-挂载点 进行手动配置,比较直观,如图所示:

    • 已启用:勾选
    • UUID:推荐使用 UUID 来进行挂载
    • 挂载点:也就是挂载的位置,通常在 /mnt 目录下新建一个文件夹

Extroot

有时候安装太多包会导致本地空间不足,此时可以通过将包安装在 USB 设备上,也可以通过 Extroot 的方式将 USB 设备的空间直接配置成 overlay 分区,后者更为推荐

  1. 修改 fstab,将原本挂载的 overlay 设备挂载到新的目录 /rwm

    DEVICE="$(sed -n -e "/\s\/overlay\s.*$/s///p" /etc/mtab)"
    uci -q delete fstab.rwm
    uci set fstab.rwm="mount"
    uci set fstab.rwm.device="${DEVICE}"
    uci set fstab.rwm.target="/rwm"
    uci commit fstab
  2. 修改 fstab,配置 USB 设备挂载成 overlay 分区

    其中部分部分操作在上节已经执行过,可以略去

    # 查看分区信息
    # block info # 确定分区并制作文件系统
    DEVICE="/dev/sda5"
    # mkfs.ext4 ${DEVICE} eval $(block info ${DEVICE} | grep -o -e "UUID=\S*")
    uci -q delete fstab.overlay
    uci set fstab.overlay="mount"
    uci set fstab.overlay.uuid="${UUID}"
    uci set fstab.overlay.target="/overlay"
    uci commit fstab
  3. 将原本 overlay 分区数据复制到 USB 设备上,重启设备

    mkdir -p /tmp/cproot
    mount --bind /overlay /tmp/cproot
    mount ${DEVICE} /mnt
    tar -C /tmp/cproot -cvf - . | tar -C /mnt -xf -
    umount /tmp/cproot /mnt
    reboot

FTP

配置好 USB 后,就可以配置 FTP 来共享 USB 设备

  1. 首先安装 vsftpd 包

    opkg install vsftpd
  2. 修改配置文件 /etc/vsftpd.conf,这里给出个人的配置,可以参考

    background=YES
    listen=YES
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    check_shell=NO
    #dirmessage_enable=YES
    #ftpd_banner=Welcome to MINI FTP service.
    session_support=NO
    #syslog_enable=YES
    #userlist_enable=YES
    #userlist_deny=NO
    #userlist_file=/etc/vsftpd/vsftpd.users
    #xferlog_enable=YES
    #xferlog_file=/var/log/vsftpd.log
    #xferlog_std_format=YES
    ###
    ### TLS/SSL options
    ### example key generation: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd_privkey.pem -out /etc
    #ssl_enable=YES
    #allow_anon_ssl=NO
    #force_local_data_ssl=NO
    #force_local_logins_ssl=NO
    #ssl_tlsv1=YES
    #ssl_sslv2=NO
    #ssl_sslv3=NO
    #rsa_cert_file=/etc/vsftpd/vsftpd_cert.pem
    #rsa_private_key_file=/etc/vsftpd/vsftpd_privkey.pem
    # 共享的目录位置
    local_root=/mnt/ext4
    pasv_enable=YES
    pasv_min_port=10090
    pasv_max_port=10100
  3. 然后参考之前的开放端口,打开 20、21、10090-10100 端口就可以在外网访问 FTP 服务器了

  4. 之后重启 vsftpd 服务即可使用

    /etc/init.d/vsftpd restart

P.S. 连接 ftp 服务器的账号密码就是路由器的 root 账号密码

SMB

使用 Samba 来共享的设备可以在 Windows 的文件资源管理器中挂载,使用起来和本地磁盘一样(在局域网内)

  1. 安装 samba4-server 以及 LuCI 管理界面

    opkg install samba4-server
    opkg install luci-app-samba4 luci-i18n-samba4-zh-cn
  2. 在网页端的 服务-网络共享 中进行配置,个人配置如下,可以参考

  3. 之后重启 samba4 服务即可使用

    /etc/init.d/samba4 restart

P.S. 连接 Samba 服务器的账号密码也是路由器的 root 账号密码

BT 下载

transmission 是一个轻量级跨平台的 BT 下载客户端

  1. 安装 transmission

    opkg install transmission-daemon
    opkg install transmission-cli
    opkg install transmission-web # web 界面,可选
    opkg install transmission-remote
    opkg install luci-app-transmission luci-i18n-transmission-zh-cn
  2. 直接修改 /etc/config/transmission,或者在网页端的 服务-Transmission 进行配置,下面给出个人配置,可以参考

    config transmission
    option config_overwrite '1'
    option mem_percentage '50'
    option nice '10'
    option alt_speed_enabled 'false'
    option alt_speed_time_enabled 'false'
    option bind_address_ipv4 '0.0.0.0'
    option bind_address_ipv6 '::'
    option blocklist_enabled 'false'
    option cache_size_mb '2'
    option dht_enabled 'true'
    option download_queue_enabled 'true'
    option download_queue_size '4'
    option encryption '1'
    option idle_seeding_limit_enabled 'false'
    option lazy_bitfield_enabled 'true'
    option lpd_enabled 'false'
    option message_level '1'
    option peer_limit_global '240'
    option peer_limit_per_torrent '60'
    option peer_port '51413'
    option peer_port_random_on_start 'false'
    option peer_socket_tos 'default'
    option pex_enabled 'true'
    option port_forwarding_enabled 'true'
    option preallocation '1'
    option queue_stalled_enabled 'true'
    option queue_stalled_minutes '30'
    option ratio_limit '2.0000'
    option rename_partial_files 'true'
    option rpc_bind_address '0.0.0.0'
    option rpc_enabled 'true'
    option rpc_host_whitelist_enabled 'false'
    option rpc_port '9091'
    option rpc_url '/transmission/'
    option rpc_whitelist_enabled 'false'
    option scrape_paused_torrents_enabled 'true'
    option script_torrent_done_enabled 'false'
    option seed_queue_enabled 'false'
    option speed_limit_down_enabled 'false'
    option speed_limit_up_enabled 'false'
    option start_added_torrents 'true'
    option umask '18'
    option utp_enabled 'true'
    option scrape_paused_torrents 'true'
    option watch_dir_enabled 'false'
    option enabled '1'
    option user 'root'
    option group 'root'
    option upload_slots_per_torrent '10'
    option download_dir '/mnt/ext4/transmission'
    option incomplete_dir_enabled 'true'
    option incomplete_dir '/mnt/ext4/transmission/incomplete'
    option trash_original_torrent_files 'true'
    option rpc_authentication_required 'true'
    option rpc_username 'rpc_username'
    option rpc_password 'rpc_password'
    option ratio_limit_enabled 'true'
    option config_dir '/etc/transmission'
  3. 之后重启 transmission 服务即可使用

    /etc/init.d/transmission restart

连接的账号密码为自行配置的 RPC 连接的账号密码

默认的 Web 界面 比较简陋,并且不能配置 tracker,个人推荐使用 transguiRPC 连接使用

如果需要远程访问,则需要将 rpc_port 配置的端口开放,具体流程参考 上文

参考资料

本文作者: ywang_wnlo

本文链接: https://ywang-wnlo.github.io/posts/51140c4a.html

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

【路由器】OpenWrt 配置使用的更多相关文章

  1. OpenWrt 20.02.2 小米路由器3G配置CP1025网络打印

    家里的施乐 CP116w 工作快五年了终于罢工了. 黑粉报错, 自己也不会拆, 只能搁置了. 后来换了个 HP CP1025. 这个打印机也不错, 墨盒便宜没什么废粉, 就是启动慢一点, 而且 -- ...

  2. 路由器OpenWrt如何脱机(离线)下载BT文件

    路由器OpenWrt如何脱机(离线)下载BT文件 1.首先到如下网址下载OpenWrt固件(确保为路由器正确型号). http://downloads.openwrt.org/snapshots/tr ...

  3. Cisco SG300系列交换机划分VLan与普通路由器连接配置

    思科SG300系列三层交换机是针对中小企业设计的一款产品,Marvell 主控和128M Ram,最大支持52个千兆RJ45端口和2个SFP端口,因公司业务需求,最近也进行了解和配置,具体型号为 SG ...

  4. 网络工程实训_2路由器基本配置及IOS介绍

    实验2:路由器基本配置及IOS介绍.包括:CLI的使用与IOS基本命令:配置文件的备份和IOS的备份:CDP协议. 一.实验目的 1.熟悉路由器CLI的各种模式: 2.熟悉路由器CLI的各种编辑命令: ...

  5. 新CCIE笔记-路由器的配置

    CCIE重修笔记之路由器基本配置与最简单的路由. 路由器与交换机的基本配置命令 全局配置模式下有多种子模式 (华为可以跳跃切换模式) 思科命令行技巧 Tab键补全,也可以直接保留缩写 问号'?'类似l ...

  6. HCNP学习笔记之史上最全华为路由器交换机配置命令大合集

    先来一张思科和华为命令的对照表: 史上最全华为路由器交换机配置命令大合集,熟练掌握下面的华为路由器交换机配置知识点,你只需花几分钟的时间就能明白华为路由器交换机配置.交换机的配置命令等等. 华为路由器 ...

  7. [转] Cisco路由器DNS配置

    禁用Web服务 Cisco路由器还在缺省情况下启用了Web服务,它是一个安全风险.如果你不打算使用它,最好将它关闭.举例如下: Router(config)# no ip http server 配置 ...

  8. CISCO实验记录一:路由器基本配置

    一.路由器基本配置要求 1.设置路由器名为:hehe 2.设置特权模式下password为ccna,secret为ccnp,vty线路密码为ccie 3.所有明文密码都加密 二.路由器基本配置命令 1 ...

  9. Cisco 三层交换机划分VLan与普通路由器连接配置

    根据一些中小企业的一些业务需求,设计一套方案: 计划目标:针对不同部门划分不同的VLAN,前期满足能够同时上网的需求,后期需要能够隔离不同部门的资源访问(本次配置操作不涉及). 因之前未接触CISCO ...

  10. 实验1: Cisco路由器基础配置

    实验 1:  Cisco路由器基础配置 1.    路由器的运行模式:Router>    用户模式,通常用来查看统计信息,但不能修改路由器的设置.Router#    特许模式,可以查看并修改 ...

随机推荐

  1. 2021-09-07:单词接龙 II。按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -

    2021-09-07:单词接龙 II.按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s ...

  2. Sentinel基本使用与源码分析

    系列文章目录和关于我 一丶什么是Sentinel Sentinel官网 Sentinel 是面向分布式.多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由.流量控制.流量整形.熔断降级 ...

  3. TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案

    作者:vivo 互联网服务器团队- Ye Feng 本文介绍了 Intel QAT 技术方案,通过Multi-Buffer技术和QAT硬件加速卡的两种方式实现对TLS的加速 一.背景 当前 TLS 已 ...

  4. L2-035 完全二叉树的层序遍历

    题目描述: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树.对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就 ...

  5. drf——权限、认证源码分析、过滤、排序、分页

    权限.认证源码(了解) 权限源码 # 继承了APIView才有的--->执行流程--->dispatch中的三大认证 self.initial(request, *args, **kwar ...

  6. 《HelloGitHub》第 86 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  7. Health Kit文档大变样,一起尝鲜!

    Health Kit文档全新升级,开发场景更清晰,聚焦你关心的问题,快来一起尝鲜! 文档入口请戳:文档入口~ 如果你是运动健康的老朋友,可以从旧文档页面上方的提示信息中进入:最新版本哦. 一. 架构调 ...

  8. Spectre.Console-处理依赖注入

    引言 之前说的做自动记录 Todo 执行过程中消耗的时间的Todo 项目,由于想持续保持程序执行,就放弃了 Spectre.Console.Cli,后来随着命令越来越多,自己处理觉得很是麻烦,想了想要 ...

  9. Python 中常见的 TypeError 是什么?

    翻译:BioIT 爱好者原文:TypeError: A Bytes-Like object Is Required, not 'str' | Finxter 简介 目标:在本教程中,我们的目标是修复以 ...

  10. 重新温习git

    在本地文件夹创建项目,使用git bash here,然后使用git clone[url]命令克隆,提示权限不足, 这是需要ssh重置了 1.删除原有.ssh文件下的known_hosts 2.设置用 ...