vsftpd配置

属性 属性值 含义
anonymous_enable YES/NO 是否允许匿名用户(anonymous)登录 FTP,如果该设置被注释,则默认允许
local_enable YES/NO 是否允许本地系统用户登录
write_enable YES/NO 是否开启任何形式的 FTP 写入命令,上传文件
local_umask xxx 本地用户的 umask 设置,如果注释该设置则默认为 077,但一般都设置成 022
anon_upload_enable YES/NO 是否允许匿名用户上传文件,如果要设置为允许,则需要先开启 write_enable,否则无效,此外对应目录还要具有写权限
anon_mkdir_write_enable YES/NO 是否允许匿名用户创建新目录
dirmessage_enable YES/NO 当进入某个目录时,发送信息提示给远程用户:
xferlog_enable YES/NO 是否开启 上传/下载 的日志记录
connect_from_port_20 YES/NO 是否使用 20 端口来连接 FTP
chown_uploads YES/NO 匿名上传的文件是否由某一指定用户 chown_username 所有
chown_username 有效用户名 匿名上传的文件由该设定用户所有
xferlog_file 有效路径 设置日志文件的保存位置,默认为 /var/log/xferlog
xferlog_std_format YES/NO 是否使用标准的 ftpd xferlog日志格式,该格式日志默认保存在 /var/log/xferlog
idle_session_timeout 数值 设置空闲连接的超时时间,单位 秒
data_connection_timeout 数值 设置等待数据传输的最大时间,单位 秒(data_connection_timeoutidle_session_timeout 在同一时间只有一个有效)
nopriv_user 有效用户名 指定一个非特权用户,用于运行 vsftpd
async_abor_enable YES/NO 是否支持异步 ABOR 请求
ascii_upload_enable YES/NO 是否开启 ASCII 模式进行文件上传,一般不开启
ascii_download_enable YES/NO 是否开启 ASCII 模式进行文件下载,一般不开启
ftpd_banner 自定义登录标语
deny_email_enable YES/NO 如果匿名登录,则会要求输入 email 地址,如果不希望一些 email 地址具有登录权限,则可以开启此项,并在 banned_email_file 指定的文件中写入对应的 email 地址
banned_email_file 有效文件 当开启 deny_email_enable 时,需要通过此项指定一个保存登录无效 email 的文件
chroot_local_user YES/NO 是否将所有用户限制在主目录,当为 NO 时, FTP 用户可以切换到其他目录
chroot_list_enable YES/NO 是否启用限制用户的名单列表
chroot_list_file 有效文件 用户列表,其作用与 chroot_local_userchroot_local_user 的组合有关,详见下表
allow_writeable_chroot YES/NO 是否允许用户对 ftp 根目录具有写权限,如果设置成不允许而目录实际上却具备写权限,则会报错
ls_recurse_enable YES/NO 是否允许 ls -R 指令来递归查询,递归查询比较耗资源
listen YES/NO 如果为 YESvsftpd 将以独立模式运行并监听 IPv4 的套接字,处理相关连接请求(该指令不能与 listen_ipv6 一起使用)
listen_ipv6 YES/NO 是否允许监听 IPv6 套接字
pam_service_name 设置 PAM 外挂模块提供的认证服务所使用的配置文件名 ,即 /etc/pam.d/vsftpd 文件,此文件中 file=/etc/vsftpd/ftpusers 字段,说明了 PAM 模块能抵挡的帐号内容来自文件 /etc/vsftpd/ftpusers
userlist_enable YES/NO 是否启用 user_list 文件来控制用户登录
userlist_deny YES/NO 是否拒绝 user_list 中的用户登录,此属性设置需在 userlist_enable = YES 时才有效
tcp_wrappers YES/NO 是否使用 tcp_wrappers 作为主机访问控制方式
max_clients 数值 同一时间允许的最大连接数
max_per_ip 数值 同一个IP客户端连接的最大值
local_root 有效目录 系统用户登录后的根目录
anon_root 有效目录 匿名用户登录后的根目录
user_config_dir 有效目录 用户单独配置文件存放目录,该目录下用户的文件名就是对应用户名

chroot_local_userchroot_local_user 组合功能如下:

