HotSummer

  • 首页
  • 分类
  • 归档
  • 标签

Elasticsearch相关操作

发表于 2019-04-13   |   分类于 Web

安装 6.3.1

1
2
3
4
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
tar -xvf elasticsearch-6.3.1.tar.gz
cd elasticsearch-6.3.1/bin
./elasticsearch

配置外网访问,编辑config/elasticsearch.yml文件,添加

1
network.host: 0.0.0.0

安装分词插件 elasticsearch-analysis-ik

1
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.1/elasticsearch-analysis-ik-6.3.1.zip

Neo4j相关操作

发表于 2019-04-13   |   分类于 Web

####数据库导出与导入

1
2
3
4
5
6
# 导出数据库,首先要关闭neo4j
# 再执行命令
neo4j-admin dump --database=graph.db --to=/path/to/dumpfile

# 导入
neo4j-admin load --from=/path/to/dumpfile --database=graph.db --force

配置外网访问

1
2
# 在3.3.6版本中,解注释
# dbms.connectors.default_listen_address=0.0.0.0

Tools-DokuWiki

发表于 2019-03-28   |   分类于 Tools

安装

参考:

  • Install DokuWiki Wiki Software On Ubuntu 16.04 / 18.04 / 18.10 With Apache2, PHP 7.2
  • 在Ubuntu上使用DokuWiki构建你自己的wiki

安装 Apache

我们需要一台用于我们 wiki 的 web 服务器。我们在本教程中使用 Apache,但你也可以使用 Nginx 或任何其他 web 服务器。用下面的命令安装apache:

1
2
3
4
5
apt-get install apache2

# 启动停止
sudo systemctl stop apache2.service
sudo systemctl start apache2.service

安装 PHP7 和模块

接下来,如果你还没有安装 PHP,你应该先安装 PHP。在本教程中,我们使用 PHP7。所以请使用下面的命令安装 PHP7 和一些其他 PHP 模块:

1
apt-get install php7.0-fpm php7.0-cli php-apcu php7.0-gd php7.0-xml php7.0-curl php7.0-json php7.0-mcrypt php7.0-cgi php7.0 libapache2-mod-php7.0

下载安装 DokuWiki

1
2
3
4
5
6
7
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz
tar xvf dokuwiki-stable.tgz

sudo mv dokuwiki-2018-04-22b/ /var/www/html/dokuwiki/

sudo chown -R www-data:www-data /var/www/html/dokuwiki/
sudo chmod -R 755 /var/www/html/dokuwiki/

访问http://服务器的IP/dokuwiki/install.php进行配置,其中ACL是访问控制表,完成后删除install.php文件,sudo rm /var/www/html/dokuwiki/install.php

Ubuntu-svn

发表于 2019-03-26   |   分类于 Tools

安装SVN服务器

参考:

  • ubuntu系统下的svn安装使用教程
  • ubuntu下安装和配置SVN, 并设置钩子
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
sudo apt install subversion

# 进入svn仓库目录,比如/opt/svn,创建仓库,比如名字叫repository
svnadmin create repository

# repository目录下打开conf文件夹
# 编辑authz文件,例如用户为abc,组为gp1
[groups]
gp1 = abc

[repository:/]
@gp1=rw

# 编辑passwd文件,例如authz的用户为abc的,设置密码为123456
[users]
abc=123456

# 编辑svnserve.conf文件
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

# 启动
svnserve -d -r /opt/svn



# 可在客户端checkout测试,比如在一个ubuntu客户端上
svn --username=abc --password=123456 co svn://192.168.1.112/repository

迁移仓库

1
2
3
4
5
# 导出
svnadmin dump /path/to/old/repository > dumpfile.svndump

# 导入
svnadmin load /path/to/new/repository < dumpfile.svndump

Pip 杂记

发表于 2019-03-21   |   分类于 Tools

参考

pip 更换仓库源

1
pip install numpy -i http://pypi.mirrors.ustc.edu.cn/simple/ # 临时用中科大源安装numpy

pip 下载安装包并离线安装

1
2
3
4
# 只下载包
pip download -d ./download_packs_dir -r ./requirements.txt
# 只安装
pip install --no-index --find-links=./download_packs_dir -r ./requirements.txt

模块安装

三种方式:

进入下载安装包目录,运行 setup.py 程序:

1
2
3
4
5
6
7
# 源码安装
cd download_dir
python setup.py install # 运行 setup.py 安装程序
# 用 pip 安装,自动安装依赖包
pip install PackageName
# 用 easy_install 安装,不推荐使用
easy_install PackageName

win下 Anaconda 安装依赖包

进入Anaconda安装目录

1
2
3
cd Scripts
pip install PackageName -i https://pypi.tuna.tsinghua.edu.cn/simple/
# -i 后接国内镜像地址url,提升速度

更换conda源(清华):

1
2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

虚拟环境

1
2
3
4
5
6
sudo pip3 install virtualenv
# 创建虚拟环境,python3,无已安装包
virtualenv -p python3 --no-site-packages venv
source venv/bin/activate # 激活
pip freeze > requirement # pip freeze
deactivate # 退出虚拟环境

Conda杂记

发表于 2019-03-21   |   分类于 Tools

参考

更换仓库源

1
2
3
4
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
# 换回默认源
conda config --remove-key channels

清理

1
2
3
4
# 删除没有用的包
conda clean -p
# 删除所有的安装包及cache
conda clean -y -all

导出与安装依赖

1
2
conda list -e > requirements.txt
conda install --yes --file requirements.txt

虚拟环境

1
2
3
4
5
6
7
8
9
10
11
12
# 创建
conda create -n your_env_name python=3.5
# 激活
conda activate your_env_name
# 安装
conda install package-name -c optional-channel-name
# 卸载包
conda remove package-name
# 退出
conda deactivate
# 删除
conda remove -n your_env_name --all

安装pytorch=0.4.1

参考:https://www.pytorchtutorial.com/pytorch-installation-commands/

