doc

doc

CentOS 7 使用Yum方式安装配置vsftpd服务

CentOSllslx520 发表了文章 • 0 个评论 • 88 次浏览 • 3 天前 • 来自相关话题

  ftp是我们最常用的网络协议之一,用于方便的在网络中传输文件。vsftp是Linux平台轻量级的ftp服务软件,它小巧轻快、简单易用。本文介绍CentOS 7下使用yum安装配置vsftpd服务器,包括匿名登录方式、系统用户登录方式和虚拟用户登录三种登录方式的vsftpd服务配置。本文也适用于RHEL、Fedora、Oracle Linux 等其它Linux Redhat发行版本。一、实验环境:操作系统: CentOS Linux release 7.2.1511 (Core)CPU构架:x86_64 Vsftpd版本:vsftpd-3.0.2-21.el7 二、安装准备:1、关闭SELINUX:  SELINUX为Linux提供安全强化同时,也让Linux服务安装变得更复杂。未正确的为相关服务配置SELINUX,将导致服务无法正常运行。所以对于初学者来说,建议关闭SELINUX。vim /etc/selinux/config:#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加保存退出后,执行“setenforce 0”命令使配置立生效:setenforce 0 三、安装vsftpd服务:1、使用安装yum安装vsftpd:  使用“yum -y install vsftpd ”命令,会自动安装vsftpd命令和相关依赖包:yum -y install vsftpd2、备份vsftpd配置文件:cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak 四、方案一,配置匿名访问的vsftpd服务:1、配置vsftpd.conf文件:#允许匿名用户访问
anonymous_enable=YES
#禁止本地用户访问
local_enable=NO
#允许匿名用户创建目录
anon_mkdir_write_enable=YES
#允许匿名用户上传文件
anon_upload_enable=YES
#允许匿名用户执行其他写入操作,如删除
anon_other_write_enable=YES
#设置匿名用户根目录
anon_root=/ftp2、创建匿名用户目录:# /ftp/pub目录可写,/ftp目录不可写
mkdir -p /ftp/pub
chown -R ftp.ftp /ftp
chmod a-w /ftp3、启动vsftpd服务:[root@aiezu.com vsftpd]# service vsftpd start
Redirecting to /bin/systemctl start vsftpd.service4、测试:在另外一台服务器上连接ftp进行测试,使用匿名用户“anonymous”和任意包含"@"字符串的密码进行连接:[root@aiezu.com ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (106,14,37,132,180,191).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 4096 Mar 24 15:01 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir ok
257 "/pub/ok" created
ftp> rm ok
250 Remove directory operation successful. 五、方案二,配置本地用户(系统)访问的vsftpd服务:1、配置主配置文件vsftpd.conf:#禁止匿名用户访问
anonymous_enable=NO
#允许本地用户访问
local_enable=YES
#允许写入操作
write_enable=YES
#禁止用户离开自己的用户根目录
chroot_local_user=YES
#启用用户名单列表
userlist_enable=YES
#设置用户名单列表为白名单(只允许名单中的用户连接到vsftpd)
userlist_deny=NO
#设置用户名单列表文件名
userlist_file=/etc/vsftpd/user_allow2、添加测试用户和设置权限:  添加用户testuser,设置密码后,添加到"/etc/vsftpd/user_allow"文件,并重启vsftpd服务:[root@aiezu.com ~]# mkdir -p /ftproot/testuser
[root@aiezu.com ~]# useradd -d /ftproot testuser -s /sbin/nologin
[root@aiezu.com ~]# chown -R testuser.testuser /ftproot/testuser
[root@aiezu.com ~]# chmod a-w /ftproot
[root@aiezu.com ~]# passwd testuser
Changing password for user testuser.
New password: (这里输入密码)
passwd: all authentication tokens updated successfully.
[root@aiezu.com ~]# echo "testuser" >> /etc/vsftpd/user_allow3、重启vsftpd服务:[root@aiezu.com ~]# service vsftpd restart
Redirecting to /bin/systemctl restart vsftpd.service4、测试:  在另外一台服务器上连接ftp进行测试,使用本地用户“testuser”和你设置的密码进行连接:[root@s2 ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): testuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (106,14,37,132,223,218).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 Mar 25 12:56 testuser
226 Directory send OK.
ftp> mkdir aa
550 Create directory operation failed.
ftp> cd testuser
250 Directory successfully changed.
ftp> mkdir aa
257 "/testuser/aa" created
ftp> dir
227 Entering Passive Mode (106,14,37,132,89,105).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 Mar 25 12:58 aa
226 Directory send OK. 六、方案三,配置虚拟用户访问的vsftpd服务(推荐方式):1、创建虚拟用户密码文件,奇数行为用户名,偶数行为密码:touch /etc/vsftpd/vir_user.txt
echo -e "aiezuuser\naiezu123" >> /etc/vsftpd/vir_user.txt
2、生成虚拟用户数据库:yum -y install libdb-utils
db_load -T -t hash -f /etc/vsftpd/vir_user.txt /etc/vsftpd/vir_user.db
3、配置vsftpd pam验证文件/etc/pam.d/vsftpd:mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
cat <<END > /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vir_user
account required pam_userdb.so db=/etc/vsftpd/vir_user
END
4、修改虚拟数据库文件vir_user.db的权限为700:chmod 700 /etc/vsftpd/vir_user.db
5、增加一个系统用户virftp ,所有虚拟用户都会映射到此用户后对文件系统进行读写操作:
mkdir /ftprootuseradd -d /ftproot virftp -s /sbin/nologin
chown -R virftp.virftp /ftproot
6、设置vsftpd主配置文件/etc/vsftpd/vsftpd.conf:#禁止匿名用户登录
anonymous_enable=NO
#允许本地用户登录
local_enable=YES
#启用虚拟账户
guest_enable=YES
#把虚拟账户映射到系统账户virftp
guest_username=virftp
#使用虚拟用户验证(PAM验证)
pam_service_name=vsftpd
#设置存放各虚拟用户配置文件的目录(此目录下与虚拟用户名相同的文件为他的配置文件)
user_config_dir=/etc/vsftpd/vsftpd_viruser
#启用chroot时,虚拟用户根目录允许写入
allow_writeable_chroot=YES
7、设置虚拟用户各自的配置文件:mkdir /etc/vsftpd/vsftpd_viruser/
#配置文件名同虚拟账户名
touch /etc/vsftpd/vsftpd_viruser/aiezuuser
mkdir -p /ftproot/aiezuuser/
chown -R virftp.virftp /ftproot/aiezuuser/
8、在虚拟用户 aiezuuser 的配置文件中写入如下配置/etc/vsftpd/vsftpd_viruser/aiezuuser:# 允许写入
write_enable=YES
#允许浏览FTP目录和下载
anon_world_readable_only=NO
# 允许虚拟用户aiezuuser上传文件
anon_upload_enable=YES
# 允许虚拟用户创建目录
anon_mkdir_write_enable=YES
# 允许虚拟用户aiezuuser执行其他操作(如改名、删除)
anon_other_write_enable=YES
# 指定虚拟用户的虚拟目录(虚拟用户登录后的主目录)
local_root=/ftproot/aiezuuser/
9、重启vsftpd服务:service vsftpd restart 
10、使用虚拟用户aiezuuser和密码aiezu123进行连接vsftpd测试: [root@S2 ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): aiezuuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir aa
257 "/aa" created
ftp> mkdir bb
257 "/bb" created
ftp> ls
227 Entering Passive Mode (106,14,37,132,129,241).
150 Here comes the directory listing.
drwx------ 2 1000 1000 4096 Mar 25 14:36 aa
drwx------ 2 1000 1000 4096 Mar 25 14:36 bb
226 Directory send OK. 七、常见问题:问题一:连接到vsftpd服务器时,提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()解决方法:请参考http://aiezu.com/question/112.html 
  八、附录:1、vsftpd相关目录和文件介绍:/etc/vsftpd/vsftpd.conf:vsftpd服务主配置文件;/etc/vsftpd/ftpusers:设置不允许访问ftp服务的系统用户(黑名单),一行一个用户名;/etc/vsftpd/user_list:用于设置允许或禁止访问vsftpd服务的系统用户名单,主配置文件的“userlist_enable”参数决定此名单是否生效,“userlist_deny”参数决定此名单是黑名单还是白名单;/etc/pam.d/vsftpd:vsftpd的pam模块的配置文件,用来认证身份和阻止特定用户;/usr/sbin/vsftpd:vsftpd的主要执行文件;/var/ftp:vsftpd的默认匿名用户登录的根目录。 2、主配置文件vsftpd.conf相关参数介绍:  vsftpd的配置参数很多,我们可以通过man 5 vsftpd.conf命令获取到vsftpd.conf配置文件的详细帮助信息。下面介绍一些vsftpd常用的参数。
①. vsftpd服务全局相关参数:参数描述connect_from_port_20=YES|NO是否使用20号端口做为ftp-data的端口号listen_port=21设置vsftpd服务监听的端口号listen=YES|NO设置vsftpd是否stand alone方式启动pasv_enable=YES|NO是否开启被动模式pasv_max_port=0
pasv_min_port=0设置被动模式(passive mode)使用的端口范围,为0时不受限制max_Clients=0当vsftpd以stand alone运行时,用来设置最大同时在线数max_per_ip=0用于设置同一IP允许的同时最大连接数idle_session_timeout=300如果用户300秒内没有命令操作,则强制离线ftpd_banner="欢迎信息"
banner_file=/path/file通过字符串或者文件的方式设置连接到vsftpd服务器时的欢迎信息dirmessange_enable=YES|NO
message_file=.message配置ftp进入目录时显示目录下某个文件的内容做为提示信息ascii_download_enable=YES|NO
ascii_upload_enable=YES|NO是否允许ascii方式传输xferlog_enable=YES|NO
xferlog_file=/var/log/vsftpd.log是否记录用户下载上传的文件②. vsftpd用户、权限相关参数:参数描述write_enable=YES|NO用来设置是否允许用户上传文件guest_username=ftp指定来宾用户身份的用户名guest_enable=YES|NO是否将非匿名用户映射成来宾用户。local_enable=YES|NO是否允许/etc/passwd中的用户以实体用户的身份登录到ftp服务器。local_max_rate=0设置最大传输速度,单位为bytes/schroot_local_user=YES|NO
chroot_list_enable=YES|NO
chroot_list_file=/etc/vsftpd/chroot_list用来设置哪些用户被限制在自己的目录内无法离开allow_writeable_chroot=YES|NO启用chroot时用户根目录是否允许写入,默认否userlist_enable=YES|NO
userlist_deny=YES|NO
userlist_file=/etc/vsftpd/user_list用来阻止或者允许相关用户登录到vsftpd服务器;  
userlist_file:指定允许或禁止访问vsftpd服务的系统用户名单文件;
userlist_enable:决定名单是否生效;
userlist_deny:决定此名单是黑名单还是白名单;anonymous_enable=YES|NO是否允许anonymouns用户登录到vsftpd服务器anon_root=/var/ftp设置匿名用户根目录anon_world_readable_only=YES|NO匿名用户是否只允许下载可读的文件anon_mkdir_write_enable=YES|NO
anon_upload_enable=YES|NO
anon_other_write_enable=YES|NO设置匿名用户的写入权限no_anon_password=YES|NOanonymous登录时是否可以省略密码。
(匿名用户使用用户名“anonymous”,密码使用任意包含“@”字符的字符串登陆)anon_max_rate=0设置anonymous的最大传输速度。anon_umask=077anonymous用户上传文件的权限掩码。 查看全部
  ftp是我们最常用的网络协议之一,用于方便的在网络中传输文件。vsftp是Linux平台轻量级的ftp服务软件,它小巧轻快、简单易用。本文介绍CentOS 7下使用yum安装配置vsftpd服务器,包括匿名登录方式、系统用户登录方式和虚拟用户登录三种登录方式的vsftpd服务配置。本文也适用于RHEL、Fedora、Oracle Linux 等其它Linux Redhat发行版本。

一、实验环境:

 

二、安装准备:

1、关闭SELINUX:

  SELINUX为Linux提供安全强化同时,也让Linux服务安装变得更复杂。未正确的为相关服务配置SELINUX,将导致服务无法正常运行。所以对于初学者来说,建议关闭SELINUX。vim /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
保存退出后,执行“setenforce 0”命令使配置立生效:
setenforce 0
 

三、安装vsftpd服务:

1、使用安装yum安装vsftpd:

  使用“yum -y install vsftpd ”命令,会自动安装vsftpd命令和相关依赖包:
yum -y install vsftpd

2、备份vsftpd配置文件:

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
 

四、方案一,配置匿名访问的vsftpd服务:

1、配置vsftpd.conf文件:

#允许匿名用户访问
anonymous_enable=YES
#禁止本地用户访问
local_enable=NO
#允许匿名用户创建目录
anon_mkdir_write_enable=YES
#允许匿名用户上传文件
anon_upload_enable=YES
#允许匿名用户执行其他写入操作,如删除
anon_other_write_enable=YES
#设置匿名用户根目录
anon_root=/ftp

2、创建匿名用户目录:

# /ftp/pub目录可写,/ftp目录不可写
mkdir -p /ftp/pub
chown -R ftp.ftp /ftp
chmod a-w /ftp

3、启动vsftpd服务:

[root@aiezu.com vsftpd]# service vsftpd start
Redirecting to /bin/systemctl start vsftpd.service

4、测试:

在另外一台服务器上连接ftp进行测试,使用匿名用户“anonymous”和任意包含"@"字符串的密码进行连接:
[root@aiezu.com ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (106,14,37,132,180,191).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 4096 Mar 24 15:01 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir ok
257 "/pub/ok" created
ftp> rm ok
250 Remove directory operation successful.
 

五、方案二,配置本地用户(系统)访问的vsftpd服务:

1、配置主配置文件vsftpd.conf:

#禁止匿名用户访问
anonymous_enable=NO
#允许本地用户访问
local_enable=YES
#允许写入操作
write_enable=YES
#禁止用户离开自己的用户根目录
chroot_local_user=YES
#启用用户名单列表
userlist_enable=YES
#设置用户名单列表为白名单(只允许名单中的用户连接到vsftpd)
userlist_deny=NO
#设置用户名单列表文件名
userlist_file=/etc/vsftpd/user_allow

2、添加测试用户和设置权限:

  添加用户testuser,设置密码后,添加到"/etc/vsftpd/user_allow"文件,并重启vsftpd服务:
[root@aiezu.com ~]# mkdir -p /ftproot/testuser
[root@aiezu.com ~]# useradd -d /ftproot testuser -s /sbin/nologin
[root@aiezu.com ~]# chown -R testuser.testuser /ftproot/testuser
[root@aiezu.com ~]# chmod a-w /ftproot
[root@aiezu.com ~]# passwd testuser
Changing password for user testuser.
New password: (这里输入密码)
passwd: all authentication tokens updated successfully.
[root@aiezu.com ~]# echo "testuser" >> /etc/vsftpd/user_allow

3、重启vsftpd服务:

[root@aiezu.com ~]# service vsftpd restart
Redirecting to /bin/systemctl restart vsftpd.service

4、测试:

  在另外一台服务器上连接ftp进行测试,使用本地用户“testuser”和你设置的密码进行连接:
[root@s2 ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): testuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (106,14,37,132,223,218).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 Mar 25 12:56 testuser
226 Directory send OK.
ftp> mkdir aa
550 Create directory operation failed.
ftp> cd testuser
250 Directory successfully changed.
ftp> mkdir aa
257 "/testuser/aa" created
ftp> dir
227 Entering Passive Mode (106,14,37,132,89,105).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 Mar 25 12:58 aa
226 Directory send OK.
 

六、方案三,配置虚拟用户访问的vsftpd服务(推荐方式):

1、创建虚拟用户密码文件,奇数行为用户名,偶数行为密码:
touch /etc/vsftpd/vir_user.txt
echo -e "aiezuuser\naiezu123" >> /etc/vsftpd/vir_user.txt

2、生成虚拟用户数据库:
yum -y install libdb-utils 
db_load -T -t hash -f /etc/vsftpd/vir_user.txt /etc/vsftpd/vir_user.db

3、配置vsftpd pam验证文件/etc/pam.d/vsftpd:
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
cat <<END > /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vir_user
account required pam_userdb.so db=/etc/vsftpd/vir_user
END

4、修改虚拟数据库文件vir_user.db的权限为700:
chmod 700 /etc/vsftpd/vir_user.db

5、增加一个系统用户virftp ,所有虚拟用户都会映射到此用户后对文件系统进行读写操作:
mkdir /ftproot
useradd -d /ftproot virftp -s /sbin/nologin
chown -R virftp.virftp /ftproot

6、设置vsftpd主配置文件/etc/vsftpd/vsftpd.conf:
#禁止匿名用户登录
anonymous_enable=NO
#允许本地用户登录
local_enable=YES
#启用虚拟账户
guest_enable=YES
#把虚拟账户映射到系统账户virftp
guest_username=virftp
#使用虚拟用户验证(PAM验证)
pam_service_name=vsftpd
#设置存放各虚拟用户配置文件的目录(此目录下与虚拟用户名相同的文件为他的配置文件)
user_config_dir=/etc/vsftpd/vsftpd_viruser
#启用chroot时,虚拟用户根目录允许写入
allow_writeable_chroot=YES

7、设置虚拟用户各自的配置文件:
mkdir /etc/vsftpd/vsftpd_viruser/
#配置文件名同虚拟账户名
touch /etc/vsftpd/vsftpd_viruser/aiezuuser
mkdir -p /ftproot/aiezuuser/
chown -R virftp.virftp /ftproot/aiezuuser/

8、在虚拟用户 aiezuuser 的配置文件中写入如下配置/etc/vsftpd/vsftpd_viruser/aiezuuser:
# 允许写入
write_enable=YES
#允许浏览FTP目录和下载
anon_world_readable_only=NO
# 允许虚拟用户aiezuuser上传文件
anon_upload_enable=YES
# 允许虚拟用户创建目录
anon_mkdir_write_enable=YES
# 允许虚拟用户aiezuuser执行其他操作(如改名、删除)
anon_other_write_enable=YES
# 指定虚拟用户的虚拟目录(虚拟用户登录后的主目录)
local_root=/ftproot/aiezuuser/

9、重启vsftpd服务:
service vsftpd restart
 
10、使用虚拟用户aiezuuser和密码aiezu123进行连接vsftpd测试: 
[root@S2 ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): aiezuuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir aa
257 "/aa" created
ftp> mkdir bb
257 "/bb" created
ftp> ls
227 Entering Passive Mode (106,14,37,132,129,241).
150 Here comes the directory listing.
drwx------ 2 1000 1000 4096 Mar 25 14:36 aa
drwx------ 2 1000 1000 4096 Mar 25 14:36 bb
226 Directory send OK.
 

七、常见问题:

问题一:连接到vsftpd服务器时,提示:

500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解决方法:请参考http://aiezu.com/question/112.html 
  

八、附录:

1、vsftpd相关目录和文件介绍:

  • /etc/vsftpd/vsftpd.conf:vsftpd服务主配置文件;
  • /etc/vsftpd/ftpusers:设置不允许访问ftp服务的系统用户(黑名单),一行一个用户名;
  • /etc/vsftpd/user_list:用于设置允许或禁止访问vsftpd服务的系统用户名单,主配置文件的“userlist_enable”参数决定此名单是否生效,“userlist_deny”参数决定此名单是黑名单还是白名单;
  • /etc/pam.d/vsftpd:vsftpd的pam模块的配置文件,用来认证身份和阻止特定用户;
  • /usr/sbin/vsftpd:vsftpd的主要执行文件;
  • /var/ftp:vsftpd的默认匿名用户登录的根目录。
 

2、主配置文件vsftpd.conf相关参数介绍:

  vsftpd的配置参数很多,我们可以通过man 5 vsftpd.conf命令获取到vsftpd.conf配置文件的详细帮助信息。下面介绍一些vsftpd常用的参数。
①. vsftpd服务全局相关参数:
参数描述
connect_from_port_20=YES|NO是否使用20号端口做为ftp-data的端口号
listen_port=21设置vsftpd服务监听的端口号
listen=YES|NO设置vsftpd是否stand alone方式启动
pasv_enable=YES|NO是否开启被动模式
pasv_max_port=0
pasv_min_port=0
设置被动模式(passive mode)使用的端口范围,为0时不受限制
max_Clients=0当vsftpd以stand alone运行时,用来设置最大同时在线数
max_per_ip=0用于设置同一IP允许的同时最大连接数
idle_session_timeout=300如果用户300秒内没有命令操作,则强制离线
ftpd_banner="欢迎信息"
banner_file=/path/file
通过字符串或者文件的方式设置连接到vsftpd服务器时的欢迎信息
dirmessange_enable=YES|NO
message_file=.message
配置ftp进入目录时显示目录下某个文件的内容做为提示信息
ascii_download_enable=YES|NO
ascii_upload_enable=YES|NO
是否允许ascii方式传输
xferlog_enable=YES|NO
xferlog_file=/var/log/vsftpd.log
是否记录用户下载上传的文件
②. vsftpd用户、权限相关参数:
参数描述
write_enable=YES|NO用来设置是否允许用户上传文件
guest_username=ftp指定来宾用户身份的用户名
guest_enable=YES|NO是否将非匿名用户映射成来宾用户。
local_enable=YES|NO是否允许/etc/passwd中的用户以实体用户的身份登录到ftp服务器。
local_max_rate=0设置最大传输速度,单位为bytes/s
chroot_local_user=YES|NO
chroot_list_enable=YES|NO
chroot_list_file=/etc/vsftpd/chroot_list
用来设置哪些用户被限制在自己的目录内无法离开
allow_writeable_chroot=YES|NO启用chroot时用户根目录是否允许写入,默认否
userlist_enable=YES|NO
userlist_deny=YES|NO
userlist_file=/etc/vsftpd/user_list
用来阻止或者允许相关用户登录到vsftpd服务器;  
userlist_file:指定允许或禁止访问vsftpd服务的系统用户名单文件;
userlist_enable:决定名单是否生效;
userlist_deny:决定此名单是黑名单还是白名单;
anonymous_enable=YES|NO是否允许anonymouns用户登录到vsftpd服务器
anon_root=/var/ftp设置匿名用户根目录
anon_world_readable_only=YES|NO匿名用户是否只允许下载可读的文件
anon_mkdir_write_enable=YES|NO
anon_upload_enable=YES|NO
anon_other_write_enable=YES|NO
设置匿名用户的写入权限
no_anon_password=YES|NOanonymous登录时是否可以省略密码。
(匿名用户使用用户名“anonymous”,密码使用任意包含“@”字符的字符串登陆)
anon_max_rate=0设置anonymous的最大传输速度。
anon_umask=077anonymous用户上传文件的权限掩码。

ERROR 1442 (HY000): Can't update table '...' in stored function/trigger because it is already used

Mysqlliuliangsong 发表了文章 • 0 个评论 • 129 次浏览 • 2016-12-22 16:31 • 来自相关话题

一、MySQL错误现象:MySQL执行创建的触发器时,报如下错误:ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 下面为错误触发器的创建过程:1、创建测试表格:drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)2、创建一个MySQL触发器:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;3、测试触发效果:mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 二、错误原因:  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 三、解决方案:1、将触发器的创建SQL语句改成如下并执行创建即可:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ; 触发器测试效果:aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec) 查看全部

一、MySQL错误现象:

MySQL执行创建的触发器时,报如下错误:
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

 下面为错误触发器的创建过程:

1、创建测试表格:

drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)

2、创建一个MySQL触发器:

DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;

3、测试触发效果:

mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 

二、错误原因:

  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 

三、解决方案:

1、将触发器的创建SQL语句改成如下并执行创建即可:
DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ;
 触发器测试效果:
aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec)

ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

Mysqlliuliangsong 发表了文章 • 0 个评论 • 200 次浏览 • 2016-12-22 16:08 • 来自相关话题

一、MySQL错误现象:  执行创建的存储过程或者触发器报:ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist 二、错误原因:  这样由于创建存储过程或者触发器时间,指定的DEFINER为'root'@'%',而在MySQL的权限表(mysql.user)中,并不存在相关的user和host:mysql> select host,user,password from mysql.user;
+-------------------------+------+----------+
| host | user | password |
+-------------------------+------+----------+
| localhost | root | |
| aiezu | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| aiezu | | |
+-------------------------+------+----------+ 三、解决方案:  执行下面SQL语句,为'root'@'%'授权即可:grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

select host,user,password from mysql.user; 
执行效果: 查看全部

一、MySQL错误现象:

  执行创建的存储过程或者触发器报:
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist
 

二、错误原因:

  这样由于创建存储过程或者触发器时间,指定的DEFINER'root'@'%',而在MySQL的权限表(mysql.user)中,并不存在相关的userhost
mysql> select host,user,password from mysql.user;
+-------------------------+------+----------+
| host | user | password |
+-------------------------+------+----------+
| localhost | root | |
| aiezu | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| aiezu | | |
+-------------------------+------+----------+
 

三、解决方案:

  执行下面SQL语句,为'root'@'%'授权即可:
grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

select host,user,password from mysql.user;
 
执行效果:
mysql_error_1449_hy000.png

MySQL触发器用法详解