chroot_local_user=YES chroot_local_user=NO
chroot_list_enable=YES 1.所有用户都被限制在其主目录下 2.使用 chroot_list_file 指定的用户列表 /etc/vsftpd/chroot_list,这些用户作为“例外”,不受限制 1.所有用户都不被限制其主目录下 2.使用 chroot_list_file 指定的用户列表 /etc/vsftpd/chroot_list,这些用户作为“例外”,受到限制
chroot_list_enable=NO 1.所有用户都被限制在其主目录下 2.不使用 chroot_list_file 指定的用户列表 /etc/vsftpd/chroot_list,没有任何“例外”用户 1.所有用户都不被限制其主目录下 2.不使用 chroot_list_file 指定的用户列表 /etc/vsftpd/chroot_list,没有任何“例外”用户

cockpit-4

cockpit可以让用户对完整的读写和查看常规文件,但是对大型文件的读写支持的不是特别好。

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
file = cockpit.file(path,
{ syntax: syntax_object,
binary: boolean,
max_read_size: int,
superuser: string,
host: string
})

promise = file.read()
promise
.then((content, tag) => { ... })
.catch(error => { ... })

promise = file.replace(content, [ expected_tag ])
promise
.then(new_tag => { ... })
.catch(error => { ... })

promise = file.modify(callback, [ initial_content, initial_tag ]
promise
.then((new_content, new_tag) => { ... })
.catch(error => { ... })

file.watch((content, tag, [error]) => { })

file.close()

简单的读取功能,text1为textarea控件id

1
2
3
4
5
6
7
cockpit.file("/root/test").read()
.then((content, tag) => {
text1.value = content;
})
.catch(error => {
result.innerHTML ="0";
});

简单的写入

1
2
3
4
5
6
cockpit.file("/root/test").replace(content)
.then(tag => {
})
.catch(error => {
result.innerHTML ="0";
});

然后调用close()将文件关闭。

cockpit学习-3

cockpit有个base1插件包,里面提供供其他插件包使用的api。

分下面几个大模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cockpit.js — Basic cockpit API to interact with the system
cockpit.js: DBus Client — DBus API communication
cockpit.js: File Access — Reading, writing, and watching files.
cockpit.js: HTTP Client — HTTP and REST API communication
cockpit.js: Spawning Processes — Spawning processes or scripts
cockpit.js: Metrics — Reading and streaming metric data
cockpit.js: Series Data — Representing series data
cockpit.js: Raw Channels — Raw communication channels
cockpit.js: Page Location and Jumping — Page location and navigation between components
cockpit.js: Localization — Localization and translations
cockpit.js: Errors — Problem codes and messages
cockpit.js: User Session — User information and login session state
cockpit.js: Utilities — Various utility functions
cockpit.js: Object Cache — Caching and sharing data
cockpit.js: Manifests — Manifest info

cockpit.js

通过在html中这样调用

1
<script src="../base1/cockpit.js">

cockpit.js:DBus Client

这些api可以直接访问dbus服务

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
client = cockpit.dbus(name, [options])
promise = client.wait([callback])
client.close([problem])
client.addEventListener("close", options => { ... })
client.addEventListener("owner", (event, owner) => { ... })
client.options
client.unique_name
client.proxy()
client.proxy()
proxy.client
//proxy = client.proxy([interface, path], [options])
proxy.path
proxy.iface
proxy.valid
proxy.data
proxy.call()
proxy.wait()
proxy.onchanged
proxy.onsignal
client.proxies()
proxies.wait()
proxies.client
proxies.iface
proxies.path_namespace
proxies.onadded
proxies.onchanged
proxies.onremoved
client.call()
invocation.then()
invocation.catch()
client.subscribe()
subscription.remove()
client.watch()
watch.then()
watch.catch()
watch.remove()
client.onnotify
client.notify()
client.onmeta
client.meta()
client.publish()
published.remove()
cockpit.variant()
cockpit.byte_array()

具体说明可以参考官方文档

cockpit学习_2

cockpit管理多台主机

首先在A机器安装cockpit-dashboard这个插件包。然后web重新登陆,就可以看到dashboard的选项。

在B机器安装cockpit包,然后设置开机启动cockpit服务

1
systemctl enable --now cockpit.socket

如果要做免密登陆,要在A机器执行下面命令

1
2
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub B机IP

然后在web界面的dashboard页面里选择添加机器,输入B机IP,就能在A的web页面管理B机器。若没有配置密钥,则需要输入B机器的账号和密码。

cockpit管理容器

cockpit管理容器使用的是podman,所以需要先安装cockpit-podman这个插件包,然后刷新web页面,就可以看到Podman Containers的选项。

在这个标签页里,可以直接搜索镜像,拉取下来之后可以直接启动。

cockpit管理虚拟机

需要先安装cockpit-machines这个插件包,然后刷新web页面,就可以看到虚拟机的标签页。

cockpit插件

cockpit使用XDG规范来存放插件包,默认情况下,cockpit按以下顺序在这几个目录里查找插件包,遇到同名的则使用找到的第一个。

1
2
3
4
5
~/.local/share/cockpit/

/usr/local/share/cockpit/

/usr/share/cockpit/

可以使用下面这条命令查看系统中安装的cockpit插件包

1
$ cockpit-bridge --packages

一个插件包包含以下几个文件

1
2
3
4
/usr/share/cockpit/my-package/
manifest.json
file.html
some.js

manfiest.json中一般包含以下几个字段

1
2
3
4
5
6
7
8
9
content-security-policy
name
priority
requires
version
preload
dashboard
menu
tools

其中menu是由以下json对象注册的

1
2
3
4
5
label
order
path
docs
keywords

keywords又是由以下json注册的

1
2
3
4
matches
goto
weight
translate

一个manifest.json文件例子

1
2
3
4
5
6
7
8
9
10
11
12
{
"version": 0,
"require": {
"cockpit": "120"
},
"tools": {
"mytool": {
"label": "My Tool",
"path": "tool.html"
}
}
}

为了压缩空间,插件包支持压缩格式,加入一个文件名为test.de.js,如果cockpit没有在找到该文件,将会以以下的扩展名寻找这个文件。

1
2
3
4
5
6
7
8
mypackage/test.de.js
mypackage/test.de.min.js
mypackage/test.de.js.gz
mypackage/test.de.min.js.gz
mypackage/test.js
mypackage/test.min.js
mypackage/test.js.gz
mypackage/test.min.js.gz

cockpit学习_1

cockpit的配置文件在/etc/cockpit/cockpit.conf ,默认不存在,需要用户自己创建。

cockpit的主要模块

cockpit-ws 用来和浏览器以及各个系统组件通信的服务。

cockpit-tls cockpit-ws的代理,证书存放于/etc/cockpit/ws-certs.d,可以使用 remotectl certificate 检查将会使用的证书。

cockpit-bridge用来处理从web前端到服务端的消息和命令,并代表web用户生成进程。

cockpit可以配置 /etc/systemd/system/cockpit.socket.d/listen.conf 中配置监听的端口和ip(官方手册)。实际系统中配置监听端口和ip的配置文件为/usr/lib/systemd/system/cockpit.socket。可以配置同时监听多个端口,但是需要在firewall中将修改的对应端口开放。firewall-cmd --add-port=9091/tcp

1
2
3
4
[Socket]
ListenStream=9090
ListenStream=9091
ListenStream=

cockpit可以同时管理和监视多个服务,但是浏览器只会连接一台机器的cockpit-ws服务,然后通过这个服务使用ssh协议连接其他机器。cockpit的工作原理如下图。

avatar

对deb包打patch

首先使用apt-get source xxx 下载我们想要打patch的包

再使用dpkg-source -x xxx.dsc将我们下载的源码包解压。

进入源码目录,quilt new testpatch 创建patch,假如我们需要对test.c文件进行修改,执行 quilt add test.c,然后对文件进行修改结束后,执行quilt refresh,生成patch文件,修改源码目录下的/debian/patches/series文件将我们的testpatch添加到最后一行。

回到源码的根目录,执行dpkg-buildpackage,则可以根据我们修改后的源码重新生成deb包。

盛最多水的容器

题目

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

示例:

1
2
输入: [1,8,6,2,5,4,8,3,7]
输出: 49

思路

两个指针同时向内收缩,短的一边向内收缩,相遇时停止,记录最大面积即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0;
int right = height.size() - 1;
int totalWater = min(height[left],height[right]) * (right - left);
while(left < right){
if(height[left] < height[right])
++left;
else
--right;
totalWater = max(totalWater,min(height[left],height[right]) * (right - left));
}
return totalWater;

}

};

内核定时器

内核定时器可以用来在未来某一时间执行被调用程序,类似于软件中断。
结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct timer_list {

struct list_head entry;



unsigned long expires;

void (*function)(unsigned long);

unsigned long data;



struct tvec_base *base;

/* ... */

};