1
2
3
4
5
6
7
conda install -c pytorch cudatoolkit=8.0
pip install http://download.pytorch.org/whl/cu80/torch-0.4.1-cp35-cp35m-linux_x86_64.whl
pip install numpy
pip install torchvision

# conda install pytorch=0.4.1 torchvision -c pytorch
# conda install torchvision=0.2.1 cudatoolkit=8.0 -c pytorch

安装tensorflow=1.4.1

1
2
conda install cudatoolkit==8.0
conda install tensorflow-gpu=1.4.1

CUDA安装

发表于 2019-02-03   |   分类于 Tools

环境

  • Ubuntu 16.04

下载文件

CUDA Toolkit 8.0 - Feb 2017,runfile方式安装选runfile[local],下载文件:

  • cuda_8.0.61_375.26_linux.run
  • cuda_8.0.61.2_linux.run

下载Nvidia GPU驱动,根据GPU型号选择,比如:

  • NVIDIA-Linux-x86_64-410.93.run

下载cudnn:

  • libcudnn6_6.0.21-1+cuda8.0_amd64.deb
  • libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb
  • libcudnn6-doc_6.0.21-1+cuda8.0_amd64.deb

安装过程

  1. 卸载所有跟nvidia有关的驱动

    1
    2
    sudo apt-get purge nvidia*
    sudo nvidia-uninstall
  2. 禁用nouveau,编辑文档/etc/modprobe.d/blacklist-nouveau.conf,加入:

    blacklist nouveau
    options nouveau modeset=0

用sudo update-initramfs -u更新nouveau设置

  1. 确认nouveau已被禁用,否则重启
    1
    lsmod | grep nouveau

如果该命令无返回值,则说明nouveau已经禁用

  1. 重启系统

  2. 关闭图形桌面,比如lightdm,用sudo service lightdm stop

  3. 安装驱动

    1
    sudo ./NVIDIA-Linux-x86_64-410.93.run --no-opengl-files --dkms

注意选择安装dkms。

  1. 执行安装CUDA的runfile
    1
    2
    sudo sh ./cuda_8.0.61_375.26_linux.run
    sudo sh ./cuda_8.0.61.2_linux.run

注意,

  • 当问及Install NVIDIA accelerated Graphics Driver for Linux-x86_65 375.26?,选择no
  • 当问及是否安装测试样本时,选择安装
  • 当问及Would you like to run the nvidia-xconfig utility?,选择yes
  • 创建软链接到/usr/local/cuda
  1. 测验,进入测试样本的安装目录NVIDIA_CUDA-8.0_Samples,运行make -j编译,运行在bin目录的多级子目录下的测试程序bin/x86_64/linux/release/deviceQuery,如果看到检测到CUDA表示安装成功

  2. 安装cudnn

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sudo dpkg -i libcudnn6_6.0.21-1+cuda8.0_amd64.deb

    # to fix '/usr/lib32/nvidia-375/libEGL.so.1 is not a symbolic link' warning,
    sudo mv /usr/lib/nvidia-375/libEGL.so.1 /usr/lib/nvidia-375/libEGL.so.1.org
    sudo mv /usr/lib32/nvidia-375/libEGL.so.1 /usr/lib32/nvidia-375/libEGL.so.1.org
    ls /usr/lib/nvidia-375/ | grep libEGL.so.375 # 获取文件名最后的版本后缀{version}
    sudo ln -s /usr/lib/nvidia-375/libEGL.so.375.{version} /usr/lib/nvidia-375/libEGL.so.1
    sudo ln -s /usr/lib32/nvidia-375/libEGL.so.375.{version} /usr/lib32/nvidia-375/libEGL.so.1
    sudo dpkg -i libcudnn6_6.0.21-1+cuda8.0_amd64.deb
    # fix end

    sudo dpkg -i libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb
    sudo dpkg -i libcudnn6-doc_6.0.21-1+cuda8.0_amd64.deb
  3. 配置环境变量 vi /etc/profile

    1
    2
    3
    export CUDA_HOME=/usr/local/cuda
    export PATH=$PATH:$CUDA_HOME/bin
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

多cuda版本共存、切换

安装不同版本

  1. 删除cuda目录软链接

    1
    2
    3
    4
    # 确认是软链接,别把之前版本的cuda文件误删了
    ls -l /usr/local/cuda

    sudo rm -rf /usr/local/cuda
  2. 上面“安装过程”第7步开始

    切换回原版本

  3. 删除cuda目录软链接

  4. 创建原版本cuda目录软链接

    1
    sudo ln -s /usr/local/cuda-8.0 /usr/local/cuda

相关命令

1
2
3
4
5
6
7
8
# intel gpu 运行情况 
intel_gpu_top

# 查看当前使用的vga kernel驱动
lspci -nnk | grep -i vga -A3 | grep 'in use'

# 查看Nvidia显卡驱动版本
cat /proc/driver/nvidia/version

MySQL8在Windows下安装与初始配置

发表于 2018-11-24   |   分类于 Web

参考:
RUNOOB.com MySQL安装教程

在Windows下安装与初始配置

下载安装包

Windows上安装MySQL8,首先下载安装包,在MySQL下载中心下载MySQL zip压缩包,也可在本实验室FTP服务器下载。

下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 C:\web\mysql-8.0.13 下。

配置文件

接下来我们需要配置下 MySQL 的配置文件

打开刚刚解压的文件夹 C:\web\mysql-8.0.13 ,在该文件夹下创建 my.ini 配置文件,编辑 my.ini 配置以下基本信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=C:\\web\\mysql-8.0.13
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
# datadir=C:\\web\\sqldata
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
default-character-set=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

安装服务

接下来我们来启动下 MySQL 数据库:\
以管理员身份打开 cmd 命令行工具,切换到MySQL bin目录:

1
cd C:\web\mysql-8.0.13\bin

初始化数据库:

1
mysqld --initialize --console

执行完成后,会输出 root 用户的初始默认密码,如:

