亮的MARK库

mark.liangliang.org.cn

Nginx环境搭建h5ai DPlayer版详细教程

介绍

h5ai可以把对应目录下的文件和文件夹全部显示在web页面上,只需点击即可下载对应的资料

h5ai需要php5.5版本以上环境,可在apache、nginx环境下运行,这里还是直接用宝塔安装就OK

h5ai DPlayer版:支持视频切片播放,拉动进度条再也不用一直等~等等等

支持登录验证,自行设置用户名和密码,也可以取消验证登录

下载h5ai_dplayer:点击下载

Github:https://github.com/Pearlulu/h5ai_dplayer_hls/releases

方法:

宝塔后台添加站点,用你自己的域名或IP都可以:

站点添加完成后将根目录下所有文件删除,并上传解压后的 _h5ai 文件夹

然后修改 宝塔后台 - 网站 - 设置 - 默认文档,全部删除替换成下面的代码然后点击添加:

index
index.html
index.php
/_h5ai/public/index.php

OK,完成,搭建其实很简单,现在打开域名即可使用账户密码登录

默认用户名:admin

默认密码:admin

如果要取消登录验证就将 _h5ai / public / index.php 里第二行 include ‘login.php’ 删除即可

如果要修改用户名和密码在 _h5ai / public / login.php

上传或下载文件到网站根目录就可以在 web 页面显示出来,也可以建立新的文件夹

如果打开网页出现以下错误:

Warning: putenv() has been disabled for security reasons in

原因:禁用了部分存在危险的PHP函数

解决方法:

打开PHP配置文件:找到disable_functions字符串,将后面的putenv删除,然后重启PHP即可;

一、添加docker容器端口映射

以tomcat容器为例:

root@localhost /]# docker run --name mytomcat -d -p 8888:8080 tomcat

–name:创建的tomcat镜像名称 ‐d:后台运行 ‐p:将主机的端口映射到容器的一个端口,8888:8080代表:主机端口:容器内部的端口

执行完会返回新创建的tomcat镜像ID

二、修改docker容器端口映射

方法一

  • 1、查看tomcat镜像ID(docker ps)
root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
bf96392335e8        tomcat              "catalina.sh run"   5 minutes ago       Up 5 minutes        0.0.0.0:8888->8080/tcp   mytomcat
  • 2、停止容器(docker stop 镜像ID)
[root@localhost /]# docker stop bf96392335e8
  • 3、停止docker服务(systemctl stop docker)
[root@localhost /]# systemctl stop docker
  • 4、修改此容器的hostconfig.json文件中的映射端口,若config.v2.json里面也记录了端口,也要修改。
[root@localhost /]# cd /var/lib/docker/containers/bf96392335e8*
[root@localhost bf96392335e88f3a0825aaec15bdd23100e642e899b6c34f9d2c33299178c464]# vi hostconfig.json

hostcongfig.json:

{"Binds":null,"ContainerIDFile":"","LogConfig":{"Type":"journald","Config":{}},"NetworkMode":"default","PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"8888"}]},"RestartPolicy":{"Name":"no","Ma
ximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"","Cgro
up":"","Links":[],"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":67108864,"Runtime":"docker
-runc","ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":null,"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"Blki
oDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DiskQuota":0,"KernelMemory":0
,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":-1,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0}

其中:“PortBindings”:{“8080/tcp”:[{“HostIp”:””,“HostPort”:“8888”}]}代表端口映射配置,修改HostPort项的值后保存退出。

  • 5、启动docker(systemctl start docker)
[root@localhost /]# systemctl start docker
  • 6、启动tomcat镜像(docker start 镜像ID)
[root@localhost /]# docker start bf96392335e8

方法二

  • 1、获得容器IP 将container_name 换成实际环境中的容器名
docker inspect `container_name`  grep IPAddress
  • 2、iptable转发端口 将宿主机的8888端口映射到IP为192.168.1.15容器的8080端口
iptables -t nat -A  DOCKER -p tcp --dport 8888 -j DNAT --to-destination 192.168.1.15:8080

Docker容器iptables访问控制

容器的访问控制,主要通过 Linux 上的 iptables 防火墙来进行管理和实现。iptables 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。

容器访问外部网络

容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。

$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

如果为 0,说明没有开启转发,则需要手动打开。

$sysctl -w net.ipv4.ip_forward=1

如果在启动 Docker 服务的时候设定 --ip-forward=true, Docker 就会自动设定系统的 ip_forward 参数为 1。

容器之间访问

容器之间相互访问,需要两方面的支持。

  • 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 docker0 网桥上。
  • 本地系统的防火墙软件 – iptables 是否允许通过。

访问所有端口

当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 链上。策略为通过(ACCEPT)还是禁止(DROP)取决于配置--icc=true(缺省值)还是 --icc=false。当然,如果手动指定 --iptables=false 则不会添加 iptables 规则。

可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 /etc/default/docker 文件中配置 DOCKER_OPTS=--icc=false 来禁止它。

也可以通过修改/usr/lib/systemd/system/docker.service

#需要修改/usr/lib/systemd/system/docker.service
vi /usr/lib/systemd/system/docker.service

#找到 ExecStart=/usr/bin/dockerd -H fd://xxxxx 在中间添加 --iptables=false
修改之后 :
ExecStart=/usr/bin/dockerd --iptables=false -H fd://xxxxxx

:wq 保存退出

#然后
systemctl daemon-reload
systemctl restart docker

ssh-keygen用来生成ssh公钥认证所需的公钥和私钥文件。

ssh秘钥登录特点:1.安全;2.免输密码。 对于安全级别较高的服务器,建议配好ssh登录后禁掉密码登录。 缺点:略繁琐。如果你的只是临时登录一次,那么还是密码吧。

一、生成秘钥

秘钥对需要在你自己的机器上生成,然后把公钥放到服务器相应用户的~/.ssh目录

执行下面命令,默认生成位置是~/.ssh

ssh-keygen

系统会询问你文件名和秘钥密码,可以一路回车过去,会生成两个文件:

  • id_rsa 私钥
  • id_rsa.pub 公钥

默认使用rsa算法,你也可以用比较详细的指令,如

ssh-keygen -t rsa -b 1024 -f yourkeyname -C "备注"

参数

解释

-b

采用长度1024bit的密钥对,b=bits,最长4096,不过没啥必要

-t rsa

采用rsa加密方式,t=type

-f

生成文件名,f=output_keyfiles

-C

备注,C=comment

更多参数可运行 man ssh-keygen

二、在服务器上安装秘钥

把上一步生成的公钥发送到服务器(scp,FillZilla等)上,然后在服务器上执行下面命令

cat id_rsa.pub >> ~/.ssh/authorized_keys

如此便完成了公钥安装,有个小坑值得一提:authenrized_keys的权限必须是600或更小,否则会连接失败。 保险起见,执行下面命令

chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

另外,.ssh目录的owner必须是ssh登录用户,不能是root

服务器ssh配置

修改服务器上的ssh配置文件,位置:/etc/ssh/sshd_config

RSAAuthentication yes
PubkeyAuthentication yes

PermitRootLogin no //禁止root登录
PasswordAuthentication yes //允许密码登录,根据你的情况设置

然后重启ssh服务

service sshd restart

三、连接服务器

方法1: 直接ssh
ssh -i ~/.ssh/id_rsa -p 22 user@yourservername
方法2(推荐):修改~/.ssh/config
Host server_alias(你的服务器别名)
HostName test.com/192.168.1.1(域名或IP)
Port 22
User user
Identifier id_rsa

保存后,登录时只需执行

ssh server_alias

多个服务器另起一行续写就行了,就是这么简单!

情景

docker 默认情况下会同时将端口映射于 IPv4 与 IPv6 两者上。 而且有的时候会出现只绑定到了 IPv6,导致服务无法正常访问的情况。

该问题的详细讨论参见这里 Port redirecting binding to IPv6 but not IPv4 interfaces.

image

现在通用的始终还是 IPv4, 因此最简单的做法就是关闭 IPv6.

解决方法 (CentOS / RHEL 7/Debian10.6)

1. 在 /etc/sysctl.conf 上加入以下设置, 此方法不需要重启

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

然后执行 sysctl -p 使其生效

注意:

如果你正在使用 SSH 的 X11 Forwarding 的, 要记得启用下面的配置。 在 /etc/ssh/sshd_config 中,找到 AddressFamily, 设置为

AddressFamily inet

重启 sshd 服务,systemctl restart sshdhttps://github.com/lanlin/notes/issues/80#issuecomment-589460035)

2. 如果第一种方法无效,那么先删除上面的设置,再修改引导文件

打开 /etc/default/grub, 找到 GRUB_CMDLINE_LINUX="..." 或者有的叫做 GRUB_CMDLINE_LINUX_DEFAULT="..."

GRUB_CMDLINE_LINUX="ipv6.disable=1  ..."
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1  ..."

ipv6.disable=1 加入到最前面,注意与后面的其他值空格隔开。

执行 grub2-mkconfig -o /boot/grub2/grub.cfg 该命令会重新生成一个引导文件,覆盖掉现有的文件。

然后重启系统

3. 最后检测是否已关闭 IPv6

现在重新开启 docker 容器等,查看相关端口是否正确绑定到 IPv4 上了

// 查看是否仍有 IPv6 相关地址信息
ip addr show  grep net6

// 查看端口监听是否均为 IPv4
netstat -tapn

4. 如果上述方法仍然无效,检测 IPv4 的转发

说明:

为了使LVS路由器正确地将网络数据包转发到真实服务器, 每个LVS路由器节点必须在内核中启用IP转发。

执行 /sbin/sysctl net.ipv4.ip_forward,如果得到以下结果,说明需要修改

net.ipv4.ip_forward = 0

打开 /etc/sysctl.conf,添加以下代码

net.ipv4.ip_forward = 1

保存后执行 sysctl -p 使其生效

再次执行 /sbin/sysctl net.ipv4.ip_forward 查看结果,如果由 0 变为 1 则生效了。

最后执行 3 中的方法加以检验。

Sddm欢迎界面用户显示控制

Debian10环境

一个或多个用户没有出现在欢迎界面 警告: 用户设置过低或过高的 UID 范围应该大体上不会暴露给 Display manager (简体中文)。 SDDM 默认会显示 UID 在 1000 到 65000 范围内的用户,如果想要显示的用户的 UID 小于这个范围,那么您就不得不更改这个范围。比如,对于 UID 为 501时,可以修改:

/etc/sddm.conf
[Users]
HideShells=/sbin/nologin,/bin/false
# Hidden users, this is if any system users fall within your range, see /etc/passwd on your system.
HideUsers=git,sddm,systemd-journal-remote,systemd-journal-upload

# Maximum user id for displayed users
MaximumUid=65000

# Minimum user id for displayed users
MinimumUid=500 #My UID is 501

用Debian安装Arch

第三版 www.liangliang.org.cn

盗梦空间,第一层构建安装环境,音乐、上网、QQ、两不误,还有各种GUI工具,随时打开教程,粘贴复制,看看小姐姐啊!你想干啥干啥……

image-20200302144745593

第一层中构建分区

EFI fat16 200mb 标记 esp EFI
/  自己掌握大小 ext4
swap 可以不用单独建立和debian共用即可。
gparted 和GNOME磁盘管理工具(小鸟们请访问https://wiki.gnome.org/Apps/Disks使用说明)

下载:

archlinux-bootstrapxxx
http://mirrors.163.com/archlinux/iso/

构建第二层(构建安装环境)

tar zxvf  archlinux-bootstrap*  -C /tmp

cp /etc/resolv.conf /tmp/root.x86_64/etc
mount --rbind /proc /tmp/root.x86_64/proc
mount --rbind /sys /tmp/root.x86_64/sys
mount --rbind /dev /tmp/root.x86_64/dev
mount --rbind /run /tmp/root.x86_64/run

image-20200302144656086

进入第二层:

chroot /tmp/root.x86_64/

在第二层中构建第三层安装目标和BASE

mount / :

mount /dev/sdx /mnt

moount efi:

mkdir /mnt/boot
mkdir /mnt/boot/grub
mkdir /mnt/boot/grub/efi

mount /dev/sdx1 /mnt/boot/grub/efi

第二层中构建arch启动

第二层梦境构建:

echo 'Server = http://mirrors.163.com/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist

echo '' >> /etc/pacman.conf
echo '[archlinuxcn]' >> /etc/pacman.conf
echo 'SigLevel = Optional TrustedOnly' >> /etc/pacman.conf
echo 'Server = http://mirrors.163.com/archlinux-cn/$arch' >> /etc/pacman.conf
网络不用配了,因为你有debian的网桥
rm /root/.gnupg/ -Rf
pacman-key --init
pacman-key --populate archlinux

--------------------------------
pacman -Syu archlinuxcn-keyring
--------------------------------
如果网络环境实在不好,请使用archlinuxcn的key,要想刷新key请pacman-key --refresh-keys

image-20200302144512937

pacstrap /mnt base base-devel linux linux-firmware dhcpcd

image-20200302144434224

genfstab -L /mnt >> /mnt/etc/fstab
提示,debian下你可能有不少mount别忘了去/mnt/etc/fstab精简一下!
vim /mnt/etc/fstab

进入第三层

cp /etc/resolv.conf /mnt/etc
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --rbind /dev /mnt/dev
mount --rbind /run /mnt/run
chroot /mnt

构建第三层系统:

有可能archlinux-cn源有问题,先用官方的吧跳过这个第三层网络:

echo 'Server = http://mirrors.163.com/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist

echo '' >> /etc/pacman.conf
echo '[archlinuxcn]' >> /etc/pacman.conf
echo 'SigLevel = Optional TrustedOnly' >> /etc/pacman.conf
echo 'Server = http://mirrors.163.com/archlinux-cn/$arch' >> /etc/pacman.conf
rm /root/.gnupg/ -Rf
pacman-key --init
pacman-key --populate archlinux

pacman安装系统组件:

直接奔入主题吧

pacman -Su  vim vi  dialog wpa_supplicant ntfs-3g networkmanager grub efibootmgr os-prober udev netctl

构建启动

grub-install --target=x86_64-efi --efi-directory=/boot/grub/efi --bootloader-id=grub
grub-mkconfig -o /boot/grub/grub.cfg

image-20200302144345564

mkinitcpio -p linux

用户管理

passwd root
useradd -m -G wheel youname
passwd youname

image-20200302144851049

有人问了,什么字体,时间,乱七八糟啊!
....有必要吗?安装完了你自己想怎么就怎么办,先把梦中的小姐姐带回家最终要。
这里就可以reboot了。
    exit 第三层
        exit 第二层
            reboot 第一层

我的无线网卡驱动:

pacman -S broadcom-wl-dkms linux-headers

我的无线网卡broadcom-wl-dkms,需要linux-headers,所以必须告别chroot

Microcode

pacman -S intel-ucode

处理器制造商发布对处理器微码的稳定性和安全性更新。虽然微码可以通过BIOS进行更新,但Linux内核也可以在引导期间应用这些更新。这些更新提供了对系统稳定性至关重要的错误修复。如果没有这些更新,您可能会遇到虚假崩溃或难以跟踪的意外系统暂停。

AMD 处理器,安装  amd-ucode
Intel 处理器,安装   intel-ucode

杂项放这里

为了减少时间消耗,可以在回到Debian,听歌看片。 继续mount后chroot。

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc
echo zh_CN.UTF-8 UTF-8 >> /etc/locale.gen

echo en_US.UTF-8 UTF-8 >> /etc/locale.gen

locale-gen

echo LANG=en_US.UTF-8 >> /etc/locale.conf

 echo arch > /etc/hostname
 echo 127.0.0.1 localhost >> /etc/hosts
 echo ::1 localhost >> /etc/hosts
 echo 127.0.1.1 arch.localdomain    arch >> /etc/hosts

想要GUI的继续Pacman

arch21

开启multilib

vim /etc/pacman.conf

#[multilib]
#Include = /etc/pacman.d/mirrorlist

修改为

[multilib]
Include = /etc/pacman.d/mirrorlist

而后

pacman -Syu

intel显卡

pacman -Su xf86-video-intel

xface4

pacman -S xorg
pacman -S xfce4 xfce4-goodies

KDE

pacman -S plasma kde-applications

Gnome

pacman -Su sddm gnome gnome-extra gnome-tweak-tool

SDDM

pacman -S sddm

关于Systemd的基本启动设置

systemctl disable netctl
systemctl enable NetworkManager
systemctl enable sddm
systemctl set-default graphical.target

终端字体

pacman -S terminus-font
setfont /usr/share/kbd/consolefonts/ter-132b

终端字体设置为32号terminus blod

持久化设置

创建或打开/etc/vconsole.conf文件,然后把FONT的值设为ter-132b。
FONT=ter-132b
引导的时候,使用这个FONT值为所有虚拟终端设置字体

关于本地化和软件

pacman -S yay
yay -S wqy-microhei wqy-zenhei ttf-ubuntu-font-family noto-fonts noto-fonts-cjk noto-fonts-emoji adobe-source-han-sans-otc-fonts
Google Noto Fonts 系列: noto-fonts noto-fonts-cjk noto-fonts-emoji
思源黑体:adobe-source-han-sans-otc-fonts
文泉驿:wqy-microhei wqy-zenhei
ubuntu系列:ttf-ubuntu-font-family
yay -S google-chrome wps-office ttf-wps-fonts 
yay -S wps-office-mui-zh-cn
yay -Ss ........(缺啥补啥)
-----------------------------------------------------
simplenote-electron-bin
tenvideo
netease-cloud-music
typora
filezilla
vlc 
visual-studio-code-bin

安装输入法

  不推荐使用搜狗输入法,因为fcitx的框架下,偶尔会出现丢字的现象,也就是说你打字快了,就会丢失一些按键。
推荐使用ibus框架并使用Rime的明月简体输入法,环节很多^_^,而且Gnome早已经将默认IM改为ibus了。

推荐Rime 输入方案

选用适合自己的输入法。
来折腾Rime 的同学,我只能说,您对输入法的追求比较与众不同啦!
当然,因为您理想中的输入方式千奇百怪、也许从没有人那样玩过,所以不可能在那种勾勾选选的介面上做得出来;需要亲手来创作——Rime 输入方案!Rime 不是一种输入法。是从各种常见键盘输入法中提炼出来的抽象的输入算法框架。

因为Rime 涵盖了大多数输入法的「共性」,所以在不同的设定下,Rime可化身为不同的输入法用来打字。

Rime 输入方案

Rime 是跨平台的输入法软件,Rime 输入方案可通用于以下发行版:
  - 【中州韵】 ibus-rime → Linux
  - 【小狼毫】 Weasel → Windows
  - 【鼠须管】 Squirrel → Mac OS X

取得适合你系统的最新版Rime 输入法,印一份《指南书》,准备开工了!

https://rime.im/

Rime安装和配置

yay -S ibus-rime
yay -S rime-data (扩展字库)

安装东风破(config工具)

curl -fsSL https://git.io/rime-install  bash -s -- :preset

安装明月输入方案

bash plum/rime-install luna-pinyin

配置rimi输入法启用明月输入方案:

vim ~/.config/ibus/rime/default.custom.yaml
chema_list:
#   - schema: luna_pinyin
    - schema: luna_pinyin_simp
#  将其他不需要的也全部注释/删除掉 
-----------------------------
配置字库方案等:
https://github.com/Bambooin/rimerc

外观配置

https://github.com/rime/home/wiki/UserGuide

谷歌拼音

pacman -S ibus-googlepinyin
echo export GTK_IM_MODULE=ibus  >> /home/liang/.xprofile.ibus
echo export XMODIFIERS="@im=ibus"  >>  /home/liang/.xprofile.ibus
echo export QT_IM_MODULE=ibus >> /home/liang/.xprofile.ibus
echo ibus-daemon --xim -d >> /home/liang/.xprofile.ibus

搜狗输入法

也许有人习惯了,搜狗输入法,还是写在这里了。有的QT环境还需要fcitx
pacman -S fcitx fcitx-im fcitx-configtool
pacman -S fcitx-sogoupinyin
pacman -S fcitx-configtool
yay -Ss fcitx-sogoupinyin

有个包archlinuxcn天然缺少,自己找一下补上吧。
yaourt -S fcitx-qt4  我帮你找了

echo export GTK_IM_MODULE=fcitx >> /home/liang/.xprofile.fcitx
echo export QT_IM_MODULE=fcitx >>  /home/liang/.xprofile.fcitx
echo export XMODIFIERS="@im=fcitx" >> /home/liang/.xprofile.fcitx

推荐默认输入法IBUS框架

cp .xprofile.ibus .xprofile

bash-completion

想要自动补全的话需要安装 bash-completion
pacman -S bash-completion

zsh + oh-my-zsh

yay -S zsh
chsh -s /bin/zsh
yay -S oh-my-zsh-git
cp /usr/share/oh-my-zsh/zshrc ~/.zshrc

回到现实的ArchLinux

exit 第三层
exit 第二层
reboot第一层
回来吧,孩子,带回梦中的姐姐了,touch开始了.....

image-20200302144952693

有点到到梦空间的感觉吧。

补充设置:

Bluetooth

启用a2dp支持,air耳机
pacman -Ss a2dp
pacman -S pulseaudio-modules-bt

systemctl start bluetooth.service
systemctl enable bluetooth.service

systemctl start ModemManager.service
systemctl enable ModemManager.service

Network-Manager

yay -S 
networkmanager-l2tp
networkmanager-openvpn
networkmanager-pptp
networkmanager-dispatcher-sshd

推荐应用:

pacman GUI Apper

pacman -S apper

pcurses TUI pacman

pacman -s pcurses

image-20200306150230771

virtualbox

QQ,微信,迅雷用VirtualBox

pacman -S virtualbox

Wine模拟效率不高,而且不会完善,用Virtualbox也是虚拟化,但是效率和Wine比稍逊而已,如果你开启很多的应用Wine效率就差的很多了,还不如直接用VirtualBox,而且搞个xp。效率就飘起来了,再利用无缝窗口模式,就爽歪歪了。

image-20200306125617043

你想要Windows的应用去装就好了,然后安装box的扩展,做好双向粘贴,做个共享文件夹。

KDE抓图软件:

yay -S flameshot   去KDE设置一下快捷键,推荐flameshot
pacman -S spectacle 有BUG

image-20200306142729573

image-20200306142756992

设置ctl+alt+a快捷键,设置抓图模式,如上图。冲突按键在设置中kwin,自己找找吧。

spotify在线音乐平台

yay -S  spotify

telegram

pacman -S telegram-desktop

Linux-steam

yay -S linux-steam-integration
zeal 
htop
cmatrix
zsh
moc(终端里的音乐播放器,当然也是超轻量级)  
bc(计算器) 
wireshark-qt nmap  
uGet 
deluge
transmission
vscode
ulauncher
.........

常用程序列表

https://wiki.archlinux.org/index.php/List_of_Applications_(简体中文)

………

滚动之前

安装TimeShift

pacman -S timeshift
设置好timeshit

滚动吧,少年郎

yay -Syu

image-20200306152730555

image-20200307215630822

一篮子的BUG

KDE各种 BUG

kwin_x11**[****11807****]**: **qt.qpa.xcb**: QXcbConnection: XCB **error**: 9 (BadDrawable), sequence: 25149, resource id: 46188693

KDE日志报错,由于默认的QT记录规则,大量的KDEo爆粗信息在后台涌现。您可以对QT维护人员抱怨,但他们不会听的。
这些日志会降低KDE的速度,占用i日志空间,除非您是KDE开发人员,否则完全无用。

通过环境变量来控制:
-------------------
#QT_LOGGING_RULES=’*=false’
QT_LOGGING_RULES='*=false'
export QT_LOGGING_RULES
-------------------
或
-------------------
#QT_LOGGING_RULES=’*.debug=false’
QT_LOGGING_RULES='*.debug=false'
export QT_LOGGING_RULES
-------------------

上面的命令会杀死调试消息,从而在日志中留下大量垃圾。

/usr/bin/startkde(可能不推荐)
/etc/profile(每个人)
~/.bash_profile(特定用户)

 选一个吧.另外说明一下:
通过禁用Qt警告,我们可以过滤掉它们,但是这也会从Qt过滤掉合法警告。因此,量力而行吧。
详情见开发者回复
 https://bugs.kde.org/show_bug.cgi?id=390403

 QQuickItem::stackAfter: Cannot stack
 KDE bug 好多啊
 https://bugreports.qt.io/browse/QTBUG-26536

 QFileSystemWatcher::removePaths: list is empty
  KDE bug 好多啊
 https://github.com/linuxdeepin/developer-center/issues/860

spectacle

存储和快捷键bug,暂无头绪。可用前面的flameshot替代。

简介

SSH (OpenSSH) 提供到远程主机的安全加密连接。如果用户有有效的 AIX® 帐户,就可以通过 SSH 连接。但是,对于任何关注安全性的系统来说,很可能需要限制某些用户或主机通过 SSH 连接指定的系统。SSH 提供两种限制用户访问的机制:Deny 和 Allow 属性。这些关键词基于用户和组列表。还可以使用 TCP Wrappers 阻止来自已知或未知主机的 SSH 连接。我建议使用 TCP Wrappers 按主机名/域或 IP 阻止主机,并且使用 sshd_config 实现基于用户/组的访问控制。

根据安装的 SSH 变体不同,可以在两个地方找到配置文件和 SSH 守护进程。对于 AIX OpenSSH,配置文件在 /etc/ssh 中,SSH (sshd) 守护进程在 /usr/sbin/sshd 文件中。

对于其他 OpenSSH 类型,配置文件通常在 /usr/local/etc 中,SSH (sshd) 守护进程在 /usr/local/sbin/sshd 中。

用 TCP Wrappers 限制 SSH

TCP Wrappers 用于阻止或允许从 inetd 启动的基于 TCP 的应用程序,比如 telnetFTP 服务。根据规则,SSH 不从 inetd 启动。如果希望通过 TCP Wrappers 控制 SSH 访问,就需要把 libwrap.a 复制到 LIBPATH 指向的目录中(对于第三方应用程序,这个目录是 /usr/local/lib)。TCP Wrappers 守护进程是 tcpd

查看 /var/adm/messages 文件,可能会找到 SSH 连接尝试。这些可能是来自您的网络中本地机器的完全无恶意的连接尝试,也可能是来自未知主机的强力连接尝试。应该进一步研究这些条目。如果发现有非法访问尝试,就应该阻止它们。尽管可以使用 sshd_config 文件阻止主机,但是我建议使用 TCP Wrappers 阻止主机,因为这是阻止到达的 TCP 连接的主要机制。

TCP Wrappers (tcpd) 通过读取两个文件决定应该允许还是拒绝到达的 TCP 连接。这两个文件是:

/etc/hosts.allow
/etc/hosts.deny

对这两个文件的修改是动态的。这两个文件中的模式匹配规则控制拒绝或允许什么。这些规则既可以很复杂,也可以很简单。首先搜索 hosts.allow。如果找到匹配的模式,就允许连接,或者更准确地说,tcpd 死亡,让真正提供服务的守护进程接管。然后在 hosts.deny 中搜索匹配的模式。如果找到匹配,tcpd 就拒绝此连接访问系统。简单地说,这意味着先应用 hosts.allow 规则,然后应用 hosts.deny 规则。一般的做法是先允许您信任的主机,然后拒绝所有其他主机。

现在,我们通过一些示例了解 TCP Wrappers 如何控制对主机的 SSH 访问。假设我们属于 drwho.com 域,希望只允许属于这个域的用户通过 SSH 连接。可以使用以下规则来实现:

# cat hosts.allow
sshd : .drwho.com

# cat hosts.deny
ALL : ALL

为了进一步细化前面的示例,我们仍然允许来自 drwho.com 域的所有连接,同时也允许以下 IP 地址范围 172.24.11., 172.24.12.(IP 地址末尾的点号表示要匹配点号后面的任何内容)。注意,在下面的示例中,每个模式由逗号分隔。

# cat hosts.allow
sshd: .drwho.com , 172.24.11. , 172.24.12.

有时候,希望允许域中的所有主机,但是某些主机除外。例如,一个系统是生产系统,不希望允许从开发系统连接它。下面的规则允许前面示例中允许的所有主机,但是以下主机除外:dev01dev02

# cat hosts.allow
sshd: .drwho.com , 172.24.11. , 172.24.12. , EXCEPT dev01, dev02

还可以在 hosts.allowhosts.deny 文件中使用 username@hostname 格式。例如:

dxtans@dev01

可能必须提供 FQDN(完全限定的域名)。为了查明这一点,在消息文件中查看 TCP Wrappers 如何解析主机名,然后相应地修改 hosts.allow 文件。

对于 username@host 格式,我喜欢用 sshd_config 文件控制访问。这是因为这样就可以使用 TCP Wrappers 只为 telnetFTP 等基于 TCP 的服务进行主机身份验证,只用 ssh_config 文件为 SSH 进行用户/组身份验证。从系统管理员的角度来看,这样更容易管理主机和用户访问控制。

要想通过 syslog 把连接记录在 /var/adm/messages 中,在 /etc/syslogd.conf 中必须有以下条目之一:

*.info /var/adm/messages

*.auth /var/adm/messages

必须重新启动 syslogd,修改才能生效:

# refresh -s syslogd

在消息文件中,成功连接的典型条目(在这里,用户 dxtans 来自属于 drwho.com 域的主机 tardis)如下:

May 25 19:04:46 rs6000 authsecurity:info sshd[245928]: Accepted password for dx``tans from tardis port 49371 ssh2

由于应用了 hosts.allow 文件中的规则,来自主机 dev01 的用户的连接尝试被拒绝,其消息如下:

May 25 19:11:12 rs6000 authsecurity:info sshd[270484]: refused connect from dev01

用 sshd_config 限制连接

sshd_config 中,有四个条目:

AllowUsers
AllowGroups
DenyUsers
DenyGroups

如果没有这些关键词,只需根据需要创建它们。必须只创建您需要的关键词,以免出现不可靠的结果。AllowUsers 和 DenyUsers 列表是由空格分隔的有效用户名,AllowGroups 和 DenyGroups 只能是现有的有效组。按以下次序匹配模式:DenyUsers,AllowUsers,DenyGroups,AllowGroups

sshd_config 文件的任何修改要到重新启动 sshd 之后才会生效,如下所示:

# stopsrc -s sshd
# startsrc -s sshd

如果在 AllowUsers 列表中设置用户 ID,那么只有这些用户可以通过 SSH 连接。对于 DenyUsers 列表也是如此,只拒绝 DenyUsers 列表中包含的用户访问。同样的规则也适用于组列表。如果同时使用允许列表和拒绝列表,就非常让人迷惑,所以不要这样做。应该根据自己的安全需求,只使用允许列表或拒绝列表之一。

如果用户在系统上有帐户,但是在 AllowUsers 列表中没有他们的用户 ID,就拒绝他们访问。同样的规则也适用于 DenyUsers 列表。现在来看一个示例,假设 AllowUsers 列表包含以下内容:

AllowUsers bravo charlie mother oscar delta echoa hotel juliet papa ukflag

如果用户 alpha 尝试通过 SSH 访问,那么该访问会遭到拒绝,因为这个用户名没有出现在 AllowUsers 列表中。

login as: alpha
alpha@rs6000's password:
Access denied
alpha@rs6000's password:
Access denied
alpha@rs6000's password:

通过查看 /var/adm/messages 文件确认这一点,这里的消息表明在 AllowUsers 列表中没有列出用户 alpha。

Jun 22 18:43:41 rs6000 authsecurity:info sshd[270552]: User alpha from tardis 
not allowed because not listed in AllowUsers
Jun 22 18:43:41 rs6000 authsecurity:info sshd[270552]: Failed none for invalid
user alpha from tardis port 49617 ssh2

现在看看 DenyUsers 列表,假设这个列表包含以下内容:

DenyUsers bravo charlie mother oscar delta echoa hotel juliet papa ukflag

现在,只要用户在系统上有帐户,而且其用户名没有在 DenyUsers 列表中列出,就允许他们通过 SSH 访问。

如果用户 alpha 尝试通过 SSH 访问,那么允许此用户访问,因为他的用户名没有包含在 DenyUsers 列表中。可以通过查看消息文件确认这一点:

Jun 22 18:52:48 rs6000 authsecurity:info sshd[250040]: Accepted password for 
alpha from tardis port 49634 ssh2

但是,如果 DenyUsers 列表中包含的用户 bravo 尝试通过 SSH 访问,其访问会遭到拒绝:

login as: bravo
bravo@rs6000's password:
Access denied
bravo@rs6000's password:

同样,可以通过查看消息文件检查拒绝的原因:

Jun 22 18:54:03 rs6000 authsecurity:info sshd[245962]: User bravo from tardis 
not allowed because listed in DenyUsers
Jun 22 18:54:03 rs6000 authsecurity:info sshd[245962]: Failed none for invalid
user bravo from tardis port 49635 ssh2

要保持简单。使用 AllowUsers 列表只允许您希望的用户访问。拒绝其他所有用户;不需要添加 DenyUsers 列表。

为了避免模式匹配产生出乎意料的结果,我强烈建议不要同时使用组列表和用户列表,而是只使用用户列表(允许或拒绝)或组列表(允许或拒绝)之一。

现在看看不适当的设置会造成怎样的混乱,假设设置了以下条目:

AllowUsers alpha
DenyUsers bravo charlie mother oscar delta echoa hotel juliet papa ukflag

考虑到模式匹配次序,我们现在可以声明,对 DenyUsers 列表中包含的用户都不授予任何访问权,只允许用户 alpha 访问。对于这种情况,我建议只使用 AllowUsers 列表。如果用户 ID 没有在允许列表中列出,就不能连接,无论拒绝列表包含哪些用户。

同样的原则也适用于组。假设设置了以下条目:

AllowGroups water
DenyGroups nossh

water 组的成员是:

# lsgroup -a users water
water users=delta,echoa,golf,plutt

现在,如果用户 dxtans(staff 和 admin 组的成员)

# id dxtans
uid=203(dxtans) gid=1(staff) groups=205(admin)

尝试连接,那么访问会失败,在 /var/adm/messages 中会记录以下条目:

Jun 30 19:50:26 rs6000 authsecurity:info sshd[278732]: User dxtans from tardis
not allowed because none of user's groups are listed in AllowGroups

这是因为 dxtans 不在允许列表中,也不在拒绝列表中。

创建一个不允许通过 SSH 访问的用户组可能有好处,因为这会减少维护工作量,然后创建一个允许通过 SSH 访问的用户组。例如,假设有一个称为 nossh 的组,其中包含不允许通过 SSH 访问的用户:

# lsgroup -a users nossh
nossh users=golf,hotel,india,julie

sshd_config 文件中,有以下条目:

DenyGroups nossh

现在,属于 nossh 组的所有用户都被拒绝访问。例如,当属于 nossh 组的用户 golf 尝试通过 SSH 访问时,在消息文件中可以看到以下消息:

Jun 22 19:40:36 rs6000 authsecurity:info sshd[278778]: User golf from tardis 
not allowed because a group is listed in DenyGroups

如果系统上的用户很多,使用组列表可能比用户列表更合适。

控制 root 访问

在处理来自远程主机的直接 root SSH 访问时,我建议最好限制能够作为 root 用户通过 SSH 连接的主机。这种方式让管理员可以控制 root 用户能够从哪里通过 SSH 连接,由此控制远程 root 连接。

为了通过 sshd_conf 文件控制用户和主机的访问,可以使用以下格式:root@root@

需要查看 SSH 在 /var/adm/messages 文件中采用什么格式,主机是解析为短主机名还是长主机名。查明这一点之后,只需在 AllowUsers 列表中加入相应的条目。如果不确定是短主机名还是长主机名(因为这取决于发起 SSH 连接的操作系统),那么最好同时包含这两种形式。

例如,要想只允许来自主机 tardis(属于 drwho 域)的 root 访问,可以使用以下设置:

AllowUsers root@tardis root@tardis.drwho.com

当然,在真实环境中,上面的列表还包含其他用户。

如果您有一台部署服务器,且只有该部署服务器上的 root 用户(在上面的示例中)可以从一个指定主机通过 SSH 和 SCP 访问所有客户机,那么非常适合采用以上方法。

自动生成用户列表

自动生成用户列表作为允许或拒绝列表是有好处的。随着时间的推移,经常会添加和删除用户,所以很容易忘记更新列表。应该生成什么列表呢?我建议只生成允许列表。判断用户是否不在 AllowUsers 列表中更方便。如果用户不在此列表中,就拒绝访问。按照什么规则允许用户进入 AllowUsers 列表呢?先考虑用户的属性是否表明他可以执行远程 rlogin/telnet (rlogin=true),然后考虑为什么不允许他通过 SSH 访问。采用这个规则就会立即排除所有系统和应用程序所有者帐户,只留下普通用户。

在典型的系统上,所有系统帐户和应用程序所有者应该是不可登录的。因此,只能通过 su 或 sudo 访问这些帐户。

只在处理特殊事件时手动编辑列表,比如在应用程序交付期间进一步允许(或拒绝)临时访问。清单 1 演示一种实现方法。首先确定 sshd_config 文件的位置,这样就知道要更新的 SSH 版本。接下来,收集主机上 rlogin 属性为 true 的所有用户,但是不包括 root 用户。然后,读取 /tmp/ssh_ignore 文件,从生成的用户列表中删除匹配的所有用户。使用 ssh_ignore 文件让管理员能够方便地控制哪些用户不应该出现在 sshd_config 文件中的允许用户列表中。

此文件的格式如下:

user1
user2
user..

然后,提取 sshd_config 文件中的 AllowUsers 列表并与生成的用户列表进行对比。如果有不同之处,就更新 sshd_config 文件。注意,列表包含 root@tardis 的短名称和长名称。正如前面提到的,这意味着只有来自主机 tardis 的 root 用户可以通过 SSH 访问。如果 sshd_config 有任何变动,就重新启动 SSH 服务并向管理员发送电子邮件,通知 sshd_config AllowUsers 列表的变动。

此脚本假设已经存在 AllowUsers 列表条目,而且列表至少包含部署服务器的条目,比如:

AllowUsers root@tardis root@tardis.drwho.com

这是主机名, root 用户只能从这个主机连接。在此示例中,列表同时包含短主机名和长主机名(主机名是 tardis)。根据自己的需要修改脚本,把主机 tardis 替换为自己的主机。可以用您喜欢的调度程序每天运行此脚本一次,从而及时更新用户列表。

清单 1. pop_user_allow_ssh
#!/bin/sh
#set -x 
# pop_user_allow_ssh
# populate UserAllow entries in sshd_conf
# if rlogin is true 
 
host=$(hostname)
log=/opt/dump/ssh_pop.log
>$log
 
if [ -f /usr/local/etc/sshd_config ]
  then
   sshd_conf="/usr/local/etc/sshd_config"
fi
  
if [ -f /etc/ssh/sshd_config ]
  then
   sshd_conf="/etc/ssh/sshd_config"
fi
 
 
echo " on ${host}: ssh config to use: [$sshd_conf]"  tee -a $log
 
# check if we need to run..any user adds/deletes
pre=`grep -w ^AllowUsers $sshd_conf`
pre=$(echo $pre  sed s/root@tardis.drwho.com//g sed 
s/root@tardis//gsed s/AllowUsers//g)
curr=$(lsuser -a rlogin ALL grep true grep -v root awk '{print $1}')
 
# check for ignores - do NOT add to allow list
if [ -f /tmp/ssh_ignore ]
 then
cat /tmp/ssh_ignorewhile read user
 do
   new_curr=$(echo $curr  tr ' ' '\n'  grep -v '^'$user'$'  tr '\n' ' ')
    echo "[$user]"
   curr=$new_curr
 
 done
fi
   echo "curr [$curr]"
  echo "pre [$pre]"
 
echo $curr >/tmp/curr.txt
echo $pre >/tmp/pre.txt
diff /tmp/curr.txt /tmp/pre.txt 2>&1
if [ $? = 0 ]
  then
   echo "no user adds/deletes detected on system" tee -a $log
   exit 0
   else
    echo "changes detected..re-populating" tee -a $log
fi
 
cp $sshd_conf $sshd_conf.bak
 
sed '/AllowUsers/d' $sshd_conf >$sshd_conf.$$
echo "AllowUsers root@tardis root@tardis.drwho.com" $curr >>$sshd_conf.$$
mv $sshd_conf.$$ $sshd_conf
stopsrc -s sshd
sleep 2
startsrc -s sshd
 
# next determine change and  email out change
>/tmp/curr.txt2
>/tmp/pre.txt2
cat /tmp/curr.txttr " " "\n" 
 while read name
 do
 echo $name >>/tmp/curr.txt2
 done 
 
 cat /tmp/pre.txt tr " " "\n" 
 while read name
  do
  echo $name >>/tmp/pre.txt2
  done
  
diff /tmp/pre.txt2 /tmp/curr.txt2 >/tmp/allow_diff.txt
changelist=$(cat /tmp/allow_diff.txt  egrep "<>"  sed 's/[<>]//g')
 
list="admins@drwho.com"
 
 
mail -s "`hostname` allowed users sshd_config change" $list <<mayday
Host: `hostname`
SSH: $sshd_conf
The following users have been either added or deleted in AllowUsers:
 
$changelist
 
mayday

调试

要启用调试,消息文件提供的信息是不够的。在客户端,可以在通过 SSH 连接时使用详细(v)选项,v 越多,输出越详细:

ssh -vv -l <login> <hostname>

在服务器端,停止 sshd 服务,然后带调试选项启动它。调试(d)意味着输出更详细。在进行连接时,sshd 将终止。然后需要在调试模式下再次重新启动它(如果需要进一步测试的话),或者通过 startsrc 命令以正常方式重新启动它。使用以下命令在调试模式下启动:

# /usr/sbin/sshd -dd

如果在尝试通过 SSH 连接时发现了问题,而且问题的原因不明,那么我建议同时使用客户机和服务器调试方法诊断问题。

在调试模式下启动 sshd 的典型输出如下:

# /usr/sbin/sshd -dd
debug2: load_server_config: filename /etc/ssh/sshd_config
debug2: load_server_config: done config len = 277
debug2: parse_server_config: config /etc/ssh/sshd_config len 277
debug1: sshd version OpenSSH_5.0p1
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: rexec_argv[0]='/usr/sbin/sshd'
…..
debug2: parse_server_config: config reprocess config len 277
User bravo from rs6000 not allowed because listed in DenyUsers
input_userauth_request: invalid user bravo

如果在调试模式下启动 sshd,会在标准输出中报告 sshdsshd_conf 中找到的错误。如果用 startsrc 命令启动 sshd,在 sshd_conf 中找到的错误会显示在 /var/adm/messages 文件中。还可以使用以下方法检查最后存在的状态(可以判断配置是否有问题):

# /usr/sbin/ssh -t
# echo $?

但是,在诊断与 SSH 相关的问题时,应该首先使用调试方法。

结束语

SSH 可以提供到远程主机的安全加密连接。但是,对于到达的连接请求,需要加以限制。可以使用 TCP Wrappers 和 sshd_config 中的 Allow/Deny 列表实现前瞻性的安全保护。

2019-06-04发布:hangge阅读:2396

使用 Docker 搭建 FTP 服务,不仅十分简单,而且可以对宿主机有一定的隔离。下面以 CentOS 系统为例,演示如何通过容器运行 FTP 服务。

1,拉取镜像

首先执行如下命令将镜像下载到本地:

docker pull fauria/vsftpd

2,启动容器

执行如下命令实例化 ftp 服务:

参数说明:

  • /home/ftp:/home/vsftpd:映射 docker 容器 ftp 文件根目录(冒号前面是宿主机的目录)
  • -p:映射 docker 端口(冒号前面是宿主机的端口)
  • -e FTP_USER=test -e FTP_PASS=test :设置默认的用户名密码(都为 test
  • PASV_ADDRESS:宿主机 ip,当需要使用被动模式时必须设置。
  • PASV_MIN_PORT~ PASV_MAX_PORT:给客服端提供下载服务随机端口号范围,默认 21100-21110,与前面的 docker 端口映射设置成一样。
docker run -d -v /home/ftp:/home/vsftpd \``-p 20:20 -p 21:21 -p 21100-21110:21100-21110 \``-e FTP_USER=test -e FTP_PASS=test \``-e PASV_ADDRESS=192.168.60.128 \``-e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \``--name vsftpd --restart=always fauria/vsftpd

3,防火墙配置

如果 CentOS 服务器有防火墙,为了让客户端能够访问 ftp 服务。我们可以关闭防火墙,或者执行如下命令配置 firewall 防火墙策略:

firewall-cmd --permanent --add-port=20/tcp``firewall-cmd --permanent --add-port=21/tcp``firewall-cmd --permanent --add-port=21100/tcp``firewall-cmd --permanent --add-port=21101/tcp``firewall-cmd --permanent --add-port=21102/tcp``firewall-cmd --permanent --add-port=21103/tcp``firewall-cmd --permanent --add-port=21104/tcp``firewall-cmd --permanent --add-port=21105/tcp``firewall-cmd --permanent --add-port=21106/tcp``firewall-cmd --permanent --add-port=21107/tcp``firewall-cmd --permanent --add-port=21108/tcp``firewall-cmd --permanent --add-port=21109/tcp``firewall-cmd --permanent --add-port=21110/tcp``firewall-cmd --reload

4,新建用户文件夹

(1)首先执行如下命令进入到容器里面:

docker ``exec` `-i -t vsftpd bash

(2)由于前面我们启动的时候设置用户名为 test,已经自动创建对应的用户文件夹(所以下面这个文件夹无需我们再次手动创建):

mkdir` `/home/vsftpd/test

(3)为方便演示,在 test 用户文件夹下新建一个 1.txt 文件。

vi /home/vsftpd/test/1.txt

5,访问服务

(1)我们可以直接使用浏览器进行访问,地址如下:

原文:Docker - 在容器中搭建运行FTP服务器(vsftpd)

(2)也可以使用 ftp 客户端工具进行访问。

原文:Docker - 在容器中搭建运行FTP服务器(vsftpd)

(3)如果是 Mac 电脑,我们还可以通过“访达”->“前往”->“**连接服务器…**”来访问 ftp 服务。

原文:Docker - 在容器中搭建运行FTP服务器(vsftpd)

附:增加一个新用户

前面我们在启动服务的时候就创建了个默认用户 test。如果需要新增一个新用户,假设用户名:hangge,密码:123456,具体操作如下。

(1)首先执行如下命令进入到容器里面:

docker ``exec` `-i -t vsftpd bash

(2)创建新用户的文件夹:

mkdir` `/home/vsftpd/hangge

(3)编辑用户配置文件:

vi /etc/vsftpd/virtual_users.txt

(4)在文件中添加新用户的用户名和密码:

原文:Docker - 在容器中搭建运行FTP服务器(vsftpd)

(5)保存退出后执行如下命令,把登录的验证信息写入数据库。

/usr/bin/db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db

(6)最后退出容器,并重启容器可以使用新用户连接 FTP 服务了。

exit``docker restart vsftpd

原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail\_2449.html

0%