Mysqlliuliangsong 发表了文章 • 0 个评论 • 296 次浏览 • 2016-12-22 10:53 • 来自相关话题

一、MySQL触发器创建:1、MySQL触发器的创建语法:CREATE [DEFINER = { 'user' | CURRENT_USER }] 
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body 2、MySQL创建语法中的关键词解释:字段含义可能的值DEFINER=可选参数,指定创建者,默认为当前登录用户(CURRENT_USER);
该触发器将以此参数指定的用户执行,所以需要考虑权限问题;DEFINER='root@%'
DEFINER=CURRENT_USERtrigger_name触发器名称,最好由表名+触发事件关键词+触发时间关键词组成; trigger_time触发时间,在某个事件之前还是之后;BEFORE、AFTERtrigger_event触发事件,如插入时触发、删除时触发;
  INSERT:插入操作触发器,INSERT、LOAD DATA、REPLACE时触发;
  UPDATE:更新操作触发器,UPDATE操作时触发;
  DELETE:删除操作触发器,DELETE、REPLACE操作时触发;INSERT、UPDATE、DELETEtable_name 触发操作时间的表名; trigger_order可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时(
如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以
使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。
  FOLLOWS:当前创建触发器在现有触发器之后激活;
  PRECEDES:当前创建触发器在现有触发器之前激活;FOLLOWS、PRECEDEStrigger_body触发执行的SQL语句内容,一般以begin开头,end结尾begin .. end 3、触发执行语句内容(trigger_body)中的OLD,NEW:  在trigger_body中,我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED),OLD表示将要删除的旧行(相当于MS SQL的DELETED)。通过OLD,NEW中获取它们的字段内容,方便在触发操作中使用,下面是对应事件是否支持OLD、NEW的对应关系:事件OLDNEWINSERT×√DELETE√×UPDATE√√  由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLD、NEW;
 4、MySQL分隔符(DELIMITER):  MySQL默认使用“;”作为分隔符,SQL语句遇到“;”就会提交。而我们的触发器中可能会有多个“;”符,为了防止触发器创建语句过早的提交,我们需要临时修改MySQL分隔符,创建完后,再将分隔符改回来。使用DELIMITER可以修改分隔符,如下:DELIMITER $
... --触发器创建语句;
$ --提交创建语句;
DELIMITER ; 二、MySQL触发器创建进阶:1、MySQL触发器中使用变量:  MySQL触发器中变量变量前面加'@',无需定义,可以直接使用:-- 变量直接赋值
set @num=999;

-- 使用select语句查询出来的数据方式赋值,需要加括号:
set @name =(select name from table);2、MySQL触发器中使用if语做条件判断:-- 简单的if语句:
set sex = if (new.sex=1, '男', '女');

-- 多条件if语句:
if old.type=1 then
update table ...;
elseif old.type=2 then
update table ...;
end if; 三、MySQL查看触发器:  可以使用“show triggers;”查看触发器。由于MySQL创建的触发器保存在“information_schema库中的triggers表中,所以还可以通过查询此表查看触发器:-- 通过information_schema.triggers表查看触发器:
select * from information_schema.triggers;

-- mysql 查看当前数据库的触发器
show triggers;

-- mysql 查看指定数据库"aiezu"的触发器
show triggers from aiezu; 四、MySQL删除触发器:1、可以使用drop trigger删除触发器:drop trigger trigger_name; 2、删除前先判断触发器是否存在:drop trigger if exists trigger_name 五、Msql触发器用法举例:1、MySQL触发器Insert触发更新同一张表:  下面我们有一个表“tmp1”,tmp1表有两个整型字段:n1、n2。我们要通过触发器实现,在tmp插入记录时,自动将n2字段的值设置为n1字段的5倍。
 创建测试表和触发器:-- 创建测试表
drop table if exists tmp1;
create table tmp1 (n1 int, n2 int);

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_insert$
create trigger tmp1_insert
before insert on tmp1
for each row
begin
set new.n2 = new.n1*5;
end$
DELIMITER ;测试触发更新效果:mysql> insert tmp1(n1) values(18);
Query OK, 1 row affected (0.01 sec)

mysql> insert tmp1(n1) values(99);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp1;
+------+------+
| n1 | n2 |
+------+------+
| 18 | 90 |
| 99 | 495 |
+------+------+
2 rows in set (0.00 sec) 2、MySQL触发器Update触发更新另一张表:  下面有有两个表tmp1、tmp2,两个表都有一个相同的字段name。使用触发器实现更新一个表的name时,将另外一个表的name也更新。
 创建测试表和触发器:-- 创建测试表和插入测试数据
drop table if exists tmp1;
drop table if exists tmp2;
create table tmp1 (id int, name varchar(128)) default charset='utf8';
create table tmp2 (fid int, name varchar(128)) default charset='utf8';
insert into tmp1 values(1, '爱E族');
insert into tmp2 values(1, '爱E族');

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_update$
create trigger tmp1_update
after update on tmp1
for each row
begin
update tmp2 set name=new.name where fid=new.id;
end$
DELIMITER ;测试触发更新效果:mysql> select * from tmp1;
+------+---------+
| id | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+---------+
| fid | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> update tmp1 set name='aiezu.com' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from tmp1;
+------+-----------+
| id | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+-----------+
| fid | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec) 查看全部

一、MySQL触发器创建:

1、MySQL触发器的创建语法:

CREATE [DEFINER = { 'user' | CURRENT_USER }] 
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body

 

2、MySQL创建语法中的关键词解释:

字段含义可能的值
DEFINER=可选参数,指定创建者,默认为当前登录用户(CURRENT_USER);
该触发器将以此参数指定的用户执行,所以需要考虑权限问题;
DEFINER='root@%'
DEFINER=CURRENT_USER
trigger_name触发器名称,最好由表名+触发事件关键词+触发时间关键词组成; 
trigger_time触发时间,在某个事件之前还是之后;BEFORE、AFTER
trigger_event触发事件,如插入时触发、删除时触发;
  INSERT:插入操作触发器,INSERT、LOAD DATA、REPLACE时触发;
  UPDATE:更新操作触发器,UPDATE操作时触发;
  DELETE:删除操作触发器,DELETE、REPLACE操作时触发;
INSERT、UPDATE、DELETE
table_name 触发操作时间的表名; 
trigger_order可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时(
如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以
使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。
  FOLLOWS:当前创建触发器在现有触发器之后激活;
  PRECEDES:当前创建触发器在现有触发器之前激活;
FOLLOWS、PRECEDES
trigger_body触发执行的SQL语句内容,一般以begin开头,end结尾begin .. end
 

3、触发执行语句内容(trigger_body)中的OLD,NEW:

  在trigger_body中,我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED),OLD表示将要删除的旧行(相当于MS SQL的DELETED)。通过OLD,NEW中获取它们的字段内容,方便在触发操作中使用,下面是对应事件是否支持OLD、NEW的对应关系:
事件OLDNEW
INSERT×
DELETE×
UPDATE
  由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLD、NEW;
 

4、MySQL分隔符(DELIMITER):

  MySQL默认使用“;”作为分隔符,SQL语句遇到“;”就会提交。而我们的触发器中可能会有多个“;”符,为了防止触发器创建语句过早的提交,我们需要临时修改MySQL分隔符,创建完后,再将分隔符改回来。使用DELIMITER可以修改分隔符,如下:
DELIMITER $
... --触发器创建语句;
$ --提交创建语句;
DELIMITER ;
 

二、MySQL触发器创建进阶:

1、MySQL触发器中使用变量:

  MySQL触发器中变量变量前面加'@',无需定义,可以直接使用:
-- 变量直接赋值
set @num=999;

-- 使用select语句查询出来的数据方式赋值,需要加括号:
set @name =(select name from table);

2、MySQL触发器中使用if语做条件判断:

-- 简单的if语句:
set sex = if (new.sex=1, '男', '女');

-- 多条件if语句:
if old.type=1 then
update table ...;
elseif old.type=2 then
update table ...;
end if;
 

三、MySQL查看触发器:

  可以使用“show triggers;”查看触发器。由于MySQL创建的触发器保存在“information_schema库中的triggers表中,所以还可以通过查询此表查看触发器:
-- 通过information_schema.triggers表查看触发器:
select * from information_schema.triggers;

-- mysql 查看当前数据库的触发器
show triggers;

-- mysql 查看指定数据库"aiezu"的触发器
show triggers from aiezu;
 

四、MySQL删除触发器:

1、可以使用drop trigger删除触发器:

drop trigger trigger_name;
 

2、删除前先判断触发器是否存在:

drop trigger if exists trigger_name
 

五、Msql触发器用法举例:

1、MySQL触发器Insert触发更新同一张表:

  下面我们有一个表“tmp1”,tmp1表有两个整型字段:n1、n2。我们要通过触发器实现,在tmp插入记录时,自动将n2字段的值设置为n1字段的5倍。
 创建测试表和触发器:
-- 创建测试表
drop table if exists tmp1;
create table tmp1 (n1 int, n2 int);

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_insert$
create trigger tmp1_insert
before insert on tmp1
for each row
begin
set new.n2 = new.n1*5;
end$
DELIMITER ;
测试触发更新效果:
mysql> insert tmp1(n1) values(18);
Query OK, 1 row affected (0.01 sec)

mysql> insert tmp1(n1) values(99);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp1;
+------+------+
| n1 | n2 |
+------+------+
| 18 | 90 |
| 99 | 495 |
+------+------+
2 rows in set (0.00 sec)
 

2、MySQL触发器Update触发更新另一张表:

  下面有有两个表tmp1、tmp2,两个表都有一个相同的字段name。使用触发器实现更新一个表的name时,将另外一个表的name也更新。
 创建测试表和触发器:
-- 创建测试表和插入测试数据
drop table if exists tmp1;
drop table if exists tmp2;
create table tmp1 (id int, name varchar(128)) default charset='utf8';
create table tmp2 (fid int, name varchar(128)) default charset='utf8';
insert into tmp1 values(1, '爱E族');
insert into tmp2 values(1, '爱E族');

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_update$
create trigger tmp1_update
after update on tmp1
for each row
begin
update tmp2 set name=new.name where fid=new.id;
end$
DELIMITER ;
测试触发更新效果:
mysql> select * from tmp1;
+------+---------+
| id | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+---------+
| fid | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> update tmp1 set name='aiezu.com' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from tmp1;
+------+-----------+
| id | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+-----------+
| fid | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

vim简体中文帮助手册下载和安装

Linuxliuliangsong 发表了文章 • 0 个评论 • 218 次浏览 • 2016-12-21 09:29 • 来自相关话题

一、下载目录介绍:1、pdf-manual目录:  pdf格式vim简体中文帮助手册。现在一般最新版本的浏览器都支持浏览pdf,所以下载后基本上能直接使用浏览器打开。如果无法使用浏览器打开,请安装一个pdf阅读器打开。
 2、win32-install目录:  这是vim中文帮助手册的windows安装版,只能安装在装有vim编辑器的windows的电脑上。下载后双击即可安装,安装程序会自动检测你的vim安装目录。
  3、vimcdoc目录:  这是vim中文帮助手册的Linux/unix安装版,下载后使用tar命令解压,然后进入解压目录,使用“./vimcdoc.sh -i”命令即可安装:tar -zxvf vimcdoc-1.9.0.tar.gz
cd vimcdoc-1.9.0
./vimcdoc.sh -i  安装好后,在vim中,输入:help命令,即显示vim的中文帮助文档,效果如下:


  进入帮助文档后,将关标移动到子文档名上,然后按CTRL+]可以进入子文档,在子文档按CTRL+T返回主帮助文档。按CTRL+W+方向键可以切换光标所在的窗口。
 二、vim help下载地址:1、vim中文文档下载地址:  本文提供vim简体中文帮助手册的两个下载地址,百度云下载和sourceforge.net下载:sourceforge.net下载:https://sourceforge.net/projects/vimcdoc/files/百度云下载:http://pan.baidu.com/s/1mhIPY1E
 2、vim版本与下载文件关系:vim 7.4下载:简体中文帮助收册的1.9.0版;vim 7.3下载:简体中文帮助收册的1.8.0版; 查看全部

一、下载目录介绍:

1、pdf-manual目录:

  pdf格式vim简体中文帮助手册。现在一般最新版本的浏览器都支持浏览pdf,所以下载后基本上能直接使用浏览器打开。如果无法使用浏览器打开,请安装一个pdf阅读器打开。
 

2、win32-install目录:

  这是vim中文帮助手册的windows安装版,只能安装在装有vim编辑器的windows的电脑上。下载后双击即可安装,安装程序会自动检测你的vim安装目录。
  

3、vimcdoc目录:

  这是vim中文帮助手册的Linux/unix安装版,下载后使用tar命令解压,然后进入解压目录,使用“./vimcdoc.sh -i”命令即可安装:
tar -zxvf vimcdoc-1.9.0.tar.gz
cd vimcdoc-1.9.0
./vimcdoc.sh -i
  安装好后,在vim中,输入:help命令,即显示vim的中文帮助文档,效果如下:
vimdoc_download_install.png
  进入帮助文档后,将关标移动到子文档名上,然后按CTRL+]可以进入子文档,在子文档按CTRL+T返回主帮助文档。按CTRL+W+方向键可以切换光标所在的窗口。
 

二、vim help下载地址:

1、vim中文文档下载地址:

  本文提供vim简体中文帮助手册的两个下载地址,百度云下载和sourceforge.net下载:
 

2、vim版本与下载文件关系:

  • vim 7.4下载:简体中文帮助收册的1.9.0版;
  • vim 7.3下载:简体中文帮助收册的1.8.0版;

Vim编辑器之《Vim常用选项合集》

Linuxliuliangsong 发表了文章 • 0 个评论 • 168 次浏览 • 2016-12-18 23:48 • 来自相关话题

  在vim编辑器中,有很多选项用于控制vim的运行。你可以在使用vim的时候在vim编辑器中临时设置,也可以将选项设置在"~/.vimrc"文件中,让vim命令每次启动时自动加载。
  你可以使用":set"命令查看当前vim的设置的选项,使用":set all"命令查看vim所有支持的选项。有很多选项是打开(on)/关闭(off)一个功能,如num行号显示/隐藏选项,你可以使用":set num"显示行号、":set nonum"隐藏行号:组选项描述用法:set all显示所有选项和设置; :set显示当前设置的所有选项; :set num?显示num选项的当前设置;num可以换成其他选项; :set num
:set nonum打开选项与关闭选项;
num可以换成其他选项; num/nonum是/否显示行号; wrap/nowrap是(默认)/否自动换行; wrapmargin=n设置右边界的值,当输入时到达右边界,并遇到空格时,会自动插入换行; aw/noaw 临时转入shell或使用":n"编辑其他文件时,是/否自动保存当前文件已做的修改; flash/noflash在出错处使用闪烁提醒/使用呜叫提醒;缩进ai/noaiautoindent是/否使用自动缩进方式,新行与前面的行保持—致的缩进; smartindentsmartindent/nosmartindent:是否使用能识别类C语法的智能缩进方式; cindentcindent/nocindent:是/否使用cindent缩进方式; indentexprindentexpr/noindentexpr:是/否使用indentexpr缩进方式; indenttype=缩进方式:autoindent、smartindent、cindent、indentexpr(同上); shiftwidth=n自动缩进字符数; tabstop=n 将TAB键的宽度设置为n个宁符宽度,默认为8;编码encoding=设置vim内部使用的编码字符集;如:prc; fileencoding=设置当前编辑的文件的字符编码方式;如:utf-8; fileencodings=设置vim自动探测fileencoding的顺序列表;如:"ucs-bom,utf-8,latin1"; termencoding=vim工作的终端的编码方式;如:utf-8; ambiwidth=设置汉字所占字符宽度;如:double;搜索ic/noic搜索时忽赂大小写/不忽略大小写(默认); wrapscan在搜索时到达文件尾后是/否跳文件头继续搜索; incsearchincsearch/noincsearch:输入搜索关键字时,是/否(默认)自动高亮匹配的字符; hlsearchhlsearch/nohlsearch:搜索后,是/否(默认)保留匹配字符的高亮显示编程syntax=on/off:是/否显示语法高亮;保存ro/noro是/否只读模式,只读模式写只能通过强制方式":w!"写入,否则无法写入; history=nhistory记录的行数,默认100个历史记录;filefiletype on侦测文件类型; filetype plugin on载入文件类型插件; filetype indent on为特定文件类型载入相关缩进文件; report=n复制或者删除了多少行时显示提示信息,默认为2; laststatus=0,1,2是否显示状态栏,0:不显示,1:需要时间显示,2:总是显示; list/nolist是/否将tab、换行符使用替代字符显示(^I、$); shell=path设置vim执行外部命令时使用的shell路径,如:/bin/bash; showmatch设置输入右半边括号时,是/否(默认)提示所对应的左半边括号; showmode设置是(默认)/否在窗口左下角显示当前的模式:插入、替换等模式; compatible除非.vimrc文件存在,默认vim会尝试采用vi兼容的模式; 相关文章:vim编辑器学习之《vim编辑命令快捷键》Vim编辑器之《Vim常用选项合集》Vim go语言基础IDE开发环境安装(Vundle/vim-go)vim go语言IDE环境Tagbar插件和NERDTree插件安装 查看全部
  在vim编辑器中,有很多选项用于控制vim的运行。你可以在使用vim的时候在vim编辑器中临时设置,也可以将选项设置在"~/.vimrc"文件中,让vim命令每次启动时自动加载。
  你可以使用":set"命令查看当前vim的设置的选项,使用":set all"命令查看vim所有支持的选项。有很多选项是打开(on)/关闭(off)一个功能,如num行号显示/隐藏选项,你可以使用":set num"显示行号、":set nonum"隐藏行号:
选项描述
用法:set all显示所有选项和设置;
 :set显示当前设置的所有选项;
 :set num?显示num选项的当前设置;num可以换成其他选项;
 :set num
:set nonum
打开选项与关闭选项;
num可以换成其他选项;
 num/nonum是/否显示行号;
 wrap/nowrap是(默认)/否自动换行;
 wrapmargin=n设置右边界的值,当输入时到达右边界,并遇到空格时,会自动插入换行;
 aw/noaw 临时转入shell或使用":n"编辑其他文件时,是/否自动保存当前文件已做的修改;
 flash/noflash在出错处使用闪烁提醒/使用呜叫提醒;
缩进ai/noaiautoindent是/否使用自动缩进方式,新行与前面的行保持—致的缩进;
 smartindentsmartindent/nosmartindent:是否使用能识别类C语法的智能缩进方式;
 cindentcindent/nocindent:是/否使用cindent缩进方式;
 indentexprindentexpr/noindentexpr:是/否使用indentexpr缩进方式;
 indenttype=缩进方式:autoindent、smartindent、cindent、indentexpr(同上);
 shiftwidth=n自动缩进字符数;
 tabstop=n 将TAB键的宽度设置为n个宁符宽度,默认为8;
编码encoding=设置vim内部使用的编码字符集;如:prc
 fileencoding=设置当前编辑的文件的字符编码方式;如:utf-8;
 fileencodings=设置vim自动探测fileencoding的顺序列表;如:"ucs-bom,utf-8,latin1";
 termencoding=vim工作的终端的编码方式;如:utf-8;
 ambiwidth=设置汉字所占字符宽度;如:double;
搜索ic/noic搜索时忽赂大小写/不忽略大小写(默认);
 wrapscan在搜索时到达文件尾后是/否跳文件头继续搜索;
 incsearchincsearch/noincsearch:输入搜索关键字时,是/否(默认)自动高亮匹配的字符;
 hlsearchhlsearch/nohlsearch:搜索后,是/否(默认)保留匹配字符的高亮显示
编程syntax=on/off:是/否显示语法高亮;
保存ro/noro是/否只读模式,只读模式写只能通过强制方式":w!"写入,否则无法写入;
 history=nhistory记录的行数,默认100个历史记录;
filefiletype on侦测文件类型;
 filetype plugin on载入文件类型插件;
 filetype indent on为特定文件类型载入相关缩进文件;
 report=n复制或者删除了多少行时显示提示信息,默认为2;
 laststatus=0,1,2是否显示状态栏,0:不显示,1:需要时间显示,2:总是显示;
 list/nolist是/否将tab、换行符使用替代字符显示(^I、$);
 shell=path设置vim执行外部命令时使用的shell路径,如:/bin/bash;
 showmatch设置输入右半边括号时,是/否(默认)提示所对应的左半边括号;
 showmode设置是(默认)/否在窗口左下角显示当前的模式:插入、替换等模式;
 compatible除非.vimrc文件存在,默认vim会尝试采用vi兼容的模式;
 

相关文章:

vim编辑器学习之《vim编辑命令快捷键》

Linuxliuliangsong 发表了文章 • 0 个评论 • 214 次浏览 • 2016-12-17 13:00 • 来自相关话题

  Vim是Linux/Unix平台的一款使用复杂、功能十分强大、且又非常常用的文本编辑器。它有非常多的快捷键、熟练掌握它们,能极大的提高工作效率。下面是爱E族整理的vim中常用的命令,供大家参考。要系统的学习了解vim,大家可以前往:http://vimcdoc.sourceforge.net/doc/ 命令描述保
存:r读入;':r file'从file文件读入;':5 r !command':从命令中读入到第5行后;:w保存;':w':强制保存;':w! file'强制保存到file文件;:q退出;q!:强制退出;:wq,:x保存退出;':x!'、':wq!':强制保存退出;ZQ,ZZ无论如何退出当前编辑;ZQ:放弃未保存内容;ZZ:自动保存修改的内容;:sh进入到shell终端,退出shell后可回到vim当前的编辑;CTRL+Z将vim压人后台运行回到shell,在shell中使用fg命令可恢复vim编辑,jobs查看任务;:!command临时执行shell命令;光


动←↓↑→ 按字符移动,使用方向键,或者用h: ←、 j: ↓、 k:↑、 l:→ 退格,空格退格(命令模式):左移一格;空格(命令模式):右移一格;w移动到下个单词开始处;3w:移动到后面第3个单词开始处;b移动到上个单词开始处;2b:移动到前面第2个单词开始处;e移动到下个单词结尾处;2e:移动到后面第2个单词结尾处;ge移动到上个单词结尾处;2ge:移动到前面第2个单词结尾处;W,B,E,gE同w,b,ge,但对单词的判断更宽松;^,0移动到行首;$移动到行尾;5$:移动到第5行结尾;(,)(:把光标移到完整句子的句首;):把光标移到完整句子的句尾;{,}{:把光标移到完整段落的段首;}:把光标移到完整段落的段尾;f向后移动到指定字符位置;fa:移动到'a'处;4f1:移动到第4个'1'处;F向前移动到指定字符位置;Fb:前移到'b'处;4f8:前移到第4个'8'处;t同f,只是移动到查找字符的前一个字符;T同F,只是移动到查找字符的后一个字符;%移动到与当前位置括弧成对的另一个括弧位置:{..},(..),[..];按

移-,+,Enter-:下移一行;+,回车:下移一行;j,k按行下、上移动;4j:下移4行;5k:上移5行;gg移动到文件首行;5gg:移动到第5行;G移动到文件末行;8G:移动到第8行;%移动到文件百分比位置;10%:移动到文件10%位置;历

&

签``跳回到光标的上一次的位置;CTRL+O无限跳回光标的上一个位置;":jumps"能显示调往的位置列表;CTRL+I无限跳往光标的下一个位置;:makrs显示所有书签;m创建一个书签;mo:创建一个名称为'o'的书签;`跳转到书签位置;`a:调整到书签'a'的位置;宏qqa:开始录制宏,宏名为'a';@@a,5@a:执行宏'a'1次、5次;滚
屏H,M,L移动到屏首、中、尾;zt,zz,zb滚屏使光标位于屏幕首、中、尾部;CTRL+..B、F向上、下滚一屏;U、D向上、下滚半屏;Y、E向上、下滚一行;查

&