1
2018-04-20T02:35:05.464644Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: APWCY5ws&hjQ

APWCY5ws&hjQ就是初始密码,后续登录需要用到,你也可以在登陆后修改密码。

再输入以下安装命令:

1
mysqld install

启动输入以下命令即可:

1
net start mysql

MySQL服务默认开机启动。

登陆MySQL

打开 cmd 命令行工具,切换到MySQL bin目录:

1
cd C:\web\mysql-8.0.13\bin

用以下命令登陆:

1
mysql -u root -p

  • -u : 登录的用户名;
  • -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

按回车确认, 如果安装正确且 MySQL 正在运行, 会得到响应Enter password:,这时输入root用户的密码(初次登陆输入上文提到的初始密码)。

修改登陆密码

在登陆MySQL后,可用以下三条命令修改root用户密码,假设要设置的密码是your_password

1
2
3
use mysql;
ALTER USER 'root'@'localhost' identified with mysql_native_password by 'your_password';
flush privileges;

外网访问

在登陆MySQL后,

1
2
3
4
5
6
use mysql;
update user set host='%' where user ='root';
FLUSH PRIVILEGES;
exit # 退出
# 更新mysql,找到mysql_upgrade.exe的位置,一般在mysql安装目录的bin目录下
mysql_upgrade -uroot -p

常用操作

数据库导入与导出

1
2
3
4
5
6
7
8
9
10
11
12
13
# 导出数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
# 导出表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
# 导入
mysql -u用户名 -p 数据库名 < 数据库名.sql


# 导出所有数据库
mysqldump -u 用户名 -p --all-databases > 导出的文件名
# 导入: 首先登录,再执行命令
mysql -u 用户名 -p
source 导出的文件路径

创建用户

1
2
3
4
# 创建用户
CREATE USER '用户名'@'%' IDENTIFIED BY '密码';
# 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' WITH GRANT OPTION;

Javascript基础

发表于 2018-11-12   |   分类于 Web

推荐在线学习网站:

  • HTML/CSS/JavaScript在线代码运行工具
  • W3school JavaScript 教程
  • runoob.com JavaScript 教程

第一个JavaScript(JS)程序

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
<!DOCTYPE html>
<!--DOCTYPE不是HTML标签,它指定了HTML版本,此处说明版本HTML5-->
<html>
<head>
<!--<meta> 标签提供了HTML文档的元数据,这里指定页面编码字符集为UTF-8-->
<meta charset="UTF-8">
<title>我的第一个 JavaScript 程序</title>
<script>
// 在demo段落展示日期
function displayDate(){
/*
document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
getElementById 返回对拥有指定 id 的第一个对象的引用。
*/
document.getElementById("demo").innerHTML=Date();
// 在浏览器调试控制台打印日志
console.log("控制台输出");
}
</script>
</head>
<body>

<h1>我的第一个 JavaScript 程序</h1>
<p id="demo">这是一个段落</p>

<button type="button" onclick="displayDate()">显示日期</button>

</body>
</html>

HTML引入JavaScript

script标签

JavaScript脚本必须位于 标签之间。

JavaScript代码可以直接嵌在网页的任何地方,但通常放置在HTML顶部或底部,不会干扰页面的内容。

  • head部分JavaScript脚本
  • body部分JavaScript脚本

引入外部JavaScript

HTML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
<title>JavaScript练习</title>
<script src="/js/myScript.js"></script>
</head>
<body>

<h1>我的第一个 JavaScript 程序</h1>
<p id="demo">这是一个段落</p>

<button type="button" onclick="displayDate()">显示日期</button>
</body>
</html>

JS文件 myScript.js:

1
2
3
4
5
6
7
8
// 在demo段落展示日期
function displayDate(){
/*
document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
getElementById返回对拥有指定 id 的第一个对象的引用。
*/
document.getElementById("demo").innerHTML=Date();
}

JS变量与函数

JavaScript的语法和Java语言类似,每个语句以;结束,但并非强制要求,语句块用{}。

变量声明

变量名区分大小写,允许包含字母、数字、美元符号($)和下划线,但第一个字符不允许是数字,不用使用脚本语言中保留的关键字及保留符号作为变量名。

1
2
3
4
5
6
// 变量声明,只声明未赋值的变量值为undefined
var a;
// 变量声明并赋值
var a = 1;
// 隐式声明全局变量并赋值
a = 1;

函数声明与调用

1
2
3
4
5
6
7
8
// 函数定义
function add(op1, op2)
{
// 这里是要执行的代码
return op1 + op2;
}
// 执行函数
console.log(add(1, 2));

全局变量 vs 局部变量

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
// 在函数块外定义的变量都是全局的
var a = 1;

function setValue()
{
// 在函数内部定义全局变量,不加var
b = 2;
// 定义局部变量用var
var c = 3;
// 函数内可访问全局变量
a = 11;
if (true){
var i = 3;
}
// 与Java不同,在函数内部的代码块{}定义的局部变量,在代码块外(函数内部)也能访问
console.log(i);
}

function log(){
console.log(a);
console.log(b);
console.log(c);
}

setValue();
log();

特殊情况:当局部变量与全局变量重名,局部变量会覆盖掉全局变量。建议命名不要重复。

1
2
3
4
5
6
7
8
9
10
11
12
13
var a = 1;

function testSameVarName()
{
/*
Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。
这里输出undefined,因为局部变量a覆盖了全局变量a,并且在此处还没有被赋值。
*/
console.log(a); // undefined
var a = 3;
console.log(a); // 3
}
testSameVarName();

JavaScript 数据类型

JavaScript 数据类型包括:字符串、数字、布尔、数组、对象、Null、Undefined

Number对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
y = 5;
// 加减乘除
x=y+2;
x=y-2;
x=y*2;
x=y/2;
// 求余数
x=y%2;
// 累加、递减
x++;
x--;
// 赋值运算符
x=y;
x+=y; // 等价于 x = x + y; 以下类推
x-=y;
x*=y;
x/=y;
x%=y;

String对象

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
// 字符串可用''或""定义
txt="Hello world!"
// 字符串长度
txt_length = txt.length;
console.log(txt_length);
// 拼接字符串
txt = txt + "!!!";
// 把其他对象转为字符串
str_1 = 1 + "";
// 或者
str_1 = String(1)
// indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
console.log(txt.indexOf("world"));
// replace() 方法用于在字符串中用一些字符替换另一些字符。
console.log(txt.replace("Hello", "Hi,"));
// split() 方法用于把一个字符串分割成字符串数组。
console.log(txt.split(" "));
// substring() 方法用于提取字符串中介于两个指定下标之间的字符。
console.log(txt.substring(0, txt.indexOf(" ")));

// 插入特殊字符用反斜杠
txt="We are the so-called \"Vikings\" from the north."
// 换行符
txt="line one. \nnew line"
// ' 在""字符串中无需转义,同理,"在''字符串中无需转义
txt='We are the so-called "Vikings" from the north.'

Array对象

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
// Array对象可以包含任意数据类型
var arr = [1, 2, 3.14, 'Hello', null, true];
// 数组长度
console.log(arr.length); // 6
// 访问元素
console.log(arr[3]);
// 对元素操作,赋值
arr[3] = "Hello world!";
console.log(arr.indexOf(3.14)); // 元素3.14的索引为2
// push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素返回并删除
arr.push('a');
console.log(arr.pop());
/*
splice() 方法向/从数组中添加/删除项目,然后返回被删除的元素。
arrayObject.splice(index,howmany,item1,.....,itemX)
index, 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany, 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX, 可选。向数组添加的新项目。
*/
// 从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2, 3, 'Google', 'Facebook');
// 只删除,不添加:
arr.splice(2, 2);

// 遍历数组的三种方法
for(var i=0; i < arr.length; i++){
console.log(arr[i]);
}
for (var i in arr){ // i是arr的索引,与上面的循环相同
console.log(i);
console.log(arr[i]);
}
arr.forEach(function(value, index, arr){
// 在forEach使用return会失效,break会报错
console.log(value); //当前值
console.log(index); //当前索引
console.log(arr); //原数组
});

对象

JavaScript 中的所有事物都是对象,提供多个内建对象,比如 String、Date、Array 等等。此外,JavaScript 允许自定义对象。对象只是带有属性和方法的特殊数据类型。

JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。创建一个对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 对象初始化器方式 
// 用一个`{ }`表示一个对象,键值对以`xxx: xxx`形式申明,用`,`隔开。
// 注意,最后一个键值对不需要在末尾加,,如果加了,有的浏览器(如低版本的IE)将报错。
var xiaohong = {
name: '小红',
id: 1,
// 如果属性名包含特殊字符,就必须用引号括起来
'middle-school': 'No.1 Middle School',
// 属性值可以是函数(方法)
sayHi: function(){
console.log('Hello world!');
}
};

// 构造函数方式
function Student(name, id, school){
this.name = name;
this.id = id;
this['middle-school'] = school;
this.sayHi = function(){
console.log('Hello world!');
};
}
xiaohong = new Student("小红", 1, 'No.1 Middle School');

访问对象的属性:

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
var xiaohong = {
name: '小红',
id: 1,
'middle-school': 'No.1 Middle School',
sayHi: function(){
console.log('Hello world!');
}
};
// 用.访问对象的属性
console.log(xiaohong.name);
// 用引号定义的属性名,必须用obj['propertyName']的形式访问
console.log(xiaohong['middle-school']);
// 也可用此法访问一般的属性
console.log(xiaohong['id']);
// 运行对象的方法
xiaohong.sayHi();
// 访问不存在的属性返回undefined
console.log(xiaohong.age); // undefined
// 新增属性
xiaohong.age = 21;
// 删除属性
delete xiaohong.name; // 删除name属性
console.log(xiaohong.name); // undefined
// 判断属性是否存在
console.log('id' in xiaohong);

// 遍历对象的属性
for (var key in xiaohong){
console.log("key: "+key+", value: "+xiaohong[key]);
}

动态类型

JavaScript 拥有动态类型。相同的变量可用作不同的类型:

1
2
3
var x                // x 为 undefined
x = 6; // x 为数字
x = "Bill"; // x 为字符串

控制语句

比较运算符

1
2
3
4
5
6
7
8
9
10
11
12
x = 2;
// 抽象相等比较 ==,执行前执行类型转换
console.log(x == 2); // true
console.log(x == 1); // false
console.log(x == '2'); // true
// 严格相等比较 ===,值和类型都必须相等
console.log(x === '2'); // false
console.log(x != '2'); // false
console.log(x > '2'); // false
console.log(x >= '2'); // true
console.log(x < '2'); // false
console.log(x <= '2'); // true

逻辑运算符

1
2
3
4
5
x = 2;
console.log(x >= 0 && x <= 8); // true
console.log(x >= 3 || x <= 8); // true
console.log(! x >= 3); // false
console.log(! (x >= 3)); // true

if语句

1
2
3
4
5
6
7
8
time = 12;
if (time < 10){
console.log("Good morning");
}else if (time<20){
console.log("Good day");
}else{
console.log("Good evening");
}

switch语句

1
2
3
4
5
6
7
8
9
10
11
switch (day) {
case 0:
x = "Today it's Sunday";
break;
case 1:
x = "Today it's Monday";
break;
case 2:
x = "Today it's Tuesday";
break;
}

for循环

1
2
3
4
for (var i=0; i<5; i++)  {
x=x + "The number is " + i + "<br>";
}
// 其他例子参考Array对象、对象遍历部分

while循环

1
2
3
4
5
6
7
8
9
10
while (i<5) {
x=x + "The number is " + i + "<br>";
i++;
}

// do/while循环至少会执行一次
do {
x=x + "The number is " + i + "<br>";
i++;
} while (i<5);

jQuery

jQuery 是一个 JavaScript 库,极大简化了 JavaScript 编程。