换/String搜索字符串Str,Str可以是普通字符串或者正则表达式;
.*[]^%/\?~$在有特殊含义,如要查找它们,需要在前面加上一个"\"字符;
/str/-num,/str/+num:查找后跳转到匹配行的前num行、后num行;
查找时,可以使用'n'查找下一个,使用'N'查找上一个;?String同'/'; 只是"?"是向前查找;
?str?-num,?str?+num:查找后跳转到匹配行的前num行、后num行;:%s/././%s/a/b/:将a替换成b,替换一次;%s/a/b/g:将全部a替换成b;
%s/a/b/gc:查找所有a并询问是否替换为b;
20,30s#a#b#g:将20-30行的a全部替换成b;插
入i,Ii:在当前位置前插入;I:在当前行首个非不可见字符前插入;a,Aa:在当前位置后插入;A:在行尾插入;o,Oo:在当前行下面插入文本;O:在当前行上面插入文本;删
除x,Xx、4x:删右1个、4个字符;X、5X:删左边1个、5个字符;D删除光标到行尾;4D:删除光标到行尾、和光标下面3行;dwdw:删除单词和单词后的空格;d4w:删除4个单词和最后的空格;dede:删除单词,保留单词后空格;d4e:删除4个单词,但保留最后的空格;di删除标记内的内容;di(、di[、di{:删除一对()、[]、{}中的内容;dt删除光标到指定标记之间的内容;dt.:删除光标到'.'间的内容;dT删除指定标记到光标之间的内容;dTs:删除字符's'到光标间的内容;d^,d$d^:删除当前到行首字符;d$:删除当前位置到行尾字符;dddd:删除整行;4dd、d4d:删除4行;:n1,n2 d删除n1-n2的所有行;JJ、5J:将2行、5行连成一行(删除首尾缩进、换行符、空格,使用空格连接多行);gJgJ、5gJ:将2行、5行连成一行(删除尾部换行符,保留空格、缩进);删



入C同D,不过删除后进入插入模式;cw,ce同dw,de,不过删除后进入插入模式;ci,ct,cT同ci,ct,CT,不过删除后进入插入模式;c^,c$同d^,d$,不过删除后进入插入模式;cc同dd,不过删除后进入插入模式;ss、4s:删除1、4个字符后进入插入模式;SS、4S:删除1、4行后进入插入模式;xp交换光标当前位置开始的两个字符的位置;覆
写r,grr、4r使用输入字符替换1个、4个字符;gr:按字符宽度替换;R,gR进入替换输入模式,输入一个字符替换一个字符;gR:按字符宽度替换;复
制yyw、ye、y^、y$、yy、5yy:复制单词、单词、到行首、到行尾、整行、5行;Y同yy,按整行复制;pp:粘贴;5p粘贴5次;注:最后删除的内容会寄存在粘贴板,可以用来粘贴;P同p,不过如果是粘贴整行内容时,p粘贴到当前行下,而P粘贴在当前行上面;大

写~修改光标下字符的大小写,并移动到下一个字符;g~g~4,g~5w,6g~~:转换4个字符、5个单词、6行字符的大小写;gUgU4<空格>,gU5e,6gUU:转换4个字符、5个单词、6行为大写;gugu4<空格>,gu5e,6guu:转换4个字符、5个单词、6行为小写;撤
销u,Uu: 撤销上一个操作;U:撤销当前行所有的操作;CTRL-R恢复被撤销的操作;.重复上一个修改,由爱E族整理,未授权不得转载;Exd删除行(del),':.,100 d':删除当前行到100行的所有行;co拷贝行(copy),':2,5 co 8':将2-5行复制到第8行;m移动行(move),':20,. $':当20行到当前行移动到文件尾;可


式v进入可视模式,然后可按方向键选取文本后进行复制、删除等操作;V进入可视模式,按行选取;CTRL+V进入可视模式,按列选取;o,O可视模式下,o:调到对角去选取;O:跳到对面去选取;移
动>右移一个tab宽度;>5gg、>G、>gg:第5行、文件尾、文件头到当前行右移;>>右移一个tab宽度;3>>:3行右移一个tab宽度;<同'>',不过<为左移;<<同'>>',不过<<为左移;对
齐:%le':%le':全部左对齐;':10,20le':10-20行左对齐;:%ce':%ce':全部居中对齐;':10,20ce':10-20行居中对齐;:%ri':%ri':全部右对齐;':10,20ri':10-20行右对齐;其
他CTRL+G显示当前文件名和位置;CTRL+L清除其他进程对vim窗口的干扰信息;CTRL+V输入控制字符;如:按CTRL+V,后按CTRL+M可输入'^M'字符;K根据当前位置的关键词去查找帮助手册;Q进入“Ex”模式;ga打印光标所在处的字符的 ascii 值:%!xxd进入十六进制编辑模式;:%!xxd -r恢复文本编辑模式;:ab定义缩写,如':ab aiezu aiezu.com',这样输入aiezu时间自动变为aiezu.com。其他:要替换特殊字符,如'^M',可以不能直接输入^M,要使用CTRL+V后,再按CTRL+M输入。vim -r file:恢复由意外退出未保存的vim编辑;view file:以只读的方式打开vim文件编辑;
 相关文章:vim编辑器学习之《vim编辑命令快捷键》Vim编辑器之《Vim常用选项合集》Vim go语言基础IDE开发环境安装(Vundle/vim-go)vim go语言IDE环境Tagbar插件和NERDTree插件安装 查看全部
  Vim是Linux/Unix平台的一款使用复杂、功能十分强大、且又非常常用的文本编辑器。它有非常多的快捷键、熟练掌握它们,能极大的提高工作效率。下面是爱E族整理的vim中常用的命令,供大家参考。要系统的学习了解vim,大家可以前往:http://vimcdoc.sourceforge.net/doc/
 命令描述

:r读入;':r file'从file文件读入;':5 r !command':从命令中读入到第5行后;
:w保存;':w':强制保存;':w! file'强制保存到file文件;
:q退出;q!:强制退出;
:wq,:x保存退出;':x!'、':wq!':强制保存退出;
ZQ,ZZ无论如何退出当前编辑;ZQ:放弃未保存内容;ZZ:自动保存修改的内容;
:sh进入到shell终端,退出shell后可回到vim当前的编辑;
CTRL+Z将vim压人后台运行回到shell,在shell中使用fg命令可恢复vim编辑,jobs查看任务;
:!command临时执行shell命令;



←↓↑→ 按字符移动,使用方向键,或者用h: ←、 j: ↓、 k:↑、 l:→ 
退格,空格退格(命令模式):左移一格;空格(命令模式):右移一格;
w移动到下个单词开始处;3w:移动到后面第3个单词开始处;
b移动到上个单词开始处;2b:移动到前面第2个单词开始处;
e移动到下个单词结尾处;2e:移动到后面第2个单词结尾处;
ge移动到上个单词结尾处;2ge:移动到前面第2个单词结尾处;
W,B,E,gE同w,b,ge,但对单词的判断更宽松;
^,0移动到行首;
$移动到行尾;5$:移动到第5行结尾;
(,)(:把光标移到完整句子的句首;):把光标移到完整句子的句尾;
{,}{:把光标移到完整段落的段首;}:把光标移到完整段落的段尾;
f向后移动到指定字符位置;fa:移动到'a'处;4f1:移动到第4个'1'处;
F向前移动到指定字符位置;Fb:前移到'b'处;4f8:前移到第4个'8'处;
t同f,只是移动到查找字符的前一个字符;
T同F,只是移动到查找字符的后一个字符;
%移动到与当前位置括弧成对的另一个括弧位置:{..},(..),[..];


-,+,Enter-:下移一行;+,回车:下移一行;
j,k按行下、上移动;4j:下移4行;5k:上移5行;
gg移动到文件首行;5gg:移动到第5行;
G移动到文件末行;8G:移动到第8行;
%移动到文件百分比位置;10%:移动到文件10%位置;


&

``跳回到光标的上一次的位置;
CTRL+O无限跳回光标的上一个位置;":jumps"能显示调往的位置列表;
CTRL+I无限跳往光标的下一个位置;
:makrs显示所有书签;
m创建一个书签;mo:创建一个名称为'o'的书签;
`跳转到书签位置;`a:调整到书签'a'的位置;
qqa:开始录制宏,宏名为'a';
@@a,5@a:执行宏'a'1次、5次;

H,M,L移动到屏首、中、尾;
zt,zz,zb滚屏使光标位于屏幕首、中、尾部;
CTRL+..B、F向上、下滚一屏;U、D向上、下滚半屏;Y、E向上、下滚一行;


&

/String搜索字符串Str,Str可以是普通字符串或者正则表达式;
.*[]^%/\?~$在有特殊含义,如要查找它们,需要在前面加上一个"\"字符;
/str/-num,/str/+num:查找后跳转到匹配行的前num行、后num行;
查找时,可以使用'n'查找下一个,使用'N'查找上一个;
?String同'/'; 只是"?"是向前查找;
?str?-num,?str?+num:查找后跳转到匹配行的前num行、后num行;
:%s/././%s/a/b/:将a替换成b,替换一次;%s/a/b/g:将全部a替换成b;
%s/a/b/gc:查找所有a并询问是否替换为b;
20,30s#a#b#g:将20-30行的a全部替换成b;

i,Ii:在当前位置前插入;I:在当前行首个非不可见字符前插入;
a,Aa:在当前位置后插入;A:在行尾插入;
o,Oo:在当前行下面插入文本;O:在当前行上面插入文本;

x,Xx、4x:删右1个、4个字符;X、5X:删左边1个、5个字符;
D删除光标到行尾;4D:删除光标到行尾、和光标下面3行;
dwdw:删除单词和单词后的空格;d4w:删除4个单词和最后的空格;
dede:删除单词,保留单词后空格;d4e:删除4个单词,但保留最后的空格;
di删除标记内的内容;di(、di[、di{:删除一对()、[]、{}中的内容;
dt删除光标到指定标记之间的内容;dt.:删除光标到'.'间的内容;
dT删除指定标记到光标之间的内容;dTs:删除字符's'到光标间的内容;
d^,d$d^:删除当前到行首字符;d$:删除当前位置到行尾字符;
dddd:删除整行;4dd、d4d:删除4行;
:n1,n2 d删除n1-n2的所有行;
JJ、5J:将2行、5行连成一行(删除首尾缩进、换行符、空格,使用空格连接多行);
gJgJ、5gJ:将2行、5行连成一行(删除尾部换行符,保留空格、缩进);




C同D,不过删除后进入插入模式;
cw,ce同dw,de,不过删除后进入插入模式;
ci,ct,cT同ci,ct,CT,不过删除后进入插入模式;
c^,c$同d^,d$,不过删除后进入插入模式;
cc同dd,不过删除后进入插入模式;
ss、4s:删除1、4个字符后进入插入模式;
SS、4S:删除1、4行后进入插入模式;
xp交换光标当前位置开始的两个字符的位置;

r,grr、4r使用输入字符替换1个、4个字符;gr:按字符宽度替换;
R,gR进入替换输入模式,输入一个字符替换一个字符;gR:按字符宽度替换;

yyw、ye、y^、y$、yy、5yy:复制单词、单词、到行首、到行尾、整行、5行;
Y同yy,按整行复制;
pp:粘贴;5p粘贴5次;注:最后删除的内容会寄存在粘贴板,可以用来粘贴;
P同p,不过如果是粘贴整行内容时,p粘贴到当前行下,而P粘贴在当前行上面;


~修改光标下字符的大小写,并移动到下一个字符;
g~g~4,g~5w,6g~~:转换4个字符、5个单词、6行字符的大小写;
gUgU4<空格>,gU5e,6gUU:转换4个字符、5个单词、6行为大写;
gugu4<空格>,gu5e,6guu:转换4个字符、5个单词、6行为小写;

u,Uu: 撤销上一个操作;U:撤销当前行所有的操作;
CTRL-R恢复被撤销的操作;
.重复上一个修改,由爱E族整理,未授权不得转载;
Exd删除行(del),':.,100 d':删除当前行到100行的所有行;
co拷贝行(copy),':2,5 co 8':将2-5行复制到第8行;
m移动行(move),':20,. $':当20行到当前行移动到文件尾;



v进入可视模式,然后可按方向键选取文本后进行复制、删除等操作;
V进入可视模式,按行选取;
CTRL+V进入可视模式,按列选取;
o,O可视模式下,o:调到对角去选取;O:跳到对面去选取;

>右移一个tab宽度;>5gg、>G、>gg:第5行、文件尾、文件头到当前行右移;
>>右移一个tab宽度;3>>:3行右移一个tab宽度;
<同'>',不过<为左移;
<<同'>>',不过<<为左移;

:%le':%le':全部左对齐;':10,20le':10-20行左对齐;
:%ce':%ce':全部居中对齐;':10,20ce':10-20行居中对齐;
:%ri':%ri':全部右对齐;':10,20ri':10-20行右对齐;

CTRL+G显示当前文件名和位置;
CTRL+L清除其他进程对vim窗口的干扰信息;
CTRL+V输入控制字符;如:按CTRL+V,后按CTRL+M可输入'^M'字符;
K根据当前位置的关键词去查找帮助手册;
Q进入“Ex”模式;
ga打印光标所在处的字符的 ascii 值
:%!xxd进入十六进制编辑模式;
:%!xxd -r恢复文本编辑模式;
:ab定义缩写,如':ab aiezu aiezu.com',这样输入aiezu时间自动变为aiezu.com。

其他:

  1. 要替换特殊字符,如'^M',可以不能直接输入^M,要使用CTRL+V后,再按CTRL+M输入。
  2. vim -r file:恢复由意外退出未保存的vim编辑;
  3. view file:以只读的方式打开vim文件编辑;

 

相关文章:

Linux curl命令使用代理、以及代理种类介绍

Linuxliuliangsong 发表了文章 • 0 个评论 • 1199 次浏览 • 2016-12-07 11:40 • 来自相关话题

  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  一、代理服务器分类:  我们比较常用、支持http(s)协议代理主要分为两大类:http代理和socks代理,见下表:大类小类子类描述http代理http代理
https代理透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议只支持TCP应用;SOCKS4A支持TCP应用;支持服务器端域名解析;SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6; 二、Linux curl命令代理设置参数:  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:参数用法-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;
 三、Linux curl命令设置代理举例:1、linux curl命令设置http代理:# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php 2、Linux curl命令设置socks代理:#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php 四、测试代理的隐匿度:1、测试前准备:  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  2、测试使用不同代理输出结果:  ①.  通过linux curl不使用代理访问:[root@aiezu.com ~]# curl http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.112.104.126
)  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理。

  ④. 通过linux curl命令使用http高匿名代理访问:[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.232.1.13
)  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理。
  
  ④. 通过linux curl命令使用socks5代理访问:[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 180.96.54.198
)  可以看出此SOCKS5代理也是高匿名代理。
  五、附录:Linux curl命令详解 查看全部
  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  

一、代理服务器分类:

  我们比较常用、支持http(s)协议代理主要分为两大类:http代理socks代理,见下表:
大类小类子类描述
http代理http代理
https代理
透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;
匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;
高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;
SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议
只支持TCP应用;
SOCKS4A支持TCP应用;支持服务器端域名解析;
SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6;
 

二、Linux curl命令代理设置参数:

  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:
参数用法
-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;

 

三、Linux curl命令设置代理举例:

1、linux curl命令设置http代理:

# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
 

2、Linux curl命令设置socks代理:

#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php
 

四、测试代理的隐匿度:

1、测试前准备:

  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:
<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);
  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  

2、测试使用不同代理输出结果:

  ①.  通过linux curl不使用代理访问:
[root@aiezu.com ~]# curl http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.112.104.126
)
  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:
[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php 
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)
  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:
[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php 
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)
  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理

  ④. 通过linux curl命令使用http高匿名代理访问:
[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.232.1.13
)
  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理
  
  ④. 通过linux curl命令使用socks5代理访问:
[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 180.96.54.198
)
  可以看出此SOCKS5代理也是高匿名代理。
  

五、附录:

Linux curl命令http cookie详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 211 次浏览 • 2016-12-07 08:35 • 来自相关话题

  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 一、Linux curl命令Cookie的接收:1、cookie接收原理:  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:


  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 2、linux curl命令接收cookie(-c):  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98 二、Linux curl命令发送Cookie:1、cookie发送原理和从cookie文件中发送:  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:<?php print_r($_COOKIE);  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 3、linux curl命令使用"-H"参数发送cookie:  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 三、附录:Linux curl命令详解
  查看全部
  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 

一、Linux curl命令Cookie的接收:

1、cookie接收原理:

  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:
<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');
  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:
linux_curl_http_header_cookie.png
  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 

2、linux curl命令接收cookie(-c):

  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。
[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98
 

二、Linux curl命令发送Cookie:

1、cookie发送原理和从cookie文件中发送:

  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:
<?php print_r($_COOKIE);
  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:
[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact
  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 

2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:

  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:
[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

3、linux curl命令使用"-H"参数发送cookie:

  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:
[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

三、附录:


 

PHP php://memory、php://temp流用法解析

PHPliuliangsong 发表了文章 • 0 个评论 • 169 次浏览 • 2016-12-06 12:42 • 来自相关话题

一、php://memory流介绍:  php://memory流类似如一个文件,支持读写操作;使用fopen()、fclose()函数打开流,使用fseek()、rewind()函数移动流指针, 使用ftell()、feof() 函数获取流指针当前的位置。
  与普通文件不同的是,php://memory流的数据是写在内存中,速度比普通文件快很多。不过由于直接占用内存,不建议将大数据写入此流。php://memory流适合用于存放需要多次重复、频繁使用,数据量不大的临时内容。
内存填充测试:<?php
echo sprintf("填充前内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
$mem = fopen('php://memory', 'r+');
for($i=0; $i<10000; $i++) {
fwrite($mem, str_repeat('aiezu.com', 1000));
}
echo sprintf("填充后内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
fclose($mem);
echo sprintf("内存释放后占用: %.2fMB\n", memory_get_usage()/1024/1024);测试结果:[root@aiezu.com ~]# php test.php
填充前内存占用: 0.21MB
填充后内存占用: 86.05MB
内存释放后占用: 0.21MB  二、php://temp流介绍:  php://temp流与php://memory流用法和功能基本相同,只是默认当写入的数据达到2MB时,数据将由写入在内存变为写入到临时文件。写入的临时文件名为sys_get_temp_dir()函数获取的目录下以"php"开头的随机文件名;可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据才写入到临时文件;php://temp流比较适合用于存放数据量比较大,且需要重复读取的数据。
  下面是通过linux curl上传csv的简单的例子,用于演示php://temp的用法;由于此例未重复使用这些csv数据,只做演示用,实际应用中此例完全可以去掉使用php://temp流。
网站端test.php代码:<?php
//设置编码,不然中文会乱码
setlocale(LC_ALL, array('zh_CN.UTF-8', 'zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));
if ( strtolower($_SERVER['CONTENT_TYPE']) == "application/csv" ) {
$input = fopen("php://input", 'r');
$temp = fopen("php://temp/maxmemory:0", 'r+');
while( $buffer = fread($input, 1024) ) {
fwrite($temp, $buffer);
}
fclose($input);
rewind($temp); //指针移动到文件头

fgetcsv($temp); //跳过标题行
while($data = fgetcsv($temp)) {
print_r($data);
//将数据写入数据库或者其他复杂计算操作
//...
}
}客户端site.csv数据:站点,url,行业
天猫,tmall.com,电子商务
腾讯,qq.com,社交网络
新浪,sina.com.cn,门户
...linux curl上传csv数据命令:[root@aiezu.com ~]# curl -H "Content-Type: application/csv" --data-binary @site.csv http://aiezu.com/test.php
Array
(
[0] => 天猫
[1] => tmall.com
[2] => 电子商务
)
Array
(
[0] => 腾讯
[1] => qq.com
[2] => 社交网络
)
Array
(
[0] => 新浪
[1] => sina.com.cn
[2] => 门户
)
... 三、附录:PHP 输入输出流合集 查看全部

一、php://memory流介绍:

  php://memory流类似如一个文件,支持读写操作;使用fopen()、fclose()函数打开流,使用fseek()、rewind()函数移动流指针, 使用ftell()、feof() 函数获取流指针当前的位置。
  与普通文件不同的是,php://memory流的数据是写在内存中,速度比普通文件快很多。不过由于直接占用内存,不建议将大数据写入此流。php://memory流适合用于存放需要多次重复、频繁使用,数据量不大的临时内容。
内存填充测试:
<?php
echo sprintf("填充前内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
$mem = fopen('php://memory', 'r+');
for($i=0; $i<10000; $i++) {
fwrite($mem, str_repeat('aiezu.com', 1000));
}
echo sprintf("填充后内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
fclose($mem);
echo sprintf("内存释放后占用: %.2fMB\n", memory_get_usage()/1024/1024);
测试结果:
[root@aiezu.com ~]# php test.php
填充前内存占用: 0.21MB
填充后内存占用: 86.05MB
内存释放后占用: 0.21MB
  

二、php://temp流介绍:

  php://temp流与php://memory流用法和功能基本相同,只是默认当写入的数据达到2MB时,数据将由写入在内存变为写入到临时文件。写入的临时文件名为sys_get_temp_dir()函数获取的目录下以"php"开头的随机文件名;可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据才写入到临时文件;php://temp流比较适合用于存放数据量比较大,且需要重复读取的数据。
  下面是通过linux curl上传csv的简单的例子,用于演示php://temp的用法;由于此例未重复使用这些csv数据,只做演示用,实际应用中此例完全可以去掉使用php://temp流。
网站端test.php代码:
<?php
//设置编码,不然中文会乱码
setlocale(LC_ALL, array('zh_CN.UTF-8', 'zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));
if ( strtolower($_SERVER['CONTENT_TYPE']) == "application/csv" ) {
$input = fopen("php://input", 'r');
$temp = fopen("php://temp/maxmemory:0", 'r+');
while( $buffer = fread($input, 1024) ) {
fwrite($temp, $buffer);
}
fclose($input);
rewind($temp); //指针移动到文件头

fgetcsv($temp); //跳过标题行
while($data = fgetcsv($temp)) {
print_r($data);
//将数据写入数据库或者其他复杂计算操作
//...
}
}
客户端site.csv数据:
站点,url,行业
天猫,tmall.com,电子商务
腾讯,qq.com,社交网络
新浪,sina.com.cn,门户
...
linux curl上传csv数据命令:
[root@aiezu.com ~]# curl -H "Content-Type: application/csv" --data-binary @site.csv http://aiezu.com/test.php 
Array
(
[0] => 天猫
[1] => tmall.com
[2] => 电子商务
)
Array
(
[0] => 腾讯
[1] => qq.com
[2] => 社交网络
)
Array
(
[0] => 新浪
[1] => sina.com.cn
[2] => 门户
)
...
 

三、附录:

ERROR 1442 (HY000): Can't update table '...' in stored function/trigger because it is already used

Mysqlliuliangsong 发表了文章 • 0 个评论 • 129 次浏览 • 2016-12-22 16:31 • 来自相关话题

一、MySQL错误现象:MySQL执行创建的触发器时,报如下错误:ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 下面为错误触发器的创建过程:1、创建测试表格:drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)2、创建一个MySQL触发器:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;3、测试触发效果:mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 二、错误原因:  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 三、解决方案:1、将触发器的创建SQL语句改成如下并执行创建即可:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ; 触发器测试效果:aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec) 查看全部

一、MySQL错误现象:

MySQL执行创建的触发器时,报如下错误:
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

 下面为错误触发器的创建过程:

1、创建测试表格:

drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)

2、创建一个MySQL触发器:

DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;

3、测试触发效果:

mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 

二、错误原因:

  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 

三、解决方案:

1、将触发器的创建SQL语句改成如下并执行创建即可:
DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ;
 触发器测试效果:
aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec)

MySQL触发器用法详解

Mysqlliuliangsong 发表了文章 • 0 个评论 • 296 次浏览 • 2016-12-22 10:53 • 来自相关话题

一、MySQL触发器创建:1、MySQL触发器的创建语法:CREATE [DEFINER = { 'user' | CURRENT_USER }] 
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body 2、MySQL创建语法中的关键词解释:字段含义可能的值DEFINER=可选参数,指定创建者,默认为当前登录用户(CURRENT_USER);
该触发器将以此参数指定的用户执行,所以需要考虑权限问题;DEFINER='root@%'
DEFINER=CURRENT_USERtrigger_name触发器名称,最好由表名+触发事件关键词+触发时间关键词组成; trigger_time触发时间,在某个事件之前还是之后;BEFORE、AFTERtrigger_event触发事件,如插入时触发、删除时触发;
  INSERT:插入操作触发器,INSERT、LOAD DATA、REPLACE时触发;
  UPDATE:更新操作触发器,UPDATE操作时触发;
  DELETE:删除操作触发器,DELETE、REPLACE操作时触发;INSERT、UPDATE、DELETEtable_name 触发操作时间的表名; trigger_order可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时(
如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以
使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。
  FOLLOWS:当前创建触发器在现有触发器之后激活;
  PRECEDES:当前创建触发器在现有触发器之前激活;FOLLOWS、PRECEDEStrigger_body触发执行的SQL语句内容,一般以begin开头,end结尾begin .. end 3、触发执行语句内容(trigger_body)中的OLD,NEW:  在trigger_body中,我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED),OLD表示将要删除的旧行(相当于MS SQL的DELETED)。通过OLD,NEW中获取它们的字段内容,方便在触发操作中使用,下面是对应事件是否支持OLD、NEW的对应关系:事件OLDNEWINSERT×√DELETE√×UPDATE√√  由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLD、NEW;
 4、MySQL分隔符(DELIMITER):  MySQL默认使用“;”作为分隔符,SQL语句遇到“;”就会提交。而我们的触发器中可能会有多个“;”符,为了防止触发器创建语句过早的提交,我们需要临时修改MySQL分隔符,创建完后,再将分隔符改回来。使用DELIMITER可以修改分隔符,如下:DELIMITER $
... --触发器创建语句;
$ --提交创建语句;
DELIMITER ; 二、MySQL触发器创建进阶:1、MySQL触发器中使用变量:  MySQL触发器中变量变量前面加'@',无需定义,可以直接使用:-- 变量直接赋值
set @num=999;

-- 使用select语句查询出来的数据方式赋值,需要加括号:
set @name =(select name from table);2、MySQL触发器中使用if语做条件判断:-- 简单的if语句:
set sex = if (new.sex=1, '男', '女');

-- 多条件if语句:
if old.type=1 then
update table ...;
elseif old.type=2 then
update table ...;
end if; 三、MySQL查看触发器:  可以使用“show triggers;”查看触发器。由于MySQL创建的触发器保存在“information_schema库中的triggers表中,所以还可以通过查询此表查看触发器:-- 通过information_schema.triggers表查看触发器:
select * from information_schema.triggers;

-- mysql 查看当前数据库的触发器
show triggers;

-- mysql 查看指定数据库"aiezu"的触发器
show triggers from aiezu; 四、MySQL删除触发器:1、可以使用drop trigger删除触发器:drop trigger trigger_name; 2、删除前先判断触发器是否存在:drop trigger if exists trigger_name 五、Msql触发器用法举例:1、MySQL触发器Insert触发更新同一张表:  下面我们有一个表“tmp1”,tmp1表有两个整型字段:n1、n2。我们要通过触发器实现,在tmp插入记录时,自动将n2字段的值设置为n1字段的5倍。
 创建测试表和触发器:-- 创建测试表
drop table if exists tmp1;
create table tmp1 (n1 int, n2 int);

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_insert$
create trigger tmp1_insert
before insert on tmp1
for each row
begin
set new.n2 = new.n1*5;
end$
DELIMITER ;测试触发更新效果:mysql> insert tmp1(n1) values(18);
Query OK, 1 row affected (0.01 sec)

mysql> insert tmp1(n1) values(99);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp1;
+------+------+
| n1 | n2 |
+------+------+
| 18 | 90 |
| 99 | 495 |
+------+------+
2 rows in set (0.00 sec) 2、MySQL触发器Update触发更新另一张表:  下面有有两个表tmp1、tmp2,两个表都有一个相同的字段name。使用触发器实现更新一个表的name时,将另外一个表的name也更新。
 创建测试表和触发器:-- 创建测试表和插入测试数据
drop table if exists tmp1;
drop table if exists tmp2;
create table tmp1 (id int, name varchar(128)) default charset='utf8';
create table tmp2 (fid int, name varchar(128)) default charset='utf8';
insert into tmp1 values(1, '爱E族');
insert into tmp2 values(1, '爱E族');

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_update$
create trigger tmp1_update
after update on tmp1
for each row
begin
update tmp2 set name=new.name where fid=new.id;
end$
DELIMITER ;测试触发更新效果:mysql> select * from tmp1;
+------+---------+
| id | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+---------+
| fid | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> update tmp1 set name='aiezu.com' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from tmp1;
+------+-----------+
| id | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+-----------+
| fid | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec) 查看全部

一、MySQL触发器创建:

1、MySQL触发器的创建语法:

CREATE [DEFINER = { 'user' | CURRENT_USER }] 
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body

 

2、MySQL创建语法中的关键词解释:

字段含义可能的值
DEFINER=可选参数,指定创建者,默认为当前登录用户(CURRENT_USER);
该触发器将以此参数指定的用户执行,所以需要考虑权限问题;
DEFINER='root@%'
DEFINER=CURRENT_USER
trigger_name触发器名称,最好由表名+触发事件关键词+触发时间关键词组成; 
trigger_time触发时间,在某个事件之前还是之后;BEFORE、AFTER
trigger_event触发事件,如插入时触发、删除时触发;
  INSERT:插入操作触发器,INSERT、LOAD DATA、REPLACE时触发;
  UPDATE:更新操作触发器,UPDATE操作时触发;
  DELETE:删除操作触发器,DELETE、REPLACE操作时触发;
INSERT、UPDATE、DELETE
table_name 触发操作时间的表名; 
trigger_order可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时(
如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以
使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。
  FOLLOWS:当前创建触发器在现有触发器之后激活;
  PRECEDES:当前创建触发器在现有触发器之前激活;
FOLLOWS、PRECEDES
trigger_body触发执行的SQL语句内容,一般以begin开头,end结尾begin .. end
 

3、触发执行语句内容(trigger_body)中的OLD,NEW:

  在trigger_body中,我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED),OLD表示将要删除的旧行(相当于MS SQL的DELETED)。通过OLD,NEW中获取它们的字段内容,方便在触发操作中使用,下面是对应事件是否支持OLD、NEW的对应关系:
事件OLDNEW
INSERT×
DELETE×
UPDATE
  由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLD、NEW;
 

4、MySQL分隔符(DELIMITER):

  MySQL默认使用“;”作为分隔符,SQL语句遇到“;”就会提交。而我们的触发器中可能会有多个“;”符,为了防止触发器创建语句过早的提交,我们需要临时修改MySQL分隔符,创建完后,再将分隔符改回来。使用DELIMITER可以修改分隔符,如下:
DELIMITER $
... --触发器创建语句;
$ --提交创建语句;
DELIMITER ;
 

二、MySQL触发器创建进阶:

1、MySQL触发器中使用变量:

  MySQL触发器中变量变量前面加'@',无需定义,可以直接使用:
-- 变量直接赋值
set @num=999;

-- 使用select语句查询出来的数据方式赋值,需要加括号:
set @name =(select name from table);

2、MySQL触发器中使用if语做条件判断:

-- 简单的if语句:
set sex = if (new.sex=1, '男', '女');

-- 多条件if语句:
if old.type=1 then
update table ...;
elseif old.type=2 then
update table ...;
end if;
 

三、MySQL查看触发器:

  可以使用“show triggers;”查看触发器。由于MySQL创建的触发器保存在“information_schema库中的triggers表中,所以还可以通过查询此表查看触发器:
-- 通过information_schema.triggers表查看触发器:
select * from information_schema.triggers;

-- mysql 查看当前数据库的触发器
show triggers;

-- mysql 查看指定数据库"aiezu"的触发器
show triggers from aiezu;
 

四、MySQL删除触发器:

1、可以使用drop trigger删除触发器:

drop trigger trigger_name;
 

2、删除前先判断触发器是否存在:

drop trigger if exists trigger_name
 

五、Msql触发器用法举例:

1、MySQL触发器Insert触发更新同一张表:

  下面我们有一个表“tmp1”,tmp1表有两个整型字段:n1、n2。我们要通过触发器实现,在tmp插入记录时,自动将n2字段的值设置为n1字段的5倍。
 创建测试表和触发器:
-- 创建测试表
drop table if exists tmp1;
create table tmp1 (n1 int, n2 int);

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_insert$
create trigger tmp1_insert
before insert on tmp1
for each row
begin
set new.n2 = new.n1*5;
end$
DELIMITER ;
测试触发更新效果:
mysql> insert tmp1(n1) values(18);
Query OK, 1 row affected (0.01 sec)

mysql> insert tmp1(n1) values(99);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp1;
+------+------+
| n1 | n2 |
+------+------+
| 18 | 90 |
| 99 | 495 |
+------+------+
2 rows in set (0.00 sec)
 

2、MySQL触发器Update触发更新另一张表:

  下面有有两个表tmp1、tmp2,两个表都有一个相同的字段name。使用触发器实现更新一个表的name时,将另外一个表的name也更新。
 创建测试表和触发器:
-- 创建测试表和插入测试数据
drop table if exists tmp1;
drop table if exists tmp2;
create table tmp1 (id int, name varchar(128)) default charset='utf8';
create table tmp2 (fid int, name varchar(128)) default charset='utf8';
insert into tmp1 values(1, '爱E族');
insert into tmp2 values(1, '爱E族');

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_update$
create trigger tmp1_update
after update on tmp1
for each row
begin
update tmp2 set name=new.name where fid=new.id;
end$
DELIMITER ;
测试触发更新效果:
mysql> select * from tmp1;
+------+---------+
| id | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+---------+
| fid | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> update tmp1 set name='aiezu.com' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from tmp1;
+------+-----------+
| id | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+-----------+
| fid | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

PHP php://input、php://output用法解析

PHPliuliangsong 发表了文章 • 0 个评论 • 244 次浏览 • 2016-12-05 10:28 • 来自相关话题

一、php://output输出流用法:  php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持CLI(command-line interface,命令行界面)模式和Http模式;
   1、CLI模式通过php://output向终端输出内容:test.php文件:<?php
$output = fopen("php://output", "w");
fwrite($output, "爱E族");
fclose($output);输出:[root@aiezu.com ~]# php test.php
爱E族 2、Http模式通过php://output导出csv文件:  注意,以UTF8编码导出CSV文件,如果文件头未添加BOM头,使用Excel打开会出现乱码。
test.php页面代码:<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件头前需添加BOM,不然会是乱码
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 输出标题行
fputcsv($output, array('站点名', '域名', '行业'));
//数据内容
$rows = array(
array('天猫', 'http://tmall.com', '电子商务')
,array('爱E族', 'http://aiezu.com', '互联网技术')
,array('腾讯', 'http://qq.com', '社交网络')
);
foreach($rows as $row) {
fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");网页打开效果如下:



   二、php://input输入流用法:  php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
 1、PHP使用"php://input"接收XML数据:http test.php页面代码:<?php
/**
* xml文档转为数组元素
* @param obj $xmlobject XML文档对象
* @return array
*/
function xmlToArray($xmlobject) {
$data = array();
foreach ((array)$xmlobject as $key => $value) {
$data[$key] = !is_string($value) ? xmlToArray($value) : $value;
}
return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
$xml = simplexml_load_string($content);//转换post数据为simplexml对象
print_r(xmlToArray($xml));
}待提交xml.xml文件内容:<?xml version='1.0' encoding='UTF-8'?>
<root>
<site>
<name>爱E族</name>
<domain>aiezu.com</domain>
</site>
<site>
<name>天猫</name>
<domain>tmall.com</domain>
</site>
</root>通过linux curl命令提交xml.xml:[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
[site] => Array
(
[0] => Array
(
[name] => 爱E族
[domain] => aiezu.com
)
[1] => Array
(
[name] => 天猫
[domain] => tmall.com
)
)
)  2、PHP使用"php://input"接收JSON数据:  PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“六”节。
 3、PHP使用"php://input"接收文件内容:  下面通过代码演示PHP使用"php://input"接收一个png文件,这里只是用于演示,实际运用中还是建议使用Http请求头"Content-Type"值为"multipart/form-data"的表单方式POST。
接收页面"test.php"代码:<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
$file = sprintf("/tmp/pic.%s", strtolower($match[1]));
file_put_contents($file, $binary);
echo sprintf("文件大小: %s\n", filesize($file));
echo sprintf("修改时间: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}提交测试:[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改时间: 2016-12-05 13:29:08
 三、附录:Linux curl命令详解PHP 输入、输出流合集 查看全部

一、php://output输出流用法:

  php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持CLI(command-line interface,命令行界面)模式和Http模式;
   

1、CLI模式通过php://output向终端输出内容:

test.php文件:
<?php
$output = fopen("php://output", "w");
fwrite($output, "爱E族");
fclose($output);
输出:
[root@aiezu.com ~]# php test.php 
爱E族
 

2、Http模式通过php://output导出csv文件:

  注意,以UTF8编码导出CSV文件,如果文件头未添加BOM头,使用Excel打开会出现乱码。
test.php页面代码:
<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件头前需添加BOM,不然会是乱码
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 输出标题行
fputcsv($output, array('站点名', '域名', '行业'));
//数据内容
$rows = array(
array('天猫', 'http://tmall.com', '电子商务')
,array('爱E族', 'http://aiezu.com', '互联网技术')
,array('腾讯', 'http://qq.com', '社交网络')
);
foreach($rows as $row) {
fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");
网页打开效果如下:
php_output流到处CSV文件.png

   

二、php://input输入流用法:

  php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
 

1、PHP使用"php://input"接收XML数据:

http test.php页面代码:
<?php
/**
* xml文档转为数组元素
* @param obj $xmlobject XML文档对象
* @return array
*/
function xmlToArray($xmlobject) {
$data = array();
foreach ((array)$xmlobject as $key => $value) {
$data[$key] = !is_string($value) ? xmlToArray($value) : $value;
}
return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
$xml = simplexml_load_string($content);//转换post数据为simplexml对象
print_r(xmlToArray($xml));
}
待提交xml.xml文件内容:
<?xml version='1.0' encoding='UTF-8'?>
<root>
<site>
<name>爱E族</name>
<domain>aiezu.com</domain>
</site>
<site>
<name>天猫</name>
<domain>tmall.com</domain>
</site>
</root>
通过linux curl命令提交xml.xml:
[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
[site] => Array
(
[0] => Array
(
[name] => 爱E族
[domain] => aiezu.com
)
[1] => Array
(
[name] => 天猫
[domain] => tmall.com
)
)
)
  

2、PHP使用"php://input"接收JSON数据:

  PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“”节。
 

3、PHP使用"php://input"接收文件内容:

  下面通过代码演示PHP使用"php://input"接收一个png文件,这里只是用于演示,实际运用中还是建议使用Http请求头"Content-Type"值为"multipart/form-data"的表单方式POST。
接收页面"test.php"代码:
<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
$file = sprintf("/tmp/pic.%s", strtolower($match[1]));
file_put_contents($file, $binary);
echo sprintf("文件大小: %s\n", filesize($file));
echo sprintf("修改时间: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}
提交测试:
[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改时间: 2016-12-05 13:29:08

 三、附录:

Linux curl命令详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 1278 次浏览 • 2016-11-23 17:57 • 来自相关话题

  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:curl [options] [URL...] 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。参数组参数描述urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt请

头-H "name: value"
--header "name: value"(HTTP)添加一个http header(http请求头);-H "name:"
--header "name:"(HTTP)移除一个http header(http请求头);-A "string"
--user-agent "string"
【参考】(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;-e <URL>
--referer <URL>
【参考】(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;响

头-I
--head(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)-i
--include(HTTP)输出HTTP头和返回内容;-D <file>
--dump-header <file>(HTTP)转储http响应头到指定文件;cookie-b name=data
--cookie name=data
【参考】(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;-c filename
--cookie-jar file name
【参考】(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;-j
--junk-session-cookies(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"-p
--proxytunnel将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlmhttp代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;数据
传输-G
--get
【参考】如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; -d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html" http://aiezu.com
curl -F "page=@/tmp/a;filename=a.txt" http://aiezu.com

如果字段内容以“<”开头,剩下的部分应该是文件名,curl将从文件中获取作为此字段的值,如:curl -F "text=<text.txt" http://aiezu.com;--form-string <key=value>(HTTP)类似于“--form”,但是“@”、“<”无特殊含义;-T file
--upload-file file通过“put”的方式将文件传输到远程网址;

选项参数只使用字符"-",将通过stdin读入文件内容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T - 
curl "http://aiezu.com/a.php" -T - <test.txt

此参数也可以使用通配符:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com断点
续传-C <offset>
--continue-at <offset>断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;-r <range>
--range <range>(HTTP/FTP/SFTP/FILE) 只传输内容的指定部分:
0-499:最前面500字节;
-500:最后面500字节;
9500-:最前面9500字节;
0-0,-1:最前面和最后面的1字节;
100-199,500-599:两个100字节;


认证--basic(HTTP)告诉curl使用HTTP Basic authentication(HTTP协议时),这是默认认证方式;--ntlm(HTTP)使用NTLM身份验证方式,用于HTTP协议;
一般用于IIS使用NTLM的网站;--digest(HTTP)使用HTTP Digest authentication加密,用于HTTP协议;
配合“-u/--user”选项,防止密码使用明文方式发送;--negotiate(HTTP)使用GSS-Negotiate authentication方式,用于HTTP协议;
它主要目的是为它的主要目的是为kerberos5认证提供支持支持;--anyauth(HTTP)告诉curl自动选择合适的身份认证方法,并选用最安全的方式;-u user:password
--user user:password使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项;

如果你只提供用户名,curl将要求你输入密码;

如果你使用“SSPI”开启的curl库做“NTLM”认证,可以使用不含用户名密码的“-u:”选项,强制curl使用当前登录的用户名密码进行认证;

此参数相当于设置http头“Authorization:”;证书-E <证书[:密码]>
--cert <证书[:密码]>(SSL)指定“PEM”格式的证书文件和证书密码;--cert-type <type>(SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;--cacert <CA证书>(SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;--capath <CA证书路径>(SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;--crlfile <file>(HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;-k
--insecure(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。SSL
其他--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;--engine <name>设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;--random-file(SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;--egd-file <file>(SSL)为随机种子生成器EGD(Entropy Gathering Daemon socket)指定的路径名;-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3(SSL)使用TLS版本2与远程服务器通讯;
(SSL)使用TLS 1.0版本与远程服务器通讯;
(SSL)使用TLS 1.1版本与远程服务器通讯;
(SSL)使用TLS 1.2版本与远程服务器通讯;
(SSL)使用SSL版本2与远程服务器通讯;
(SSL)使用SSL版本3与远程服务器通讯;私钥
公钥--key <key>(SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;--key-type <type>(SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;--pass <phrase>(SSL/SSH)指定私钥文件的密码;--pubkey <key>(SSH)使用指定文件提供的您公钥;FTP-P
--ftp-port <接口>(FTP)FTP主动模式时,设置一个地址等待服务器的连接,如:
网卡:eth1
IP:8.8.8.8
主机名:aiezu.com
可以加端口号:eth1:20000-21000;--crlf(FTP)上传时将换行符(LF)转换为回车换行(CRLF);--ftp-account [data](FTP)ftp帐号信息;--ftp-method [method](FTP)可选值:multicwd/nocwd/singlecwd;--ftp-pasv(FTP)使用使用PASV(被动)/EPSV模式;--ftp-skip-pasv-ip(FTP)使用PASV的时,跳过指定IP;--ftp-create-dirs(FTP)上传时自动创建远程目录;-l
--list-only(FTP)列出ftp文件列表;-B
--use-ascii(FTP/LDAP)使用Ascii传输模式,用于FTP、LDAP;在ftp中相当与使用了“type=A;”模式。--disable-epsv(FTP)告诉curl在PASV(被动模式)时不要使用EPSV;--disable-eprt(FTP)告诉curl在主动模式时禁用EPRT和LPRT;限速--limit-rate <speed>限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;-y
--speed-time <time>If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option.-Y
--speed-limit <speed>If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.其他
选项-0/--http1.0(HTTP) 强制curl使用HTTP 1.0而不是使用默认的HTTP 1.1;--interface <name>使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com-X <command>
--request <command>(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;--keepalive-time <seconds>设置keepalive时间--no-keepalive关闭keepalive功能;--no-buffer禁用对输出流缓冲;--buffer启用输出流缓冲;-L
--location(HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;
(在http响应码为3XX时使用,如301跳转、302跳转)--location-trusted(HTTP/HTTPS)同“--location”,但跳转后会发送跳转前的用户名和密码;--compressed(HTTP)请求对返回内容使用压缩算法进行压缩;curl支持对gzip压缩进行解压;--connect-timeout <seconds>指定最大连接超时,单位“秒”;-m seconds
--max-time seconds限制整个curl操作的最长时间,单位为秒;-s
--silent安静模式。不要显示进度表或错误消息;-#
--progress-bar显示进度条;错误
选项-f
--fail(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;--retry <num>
--retry-delay <seconds>
--retry-max-time <seconds>失败重试次数;
重试间隔时间;
最大重试时间;-S
--show-error安静模式下显示错误信息;--stderr <file>错误信息保存文件;输出-o file
--output file将返回内容输出到文件。
如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  将保存为:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根据规则创建保存目录,参考:“--create-dirs”

指定“-”将定向到标准输出“如控制台”; -O
--remote-name将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);--create-dirs与“-o”参数配合使用,创建必要的本地目录层次结构-w
--write-out format操作完成后在返回信息尾部追加指定的内容;要追加的内容可以是一个字符串“string”、从文件中获取“@filename”、从标准输入中获取“@-”

格式参数中可以用%{variable_name} 方式使用响应信息的相关变量,如:%{content_type}、%{http_code}、%{local_ip}...,更多变量参考“man curl”获取;

格式参数可以使用“\n”、“\r”、“\t”等转义字符;调试--trace <file>转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。--trace-ascii file转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;--trace-time转储文件中添加时间信息;-K
--config <config file>从配置文件中读取参数,参考:http://curl.haxx.se/docs/-v
--verbose显示更详细的信息,调试时使用;帮助-M
--manual显示完整的帮助手册;-h
--helplinux curl用法帮助; 
三、Linux curl命令退出码:
下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。退出码错误描述1Unsupported protocol. This build of curl has no support for this protocol.2Failed to initialize.3URL malformed. The syntax was not correct.5Couldn't resolve proxy. The given proxy host could not be resolved.6Couldn't resolve host. The given remote host was not resolved.7Failed to connect to host.8FTP weird server reply. The server sent data curl couldn't parse.9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.17FTP couldn't set binary. Couldn't change transfer method to binary.18Partial file. Only a part of the file was transferred.19FTP couldn't download/access the given file, the RETR (or similar) command failed.21FTP quote error. A quote command returned error from the server.22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.23Write error. Curl couldn't write data to a local filesystem or similar.25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.26Read error. Various reading problems.27Out of memory. A memory allocation request failed.28Operation timeout. The specified time-out period was reached according to the conditions.30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.33HTTP range error. The range "command" didn't work.34HTTP post error. Internal post-request generation error.35SSL connect error. The SSL handshaking failed.36FTP bad download resume. Couldn't continue an earlier aborted download.37FILE couldn't read file. Failed to open the file. Permissions?38LDAP cannot bind. LDAP bind operation failed.39LDAP search failed.41Function not found. A required LDAP function was not found.42Aborted by callback. An application told curl to abort the operation.43Internal error. A function was called with a bad parameter.45Interface error. A specified outgoing interface could not be used.47Too many redirects. When following redirects, curl hit the maximum amount.48Unknown TELNET option specified.49Malformed telnet option.51The peer's SSL certificate or SSH MD5 fingerprint was not ok.52The server didn't reply anything, which here is considered an error.53SSL crypto engine not found.54Cannot set SSL crypto engine as default.55Failed sending network data.56Failure in receiving network data.58Problem with the local certificate.59Couldn't use specified SSL cipher.60Peer certificate cannot be authenticated with known CA certificates.61Unrecognized transfer encoding.62Invalid LDAP URL.63Maximum file size exceeded.64Requested FTP SSL level failed.65Sending the data requires a rewind that failed.66Failed to initialize SSL Engine.67The user name, password, or similar was not accepted and curl failed to log in.68File not found on TFTP server.69Permission problem on TFTP server.70Out of disk space on TFTP server.71Illegal TFTP operation.72Unknown TFTP transfer ID.73File already exists (TFTP).74No such user (TFTP).75Character conversion failed.76Character conversion functions required.77Problem with reading the SSL CA cert (path? access rights?).78The resource referenced in the URL does not exist.79An unspecified error occurred during the SSH session.80Failed to shut down the SSL connection.82Could not load CRL file, missing or wrong format (added in 7.19.0).83Issuer check failed (added in 7.19.0).XXMore error codes will appear here in future releases. The existing ones are meant to never change.
四、用法演示:
1、下载页面:curl -o index.html http://aiezu.com 
2、下载文件并显示简单进度条:curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso 
3、断点续传:#继续完成上次终止的未完成的下载
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
4、伪造来源页面:
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com
 5、伪造代理设备:#告诉爱E族,我是GOOGLE爬虫蜘蛛(其实我是curl命令)
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告诉爱E族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com 
6、http头:# 看看本站的http头是怎么样的
curl -I http://aiezu.com输出:HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8 
6、设置http请求头:curl -H "Cache-Control:no-cache" http://aiezu.com
7、发送表单数据:curl -F "pic=@logo.png" -F "site=aiezu" http://aiezu.com/
8、发送cookie:curl -b "domain=aiezu.com" http://aiezu.com 查看全部
  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:
curl [options] [URL...]
 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。
参数组参数描述
urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt


-H "name: value"
--header "name: value"
(HTTP)添加一个http header(http请求头);
-H "name:"
--header "name:"
(HTTP)移除一个http header(http请求头);
-A "string"
--user-agent "string"
【参考】
(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;
-e <URL>
--referer <URL>
【参考】
(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;


-I
--head
(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)
-i
--include
(HTTP)输出HTTP头和返回内容;
-D <file>
--dump-header <file>
(HTTP)转储http响应头到指定文件;
cookie-b name=data
--cookie name=data
【参考】
(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;
-c filename
--cookie-jar file name
【参考】
(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;
-j
--junk-session-cookies
(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;
代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
-p
--proxytunnel
将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
http代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;
数据
传输
-G
--get
【参考】
如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; 
-d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】
(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;
-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】
(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html" http://aiezu.com
curl -F "page=@/tmp/a;filename=a.txt" http://aiezu.com

如果字段内容以“<”开头,剩下的部分应该是文件名,curl将从文件中获取作为此字段的值,如:curl -F "text=<text.txt" http://aiezu.com;
--form-string <key=value>(HTTP)类似于“--form”,但是“@”、“<”无特殊含义;
-T file
--upload-file file
通过“put”的方式将文件传输到远程网址;

选项参数只使用字符"-",将通过stdin读入文件内容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T - 
curl "http://aiezu.com/a.php" -T - <test.txt

此参数也可以使用通配符:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com
断点
续传
-C <offset>
--continue-at <offset>
断点续转,从文件头的指定位置开始继续下载/上传;
offset续传开始的位置,如果offset值为“-”,curl会自动从文件中识别起始位置开始传输;
-r <range>
--range <range>
(HTTP/FTP/SFTP/FILE) 只传输内容的指定部分:
0-499:最前面500字节;
-500:最后面500字节;
9500-:最前面9500字节;
0-0,-1:最前面和最后面的1字节;
100-199,500-599:两个100字节;



认证
--basic(HTTP)告诉curl使用HTTP Basic authentication(HTTP协议时),这是默认认证方式;
--ntlm(HTTP)使用NTLM身份验证方式,用于HTTP协议;
一般用于IIS使用NTLM的网站;
--digest(HTTP)使用HTTP Digest authentication加密,用于HTTP协议;
配合“-u/--user”选项,防止密码使用明文方式发送;
--negotiate(HTTP)使用GSS-Negotiate authentication方式,用于HTTP协议;
它主要目的是为它的主要目的是为kerberos5认证提供支持支持;
--anyauth(HTTP)告诉curl自动选择合适的身份认证方法,并选用最安全的方式;
-u user:password
--user user:password
使用用户名、密码认证,此参数会覆盖“-n”、“--netrc”和“--netrc-optional”选项;

如果你只提供用户名,curl将要求你输入密码;

如果你使用“SSPI”开启的curl库做“NTLM”认证,可以使用不含用户名密码的“-u:”选项,强制curl使用当前登录的用户名密码进行认证;

此参数相当于设置http头“Authorization:”;
证书-E <证书[:密码]>
--cert <证书[:密码]>
(SSL)指定“PEM”格式的证书文件和证书密码;
--cert-type <type>(SSL)告诉curl所提供证书的类型:PEM、DER、ENG等;
默认为“PEM”;
--cacert <CA证书>(SSL)告诉curl所以指定的CA证书文件,必须是“PEM”格式;
--capath <CA证书路径>(SSL)告诉curl所以指定目录下的CA证书用来验证;
这些证书必须是“PEM”格式;
--crlfile <file>(HTTPS/FTPS)提供一个PEM格式的文件,用于指定被吊销的证书列表;
-k
--insecure
(SSL)设置此选项将允许使用无证书的不安全SSL进行连接和传输。
SSL
其他
--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;
--engine <name>设置一个OpenSSL加密引擎用于加密操作;
使用“curl --engine list”查看支持的加密引擎列表;
--random-file(SSL)指定包含随机数据的文件路径名;数据是用来为SSL连接产生随机种子为;
--egd-file <file>(SSL)为随机种子生成器EGD(Entropy Gathering Daemon socket)指定的路径名;
-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3
(SSL)使用TLS版本2与远程服务器通讯;
(SSL)使用TLS 1.0版本与远程服务器通讯;
(SSL)使用TLS 1.1版本与远程服务器通讯;
(SSL)使用TLS 1.2版本与远程服务器通讯;
(SSL)使用SSL版本2与远程服务器通讯;
(SSL)使用SSL版本3与远程服务器通讯;
私钥
公钥
--key <key>(SSL/SSH)指定一个私钥文件名;为指定时自动尝试使用下面文件:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;
--key-type <type>(SSL)指定私钥文件类型,支持:DER、PEM、ENG,默认是PEM;
--pass <phrase>(SSL/SSH)指定私钥文件的密码;
--pubkey <key>(SSH)使用指定文件提供的您公钥;
FTP-P
--ftp-port <接口>
(FTP)FTP主动模式时,设置一个地址等待服务器的连接,如:
网卡:eth1
IP:8.8.8.8
主机名:aiezu.com
可以加端口号:eth1:20000-21000;
--crlf(FTP)上传时将换行符(LF)转换为回车换行(CRLF);
--ftp-account [data](FTP)ftp帐号信息;
--ftp-method [method](FTP)可选值:multicwd/nocwd/singlecwd;
--ftp-pasv(FTP)使用使用PASV(被动)/EPSV模式;
--ftp-skip-pasv-ip(FTP)使用PASV的时,跳过指定IP;
--ftp-create-dirs(FTP)上传时自动创建远程目录;
-l
--list-only
(FTP)列出ftp文件列表;
-B
--use-ascii
(FTP/LDAP)使用Ascii传输模式,用于FTP、LDAP;在ftp中相当与使用了“type=A;”模式。
--disable-epsv(FTP)告诉curl在PASV(被动模式)时不要使用EPSV;
--disable-eprt(FTP)告诉curl在主动模式时禁用EPRT和LPRT;
限速--limit-rate <speed>限制curl使用的最大带宽;如果未指定单位,默认单位为“bytes/秒”,你也可以指定单位为“K”、“M”、“G”等单位,如:“--limit-rate 1m”为限制最大使用带宽为“1m字节/秒”;
-y
--speed-time <time>
If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option.
-Y
--speed-limit <speed>
If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.
其他
选项
-0/--http1.0(HTTP) 强制curl使用HTTP 1.0而不是使用默认的HTTP 1.1;
--interface <name>使用指定的网卡接口访问;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com
-X <command>
--request <command>
(HTTP)指定与服务器通信使用的请求方法,如:GET、PUT、POST、DELETE等,默认GET;
--keepalive-time <seconds>设置keepalive时间
--no-keepalive关闭keepalive功能;
--no-buffer禁用对输出流缓冲;
--buffer启用输出流缓冲;
-L
--location
(HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;
(在http响应码为3XX时使用,如301跳转、302跳转)
--location-trusted(HTTP/HTTPS)同“--location”,但跳转后会发送跳转前的用户名和密码;
--compressed(HTTP)请求对返回内容使用压缩算法进行压缩;curl支持对gzip压缩进行解压;
--connect-timeout <seconds>指定最大连接超时,单位“秒”;
-m seconds
--max-time seconds
限制整个curl操作的最长时间,单位为秒;
-s
--silent
安静模式。不要显示进度表或错误消息;
-#
--progress-bar
显示进度条;
错误
选项
-f
--fail
(HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;
--retry <num>
--retry-delay <seconds>
--retry-max-time <seconds>
失败重试次数;
重试间隔时间;
最大重试时间;
-S
--show-error
安静模式下显示错误信息;
--stderr <file>错误信息保存文件;
输出-o file
--output file
将返回内容输出到文件。
如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  将保存为:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根据规则创建保存目录,参考:“--create-dirs”

指定“-”将定向到标准输出“如控制台”; 
-O
--remote-name
将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);
--create-dirs与“-o”参数配合使用,创建必要的本地目录层次结构
-w
--write-out format
操作完成后在返回信息尾部追加指定的内容;要追加的内容可以是一个字符串“string”、从文件中获取“@filename”、从标准输入中获取“@-”

格式参数中可以用%{variable_name} 方式使用响应信息的相关变量,如:%{content_type}、%{http_code}、%{local_ip}...,更多变量参考“man curl”获取;

格式参数可以使用“\n”、“\r”、“\t”等转义字符;
调试--trace <file>转储所有传入和传出的数据到文件,包括描述信息;
使用“-”作为文件名将输出发送到标准输出。
--trace-ascii file转储所有传入和传出的数据到文件,包括描述信息,只转储ASCII部分,更容易阅读;
使用“-”作为文件名将输出发送到标准输出。
这个选项会覆盖之前使用的-v、 --verbose、 --trace-ascii选项;
--trace-time转储文件中添加时间信息;
-K
--config <config file>
从配置文件中读取参数,参考:http://curl.haxx.se/docs/
-v
--verbose
显示更详细的信息,调试时使用;
帮助-M
--manual
显示完整的帮助手册;
-h
--help
linux curl用法帮助;
 
三、Linux curl命令退出码:
下面是linux curl命令的错误代码和她们的相应的错误消息,可能会出现在恶劣的环境。
退出码错误描述
1Unsupported protocol. This build of curl has no support for this protocol.
2Failed to initialize.
3URL malformed. The syntax was not correct.
5Couldn't resolve proxy. The given proxy host could not be resolved.
6Couldn't resolve host. The given remote host was not resolved.
7Failed to connect to host.
8FTP weird server reply. The server sent data curl couldn't parse.
9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.
11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.
13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.
14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.
15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.
17FTP couldn't set binary. Couldn't change transfer method to binary.
18Partial file. Only a part of the file was transferred.
19FTP couldn't download/access the given file, the RETR (or similar) command failed.
21FTP quote error. A quote command returned error from the server.
22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.
23Write error. Curl couldn't write data to a local filesystem or similar.
25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.
26Read error. Various reading problems.
27Out of memory. A memory allocation request failed.
28Operation timeout. The specified time-out period was reached according to the conditions.
30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!
31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.
33HTTP range error. The range "command" didn't work.
34HTTP post error. Internal post-request generation error.
35SSL connect error. The SSL handshaking failed.
36FTP bad download resume. Couldn't continue an earlier aborted download.
37FILE couldn't read file. Failed to open the file. Permissions?
38LDAP cannot bind. LDAP bind operation failed.
39LDAP search failed.
41Function not found. A required LDAP function was not found.
42Aborted by callback. An application told curl to abort the operation.
43Internal error. A function was called with a bad parameter.
45Interface error. A specified outgoing interface could not be used.
47Too many redirects. When following redirects, curl hit the maximum amount.
48Unknown TELNET option specified.
49Malformed telnet option.
51The peer's SSL certificate or SSH MD5 fingerprint was not ok.
52The server didn't reply anything, which here is considered an error.
53SSL crypto engine not found.
54Cannot set SSL crypto engine as default.
55Failed sending network data.
56Failure in receiving network data.
58Problem with the local certificate.
59Couldn't use specified SSL cipher.
60Peer certificate cannot be authenticated with known CA certificates.
61Unrecognized transfer encoding.
62Invalid LDAP URL.
63Maximum file size exceeded.
64Requested FTP SSL level failed.
65Sending the data requires a rewind that failed.
66Failed to initialize SSL Engine.
67The user name, password, or similar was not accepted and curl failed to log in.
68File not found on TFTP server.
69Permission problem on TFTP server.
70Out of disk space on TFTP server.
71Illegal TFTP operation.
72Unknown TFTP transfer ID.
73File already exists (TFTP).
74No such user (TFTP).
75Character conversion failed.
76Character conversion functions required.
77Problem with reading the SSL CA cert (path? access rights?).
78The resource referenced in the URL does not exist.
79An unspecified error occurred during the SSH session.
80Failed to shut down the SSL connection.
82Could not load CRL file, missing or wrong format (added in 7.19.0).
83Issuer check failed (added in 7.19.0).
XXMore error codes will appear here in future releases. The existing ones are meant to never change.

四、用法演示:
1、下载页面:
curl -o index.html http://aiezu.com
 
2、下载文件并显示简单进度条:
curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
 
3、断点续传:
#继续完成上次终止的未完成的下载
curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso

4、伪造来源页面:
#告诉爱E族,我是从百度来的
curl -e http://baidu.com http://aiezu.com

 5、伪造代理设备:
#告诉爱E族,我是GOOGLE爬虫蜘蛛(其实我是curl命令) 
curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告诉爱E族,我用的是微信内置浏览器
curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com
 
6、http头:
# 看看本站的http头是怎么样的
curl -I http://aiezu.com
输出:
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
 
6、设置http请求头:
curl -H "Cache-Control:no-cache"  http://aiezu.com

7、发送表单数据:
curl -F "pic=@logo.png" -F "site=aiezu"  http://aiezu.com/

8、发送cookie:
curl -b "domain=aiezu.com"  http://aiezu.com

Linux 常用 ls命令详解

Linuxlinyu520 发表了文章 • 0 个评论 • 201 次浏览 • 2016-11-22 16:06 • 来自相关话题

  ls命令是linux常用命令之一,用于在命令控制台提示符中列出目录和文件信息。
 
一、ls命令用法:
  ls命令运行在命令提示符终端,用法如下。其中【选项】和为可选参数,可以一零个或者多个选项;【文件】也为可选参数,可以为零个或者多个;如果未指定文件,默认为列出当前目录下的文件:用法:ls [选项]... [文件]... 
二、ls命令参数详解:
下面是爱E族(aiezu.com)收集整理的ls详细选项,如有错误的地方,欢迎指正:参数名描述-a
--all列出所有的文件和目录,包括以“.”号开头的;-A
--almost-all列出所有的文件和目录,包括以“.”号开头的(除了“.”和“..”);-b
--escape 将文件名中的不可见字符,使用“\”开头的八进制转换字符表示;--block-size=SIZE指定每块的大小,如果指定了此值,将显示块数,不再显示文件大小;
可能的值:
  数   字,如:50、1024、102400;
  数字+单位,如:1k、2m、5g、10t;-B
--ignore-backups不要显示以“~”结尾的文件;-c按文件修改时间排序,可以使用“-l”选项显示创建时间;-C使用列的顺序输出文件列表;--color[=WHEN]是否使用不同的颜色区分文件类型,可能的值:
  never:从不;
  always:总是;
  auto:自动。-d
--directory列出目录的信息,而不是列出命令里面的内容;-D
--diredGenerate output designed for Emacs' dired mode;-f 不排序, 使用“-aU”选项, 停用“-lst”选项;-F
--classify给文件名末尾添加一个标识符(*/=@|中的一个):
  “*”:可执行文件;
  “/”:目录;
  “=”:socket文件;
  “@”:符号链接(symbolic link)文件;
  “|”:FIFOs文件;--format=WORD设置输出的格式,可能的值:
  across:相当于“-x”;
  commas:相当于“-m”;
  horizontal:相当于“-x”;
  long:相当于“-l”;
  single-column:相当于“-1”;
  verbose:相当于“-l”;
  vertical:相当于“-C”;--full-time列出文件完整的修改日期和时间;-g(ignored)-G
--no-group不显示文件的用户组;-h
--human-readable自动将文件大小使用方便阅读的方式表示,如:1.23K, 2.4M, 9G;-H
--si单位转换使用1000,而不是1024;
如:1M = 1000K,而不是 1M = 1024K;--indicator-style=WORD按指定样式给文件名追加一个标识,可能的值:
  none:不添加,默认值;
  classify:相当于“-F”;
  file-type: 相当于“-p”;
  slash:目录添加斜杠;-i
--inode输出文件使用的index node;-I
--ignore=PATTERNDo not list implied entries matching shell PATTERN-k
--kilobytes以K为单位显示文件大小,相当于“--block-size=1024”;-l以长列表的形式显示文件的详细信息;-L
--dereference列出符号链接指向的条目,而不是列出符号链接;-m 所有的相连并使用“,”逗号分隔;-n
--numeric-uid-gid使用数字UIDs、GIDs来代替名字;-N
--literal输出原始名称,对特殊字符不做特别处理,如:控制字符;-o 使用没有组信息的长列表格式-p
--file-type根据文件类型,给文件名末尾添加一个标识符(/=@|中的一个);-q
--hide-control-chars以?号代替不可显示字符(默认);--show-control-chars显示控制字符,不使用?号代替;-Q
--quote-name给名称加上双引号;--quoting-style=WORD条目名称使用的引号样式,可选的值:literal、shell、shell-always、c、c-maybe、escape、clocale;-r
--reverse 使用反序排序;-R
--recursive递归列出目录和子目录的文件;-s
--size以块为单位输出文件大小;-S根据文件大小排序;--sort=WORD排序关键词,可能的值: "none", "time", "size", "extension", "version";--time=WORD显示文档的指定时间,而不是显示修改时间,可能的值:
  atime, access, use, ctime or status; 
如果“--sort=time”,也可以使用此时间作为排序键;-t使用修改时间排序;-T
--tabsize=COLS设置tab制表符的长度,而不是使用默认的8字符长度;-u 按最后访问时间排序; 使用“-l”显示最后访问时间;-U 不排序,使用目录的默认顺序;-v 按版本排序-w
--width=COLS指定屏幕宽度,而不是使用屏幕的实际宽度;-x按行的顺序显示,而不是按列的顺序;-X按字母顺序排序;-1每行显示一个文件;--help显示帮助信息;--version输出版本号; 
三、用法演示:
1、“-a”和“-A”选项的区别:[root@aiezu.com ~]# ls -a
. .. anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc mysqlaccess.log .mysql_history .tcshrc .viminfo

[root@aiezu.com ~]# ls -A
anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc mysqlaccess.log .mysql_history .tcshrc .viminfo
 2、“-b”和“--show-control-chars”选项演示:
  下面通过创建两个含不可显示字符“\001”和“\n”的文件名,来展示“-b”和“--show-control-chars”选项的区别:[root@aiezu.com mm]# touch "`echo -e "aiezu.com\001.txt"`"

[root@aiezu.com mm]# touch "`echo -e "aiezu\n.com.txt"`"

[root@aiezu.com mm]# ls
aiezu.com?.txt aiezu?.com.txt

[root@aiezu mm]# ls -b
aiezu.com\001.txt aiezu\n.com.txt

[root@aiezu.com mm]# ls --show-control-chars
aiezu.com.txt aiezu
.com.txt 
3、文件大小:[root@S2 opt]# ls -l aiezu.com.zip
-rw-r--r-- 1 root root 8007112 Nov 22 21:45 aiezu.com.zip

[root@S2 opt]# ls -lh aiezu.com.zip
-rw-r--r-- 1 root root 7.7M Nov 22 21:45 aiezu.com.zip

[root@S2 opt]# ls -l --block-size=1k aiezu.com.zip
-rw-r--r-- 1 root root 7820 Nov 22 21:45 aiezu.com.zip

[root@S2 opt]# ls -s aiezu.com.zip
7820 aiezu.com.zip 
4、ls命令“-F 参数”与“-p”参数演示:



5、文件创建时间、访问时间、修改时间:#文件的创建时间
[root@aiezu mm]# ls -lc aiezu.com.conf
-rw-r--r--. 1 root root 2 11月 22 22:43 aiezu.com.conf

[root@aiezu mm]# ls --full-time --time=ctime aiezu.com.conf
-rw-r--r--. 1 root root 2 2016-11-22 22:43:23.572000000 +0800 aiezu.com.conf



#文件的修改时间:
[root@aiezu mm]# ls -l aiezu.com.conf
-rw-r--r--. 1 root root 2 11月 22 22:41 aiezu.com.conf

[root@aiezu mm]# ls --full-time aiezu.com.conf
-rw-r--r--. 1 root root 2 2016-11-22 22:41:55.575000000 +0800 aiezu.com.conf



#文件的访问时间:
[root@aiezu mm]# ls -lu aiezu.com.conf
-rw-r--r--. 1 root root 2 11月 22 22:42 aiezu.com.conf

[root@aiezu mm]# ls --full-time --time=atime aiezu.com.conf
-rw-r--r--. 1 root root 2 2016-11-22 22:42:15.060000000 +0800 aiezu.com.conf 查看全部
  ls命令是linux常用命令之一,用于在命令控制台提示符中列出目录和文件信息。
 
一、ls命令用法:
  ls命令运行在命令提示符终端,用法如下。其中【选项】和为可选参数,可以一零个或者多个选项;【文件】也为可选参数,可以为零个或者多个;如果未指定文件,默认为列出当前目录下的文件:
用法:ls [选项]... [文件]...
 
二、ls命令参数详解:
下面是爱E族(aiezu.com)收集整理的ls详细选项,如有错误的地方,欢迎指正:
参数名描述
-a
--all
列出所有的文件和目录,包括以“.”号开头的;
-A
--almost-all
列出所有的文件和目录,包括以“.”号开头的(除了“.”和“..”);
-b
--escape 
将文件名中的不可见字符,使用“\”开头的八进制转换字符表示;
--block-size=SIZE指定每块的大小,如果指定了此值,将显示块数,不再显示文件大小;
可能的值:
  数   字,如:50、1024、102400;
  数字+单位,如:1k、2m、5g、10t;
-B
--ignore-backups
不要显示以“~”结尾的文件;
-c按文件修改时间排序,可以使用“-l”选项显示创建时间;
-C使用列的顺序输出文件列表;
--color[=WHEN]是否使用不同的颜色区分文件类型,可能的值:
  never:从不;
  always:总是;
  auto:自动。
-d
--directory
列出目录的信息,而不是列出命令里面的内容;
-D
--dired
Generate output designed for Emacs' dired mode;
-f 不排序, 使用“-aU”选项, 停用“-lst”选项;
-F
--classify
给文件名末尾添加一个标识符(*/=@|中的一个):
  “*”:可执行文件;
  “/”:目录;
  “=”:socket文件;
  “@”:符号链接(symbolic link)文件;
  “|”:FIFOs文件;
--format=WORD设置输出的格式,可能的值:
  across:相当于“-x”;
  commas:相当于“-m”;
  horizontal:相当于“-x”;
  long:相当于“-l”;
  single-column:相当于“-1”;
  verbose:相当于“-l”;
  vertical:相当于“-C”;
--full-time列出文件完整的修改日期和时间;
-g(ignored)
-G
--no-group
不显示文件的用户组;
-h
--human-readable
自动将文件大小使用方便阅读的方式表示,如:1.23K, 2.4M, 9G;
-H
--si
单位转换使用1000,而不是1024;
如:1M = 1000K,而不是 1M = 1024K;
--indicator-style=WORD按指定样式给文件名追加一个标识,可能的值:
  none:不添加,默认值;
  classify:相当于“-F”;
  file-type: 相当于“-p”;
  slash:目录添加斜杠;
-i
--inode
输出文件使用的index node;
-I
--ignore=PATTERN
Do not list implied entries matching shell PATTERN
-k
--kilobytes
以K为单位显示文件大小,相当于“--block-size=1024”;
-l以长列表的形式显示文件的详细信息;
-L
--dereference
列出符号链接指向的条目,而不是列出符号链接;
-m 所有的相连并使用“,”逗号分隔;
-n
--numeric-uid-gid
使用数字UIDs、GIDs来代替名字;
-N
--literal
输出原始名称,对特殊字符不做特别处理,如:控制字符;
-o 使用没有组信息的长列表格式
-p
--file-type
根据文件类型,给文件名末尾添加一个标识符(/=@|中的一个);
-q
--hide-control-chars
以?号代替不可显示字符(默认);
--show-control-chars显示控制字符,不使用?号代替;
-Q
--quote-name
给名称加上双引号;
--quoting-style=WORD条目名称使用的引号样式,可选的值:literal、shell、shell-always、c、c-maybe、escape、clocale;
-r
--reverse 
使用反序排序;
-R
--recursive
递归列出目录和子目录的文件;
-s
--size
以块为单位输出文件大小;
-S根据文件大小排序;
--sort=WORD排序关键词,可能的值: "none", "time", "size", "extension", "version";
--time=WORD显示文档的指定时间,而不是显示修改时间,可能的值:
  atime, access, use, ctime or status; 
如果“--sort=time”,也可以使用此时间作为排序键;
-t使用修改时间排序;
-T
--tabsize=COLS
设置tab制表符的长度,而不是使用默认的8字符长度;
-u 按最后访问时间排序; 使用“-l”显示最后访问时间;
-U 不排序,使用目录的默认顺序;
-v 按版本排序
-w
--width=COLS
指定屏幕宽度,而不是使用屏幕的实际宽度;
-x按行的顺序显示,而不是按列的顺序;
-X按字母顺序排序;
-1每行显示一个文件;
--help显示帮助信息;
--version输出版本号;
 
三、用法演示:
1、“-a”和“-A”选项的区别:
[root@aiezu.com ~]# ls -a
. .. anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc mysqlaccess.log .mysql_history .tcshrc .viminfo

[root@aiezu.com ~]# ls -A
anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc mysqlaccess.log .mysql_history .tcshrc .viminfo

 2、“-b”和“--show-control-chars”选项演示:
  下面通过创建两个含不可显示字符“\001”和“\n”的文件名,来展示“-b”和“--show-control-chars”选项的区别:
[root@aiezu.com mm]# touch "`echo -e "aiezu.com\001.txt"`"

[root@aiezu.com mm]# touch "`echo -e "aiezu\n.com.txt"`"

[root@aiezu.com mm]# ls
aiezu.com?.txt aiezu?.com.txt

[root@aiezu mm]# ls -b
aiezu.com\001.txt aiezu\n.com.txt

[root@aiezu.com mm]# ls --show-control-chars
aiezu.com.txt aiezu
.com.txt
 
3、文件大小:
[root@S2 opt]# ls -l aiezu.com.zip 
-rw-r--r-- 1 root root 8007112 Nov 22 21:45 aiezu.com.zip

[root@S2 opt]# ls -lh aiezu.com.zip
-rw-r--r-- 1 root root 7.7M Nov 22 21:45 aiezu.com.zip

[root@S2 opt]# ls -l --block-size=1k aiezu.com.zip
-rw-r--r-- 1 root root 7820 Nov 22 21:45 aiezu.com.zip

[root@S2 opt]# ls -s aiezu.com.zip
7820 aiezu.com.zip
 
4、ls命令“-F 参数”与“-p”参数演示:
未标题-1.png

5、文件创建时间、访问时间、修改时间:
#文件的创建时间
[root@aiezu mm]# ls -lc aiezu.com.conf
-rw-r--r--. 1 root root 2 11月 22 22:43 aiezu.com.conf

[root@aiezu mm]# ls --full-time --time=ctime aiezu.com.conf
-rw-r--r--. 1 root root 2 2016-11-22 22:43:23.572000000 +0800 aiezu.com.conf



#文件的修改时间:
[root@aiezu mm]# ls -l aiezu.com.conf
-rw-r--r--. 1 root root 2 11月 22 22:41 aiezu.com.conf

[root@aiezu mm]# ls --full-time aiezu.com.conf
-rw-r--r--. 1 root root 2 2016-11-22 22:41:55.575000000 +0800 aiezu.com.conf



#文件的访问时间:
[root@aiezu mm]# ls -lu aiezu.com.conf
-rw-r--r--. 1 root root 2 11月 22 22:42 aiezu.com.conf

[root@aiezu mm]# ls --full-time --time=atime aiezu.com.conf
-rw-r--r--. 1 root root 2 2016-11-22 22:42:15.060000000 +0800 aiezu.com.conf

Linux 常用ping命令详解

Linuxlinyu520 发表了文章 • 0 个评论 • 454 次浏览 • 2016-11-22 00:13 • 来自相关话题

  不管在windows平台,还是在linux平台,ping都是非常常用的网络命令;ping命令通过ICMP(Internet控制消息协议)工作;ping可以用来测试本机与目标主机是否联通、联通速度如何、稳定性如何。
 
一、ping用法:
  ping命令运行在命令提示符终端,用法为:“ping 参数 目标主机”。其中参数为零到多个,目标主机可以是IP或者域名。Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
 二、ping参数详解:
下面是爱E族(aiezu.com)收集整理的ping详细参数,可能部分不全或翻译错误,欢迎指正:参数详解-aAudible ping.-A自适应ping,根据ping包往返时间确定ping的速度;-b允许ping一个广播地址;-B不允许ping改变包头的源地址;-c countping指定次数后停止ping; -d 使用Socket的SO_DEBUG功能;-F flow_label为ping回显请求分配一个20位的“flow label”,如果未设置,内核会为ping随机分配;-f极限检测,快速连续ping一台主机,ping的速度达到100次每秒;-i interval设定间隔几秒发送一个ping包,默认一秒ping一次;-I interface指定网卡接口、或指定的本机地址送出数据包;-l preload设置在送出要求信息之前,先行发出的数据包;-L抑制组播报文回送,只适用于ping的目标为一个组播地址-n 不要将ip地址转换成主机名;-p pattern指定填充ping数据包的十六进制内容,在诊断与数据有关的网络错误时这个选项就非常有用,如:“-p ff”;-q不显示任何传送封包的信息,只显示最后的结果-Q tos设置Qos(Quality of Service),它是ICMP数据报相关位;可以是十进制或十六进制数,详见rfc1349和rfc2474文档;-R记录ping的路由过程(IPv4 only);
注意:由于IP头的限制,最多只能记录9个路由,其他会被忽略;-r忽略正常的路由表,直接将数据包送到远端主机上,通常是查看本机的网络接口是否有问题;如果主机不直接连接的网络上,则返回一个错误。-S sndbufSet socket sndbuf. If not specified, it is selected to buffer not more than one packet.-s packetsize指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节;
包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500);-t ttl设置TTL(Time To Live)为指定的值。该字段指定IP包被路由器丢弃之前允许通过的最大网段数;-T timestamp_option设置IP timestamp选项,可以是下面的任何一个:
  'tsonly' (only timestamps)
  'tsandaddr' (timestamps and addresses)
  'tsprespec host1 [host2 [host3]]' (timestamp prespecified hops). -M hint 设置MTU(最大传输单元)分片策略。
可设置为:
  'do':禁止分片,即使包被丢弃;
  'want':当包过大时分片;
  'dont':不设置分片标志(DF flag);-m mark设置mark;-v使ping处于verbose方式,它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包;-U Print full user-to-user latency (the old behaviour).
Normally ping prints network round trip time, which can be different f.e. due to DNS failures.-W timeout以毫秒为单位设置ping的超时时间;-w deadlinedeadline;参考内容:http://ss64.com/bash/ping.html
 
三、输出格式:



下图为简单的ping产生的响应内容,图中返回内容具体的含义如下:① ping目标主机的域名和IP(ping会自动将域名转换为IP)② 不带包头的包大小和带包头的包大小(参考“-s”参数)③ icmp_seq:ping序列,从1开始;  ttl:剩余的ttl;  time: 响应时间,数值越小,联通速度越快;④ 发出去的包数,返回的包数,丢包率,耗费时间;⑤ 最小/最大/平均响应时间和本机硬件耗费时间;  
 
四、简单例子:
1、每隔0.6秒ping一次,一共ping 5次:[root@aiezu.com ~]# ping -c 5 -i 0.6 qq.com
PING qq.com (14.17.32.211) 56(84) bytes of data.
64 bytes from 14.17.32.211: icmp_seq=1 ttl=54 time=16.5 ms
64 bytes from 14.17.32.211: icmp_seq=2 ttl=54 time=17.0 ms
64 bytes from 14.17.32.211: icmp_seq=3 ttl=54 time=16.6 ms
64 bytes from 14.17.32.211: icmp_seq=4 ttl=54 time=18.3 ms
64 bytes from 14.17.32.211: icmp_seq=5 ttl=54 time=19.9 ms

--- qq.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 2405ms
rtt min/avg/max/mdev = 16.520/17.692/19.919/1.293 ms 
2、极限快速的使用大包ping:
  以最快的速度,使用最大的包进行ping,可用于测试目标主机的承压能力:[root@aiezu ~]# ping -f -s 65507 10.0.0.52
PING 10.0.0.52 (10.0.0.52) 65507(65535) bytes of data.
.^
--- 10.0.0.52 ping statistics ---
646 packets transmitted, 646 received, 0% packet loss, time 1675ms
rtt min/avg/max/mdev = 1.202/2.406/8.253/0.507 ms, ipg/ewma 2.598/2.318 ms注意:此用法非常危险,65535(包头+内容)*100个包每秒=6.25MB,每秒发送6.25MB的数据,相当于50Mbps的带宽,完全可能导致目标主机拒绝服务。请勿用于非法用途,造成不良后果自负。

3、联通不稳定,丢包严重的情形:
  下面的ping发出17个ping icmp包,而只有序号为8、9、12的包收到响应信息,丢包率达82%,联通非常不稳定:[root@aiezu.com ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=8 ttl=43 time=32.3 ms
64 bytes from 8.8.8.8: icmp_seq=9 ttl=43 time=32.2 ms
64 bytes from 8.8.8.8: icmp_seq=12 ttl=43 time=32.0 ms
^C
--- 8.8.8.8 ping statistics ---
17 packets transmitted, 3 received, 82% packet loss, time 16003ms
rtt min/avg/max/mdev = 32.038/32.208/32.362/0.246 ms 
4、完全无法ping通的情形:[root@aiezu.com ~]# ping -c 3 9.9.9.9
PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data.

--- 9.9.9.9 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms 
五、常见错误:
1、错误一:ping: packet size too large: 70000WARNING: packet size 65508 is too large. Maximum is 65507
PING 10.0.0.52 (10.0.0.52) 65508(65536) bytes of data.
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500解决:
  将ping的“-s”参数设置一个更小的值,windows最大值为“65500”,linux最大值为“65507”。 查看全部
  不管在windows平台,还是在linux平台,ping都是非常常用的网络命令;ping命令通过ICMP(Internet控制消息协议)工作;ping可以用来测试本机与目标主机是否联通、联通速度如何、稳定性如何。
 
一、ping用法:
  ping命令运行在命令提示符终端,用法为:“ping 参数 目标主机”。其中参数为零到多个,目标主机可以是IP或者域名。
Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination

 二、ping参数详解:
下面是爱E族(aiezu.com)收集整理的ping详细参数,可能部分不全或翻译错误,欢迎指正:
参数详解
-aAudible ping.
-A自适应ping,根据ping包往返时间确定ping的速度;
-b允许ping一个广播地址;
-B不允许ping改变包头的源地址;
-c countping指定次数后停止ping; 
-d 使用Socket的SO_DEBUG功能;
-F flow_label为ping回显请求分配一个20位的“flow label”,如果未设置,内核会为ping随机分配;
-f极限检测,快速连续ping一台主机,ping的速度达到100次每秒;
-i interval设定间隔几秒发送一个ping包,默认一秒ping一次;
-I interface指定网卡接口、或指定的本机地址送出数据包;
-l preload设置在送出要求信息之前,先行发出的数据包;
-L抑制组播报文回送,只适用于ping的目标为一个组播地址
-n 不要将ip地址转换成主机名;
-p pattern指定填充ping数据包的十六进制内容,在诊断与数据有关的网络错误时这个选项就非常有用,如:“-p ff”;
-q不显示任何传送封包的信息,只显示最后的结果
-Q tos设置Qos(Quality of Service),它是ICMP数据报相关位;可以是十进制或十六进制数,详见rfc1349和rfc2474文档;
-R记录ping的路由过程(IPv4 only);
注意:由于IP头的限制,最多只能记录9个路由,其他会被忽略;
-r忽略正常的路由表,直接将数据包送到远端主机上,通常是查看本机的网络接口是否有问题;如果主机不直接连接的网络上,则返回一个错误。
-S sndbufSet socket sndbuf. If not specified, it is selected to buffer not more than one packet.
-s packetsize指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节;
包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500);
-t ttl设置TTL(Time To Live)为指定的值。该字段指定IP包被路由器丢弃之前允许通过的最大网段数;
-T timestamp_option设置IP timestamp选项,可以是下面的任何一个:
  'tsonly' (only timestamps)
  'tsandaddr' (timestamps and addresses)
  'tsprespec host1 [host2 [host3]]' (timestamp prespecified hops). 
-M hint 设置MTU(最大传输单元)分片策略。
可设置为:
  'do':禁止分片,即使包被丢弃;
  'want':当包过大时分片;
  'dont':不设置分片标志(DF flag);
-m mark设置mark;
-v使ping处于verbose方式,它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包;
-U Print full user-to-user latency (the old behaviour).
Normally ping prints network round trip time, which can be different f.e. due to DNS failures.
-W timeout以毫秒为单位设置ping的超时时间;
-w deadlinedeadline;
参考内容:http://ss64.com/bash/ping.html
 
三、输出格式:
linux_bash_ping.png
下图为简单的ping产生的响应内容,图中返回内容具体的含义如下:
  • ① ping目标主机的域名和IP(ping会自动将域名转换为IP)
  • ② 不带包头的包大小和带包头的包大小(参考“-s”参数)
  • ③ icmp_seq:ping序列,从1开始;
  •   ttl:剩余的ttl;
  •   time: 响应时间,数值越小,联通速度越快;
  • ④ 发出去的包数,返回的包数,丢包率,耗费时间;
  • ⑤ 最小/最大/平均响应时间和本机硬件耗费时间; 
 
 
四、简单例子:
1、每隔0.6秒ping一次,一共ping 5次:
[root@aiezu.com ~]# ping -c 5 -i 0.6 qq.com
PING qq.com (14.17.32.211) 56(84) bytes of data.
64 bytes from 14.17.32.211: icmp_seq=1 ttl=54 time=16.5 ms
64 bytes from 14.17.32.211: icmp_seq=2 ttl=54 time=17.0 ms
64 bytes from 14.17.32.211: icmp_seq=3 ttl=54 time=16.6 ms
64 bytes from 14.17.32.211: icmp_seq=4 ttl=54 time=18.3 ms
64 bytes from 14.17.32.211: icmp_seq=5 ttl=54 time=19.9 ms

--- qq.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 2405ms
rtt min/avg/max/mdev = 16.520/17.692/19.919/1.293 ms
 
2、极限快速的使用大包ping:
  以最快的速度,使用最大的包进行ping,可用于测试目标主机的承压能力:
[root@aiezu ~]# ping -f -s 65507 10.0.0.52
PING 10.0.0.52 (10.0.0.52) 65507(65535) bytes of data.
.^
--- 10.0.0.52 ping statistics ---
646 packets transmitted, 646 received, 0% packet loss, time 1675ms
rtt min/avg/max/mdev = 1.202/2.406/8.253/0.507 ms, ipg/ewma 2.598/2.318 ms
注意:此用法非常危险,65535(包头+内容)*100个包每秒=6.25MB,每秒发送6.25MB的数据,相当于50Mbps的带宽,完全可能导致目标主机拒绝服务。请勿用于非法用途,造成不良后果自负。

3、联通不稳定,丢包严重的情形:
  下面的ping发出17个ping icmp包,而只有序号为8、9、12的包收到响应信息,丢包率达82%,联通非常不稳定:
[root@aiezu.com ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=8 ttl=43 time=32.3 ms
64 bytes from 8.8.8.8: icmp_seq=9 ttl=43 time=32.2 ms
64 bytes from 8.8.8.8: icmp_seq=12 ttl=43 time=32.0 ms
^C
--- 8.8.8.8 ping statistics ---
17 packets transmitted, 3 received, 82% packet loss, time 16003ms
rtt min/avg/max/mdev = 32.038/32.208/32.362/0.246 ms
 
4、完全无法ping通的情形:
[root@aiezu.com ~]# ping -c 3 9.9.9.9
PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data.

--- 9.9.9.9 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms
 
五、常见错误:
1、错误一:
ping: packet size too large: 70000
WARNING: packet size 65508 is too large. Maximum is 65507
PING 10.0.0.52 (10.0.0.52) 65508(65536) bytes of data.
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500
解决:
  将ping的“-s”参数设置一个更小的值,windows最大值为“65500”,linux最大值为“65507”。

PHP array_udiff_uassoc 函数

PHPllslx520 发表了文章 • 0 个评论 • 193 次浏览 • 2016-11-14 14:25 • 来自相关话题

一、函数功能:
  计算出第一个数组与其他数组的差集(考虑键名和键值,对键名和键值的比较都使用自定义函数)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键/值对。此函数键值比较和键名比较都使用用户自定义函数。关于计算差集系列函数的区别请参考:PHP数组计算差集系列函数的区别。

二、函数语法:array array_udiff_uassoc($array1 , $array2[, $...], $user_value_compare_func, $user_key_compare_func)
三、函数参数:参数名描述$array1参与比较的第一个数组;$array2参与比较的第二个数组;...参与比较的更多数组;$user_value_compare_func用户自定义回调函数,用来比较键值。如果认为第一个键值小于,等于,或大于第二个键值时必须分别返回一个小于零,等于零,或大于零的整数。只有键名比较返回0,对应的键值才会传递给此自定义函数比较。$user_key_compare_func用户自定义回调函数,用来比较键名。如果认为第一个键名小于,等于,或大于第二个键名时必须分别返回一个小于零,等于零,或大于零的整数。 
四、返回值:返回第一个数组与其他数组的键名/键值对差集组成的数组。
五、用法举例:
1、array_udiff_uassoc 函数工作流程解析:
  大体分为3步:1、每个数组key的排序去重;2、判断第一个数组的key是否与其他数组的key相等,如果相等返回0,然后执行第3步;3、判断第2步相等的key对应的值是否相等,相等返回0,此key和对应的值不会再出现在返回数组中,执行第1步比较下一对key。<?php
function user_key_compare_func($k1, $k2) {
echo sprintf("debug key: %s vs %s %s\n", $k1, $k2, $k1===$k2 ? 0 : ($k1>$k2?1:-1) ); //debug行
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}

function user_value_compare_func($v1, $v2) {
echo sprintf("debug value: %s vs %s %s\n", $v1, $v2, $v1===$v2 ? 0 : ($v1>$v2?1:-1) ); //debug行
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}

$arr1 = array('爱E族', 'aiezu', 'b'=>'bb',);
$arr2 = array('name'=>'爱E族', 'b'=>'bb', 'aiezu');

$result = array_udiff_uassoc($arr1, $arr2, "user_value_compare_func", "user_key_compare_func");
print_r($result);输出:debug key: 1 vs 0 1 #$arr1的key排序去重
debug key: b vs 1 -1
debug key: 0 vs b -1 #$arr2的key排序去重
debug key: b vs name -1

debug key: 0 vs b -1 #key不相等
debug key: 0 vs 0 0 #key相等,下步比较key对应的键值
debug value: 爱E族 vs aiezu 1 #key对应的键值不相等,key:0,value:爱E族会出现在返回数组中
debug key: b vs 0 -1
debug key: b vs b 0 #key相等,下步比较key对应的键值
debug value: bb vs bb 0 #key对应的键值也相等,$arr1中键b和对应的键值bb不会出现在返回数组中
debug key: 1 vs 0 1
debug key: 1 vs b 1
debug key: 1 vs name 1
Array
(
[0] => 爱E族
[1] => aiezu
)
2、使用类函数作为键值和键名比较函数,找出三个数组的差集:<?php
class user {
function key_compare($k1, $k2) {
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
function value_compare($v1, $v2) {
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}
}
$arr1 = array('爱E族', 'aiezu', 'b'=>'bb',);
$arr2 = array('name'=>'爱E族', 'b'=>'bb', 'aiezu');
$arr3 = array('1'=>'aiezu');
$result = array_udiff_uassoc($arr1, $arr2, $arr3, array("user", "value_compare"), array("user", "key_compare"));
print_r($result);输出:Array
(
[0] => 爱E族
) 查看全部
一、函数功能:
  计算出第一个数组与其他数组的差集(考虑键名和键值,对键名和键值的比较都使用自定义函数)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键/值对。此函数键值比较和键名比较都使用用户自定义函数。关于计算差集系列函数的区别请参考:PHP数组计算差集系列函数的区别

二、函数语法:
array array_udiff_uassoc($array1 , $array2[, $...], $user_value_compare_func, $user_key_compare_func)

三、函数参数:
参数名描述
$array1参与比较的第一个数组;
$array2参与比较的第二个数组;
...参与比较的更多数组;
$user_value_compare_func用户自定义回调函数,用来比较键值。如果认为第一个键值小于,等于,或大于第二个键值时必须分别返回一个小于零,等于零,或大于零的整数。只有键名比较返回0,对应的键值才会传递给此自定义函数比较。
$user_key_compare_func用户自定义回调函数,用来比较键名。如果认为第一个键名小于,等于,或大于第二个键名时必须分别返回一个小于零,等于零,或大于零的整数。
 
四、返回值:
返回第一个数组与其他数组的键名/键值对差集组成的数组。

五、用法举例:
1、array_udiff_uassoc 函数工作流程解析:
  大体分为3步:1、每个数组key的排序去重;2、判断第一个数组的key是否与其他数组的key相等,如果相等返回0,然后执行第3步;3、判断第2步相等的key对应的值是否相等,相等返回0,此key和对应的值不会再出现在返回数组中,执行第1步比较下一对key。
<?php
function user_key_compare_func($k1, $k2) {
echo sprintf("debug key: %s vs %s %s\n", $k1, $k2, $k1===$k2 ? 0 : ($k1>$k2?1:-1) ); //debug行
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}

function user_value_compare_func($v1, $v2) {
echo sprintf("debug value: %s vs %s %s\n", $v1, $v2, $v1===$v2 ? 0 : ($v1>$v2?1:-1) ); //debug行
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}

$arr1 = array('爱E族', 'aiezu', 'b'=>'bb',);
$arr2 = array('name'=>'爱E族', 'b'=>'bb', 'aiezu');

$result = array_udiff_uassoc($arr1, $arr2, "user_value_compare_func", "user_key_compare_func");
print_r($result);
输出:
debug   key: 1 vs 0 1  #$arr1的key排序去重
debug key: b vs 1 -1
debug key: 0 vs b -1 #$arr2的key排序去重
debug key: b vs name -1

debug key: 0 vs b -1 #key不相等
debug key: 0 vs 0 0 #key相等,下步比较key对应的键值
debug value: 爱E族 vs aiezu 1 #key对应的键值不相等,key:0,value:爱E族会出现在返回数组中
debug key: b vs 0 -1
debug key: b vs b 0 #key相等,下步比较key对应的键值
debug value: bb vs bb 0 #key对应的键值也相等,$arr1中键b和对应的键值bb不会出现在返回数组中
debug key: 1 vs 0 1
debug key: 1 vs b 1
debug key: 1 vs name 1
Array
(
[0] => 爱E族
[1] => aiezu
)

2、使用类函数作为键值和键名比较函数,找出三个数组的差集:
<?php
class user {
function key_compare($k1, $k2) {
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
function value_compare($v1, $v2) {
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}
}
$arr1 = array('爱E族', 'aiezu', 'b'=>'bb',);
$arr2 = array('name'=>'爱E族', 'b'=>'bb', 'aiezu');
$arr3 = array('1'=>'aiezu');
$result = array_udiff_uassoc($arr1, $arr2, $arr3, array("user", "value_compare"), array("user", "key_compare"));
print_r($result);
输出:
Array
(
[0] => 爱E族
)

PHP array_udiff_assoc 函数

PHPllslx520 发表了文章 • 0 个评论 • 154 次浏览 • 2016-11-14 14:18 • 来自相关话题

一、函数功能:
  计算出第一个数组与其他数组的差集(考虑键名和键值,对键值的比较使用自定义函数)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键/值对。此函数键值比较使用用户自定义函数,键名比较使用系统默认。关于计算差集系列函数的区别请参考:PHP数组计算差集系列函数的区别。

二、函数语法:array array_udiff_assoc($array1, $array2[, $... ], $user_value_compare_func)
三、函数参数:参数名描述$array1参与比较的第一个数组;$array2参与比较的第二个数组;...参与比较的更多数组;user_value_compare_func用户自定义回调函数,用来比较键值。如果认为第一个键值小于,等于,或大于第二个键值时必须分别返回一个小于零,等于零,或大于零的整数。 
四、返回值:返回第一个数组与其他数组的键名/键值对差集组成的数组。
五、用法举例:
1、array_udiff_assoc 的自定义函数工作流程:<?php
function user_value_compare_func($v1, $v2) {
echo sprintf("debug: value %s %s %s\n", $v1, $v2, $v1===$v2 ? 0 : ($v1>$v2?1:-1) ); //debug行
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}

$arr1 = array('爱E族', 'aiezu', 'b'=>'bb',);
$arr2 = array('name'=>'爱E族', 'b'=>'bb', 'aiezu');
$result = array_udiff_assoc($arr1, $arr2, "user_value_compare_func");
print_r($result);输出:debug: value 爱E族 aiezu 1 #键名相等但键值不相等,“爱E族”会出现在返回结果中。
debug: value bb bb 0 #键名相等且键值也相等,,“bb”不会出现在返回结果中。
Array
(
[0] => 爱E族
[1] => aiezu #键名不相等,不会提交给user_value_compare_func函数比较键值

2、使用类函数作为键值比较函数,找出三个数组的差集:<?php
class user {
function value_compare($v1, $v2) {
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}
}
$arr1 = array('usage', 'aiezu', '爱E族', 'com');
$arr2 = array('com', '2'=>'爱E族');
$arr3 = array('usage');
$result = array_udiff_assoc($arr1, $arr2, $arr3, array("user", "value_compare"));
print_r($result);输出:Array
(
[1] => aiezu
[3] => com
) 查看全部
一、函数功能:
  计算出第一个数组与其他数组的差集(考虑键名和键值,对键值的比较使用自定义函数)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键/值对。此函数键值比较使用用户自定义函数,键名比较使用系统默认。关于计算差集系列函数的区别请参考:PHP数组计算差集系列函数的区别

二、函数语法:
array array_udiff_assoc($array1, $array2[, $... ], $user_value_compare_func)

三、函数参数:
参数名描述
$array1参与比较的第一个数组;
$array2参与比较的第二个数组;
...参与比较的更多数组;
user_value_compare_func用户自定义回调函数,用来比较键值。如果认为第一个键值小于,等于,或大于第二个键值时必须分别返回一个小于零,等于零,或大于零的整数。
 
四、返回值:
返回第一个数组与其他数组的键名/键值对差集组成的数组。

五、用法举例:
1、array_udiff_assoc 的自定义函数工作流程:
<?php
function user_value_compare_func($v1, $v2) {
echo sprintf("debug: value %s %s %s\n", $v1, $v2, $v1===$v2 ? 0 : ($v1>$v2?1:-1) ); //debug行
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}

$arr1 = array('爱E族', 'aiezu', 'b'=>'bb',);
$arr2 = array('name'=>'爱E族', 'b'=>'bb', 'aiezu');
$result = array_udiff_assoc($arr1, $arr2, "user_value_compare_func");
print_r($result);
输出:
debug: value 爱E族 aiezu 1   #键名相等但键值不相等,“爱E族”会出现在返回结果中。
debug: value bb bb 0 #键名相等且键值也相等,,“bb”不会出现在返回结果中。
Array
(
[0] => 爱E族
[1] => aiezu #键名不相等,不会提交给user_value_compare_func函数比较键值
)
 
2、使用类函数作为键值比较函数,找出三个数组的差集:
<?php
class user {
function value_compare($v1, $v2) {
if ( $v1 === $v2 ) {
return 0;
}
return $v1 > $v2 ? 1 : -1;
}
}
$arr1 = array('usage', 'aiezu', '爱E族', 'com');
$arr2 = array('com', '2'=>'爱E族');
$arr3 = array('usage');
$result = array_udiff_assoc($arr1, $arr2, $arr3, array("user", "value_compare"));
print_r($result);
输出:
Array
(
[1] => aiezu
[3] => com
)

PHP array_diff_ukey 函数

PHPllslx520 发表了文章 • 0 个评论 • 147 次浏览 • 2016-11-14 13:59 • 来自相关话题

一、函数功能:
  计算出第一个数组与其他数组的键名差集(只考虑键名,不考虑键值,对键名的比较使用自定义函数)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键名,返回键名及其对应的值组成的数组。PHP 5.1开始才支持此函数。关于计算数组差集系列函数的区别请参考页面:PHP数组计算差集系列函数的区别。
 
二、函数语法:array array_diff_ukey ( $array1, $array2 [, $...], $user_key_compare_func) 
三、函数参数:参数名描述$array1参与比较的第一个数组;$array2参与比较的第二个数组;...参与比较的更多数组;$user_key_compare_func用户自定义回调函数,用来比较键名。如果认为第一个键名小于,等于,或大于第二个键名时必须分别返回一个小于零,等于零,或大于零的整数。 
四、返回值:返回第一个数组中不包含在其他任何数组中的键名及其对应的值组成的数组。
五、用法举例:
1、array_diff_ukey 函数工作流程解析:<?php
function user_key_compare_func($k1, $k2) {
echo sprintf("%s %s %s\n", $k1, $k2, $k1===$k2 ? 0 : ($k1>$k2?1:-1) ); //debug行
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}

$arr1 = array("a"=>1, "b"=>2, "c"=>3);
$arr2 = array("a" =>'aa', "b"=>2, "d"=>3);
$result = array_diff_ukey($arr1, $arr2, "user_key_compare_func");
print_r($result);输出:b a 1 #数组$arr1键名排序去重
c b 1
b a 1 #数组$arr2键名排序去重
d b 1

a a 0 #键名相等,不会在出现在返回数组中
b a 1
b b 0 #键名相等,不会在出现在返回数组中
c a 1
c b 1
c d -1
Array
(
[c] => 3

2、使用类中的自定义函数比较三个数组。<?php
class user {
function key_compare($k1, $k2) {
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
}
$arr1 = array("a"=>1, "b"=>2, "c"=>3);
$arr2 = array("a" =>'aa', "d"=>3);
$arr3 = array('c'=>3);
$result = array_diff_ukey($arr1, $arr2, $arr3, array("user", "key_compare"));
print_r($result);输出:Array
(
<strong> => 2
)</strong> 查看全部
一、函数功能:
  计算出第一个数组与其他数组的键名差集(只考虑键名,不考虑键值,对键名的比较使用自定义函数)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键名,返回键名及其对应的值组成的数组。PHP 5.1开始才支持此函数。关于计算数组差集系列函数的区别请参考页面:PHP数组计算差集系列函数的区别
 
二、函数语法:
array array_diff_ukey ( $array1, $array2 [, $...], $user_key_compare_func)
 
三、函数参数:
参数名描述
$array1参与比较的第一个数组;
$array2参与比较的第二个数组;
...参与比较的更多数组;
$user_key_compare_func用户自定义回调函数,用来比较键名。如果认为第一个键名小于,等于,或大于第二个键名时必须分别返回一个小于零,等于零,或大于零的整数。
 
四、返回值:
返回第一个数组中不包含在其他任何数组中的键名及其对应的值组成的数组。

五、用法举例:
1、array_diff_ukey 函数工作流程解析:
<?php
function user_key_compare_func($k1, $k2) {
echo sprintf("%s %s %s\n", $k1, $k2, $k1===$k2 ? 0 : ($k1>$k2?1:-1) ); //debug行
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}

$arr1 = array("a"=>1, "b"=>2, "c"=>3);
$arr2 = array("a" =>'aa', "b"=>2, "d"=>3);
$result = array_diff_ukey($arr1, $arr2, "user_key_compare_func");
print_r($result);
输出:
b a 1  #数组$arr1键名排序去重
c b 1
b a 1 #数组$arr2键名排序去重
d b 1

a a 0 #键名相等,不会在出现在返回数组中
b a 1
b b 0 #键名相等,不会在出现在返回数组中
c a 1
c b 1
c d -1
Array
(
[c] => 3
)
 
2、使用类中的自定义函数比较三个数组。
<?php
class user {
function key_compare($k1, $k2) {
if ( $k1 === $k2 ) {
return 0;
}
return $k1 > $k2 ? 1 : -1;
}
}
$arr1 = array("a"=>1, "b"=>2, "c"=>3);
$arr2 = array("a" =>'aa', "d"=>3);
$arr3 = array('c'=>3);
$result = array_diff_ukey($arr1, $arr2, $arr3, array("user", "key_compare"));
print_r($result);
输出:
Array
(
<strong> => 2
)</strong>

PHP array_diff_key 函数

PHPllslx520 发表了文章 • 0 个评论 • 142 次浏览 • 2016-11-14 13:54 • 来自相关话题

一、函数功能:
  计算出第一个数组与其他数组的键名差集(只考虑键名,不考虑键值)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键名,返回键名及其对应的值组成的数组。PHP 5.1开始才支持此函数。关于计算数组差集系列函数的区别请参考页面:PHP数组计算差集系列函数的区别。

二、函数语法:array array_diff_key ( $array1 , $array2 [, $...] )
三、函数参数:参数名描述$array1参与比较的第一个数组;$array2参与比较的第二个数组;...参与比较的更多数组; 
四、返回值:返回第一个数组中不包含在其他任何数组中的键名及其对应的值组成的数组。
五、用法举例:
1、两个数组的比较:
  只要第一个数组中的key出现在后续数组key中,不管值是不是一样,都不会出现在返回数组中。<?php
$arr1 = array("a"=>"aa", "b"=>"aiezu.com", "c"=>"cc");
$arr2 = array("a"=>false, "aiezu.com", "c"=>"cc");
print_r(array_diff_key($arr1, $arr2));输出:Array
(
<strong> => bb
)</strong>
2、三个数组的比较:<strong><?php
$arr1 = array("a"=>"aa", "b"=>"bb", "c"=>"cc");
$arr2 = array("a"=>false);
$arr3 = array("b"=>'bb');
print_r(array_diff_key($arr1, $arr2, $arr3));</strong>输出:<strong>Array
(
[c] => cc
)</strong>
3、array_diff_key是将数组键强制转换为"string"后进行"==="(全等于)比较:<strong><?php
$arr1 = array(false=>"aa"); #false做为数组键时会自动转换为0
$arr2 = array("0"=>false);
print_r($arr1);
print_r(array_diff_key($arr1, $arr2));</strong>输出:<strong>Array
(
[0] => aa
)
Array
(
)</strong> 查看全部
一、函数功能:
  计算出第一个数组与其他数组的键名差集(只考虑键名,不考虑键值)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键名,返回键名及其对应的值组成的数组。PHP 5.1开始才支持此函数。关于计算数组差集系列函数的区别请参考页面:PHP数组计算差集系列函数的区别

二、函数语法:
array array_diff_key ( $array1 , $array2 [, $...] )

三、函数参数:
参数名描述
$array1参与比较的第一个数组;
$array2参与比较的第二个数组;
...参与比较的更多数组;
 
四、返回值:
返回第一个数组中不包含在其他任何数组中的键名及其对应的值组成的数组。

五、用法举例:
1、两个数组的比较:
  只要第一个数组中的key出现在后续数组key中,不管值是不是一样,都不会出现在返回数组中。
<?php
$arr1 = array("a"=>"aa", "b"=>"aiezu.com", "c"=>"cc");
$arr2 = array("a"=>false, "aiezu.com", "c"=>"cc");
print_r(array_diff_key($arr1, $arr2));
输出:
Array
(
<strong> => bb
)</strong>

2、三个数组的比较:
<strong><?php
$arr1 = array("a"=>"aa", "b"=>"bb", "c"=>"cc");
$arr2 = array("a"=>false);
$arr3 = array("b"=>'bb');
print_r(array_diff_key($arr1, $arr2, $arr3));</strong>
输出:
<strong>Array
(
[c] => cc
)</strong>

3、array_diff_key是将数组键强制转换为"string"后进行"==="(全等于)比较:
<strong><?php
$arr1 = array(false=>"aa"); #false做为数组键时会自动转换为0
$arr2 = array("0"=>false);
print_r($arr1);
print_r(array_diff_key($arr1, $arr2));</strong>
输出:
<strong>Array
(
[0] => aa
)
Array
(
)</strong>

CentOS 7 使用Yum方式安装配置vsftpd服务

CentOSllslx520 发表了文章 • 0 个评论 • 88 次浏览 • 3 天前 • 来自相关话题

  ftp是我们最常用的网络协议之一,用于方便的在网络中传输文件。vsftp是Linux平台轻量级的ftp服务软件,它小巧轻快、简单易用。本文介绍CentOS 7下使用yum安装配置vsftpd服务器,包括匿名登录方式、系统用户登录方式和虚拟用户登录三种登录方式的vsftpd服务配置。本文也适用于RHEL、Fedora、Oracle Linux 等其它Linux Redhat发行版本。一、实验环境:操作系统: CentOS Linux release 7.2.1511 (Core)CPU构架:x86_64 Vsftpd版本:vsftpd-3.0.2-21.el7 二、安装准备:1、关闭SELINUX:  SELINUX为Linux提供安全强化同时,也让Linux服务安装变得更复杂。未正确的为相关服务配置SELINUX,将导致服务无法正常运行。所以对于初学者来说,建议关闭SELINUX。vim /etc/selinux/config:#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加保存退出后,执行“setenforce 0”命令使配置立生效:setenforce 0 三、安装vsftpd服务:1、使用安装yum安装vsftpd:  使用“yum -y install vsftpd ”命令,会自动安装vsftpd命令和相关依赖包:yum -y install vsftpd2、备份vsftpd配置文件:cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak 四、方案一,配置匿名访问的vsftpd服务:1、配置vsftpd.conf文件:#允许匿名用户访问
anonymous_enable=YES
#禁止本地用户访问
local_enable=NO
#允许匿名用户创建目录
anon_mkdir_write_enable=YES
#允许匿名用户上传文件
anon_upload_enable=YES
#允许匿名用户执行其他写入操作,如删除
anon_other_write_enable=YES
#设置匿名用户根目录
anon_root=/ftp2、创建匿名用户目录:# /ftp/pub目录可写,/ftp目录不可写
mkdir -p /ftp/pub
chown -R ftp.ftp /ftp
chmod a-w /ftp3、启动vsftpd服务:[root@aiezu.com vsftpd]# service vsftpd start
Redirecting to /bin/systemctl start vsftpd.service4、测试:在另外一台服务器上连接ftp进行测试,使用匿名用户“anonymous”和任意包含"@"字符串的密码进行连接:[root@aiezu.com ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (106,14,37,132,180,191).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 4096 Mar 24 15:01 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir ok
257 "/pub/ok" created
ftp> rm ok
250 Remove directory operation successful. 五、方案二,配置本地用户(系统)访问的vsftpd服务:1、配置主配置文件vsftpd.conf:#禁止匿名用户访问
anonymous_enable=NO
#允许本地用户访问
local_enable=YES
#允许写入操作
write_enable=YES
#禁止用户离开自己的用户根目录
chroot_local_user=YES
#启用用户名单列表
userlist_enable=YES
#设置用户名单列表为白名单(只允许名单中的用户连接到vsftpd)
userlist_deny=NO
#设置用户名单列表文件名
userlist_file=/etc/vsftpd/user_allow2、添加测试用户和设置权限:  添加用户testuser,设置密码后,添加到"/etc/vsftpd/user_allow"文件,并重启vsftpd服务:[root@aiezu.com ~]# mkdir -p /ftproot/testuser
[root@aiezu.com ~]# useradd -d /ftproot testuser -s /sbin/nologin
[root@aiezu.com ~]# chown -R testuser.testuser /ftproot/testuser
[root@aiezu.com ~]# chmod a-w /ftproot
[root@aiezu.com ~]# passwd testuser
Changing password for user testuser.
New password: (这里输入密码)
passwd: all authentication tokens updated successfully.
[root@aiezu.com ~]# echo "testuser" >> /etc/vsftpd/user_allow3、重启vsftpd服务:[root@aiezu.com ~]# service vsftpd restart
Redirecting to /bin/systemctl restart vsftpd.service4、测试:  在另外一台服务器上连接ftp进行测试,使用本地用户“testuser”和你设置的密码进行连接:[root@s2 ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): testuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (106,14,37,132,223,218).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 Mar 25 12:56 testuser
226 Directory send OK.
ftp> mkdir aa
550 Create directory operation failed.
ftp> cd testuser
250 Directory successfully changed.
ftp> mkdir aa
257 "/testuser/aa" created
ftp> dir
227 Entering Passive Mode (106,14,37,132,89,105).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 Mar 25 12:58 aa
226 Directory send OK. 六、方案三,配置虚拟用户访问的vsftpd服务(推荐方式):1、创建虚拟用户密码文件,奇数行为用户名,偶数行为密码:touch /etc/vsftpd/vir_user.txt
echo -e "aiezuuser\naiezu123" >> /etc/vsftpd/vir_user.txt
2、生成虚拟用户数据库:yum -y install libdb-utils
db_load -T -t hash -f /etc/vsftpd/vir_user.txt /etc/vsftpd/vir_user.db
3、配置vsftpd pam验证文件/etc/pam.d/vsftpd:mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
cat <<END > /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vir_user
account required pam_userdb.so db=/etc/vsftpd/vir_user
END
4、修改虚拟数据库文件vir_user.db的权限为700:chmod 700 /etc/vsftpd/vir_user.db
5、增加一个系统用户virftp ,所有虚拟用户都会映射到此用户后对文件系统进行读写操作:
mkdir /ftprootuseradd -d /ftproot virftp -s /sbin/nologin
chown -R virftp.virftp /ftproot
6、设置vsftpd主配置文件/etc/vsftpd/vsftpd.conf:#禁止匿名用户登录
anonymous_enable=NO
#允许本地用户登录
local_enable=YES
#启用虚拟账户
guest_enable=YES
#把虚拟账户映射到系统账户virftp
guest_username=virftp
#使用虚拟用户验证(PAM验证)
pam_service_name=vsftpd
#设置存放各虚拟用户配置文件的目录(此目录下与虚拟用户名相同的文件为他的配置文件)
user_config_dir=/etc/vsftpd/vsftpd_viruser
#启用chroot时,虚拟用户根目录允许写入
allow_writeable_chroot=YES
7、设置虚拟用户各自的配置文件:mkdir /etc/vsftpd/vsftpd_viruser/
#配置文件名同虚拟账户名
touch /etc/vsftpd/vsftpd_viruser/aiezuuser
mkdir -p /ftproot/aiezuuser/
chown -R virftp.virftp /ftproot/aiezuuser/
8、在虚拟用户 aiezuuser 的配置文件中写入如下配置/etc/vsftpd/vsftpd_viruser/aiezuuser:# 允许写入
write_enable=YES
#允许浏览FTP目录和下载
anon_world_readable_only=NO
# 允许虚拟用户aiezuuser上传文件
anon_upload_enable=YES
# 允许虚拟用户创建目录
anon_mkdir_write_enable=YES
# 允许虚拟用户aiezuuser执行其他操作(如改名、删除)
anon_other_write_enable=YES
# 指定虚拟用户的虚拟目录(虚拟用户登录后的主目录)
local_root=/ftproot/aiezuuser/
9、重启vsftpd服务:service vsftpd restart 
10、使用虚拟用户aiezuuser和密码aiezu123进行连接vsftpd测试: [root@S2 ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): aiezuuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir aa
257 "/aa" created
ftp> mkdir bb
257 "/bb" created
ftp> ls
227 Entering Passive Mode (106,14,37,132,129,241).
150 Here comes the directory listing.
drwx------ 2 1000 1000 4096 Mar 25 14:36 aa
drwx------ 2 1000 1000 4096 Mar 25 14:36 bb
226 Directory send OK. 七、常见问题:问题一:连接到vsftpd服务器时,提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()解决方法:请参考http://aiezu.com/question/112.html 
  八、附录:1、vsftpd相关目录和文件介绍:/etc/vsftpd/vsftpd.conf:vsftpd服务主配置文件;/etc/vsftpd/ftpusers:设置不允许访问ftp服务的系统用户(黑名单),一行一个用户名;/etc/vsftpd/user_list:用于设置允许或禁止访问vsftpd服务的系统用户名单,主配置文件的“userlist_enable”参数决定此名单是否生效,“userlist_deny”参数决定此名单是黑名单还是白名单;/etc/pam.d/vsftpd:vsftpd的pam模块的配置文件,用来认证身份和阻止特定用户;/usr/sbin/vsftpd:vsftpd的主要执行文件;/var/ftp:vsftpd的默认匿名用户登录的根目录。 2、主配置文件vsftpd.conf相关参数介绍:  vsftpd的配置参数很多,我们可以通过man 5 vsftpd.conf命令获取到vsftpd.conf配置文件的详细帮助信息。下面介绍一些vsftpd常用的参数。
①. vsftpd服务全局相关参数:参数描述connect_from_port_20=YES|NO是否使用20号端口做为ftp-data的端口号listen_port=21设置vsftpd服务监听的端口号listen=YES|NO设置vsftpd是否stand alone方式启动pasv_enable=YES|NO是否开启被动模式pasv_max_port=0
pasv_min_port=0设置被动模式(passive mode)使用的端口范围,为0时不受限制max_Clients=0当vsftpd以stand alone运行时,用来设置最大同时在线数max_per_ip=0用于设置同一IP允许的同时最大连接数idle_session_timeout=300如果用户300秒内没有命令操作,则强制离线ftpd_banner="欢迎信息"
banner_file=/path/file通过字符串或者文件的方式设置连接到vsftpd服务器时的欢迎信息dirmessange_enable=YES|NO
message_file=.message配置ftp进入目录时显示目录下某个文件的内容做为提示信息ascii_download_enable=YES|NO
ascii_upload_enable=YES|NO是否允许ascii方式传输xferlog_enable=YES|NO
xferlog_file=/var/log/vsftpd.log是否记录用户下载上传的文件②. vsftpd用户、权限相关参数:参数描述write_enable=YES|NO用来设置是否允许用户上传文件guest_username=ftp指定来宾用户身份的用户名guest_enable=YES|NO是否将非匿名用户映射成来宾用户。local_enable=YES|NO是否允许/etc/passwd中的用户以实体用户的身份登录到ftp服务器。local_max_rate=0设置最大传输速度,单位为bytes/schroot_local_user=YES|NO
chroot_list_enable=YES|NO
chroot_list_file=/etc/vsftpd/chroot_list用来设置哪些用户被限制在自己的目录内无法离开allow_writeable_chroot=YES|NO启用chroot时用户根目录是否允许写入,默认否userlist_enable=YES|NO
userlist_deny=YES|NO
userlist_file=/etc/vsftpd/user_list用来阻止或者允许相关用户登录到vsftpd服务器;  
userlist_file:指定允许或禁止访问vsftpd服务的系统用户名单文件;
userlist_enable:决定名单是否生效;
userlist_deny:决定此名单是黑名单还是白名单;anonymous_enable=YES|NO是否允许anonymouns用户登录到vsftpd服务器anon_root=/var/ftp设置匿名用户根目录anon_world_readable_only=YES|NO匿名用户是否只允许下载可读的文件anon_mkdir_write_enable=YES|NO
anon_upload_enable=YES|NO
anon_other_write_enable=YES|NO设置匿名用户的写入权限no_anon_password=YES|NOanonymous登录时是否可以省略密码。
(匿名用户使用用户名“anonymous”,密码使用任意包含“@”字符的字符串登陆)anon_max_rate=0设置anonymous的最大传输速度。anon_umask=077anonymous用户上传文件的权限掩码。 查看全部
  ftp是我们最常用的网络协议之一,用于方便的在网络中传输文件。vsftp是Linux平台轻量级的ftp服务软件,它小巧轻快、简单易用。本文介绍CentOS 7下使用yum安装配置vsftpd服务器,包括匿名登录方式、系统用户登录方式和虚拟用户登录三种登录方式的vsftpd服务配置。本文也适用于RHEL、Fedora、Oracle Linux 等其它Linux Redhat发行版本。

一、实验环境:

 

二、安装准备:

1、关闭SELINUX:

  SELINUX为Linux提供安全强化同时,也让Linux服务安装变得更复杂。未正确的为相关服务配置SELINUX,将导致服务无法正常运行。所以对于初学者来说,建议关闭SELINUX。vim /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
保存退出后,执行“setenforce 0”命令使配置立生效:
setenforce 0
 

三、安装vsftpd服务:

1、使用安装yum安装vsftpd:

  使用“yum -y install vsftpd ”命令,会自动安装vsftpd命令和相关依赖包:
yum -y install vsftpd

2、备份vsftpd配置文件:

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
 

四、方案一,配置匿名访问的vsftpd服务:

1、配置vsftpd.conf文件:

#允许匿名用户访问
anonymous_enable=YES
#禁止本地用户访问
local_enable=NO
#允许匿名用户创建目录
anon_mkdir_write_enable=YES
#允许匿名用户上传文件
anon_upload_enable=YES
#允许匿名用户执行其他写入操作,如删除
anon_other_write_enable=YES
#设置匿名用户根目录
anon_root=/ftp

2、创建匿名用户目录:

# /ftp/pub目录可写,/ftp目录不可写
mkdir -p /ftp/pub
chown -R ftp.ftp /ftp
chmod a-w /ftp

3、启动vsftpd服务:

[root@aiezu.com vsftpd]# service vsftpd start
Redirecting to /bin/systemctl start vsftpd.service

4、测试:

在另外一台服务器上连接ftp进行测试,使用匿名用户“anonymous”和任意包含"@"字符串的密码进行连接:
[root@aiezu.com ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (106,14,37,132,180,191).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 4096 Mar 24 15:01 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir ok
257 "/pub/ok" created
ftp> rm ok
250 Remove directory operation successful.
 

五、方案二,配置本地用户(系统)访问的vsftpd服务:

1、配置主配置文件vsftpd.conf:

#禁止匿名用户访问
anonymous_enable=NO
#允许本地用户访问
local_enable=YES
#允许写入操作
write_enable=YES
#禁止用户离开自己的用户根目录
chroot_local_user=YES
#启用用户名单列表
userlist_enable=YES
#设置用户名单列表为白名单(只允许名单中的用户连接到vsftpd)
userlist_deny=NO
#设置用户名单列表文件名
userlist_file=/etc/vsftpd/user_allow

2、添加测试用户和设置权限:

  添加用户testuser,设置密码后,添加到"/etc/vsftpd/user_allow"文件,并重启vsftpd服务:
[root@aiezu.com ~]# mkdir -p /ftproot/testuser
[root@aiezu.com ~]# useradd -d /ftproot testuser -s /sbin/nologin
[root@aiezu.com ~]# chown -R testuser.testuser /ftproot/testuser
[root@aiezu.com ~]# chmod a-w /ftproot
[root@aiezu.com ~]# passwd testuser
Changing password for user testuser.
New password: (这里输入密码)
passwd: all authentication tokens updated successfully.
[root@aiezu.com ~]# echo "testuser" >> /etc/vsftpd/user_allow

3、重启vsftpd服务:

[root@aiezu.com ~]# service vsftpd restart
Redirecting to /bin/systemctl restart vsftpd.service

4、测试:

  在另外一台服务器上连接ftp进行测试,使用本地用户“testuser”和你设置的密码进行连接:
[root@s2 ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): testuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (106,14,37,132,223,218).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 Mar 25 12:56 testuser
226 Directory send OK.
ftp> mkdir aa
550 Create directory operation failed.
ftp> cd testuser
250 Directory successfully changed.
ftp> mkdir aa
257 "/testuser/aa" created
ftp> dir
227 Entering Passive Mode (106,14,37,132,89,105).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 Mar 25 12:58 aa
226 Directory send OK.
 

六、方案三,配置虚拟用户访问的vsftpd服务(推荐方式):

1、创建虚拟用户密码文件,奇数行为用户名,偶数行为密码:
touch /etc/vsftpd/vir_user.txt
echo -e "aiezuuser\naiezu123" >> /etc/vsftpd/vir_user.txt

2、生成虚拟用户数据库:
yum -y install libdb-utils 
db_load -T -t hash -f /etc/vsftpd/vir_user.txt /etc/vsftpd/vir_user.db

3、配置vsftpd pam验证文件/etc/pam.d/vsftpd:
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
cat <<END > /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vir_user
account required pam_userdb.so db=/etc/vsftpd/vir_user
END

4、修改虚拟数据库文件vir_user.db的权限为700:
chmod 700 /etc/vsftpd/vir_user.db

5、增加一个系统用户virftp ,所有虚拟用户都会映射到此用户后对文件系统进行读写操作:
mkdir /ftproot
useradd -d /ftproot virftp -s /sbin/nologin
chown -R virftp.virftp /ftproot

6、设置vsftpd主配置文件/etc/vsftpd/vsftpd.conf:
#禁止匿名用户登录
anonymous_enable=NO
#允许本地用户登录
local_enable=YES
#启用虚拟账户
guest_enable=YES
#把虚拟账户映射到系统账户virftp
guest_username=virftp
#使用虚拟用户验证(PAM验证)
pam_service_name=vsftpd
#设置存放各虚拟用户配置文件的目录(此目录下与虚拟用户名相同的文件为他的配置文件)
user_config_dir=/etc/vsftpd/vsftpd_viruser
#启用chroot时,虚拟用户根目录允许写入
allow_writeable_chroot=YES

7、设置虚拟用户各自的配置文件:
mkdir /etc/vsftpd/vsftpd_viruser/
#配置文件名同虚拟账户名
touch /etc/vsftpd/vsftpd_viruser/aiezuuser
mkdir -p /ftproot/aiezuuser/
chown -R virftp.virftp /ftproot/aiezuuser/

8、在虚拟用户 aiezuuser 的配置文件中写入如下配置/etc/vsftpd/vsftpd_viruser/aiezuuser:
# 允许写入
write_enable=YES
#允许浏览FTP目录和下载
anon_world_readable_only=NO
# 允许虚拟用户aiezuuser上传文件
anon_upload_enable=YES
# 允许虚拟用户创建目录
anon_mkdir_write_enable=YES
# 允许虚拟用户aiezuuser执行其他操作(如改名、删除)
anon_other_write_enable=YES
# 指定虚拟用户的虚拟目录(虚拟用户登录后的主目录)
local_root=/ftproot/aiezuuser/

9、重启vsftpd服务:
service vsftpd restart
 
10、使用虚拟用户aiezuuser和密码aiezu123进行连接vsftpd测试: 
[root@S2 ~]# ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 (vsFTPd 3.0.2)
Name (yyy.yyy.yyy.yyy:root): aiezuuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir aa
257 "/aa" created
ftp> mkdir bb
257 "/bb" created
ftp> ls
227 Entering Passive Mode (106,14,37,132,129,241).
150 Here comes the directory listing.
drwx------ 2 1000 1000 4096 Mar 25 14:36 aa
drwx------ 2 1000 1000 4096 Mar 25 14:36 bb
226 Directory send OK.
 

七、常见问题:

问题一:连接到vsftpd服务器时,提示:

500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解决方法:请参考http://aiezu.com/question/112.html 
  

八、附录:

1、vsftpd相关目录和文件介绍:

  • /etc/vsftpd/vsftpd.conf:vsftpd服务主配置文件;
  • /etc/vsftpd/ftpusers:设置不允许访问ftp服务的系统用户(黑名单),一行一个用户名;
  • /etc/vsftpd/user_list:用于设置允许或禁止访问vsftpd服务的系统用户名单,主配置文件的“userlist_enable”参数决定此名单是否生效,“userlist_deny”参数决定此名单是黑名单还是白名单;
  • /etc/pam.d/vsftpd:vsftpd的pam模块的配置文件,用来认证身份和阻止特定用户;
  • /usr/sbin/vsftpd:vsftpd的主要执行文件;
  • /var/ftp:vsftpd的默认匿名用户登录的根目录。
 

2、主配置文件vsftpd.conf相关参数介绍:

  vsftpd的配置参数很多,我们可以通过man 5 vsftpd.conf命令获取到vsftpd.conf配置文件的详细帮助信息。下面介绍一些vsftpd常用的参数。
①. vsftpd服务全局相关参数:
参数描述
connect_from_port_20=YES|NO是否使用20号端口做为ftp-data的端口号
listen_port=21设置vsftpd服务监听的端口号
listen=YES|NO设置vsftpd是否stand alone方式启动
pasv_enable=YES|NO是否开启被动模式
pasv_max_port=0
pasv_min_port=0
设置被动模式(passive mode)使用的端口范围,为0时不受限制
max_Clients=0当vsftpd以stand alone运行时,用来设置最大同时在线数
max_per_ip=0用于设置同一IP允许的同时最大连接数
idle_session_timeout=300如果用户300秒内没有命令操作,则强制离线
ftpd_banner="欢迎信息"
banner_file=/path/file
通过字符串或者文件的方式设置连接到vsftpd服务器时的欢迎信息
dirmessange_enable=YES|NO
message_file=.message
配置ftp进入目录时显示目录下某个文件的内容做为提示信息
ascii_download_enable=YES|NO
ascii_upload_enable=YES|NO
是否允许ascii方式传输
xferlog_enable=YES|NO
xferlog_file=/var/log/vsftpd.log
是否记录用户下载上传的文件
②. vsftpd用户、权限相关参数:
参数描述
write_enable=YES|NO用来设置是否允许用户上传文件
guest_username=ftp指定来宾用户身份的用户名
guest_enable=YES|NO是否将非匿名用户映射成来宾用户。
local_enable=YES|NO是否允许/etc/passwd中的用户以实体用户的身份登录到ftp服务器。
local_max_rate=0设置最大传输速度,单位为bytes/s
chroot_local_user=YES|NO
chroot_list_enable=YES|NO
chroot_list_file=/etc/vsftpd/chroot_list
用来设置哪些用户被限制在自己的目录内无法离开
allow_writeable_chroot=YES|NO启用chroot时用户根目录是否允许写入,默认否
userlist_enable=YES|NO
userlist_deny=YES|NO
userlist_file=/etc/vsftpd/user_list
用来阻止或者允许相关用户登录到vsftpd服务器;  
userlist_file:指定允许或禁止访问vsftpd服务的系统用户名单文件;
userlist_enable:决定名单是否生效;
userlist_deny:决定此名单是黑名单还是白名单;
anonymous_enable=YES|NO是否允许anonymouns用户登录到vsftpd服务器
anon_root=/var/ftp设置匿名用户根目录
anon_world_readable_only=YES|NO匿名用户是否只允许下载可读的文件
anon_mkdir_write_enable=YES|NO
anon_upload_enable=YES|NO
anon_other_write_enable=YES|NO
设置匿名用户的写入权限
no_anon_password=YES|NOanonymous登录时是否可以省略密码。
(匿名用户使用用户名“anonymous”,密码使用任意包含“@”字符的字符串登陆)
anon_max_rate=0设置anonymous的最大传输速度。
anon_umask=077anonymous用户上传文件的权限掩码。

ERROR 1442 (HY000): Can't update table '...' in stored function/trigger because it is already used

Mysqlliuliangsong 发表了文章 • 0 个评论 • 129 次浏览 • 2016-12-22 16:31 • 来自相关话题

一、MySQL错误现象:MySQL执行创建的触发器时,报如下错误:ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 下面为错误触发器的创建过程:1、创建测试表格:drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)2、创建一个MySQL触发器:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;3、测试触发效果:mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 二、错误原因:  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 三、解决方案:1、将触发器的创建SQL语句改成如下并执行创建即可:DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ; 触发器测试效果:aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec) 查看全部

一、MySQL错误现象:

MySQL执行创建的触发器时,报如下错误:
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

 下面为错误触发器的创建过程:

1、创建测试表格:

drop table if exists tmp;
create table tmp (id int, n1 int, n2 int);
insert tmp values(1, 10, 50);

MariaDB [test]> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.01 sec)

2、创建一个MySQL触发器:

DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
after update on tmp
for each row
begin
update tmp set n2=n1*5 where id=new.id;
end$
DELIMITER ;

3、测试触发效果:

mysql> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

mysql> update tmp set n1=2 where id=1;
ERROR 1442 (HY000): Can't update table 'tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 

二、错误原因:

  这是由于MySQL触发器,触发事件的表与触发更新的表是用一表。触发更新同一表时,不应该使用update语句更新,应该使用set修改NEW对象更新即可。
 

三、解决方案:

1、将触发器的创建SQL语句改成如下并执行创建即可:
DELIMITER $
drop trigger if exists tmp_update$
create trigger tmp_update
before update on tmp -- 更新之前执行,这样才能在NEW插入到数据库之前,修改NEW.n2
for each row
begin
set new.n2 = new.n1*5; -- 直接修改new.n2
end$
DELIMITER ;
 触发器测试效果:
aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 10 | 50 |
+------+------+------+
1 row in set (0.00 sec)

aiezu.com> update tmp set n1=12 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

aiezu.com> select * from tmp;
+------+------+------+
| id | n1 | n2 |
+------+------+------+
| 1 | 12 | 60 |
+------+------+------+
1 row in set (0.00 sec)

ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

Mysqlliuliangsong 发表了文章 • 0 个评论 • 200 次浏览 • 2016-12-22 16:08 • 来自相关话题

一、MySQL错误现象:  执行创建的存储过程或者触发器报:ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist 二、错误原因:  这样由于创建存储过程或者触发器时间,指定的DEFINER为'root'@'%',而在MySQL的权限表(mysql.user)中,并不存在相关的user和host:mysql> select host,user,password from mysql.user;
+-------------------------+------+----------+
| host | user | password |
+-------------------------+------+----------+
| localhost | root | |
| aiezu | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| aiezu | | |
+-------------------------+------+----------+ 三、解决方案:  执行下面SQL语句,为'root'@'%'授权即可:grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

select host,user,password from mysql.user; 
执行效果: 查看全部

一、MySQL错误现象:

  执行创建的存储过程或者触发器报:
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist
 

二、错误原因:

  这样由于创建存储过程或者触发器时间,指定的DEFINER'root'@'%',而在MySQL的权限表(mysql.user)中,并不存在相关的userhost
mysql> select host,user,password from mysql.user;
+-------------------------+------+----------+
| host | user | password |
+-------------------------+------+----------+
| localhost | root | |
| aiezu | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| aiezu | | |
+-------------------------+------+----------+
 

三、解决方案:

  执行下面SQL语句,为'root'@'%'授权即可:
grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

select host,user,password from mysql.user;
 
执行效果:
mysql_error_1449_hy000.png

MySQL触发器用法详解

Mysqlliuliangsong 发表了文章 • 0 个评论 • 296 次浏览 • 2016-12-22 10:53 • 来自相关话题

一、MySQL触发器创建:1、MySQL触发器的创建语法:CREATE [DEFINER = { 'user' | CURRENT_USER }] 
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body 2、MySQL创建语法中的关键词解释:字段含义可能的值DEFINER=可选参数,指定创建者,默认为当前登录用户(CURRENT_USER);
该触发器将以此参数指定的用户执行,所以需要考虑权限问题;DEFINER='root@%'
DEFINER=CURRENT_USERtrigger_name触发器名称,最好由表名+触发事件关键词+触发时间关键词组成; trigger_time触发时间,在某个事件之前还是之后;BEFORE、AFTERtrigger_event触发事件,如插入时触发、删除时触发;
  INSERT:插入操作触发器,INSERT、LOAD DATA、REPLACE时触发;
  UPDATE:更新操作触发器,UPDATE操作时触发;
  DELETE:删除操作触发器,DELETE、REPLACE操作时触发;INSERT、UPDATE、DELETEtable_name 触发操作时间的表名; trigger_order可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时(
如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以
使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。
  FOLLOWS:当前创建触发器在现有触发器之后激活;
  PRECEDES:当前创建触发器在现有触发器之前激活;FOLLOWS、PRECEDEStrigger_body触发执行的SQL语句内容,一般以begin开头,end结尾begin .. end 3、触发执行语句内容(trigger_body)中的OLD,NEW:  在trigger_body中,我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED),OLD表示将要删除的旧行(相当于MS SQL的DELETED)。通过OLD,NEW中获取它们的字段内容,方便在触发操作中使用,下面是对应事件是否支持OLD、NEW的对应关系:事件OLDNEWINSERT×√DELETE√×UPDATE√√  由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLD、NEW;
 4、MySQL分隔符(DELIMITER):  MySQL默认使用“;”作为分隔符,SQL语句遇到“;”就会提交。而我们的触发器中可能会有多个“;”符,为了防止触发器创建语句过早的提交,我们需要临时修改MySQL分隔符,创建完后,再将分隔符改回来。使用DELIMITER可以修改分隔符,如下:DELIMITER $
... --触发器创建语句;
$ --提交创建语句;
DELIMITER ; 二、MySQL触发器创建进阶:1、MySQL触发器中使用变量:  MySQL触发器中变量变量前面加'@',无需定义,可以直接使用:-- 变量直接赋值
set @num=999;

-- 使用select语句查询出来的数据方式赋值,需要加括号:
set @name =(select name from table);2、MySQL触发器中使用if语做条件判断:-- 简单的if语句:
set sex = if (new.sex=1, '男', '女');

-- 多条件if语句:
if old.type=1 then
update table ...;
elseif old.type=2 then
update table ...;
end if; 三、MySQL查看触发器:  可以使用“show triggers;”查看触发器。由于MySQL创建的触发器保存在“information_schema库中的triggers表中,所以还可以通过查询此表查看触发器:-- 通过information_schema.triggers表查看触发器:
select * from information_schema.triggers;

-- mysql 查看当前数据库的触发器
show triggers;

-- mysql 查看指定数据库"aiezu"的触发器
show triggers from aiezu; 四、MySQL删除触发器:1、可以使用drop trigger删除触发器:drop trigger trigger_name; 2、删除前先判断触发器是否存在:drop trigger if exists trigger_name 五、Msql触发器用法举例:1、MySQL触发器Insert触发更新同一张表:  下面我们有一个表“tmp1”,tmp1表有两个整型字段:n1、n2。我们要通过触发器实现,在tmp插入记录时,自动将n2字段的值设置为n1字段的5倍。
 创建测试表和触发器:-- 创建测试表
drop table if exists tmp1;
create table tmp1 (n1 int, n2 int);

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_insert$
create trigger tmp1_insert
before insert on tmp1
for each row
begin
set new.n2 = new.n1*5;
end$
DELIMITER ;测试触发更新效果:mysql> insert tmp1(n1) values(18);
Query OK, 1 row affected (0.01 sec)

mysql> insert tmp1(n1) values(99);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp1;
+------+------+
| n1 | n2 |
+------+------+
| 18 | 90 |
| 99 | 495 |
+------+------+
2 rows in set (0.00 sec) 2、MySQL触发器Update触发更新另一张表:  下面有有两个表tmp1、tmp2,两个表都有一个相同的字段name。使用触发器实现更新一个表的name时,将另外一个表的name也更新。
 创建测试表和触发器:-- 创建测试表和插入测试数据
drop table if exists tmp1;
drop table if exists tmp2;
create table tmp1 (id int, name varchar(128)) default charset='utf8';
create table tmp2 (fid int, name varchar(128)) default charset='utf8';
insert into tmp1 values(1, '爱E族');
insert into tmp2 values(1, '爱E族');

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_update$
create trigger tmp1_update
after update on tmp1
for each row
begin
update tmp2 set name=new.name where fid=new.id;
end$
DELIMITER ;测试触发更新效果:mysql> select * from tmp1;
+------+---------+
| id | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+---------+
| fid | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> update tmp1 set name='aiezu.com' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from tmp1;
+------+-----------+
| id | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+-----------+
| fid | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec) 查看全部

一、MySQL触发器创建:

1、MySQL触发器的创建语法:

CREATE [DEFINER = { 'user' | CURRENT_USER }] 
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body

 

2、MySQL创建语法中的关键词解释:

字段含义可能的值
DEFINER=可选参数,指定创建者,默认为当前登录用户(CURRENT_USER);
该触发器将以此参数指定的用户执行,所以需要考虑权限问题;
DEFINER='root@%'
DEFINER=CURRENT_USER
trigger_name触发器名称,最好由表名+触发事件关键词+触发时间关键词组成; 
trigger_time触发时间,在某个事件之前还是之后;BEFORE、AFTER
trigger_event触发事件,如插入时触发、删除时触发;
  INSERT:插入操作触发器,INSERT、LOAD DATA、REPLACE时触发;
  UPDATE:更新操作触发器,UPDATE操作时触发;
  DELETE:删除操作触发器,DELETE、REPLACE操作时触发;
INSERT、UPDATE、DELETE
table_name 触发操作时间的表名; 
trigger_order可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时(
如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以
使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。
  FOLLOWS:当前创建触发器在现有触发器之后激活;
  PRECEDES:当前创建触发器在现有触发器之前激活;
FOLLOWS、PRECEDES
trigger_body触发执行的SQL语句内容,一般以begin开头,end结尾begin .. end
 

3、触发执行语句内容(trigger_body)中的OLD,NEW:

  在trigger_body中,我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED),OLD表示将要删除的旧行(相当于MS SQL的DELETED)。通过OLD,NEW中获取它们的字段内容,方便在触发操作中使用,下面是对应事件是否支持OLD、NEW的对应关系:
事件OLDNEW
INSERT×
DELETE×
UPDATE
  由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLD、NEW;
 

4、MySQL分隔符(DELIMITER):

  MySQL默认使用“;”作为分隔符,SQL语句遇到“;”就会提交。而我们的触发器中可能会有多个“;”符,为了防止触发器创建语句过早的提交,我们需要临时修改MySQL分隔符,创建完后,再将分隔符改回来。使用DELIMITER可以修改分隔符,如下:
DELIMITER $
... --触发器创建语句;
$ --提交创建语句;
DELIMITER ;
 

二、MySQL触发器创建进阶:

1、MySQL触发器中使用变量:

  MySQL触发器中变量变量前面加'@',无需定义,可以直接使用:
-- 变量直接赋值
set @num=999;

-- 使用select语句查询出来的数据方式赋值,需要加括号:
set @name =(select name from table);

2、MySQL触发器中使用if语做条件判断:

-- 简单的if语句:
set sex = if (new.sex=1, '男', '女');

-- 多条件if语句:
if old.type=1 then
update table ...;
elseif old.type=2 then
update table ...;
end if;
 

三、MySQL查看触发器:

  可以使用“show triggers;”查看触发器。由于MySQL创建的触发器保存在“information_schema库中的triggers表中,所以还可以通过查询此表查看触发器:
-- 通过information_schema.triggers表查看触发器:
select * from information_schema.triggers;

-- mysql 查看当前数据库的触发器
show triggers;

-- mysql 查看指定数据库"aiezu"的触发器
show triggers from aiezu;
 

四、MySQL删除触发器:

1、可以使用drop trigger删除触发器:

drop trigger trigger_name;
 

2、删除前先判断触发器是否存在:

drop trigger if exists trigger_name
 

五、Msql触发器用法举例:

1、MySQL触发器Insert触发更新同一张表:

  下面我们有一个表“tmp1”,tmp1表有两个整型字段:n1、n2。我们要通过触发器实现,在tmp插入记录时,自动将n2字段的值设置为n1字段的5倍。
 创建测试表和触发器:
-- 创建测试表
drop table if exists tmp1;
create table tmp1 (n1 int, n2 int);

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_insert$
create trigger tmp1_insert
before insert on tmp1
for each row
begin
set new.n2 = new.n1*5;
end$
DELIMITER ;
测试触发更新效果:
mysql> insert tmp1(n1) values(18);
Query OK, 1 row affected (0.01 sec)

mysql> insert tmp1(n1) values(99);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp1;
+------+------+
| n1 | n2 |
+------+------+
| 18 | 90 |
| 99 | 495 |
+------+------+
2 rows in set (0.00 sec)
 

2、MySQL触发器Update触发更新另一张表:

  下面有有两个表tmp1、tmp2,两个表都有一个相同的字段name。使用触发器实现更新一个表的name时,将另外一个表的name也更新。
 创建测试表和触发器:
-- 创建测试表和插入测试数据
drop table if exists tmp1;
drop table if exists tmp2;
create table tmp1 (id int, name varchar(128)) default charset='utf8';
create table tmp2 (fid int, name varchar(128)) default charset='utf8';
insert into tmp1 values(1, '爱E族');
insert into tmp2 values(1, '爱E族');

-- 创建触发器
DELIMITER $
drop trigger if exists tmp1_update$
create trigger tmp1_update
after update on tmp1
for each row
begin
update tmp2 set name=new.name where fid=new.id;
end$
DELIMITER ;
测试触发更新效果:
mysql> select * from tmp1;
+------+---------+
| id | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+---------+
| fid | name |
+------+---------+
| 1 | 爱E族 |
+------+---------+
1 row in set (0.00 sec)

mysql> update tmp1 set name='aiezu.com' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from tmp1;
+------+-----------+
| id | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

mysql> select * from tmp2;
+------+-----------+
| fid | name |
+------+-----------+
| 1 | aiezu.com |
+------+-----------+
1 row in set (0.00 sec)

vim简体中文帮助手册下载和安装

Linuxliuliangsong 发表了文章 • 0 个评论 • 218 次浏览 • 2016-12-21 09:29 • 来自相关话题

一、下载目录介绍:1、pdf-manual目录:  pdf格式vim简体中文帮助手册。现在一般最新版本的浏览器都支持浏览pdf,所以下载后基本上能直接使用浏览器打开。如果无法使用浏览器打开,请安装一个pdf阅读器打开。
 2、win32-install目录:  这是vim中文帮助手册的windows安装版,只能安装在装有vim编辑器的windows的电脑上。下载后双击即可安装,安装程序会自动检测你的vim安装目录。
  3、vimcdoc目录:  这是vim中文帮助手册的Linux/unix安装版,下载后使用tar命令解压,然后进入解压目录,使用“./vimcdoc.sh -i”命令即可安装:tar -zxvf vimcdoc-1.9.0.tar.gz
cd vimcdoc-1.9.0
./vimcdoc.sh -i  安装好后,在vim中,输入:help命令,即显示vim的中文帮助文档,效果如下:


  进入帮助文档后,将关标移动到子文档名上,然后按CTRL+]可以进入子文档,在子文档按CTRL+T返回主帮助文档。按CTRL+W+方向键可以切换光标所在的窗口。
 二、vim help下载地址:1、vim中文文档下载地址:  本文提供vim简体中文帮助手册的两个下载地址,百度云下载和sourceforge.net下载:sourceforge.net下载:https://sourceforge.net/projects/vimcdoc/files/百度云下载:http://pan.baidu.com/s/1mhIPY1E
 2、vim版本与下载文件关系:vim 7.4下载:简体中文帮助收册的1.9.0版;vim 7.3下载:简体中文帮助收册的1.8.0版; 查看全部

一、下载目录介绍:

1、pdf-manual目录:

  pdf格式vim简体中文帮助手册。现在一般最新版本的浏览器都支持浏览pdf,所以下载后基本上能直接使用浏览器打开。如果无法使用浏览器打开,请安装一个pdf阅读器打开。
 

2、win32-install目录:

  这是vim中文帮助手册的windows安装版,只能安装在装有vim编辑器的windows的电脑上。下载后双击即可安装,安装程序会自动检测你的vim安装目录。
  

3、vimcdoc目录:

  这是vim中文帮助手册的Linux/unix安装版,下载后使用tar命令解压,然后进入解压目录,使用“./vimcdoc.sh -i”命令即可安装:
tar -zxvf vimcdoc-1.9.0.tar.gz
cd vimcdoc-1.9.0
./vimcdoc.sh -i
  安装好后,在vim中,输入:help命令,即显示vim的中文帮助文档,效果如下:
vimdoc_download_install.png
  进入帮助文档后,将关标移动到子文档名上,然后按CTRL+]可以进入子文档,在子文档按CTRL+T返回主帮助文档。按CTRL+W+方向键可以切换光标所在的窗口。
 

二、vim help下载地址:

1、vim中文文档下载地址:

  本文提供vim简体中文帮助手册的两个下载地址,百度云下载和sourceforge.net下载:
 

2、vim版本与下载文件关系:

  • vim 7.4下载:简体中文帮助收册的1.9.0版;
  • vim 7.3下载:简体中文帮助收册的1.8.0版;

Vim编辑器之《Vim常用选项合集》

Linuxliuliangsong 发表了文章 • 0 个评论 • 168 次浏览 • 2016-12-18 23:48 • 来自相关话题

  在vim编辑器中,有很多选项用于控制vim的运行。你可以在使用vim的时候在vim编辑器中临时设置,也可以将选项设置在"~/.vimrc"文件中,让vim命令每次启动时自动加载。
  你可以使用":set"命令查看当前vim的设置的选项,使用":set all"命令查看vim所有支持的选项。有很多选项是打开(on)/关闭(off)一个功能,如num行号显示/隐藏选项,你可以使用":set num"显示行号、":set nonum"隐藏行号:组选项描述用法:set all显示所有选项和设置; :set显示当前设置的所有选项; :set num?显示num选项的当前设置;num可以换成其他选项; :set num
:set nonum打开选项与关闭选项;
num可以换成其他选项; num/nonum是/否显示行号; wrap/nowrap是(默认)/否自动换行; wrapmargin=n设置右边界的值,当输入时到达右边界,并遇到空格时,会自动插入换行; aw/noaw 临时转入shell或使用":n"编辑其他文件时,是/否自动保存当前文件已做的修改; flash/noflash在出错处使用闪烁提醒/使用呜叫提醒;缩进ai/noaiautoindent是/否使用自动缩进方式,新行与前面的行保持—致的缩进; smartindentsmartindent/nosmartindent:是否使用能识别类C语法的智能缩进方式; cindentcindent/nocindent:是/否使用cindent缩进方式; indentexprindentexpr/noindentexpr:是/否使用indentexpr缩进方式; indenttype=缩进方式:autoindent、smartindent、cindent、indentexpr(同上); shiftwidth=n自动缩进字符数; tabstop=n 将TAB键的宽度设置为n个宁符宽度,默认为8;编码encoding=设置vim内部使用的编码字符集;如:prc; fileencoding=设置当前编辑的文件的字符编码方式;如:utf-8; fileencodings=设置vim自动探测fileencoding的顺序列表;如:"ucs-bom,utf-8,latin1"; termencoding=vim工作的终端的编码方式;如:utf-8; ambiwidth=设置汉字所占字符宽度;如:double;搜索ic/noic搜索时忽赂大小写/不忽略大小写(默认); wrapscan在搜索时到达文件尾后是/否跳文件头继续搜索; incsearchincsearch/noincsearch:输入搜索关键字时,是/否(默认)自动高亮匹配的字符; hlsearchhlsearch/nohlsearch:搜索后,