jQuery是一个快速,小巧,功能丰富的JavaScript库,使得HTML 文档遍历和操作,事件处理,动画和Ajax 更加简单。

改写第一个JS程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<title>用jQuery改写第一个JS程序</title>
</head>
<body>

<h1>我的第一个 JavaScript 程序</h1>
<p id="demo">这是一个段落</p>

<button type="button">显示日期</button>

<!--引用jQuery库-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
// $("button") 选择所有的button元素
$("button").on("click", function () {
// #id 选择器
$("#demo").html(Date());
});
</script>
</body>
</html>

选择器

参考RUNOOB.COM jQuery 选择器教程

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>jQuery选择器示例</title>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>

<body>
<!--ID的命名规范:含字母、数字、连字符-、下划线_、冒号:、点号.,必须字母开头,大小写敏感。
建议只用字母数字命名id,避免jQuery转义-->
<p id="p1"> 第1段 </p>
<!--class 的命名规范,可参考 How to name css classes: http://bdavidxyz.com/blog/how-to-name-css-classes/-->
<p class="p-red"> 第2段 </p>
<p class="p-red p-gold"> 第3段 </p>
<p hidden="hidden"> 第4段 </p>
<p title="No.5"> 第5段 </p>
<hr />

用户名: &nbsp;<input type="text" name="username"><br>
密码: &nbsp;&nbsp;&nbsp;&nbsp;<input type="password" name="password" autocomplete="new-password"><br>
<hr />

<input type="checkbox" id="ckb_1" />
<input type="checkbox" id="ckb_2" disabled="disabled" />
<input type="checkbox" id="ckb_3" />
<input type="checkbox" id="ckb_4" />
<input type="button" id="btn" value="点击">
<hr />

<ul class="test">
<li>列表项</li>
<li>列表项
<ul>
<li>内嵌列表项</li>
</ul>
</li>
<li>列表项</li>
</ul>
<hr />

<p>这是ul元素后第1个p元素</p>
<div>
<p>这个p元素在div内</p>
</div>
<p>这是ul元素后第2个p元素</p>
<hr />

<ul>
ul
<li>
ul->li
<span id="embed_span">ul->li->span</span>
</li>
</ul>

<script type="text/javascript">
// * 选择器选取文档中的每个单独的元素,包括 html、head 和 body
$("*").css('color', '');
// # ID选择器选取带有唯一的指定 id 的元素。选择id=p1的元素
$("#p1").css('color','Violet');
// . 类选择器选取带有指定class的元素
$(".p-red").css('color','red');
// 标签选择器选取带有指定标签名的元素
$("p").css('color','Purple');

// 属性选择器
// 选择每个带有指定属性的元素
$("[hidden]").show();
// 选取每个带有指定属性和值的元素
$("[title='No.5']").css('color', 'Green');
// 选取每个不带有指定属性及值的元素
$("[class!='p-red']").css('color', 'yellow');
// 选取每个带有指定属性且以指定字符串结尾的元素
$("[class$='p-gold']").css('color', 'gold');

// :选择器
// 选择input元素
$(":input").css("background-color", "orange");
// 选择带有 type="text" 的 input 元素
$(":text").css("color", "orange");
// 选择带有 type="password" 的 input 元素
$(":password").css("background-color", "orange");

// 复合选择器,两个选择器相连
// 把类型为checkbox,同时"可用"的元素设置成"已选择"
// :checkbox选择带有 type="checkbox" 的 input 元素
$(':checkbox[disabled!="disabled"]').attr("checked",true);
$('input:checkbox[disabled!="disabled"]').attr("checked",true);

// ("parent descendant")选择器选取指定元素的后代的所有元素
$("ul.test li").css("color", "DarkBlue");
// ("parent > child") 选择器选取指定元素的直接子元素的所有元素。
$("ul.test > li").css("color", "DarkRed");
// ("element ~ siblings") 选择器选取指定元素 "element" 同级的所有元素。
$("ul.test ~ p").css("color","SkyBlue");
// ("element + next") 选择器选取指定元素"element" “紧邻”的同级元素"next"。
$("ul.test + p").css("color","yellow");

// :first 选择器选取第一个元素
$("ul.test ~ p:first").css('color', 'red');
// :last 选择器选取第一个元素
$("ul.test ~ p:last").css('color', 'red');
// :eq() 选择器选取带有指定 index 值的元素
$("ul.test ~ p:eq(1)").css('color', 'blue');

// parent() 方法返回被选元素的直接父元素
$("#embed_span").parent().css('color', 'blue');
// parents() 方法返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (<html>)
$("#embed_span").parents().css('color', 'red');
// 可以使用可选参数来过滤对祖先元素的搜索
$("#embed_span").parents("ul").css('color', 'blue');
</script>
</body>
</html>

选择器-更复杂的例子

(改编自jQuery选择器-综合案例)

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>jQuery标签切换效果</title>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
</head>

<body>
<!--代码部分begin-->
<div id="menu">
<!--tag标题-->
<div id="menu_female">
<h3>女装</h3>
<div class="tag" style="display: block;">
<dl>
<dd>
<p>第一类</p>
<a>1.衬衫</a>
<a>2.T恤</a>
<a>3.雪纺衫</a>
<a>4.针织衫</a>
<a>5.短外套</a>
<a>6.卫衣</a>
<a>7.小西裤</a>
<a>8.风衣</a>
<a>9.吊带背心</a>
<a>10.连衣裙</a>
<a name="setColor">11.蕾丝连衣裙</a>
<a>12.复古连衣裙</a>
<a>13.印花连衣裙</a>
<a>14.真丝连衣裙</a>
<a>更多</a>
</dd>
</dl>
</div>
<div class="tag_More" style="display:block">
<dl>
<dd>
<p>第二类</p>
<a>1.背带裤</a>
<a>2.哈伦裤</a>
<a>3.牛仔裤</a>
<a>4.休闲裤</a>
<a>5.小脚裤</a>
<a>6.西装裤</a>
<a>7.打底裤</a>
<a>8.阔脚裤</a>
<a>9.短裤</a>
<a>10.马甲/背心</a>
<a>11.羽绒服</a>
<a>12.棉服</a>
<a>13.夹克</a>
<a>14.POLO衫</a>
<a>更多</a>
</dd>
</dl>
</div>>
</div>
<div id="menu_male">
<h3>男装</h3>
<div class="tag" style="display:block">
<dl>
<dd>
<p>第一类</p>
<a>1.衬衫</a>
<a>2.T恤</a>
<a>3.牛仔裤</a>
<a>4.休闲裤</a>
<a>5.短裤</a>
<a>6.针织衫</a>
<a>7.西服</a>
<a>8.西裤</a>
<a>9.嘻哈裤</a>
<a>10.西服套装</a>
<a>11.马甲/背心</a>
<a name="setColor">12.羽绒服</a>
<a>13.棉服</a>
<a>14.夹克</a>
<p>更多</p>
</dd>
</dl>
</div>
<div class="tag_More" style="display:block">
<dl>
<dd>
<p>第二类</p>
<a>1.衬衫</a>
<a>2.T恤</a>
<a>3.牛仔裤</a>
<a name='setColor'>4.休闲裤</a>
<a>5.短裤</a>
<a>6.针织衫</a>
<a>7.西服</a>
<a>8.西裤</a>
<a>9.嘻哈裤</a>
<a>10.西服套装</a>
<a>11.马甲/背心</a>
<a>12.羽绒服</a>
<a>13.棉服</a>
<a>14.夹克</a>
<p>更多</p>
</dd>
</dl>
</div>
</div>
</div>

<script type="text/javascript">
// 找到男装下第一类衣服中的第一个p元素,并改变颜色
// :first-child 选择器选取属于其父元素的第一个子元素
$("#menu_male div.tag p:first-child").css('color','#9932CC');
</script>

<script type="text/javascript">
//找到男装下第一类衣服把a元素从顺序1-4加上颜色
//可以通过基本筛选器lt,选择匹配集合中所有索引值小于给定index参数的元素
$("#menu_male > div:first a:lt(4)").css('color','red');
</script>

<script type="text/javascript">
//找到男装所有a元素中属性名name="setColor"的元素,并设置颜色
//这里用的属性选择器[attribute='value']选择指定属性是给定值的元素
$("#menu_male a[name='setColor']").css('color','blue');
</script>

<script type="text/javascript">
//不分男女,选中第一类衣服中第9个a元素,并改变颜色
//:nth-child(n) 选择器选取属于其父元素的不限类型的第 n 个子元素的所有元素
$("#menu div.tag dd a:nth-child(10)").css('color','#66CD00');
</script>

<script type="text/javascript">
//找到女装下第一类衣服,把a元素中包含文字"更多"的节点,改变颜色
$(".tag:first a:contains('更多')").css('color','#C71585');
</script>
</body>
</html>

jQuery 元素绑定事件

一个限制输入框输入正整数的例子

1
2
3
4
5
6
7
8
9
10
11
12
请输入一个正整数:<input type="text" name="positive_num_inpt">

<script type="text/javascript">
// 限制输入框输入正整数
// on() 方法在被选元素及子元素上添加一个或多个事件处理程序
// 这里响应keyup事件。当键盘键被松开时发生 keyup 事件
$("[name='positive_num_inpt']").on("keyup", function(){
var tmptxt = $(this).val();
// /\D|^0/g 是一个正则表达式,匹配非数字与开头的0
$(this).val(tmptxt.replace(/\D|^0/g, ''));
});
</script>

jQuery Ajax

ajax() 方法通过 HTTP 请求加载远程数据。

ajax cnodejs.org论坛主题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$.ajax({
url: "https://cnodejs.org/api/v1/topics", // ajax请求地址,如果是跨域请求,需要服务器支持
type: "GET", // 请求方式 "POST" 或 "GET", 默认为 "GET"
dataType: "json", //根据返回数据类型可以有这些类型可选:xml html script json jsonp text,ajax会将数据解析成js对象
data: {limit: 3}, // 发送到服务器的数据。类型可以为:PlainObject、String、Array。GET 请求中将附加在 URL 后面
async: true, // 布尔值,默认是 true。表示请求是否异步处理。
success: function(data, status){
// 请求成功后执行此函数
console.log(data);
},
error: function(jqXHR, status, error){
// 请求失败要运行的函数
// 参数分别为:XMLHttpRequest对象,错误信息,捕获的错误对象(可选)
}
});

点击按钮生成下拉选择框:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<button type="button">显示部门下拉选择框</button>
<select id="departmentSelector" hidden="hidden"></select>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
// $("button") 选择所有的button元素
$("button").on("click", function () {
$.ajax({
url: "/helloworld/department/list",
dataType: 'json',
success: function (data) {
$("#departmentSelector").html("");
for(var i in data){
$("#departmentSelector").append(
'<option value ="' + data[i].departmentId + '">' + data[i].departmentName +
'</option>'
);
}
$("#departmentSelector").show();
}
});
});

常用函数

1
2
3
4
i = Number("30");
console.log(typeof i);
i = parseInt("30");
i = parseFloat("30");

Ubuntu16上安装vsftp服务器

发表于 2018-09-26   |   分类于 Tools

参考教程

设计三个用户:ftp, ftpadmin, ftpguest。目录结构:

  • /home/ftp, ftp可读可写
  • /home/ftpadmin, ftpadmin可读可写
  • /home/ftpadmin/shares, ftpguest可读

vsftp安装

1
2
3
4
5
6
# 检查是否已经安装
vsftpd -v
# 安装
sudo apt-get install vsftpd
# 备份配置文件
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup

打开端口

1
2
3
4
5
# 查看防火墙状态
sudo ufw status
# 打开20/21号端口
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp

创建目录与用户

1
2
3
4
5
6
7
8
9
sudo useradd -d /home/ftpadmin -s /bin/bash ftpadmin
sudo passwd ftpadmin

sudo useradd -s /bin/bash ftpguest
sudo passwd ftpguest

sudo mkdir /home/ftp
sudo chown ftp:ftp /home/ftp
sudo usermod -d /home/ftp ftp

配置文件

1
2


vsftpd配置文件详解

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
1.默认配置:
1>允许匿名用户和本地用户登陆。
anonymous_enable=YES
local_enable=YES
2>匿名用户使用的登陆名为ftp或anonymous,口令为空;匿名用户不能离开匿名用户家目录/var/ftp,且只能下载不能上传。
3>本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自 己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传/下载。
write_enable=YES
4>写在文件/etc/vsftpd.ftpusers中的本地用户禁止登陆。

2.配置文件格式:
vsftpd.conf 的内容非常单纯,每一行即为一项设定。若是空白行或是开头为#的一行,将会被忽略。内容的格式只有一种,如下所示
option=value
要注意的是,等号两边不能加空白。

3.匿名用户(anonymous)设置
anonymous_enable=YES/NO(YES)
控制是否允许匿名用户登入,YES 为允许匿名登入,NO 为不允许。默认值为YES。
write_enable=YES/NO(YES)
是否允许登陆用户有写权限。属于全局设置,默认值为YES。
no_anon_password=YES/NO(NO)
若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为NO。
ftp_username=ftp
定义匿名登入的使用者名称。默认值为ftp。
anon_root=/var/ftp
使用匿名登入时,所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限。
anon_upload_enable=YES/NO(NO)
如果设为YES,则允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效。当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
anon_world_readable_only=YES/NO(YES)
如果设为YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在FTP服务器中打开阅读)。默认值为YES。
anon_mkdir_write_enable=YES/NO(NO)
如果设为YES,则允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效。当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
anon_other_write_enable=YES/NO(NO)
如果设为YES,则允许匿名登入者更多于上传或者建立目录之外的权限,譬如删除或者重命名。(如果anon_upload_enable=NO,则匿名用户不能上传文件,但可以删除或者重命名已经存在的文件;如果anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但可以删除或者重命名已经存在的文件夹。)默认值为NO。
chown_uploads=YES/NO(NO)
设置是否改变匿名用户上传文件(非目录)的属主。默认值为NO。
chown_username=username
设置匿名用户上传文件(非目录)的属主名。建议不要设置为root。
anon_umask=077
设置匿名登入者新增或上传档案时的umask 值。默认值为077,则新建档案的对应权限为700。
deny_email_enable=YES/NO(NO)
若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。默认值为NO。
banned_email_file=/etc/vsftpd/banner_emails
此文件用来输入email address,只有在deny_email_enable=YES时,才会使用到此档案。若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。

4.本地用户设置
local_enable=YES/NO(YES)
控制是否允许本地用户登入,YES 为允许本地用户登入,NO为不允许。默认值为YES。
local_root=/home/username
当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。
write_enable=YES/NO(YES)
是否允许登陆用户有写权限。属于全局设置,默认值为YES。
local_umask=022
本地用户新增档案时的umask 值。默认值为077。
file_open_mode=0755
本地用户上传档案后的档案权限,与chmod 所使用的数值相同。默认值为0666。

5.欢迎语设置
dirmessage_enable=YES/NO(YES)
如果启动这个选项,那么使用者第一次进入一个目录时,会检查该目录下是否有.message这个档案,如果有,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对该目录的说明。默认值为开启。
message_file=.message
设置目录消息文件,可将要显示的信息写入该文件。默认值为.message。
banner_file=/etc/vsftpd/banner
当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语或是说明。默认值为无。如果欢迎信息较多,则使用该配置项。
ftpd_banner=Welcome to BOB's FTP server
这里用来定义欢迎话语的字符串,banner_file是档案的形式,而ftpd_banner 则是字符串的形式。预设为无。

6.控制用户是否允许切换到上级目录
在默认配置下,本地用户登入FTP后可以使用cd命令切换到其他目录,这样会对系统带来安全隐患。可以通过以下三条配置文件来控制用户切换目录。
chroot_list_enable=YES/NO(NO)
设置是否启用chroot_list_file配置项指定的用户列表文件。默认值为NO。
chroot_list_file=/etc/vsftpd.chroot_list
用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录。
chroot_local_user=YES/NO(NO)
用于指定用户列表文件中的用户是否允许切换到上级目录。默认值为NO。
通过搭配能实现以下几种效果:
①当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
②当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd.chroot_list文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。
③当chroot_list_enable=NO,chroot_local_user=YES时,所有的用户均不能切换到其他目录。
④当chroot_list_enable=NO,chroot_local_user=NO时,所有的用户均可以切换到其他目录。

7.数据传输模式设置
FTP在传输数据时,可以使用二进制方式,也可以使用ASCII模式来上传或下载数据。
ascii_upload_enable=YES/NO(NO)
设置是否启用ASCII 模式上传数据。默认值为NO。
ascii_download_enable=YES/NO(NO)
设置是否启用ASCII 模式下载数据。默认值为NO。

8.访问控制设置
两种控制方式:一种控制主机访问,另一种控制用户访问。
①控制主机访问:
tcp_wrappers=YES/NO(YES)
设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制。默认值为YES。如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该FTP服务器。这两个文件可以起到简易的防火墙功能。
比如:若要仅允许192.168.0.1—192.168.0.254的用户可以连接FTP服务器,则在/etc/hosts.allow文件中添加以下内容:
vsftpd:192.168.0. :allow
all:all :deny
②控制用户访问:
对于用户的访问控制可以通过/etc目录下的vsftpd.user_list和ftpusers文件来实现。
userlist_file=/etc/vsftpd.user_list
控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行。
userlist_enable=YES/NO(NO)
是否启用vsftpd.user_list文件。
userlist_deny=YES/NO(YES)
决定vsftpd.user_list文件中的用户是否能够访问FTP服务器。若设置为YES,则vsftpd.user_list文件中的用户不允许访问FTP,若设置为NO,则只有vsftpd.user_list文件中的用户才能访问FTP。
/etc/vsftpd/ftpusers文件专门用于定义不允许访问FTP服务器的用户列表(注意:如果userlist_enable=YES,userlist_deny=NO,此时如果在vsftpd.user_list和ftpusers中都有某个用户时,那么这个用户是不能够访问FTP的,即ftpusers的优先级要高)。默认情况下vsftpd.user_list和ftpusers,这两个文件已经预设置了一些不允许访问FTP服务器的系统内部账户。如果系统没有这两个文件,那么新建这两个文件,将用户添加进去即可。

9.访问速率设置
anon_max_rate=0
设置匿名登入者使用的最大传输速度,单位为B/s,0 表示不限制速度。默认值为0。
local_max_rate=0
本地用户使用的最大传输速度,单位为B/s,0 表示不限制速度。预设值为0。

10.超时时间设置
accept_timeout=60
设置建立FTP连接的超时时间,单位为秒。默认值为60。
connect_timeout=60
PORT 方式下建立数据连接的超时时间,单位为秒。默认值为60。
data_connection_timeout=120
设置建立FTP数据连接的超时时间,单位为秒。默认值为120。
idle_session_timeout=300
设置多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒。默认值为300 。

11.日志文件设置
xferlog_enable= YES/NO(YES)
是否启用上传/下载日志记录。如果启用,则上传与下载的信息将被完整纪录在xferlog_file 所定义的档案中。预设为开启。
xferlog_file=/var/log/vsftpd.log
设置日志文件名和路径,默认值为/var/log/vsftpd.log。
xferlog_std_format=YES/NO(NO)
如果启用,则日志文件将会写成xferlog的标准格式,如同wu-ftpd 一般。默认值为关闭。
log_ftp_protocol=YES|NO(NO)
如果启用此选项,所有的FTP请求和响应都会被记录到日志中,默认日志文件在/var/log/vsftpd.log。启用此选项时,xferlog_std_format不能被激活。这个选项有助于调试。默认值为NO。

12.定义用户配置文件
在vsftpd中,可以通过定义用户配置文件来实现不同的用户使用不同的配置。
user_config_dir=/etc/vsftpd/userconf
设置用户配置文件所在的目录。当设置了该配置项后,用户登陆服务器后,系统就会到/etc/vsftpd/userconf目录下,读取与当前用户名相同的文件,并根据文件中的配置命令,对当前用户进行更进一步的配置。
例如:定义user_config_dir=/etc/vsftpd/userconf,且主机上有使用者 test1,test2,那么我们就在user_config_dir 的目录新增文件名为test1和test2两个文件。若是test1 登入,则会读取user_config_dir 下的test1 这个档案内的设定。默认值为无。利用用户配置文件,可以实现对不同用户进行访问速度的控制,在各用户配置文件中定义local_max_rate=XX,即可。

13.FTP的工作方式与端口设置
FTP有两种工作方式:PORT FTP(主动模式)和PASV FTP(被动模式)
listen_port=21
设置FTP服务器建立连接所监听的端口,默认值为21。
connect_from_port_20=YES/NO
指定FTP使用20端口进行数据传输,默认值为YES。
ftp_data_port=20
设置在PORT方式下,FTP数据连接使用的端口,默认值为20。
pasv_enable=YES/NO(YES)
若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。默认值为YES,即使用PASV工作模式。
pasv_max_port=0
在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为0。
pasv_min_port=0
在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为0。

14.与连接相关的设置
listen=YES/NO(YES)
设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,此时listen必须设置为YES,此为默认值。建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。若设置为NO,则vsftpd不是以独立的服务运行,要受到xinetd服务的管控,功能上会受到限制。
max_clients=0
设置vsftpd允许的最大连接数,默认值为0,表示不受限制。若设置为100时,则同时允许有100个连接,超出的将被拒绝。只有在standalone模式运行才有效。
max_per_ip=0
设置每个IP允许与FTP服务器同时建立连接的数目。默认值为0,表示不受限制。只有在standalone模式运行才有效。
listen_address=IP地址
设置FTP服务器在指定的IP地址上侦听用户的FTP请求。若不设置,则对服务器绑定的所有IP地址进行侦听。只有在standalone模式运行才有效。
setproctitle_enable=YES/NO(NO)
设置每个与FTP服务器的连接,是否以不同的进程表现出来。默认值为NO,此时使用ps aux |grep ftp只会有一个vsftpd的进程。若设置为YES,则每个连接都会有一个vsftpd的进程。

15.虚拟用户设置
虚拟用户使用PAM认证方式。
pam_service_name=vsftpd
设置PAM使用的名称,默认值为/etc/pam.d/vsftpd。
guest_enable= YES/NO(NO)
启用虚拟用户。默认值为NO。
guest_username=ftp
这里用来映射虚拟用户。默认值为ftp。
virtual_use_local_privs=YES/NO(NO)
当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限。默认情况下此参数是关闭的(NO)。

16.其他设置
text_userdb_names= YES/NO(NO)
设置在执行ls –la之类的命令时,是显示UID、GID还是显示出具体的用户名和组名。默认值为NO,即以UID和GID方式显示。若希望显示用户名和组名,则设置为YES。
ls_recurse_enable=YES/NO(NO)
若是启用此功能,则允许登入者使用ls –R(可以查看当前目录下子目录中的文件)这个指令。默认值为NO。
hide_ids=YES/NO(NO)
如果启用此功能,所有档案的拥有者与群组都为ftp,也就是使用者登入使用ls -al之类的指令,所看到的档案拥有者跟群组均为ftp。默认值为关闭。
download_enable=YES/NO(YES)
如果设置为NO,所有的文件都不能下载到本地,文件夹不受影响。默认值为YES。

12…8
Blunt

Blunt

email:summer15y@163.com

72 日志
7 分类
37 标签
© 2019 Blunt
由 Hexo 强力驱动
主题 - NexT.Muse