环境
server:
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
client:
OS 名称:Microsoft Windows 7 企业版
OS 版本:6.1.7601 Service Pack 1 Build 7601
一、为 root 用户开启 ssh 登录
- 修改root密码
sudo passwd root
- 以其他账户登录,通过
nano
编辑配置文件
su - root
nano /etc/ssh/sshd_config
其中nano为编辑器,与vi类似,但相比于vi更加类似于Windows环境的编辑器,所以更加易用,nano的最后两行是按键提示 - 修改文件中的如下内容
#permitrootlogin without-password
为
permitrootlogin yes
- 保存
ctrl + x
- 重启 sshd
systemctl restart sshd
现在就可以直接用root账户登录了
二、配置 openVPN
一、 修改源
- 查看源文件
cat /etc/apt/sources.list
- 修改源文件
- 可以直接覆盖源文件
mv 修改好的文件 要修改的文件
- 也可以修改内容
nano /etc/apt/sources.list
ctrl + x
保存
二、 从本地源码包安装 openVPN
- 将压缩包移动到
/home
目录下
mv 源码包(路径) /home
- 解压
tar xvf 包
- 运行 configure 检查缺少的包
./configure --prefix=/usr
- 根据缺少的包查询包名
apt-cache search 包名
- 安装相应的包
apt-get install 包名
直到 3.检查通过 - 编译
make
- 安装
make install
- 复制
openvpn-plugin-auth-pam.so
文件到/etc/openvpn
先用find . | grep
查询插件路径
得到路径/usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so
再用cp -p /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so /etc/openvpn
- 其中会提示缺少 gcc 和 gcc+ ,Ubuntu中提供了 build-essential 软件包,安装了该软件包,编译c/c++所需要的软件包也都会被安装
apt-get install build-essential
- 另外几个包
libssl1.0-dev
liblz4-dev
liblzo2-dev
libpam0g-dev
三、 检查是否安装成功
ls /usr/sbin
查看有没有 openVPN 的选项,有就成功了
三、MySQL 安装和配置
- 查询 MySQL 需要的包
apt-cache search mysql
- 安装两个包
apt-get install mysql mysql-client mysql-server
- 重要的一步:设置安全策略
mysql_secure_installation
在这里设置数据库的 root 账户密码 - 查看 MySQL 运行状态
systemctl status mysql
- 设置 MySQL 开机启动
systemctl enable mysql
附启动、关闭、重启、设置开机是否自启动命令(其他服务也适用):#查看服务状态 systemctl status mysql #设置服务开机启动 `systemctl enable mysql` #设置服务开机不启动 `systemctl disable mysql` #启动服务 `systemctl start mysql` #关闭服务 `systemctl stop mysql` #重启服务 `systemctl restart mysql`
- 登录 MySQL
mysql -uroot -p12345678
- 创建 openvpn 数据库
-- 添加vpn用户,允许访问数据库 GRANT ALL ON openvpn.* TO vpn@'%' IDENTIFIED BY 'vpn123456' WITH GRANT OPTION; GRANT ALL ON openvpn.* TO vpn@'localhost' IDENTIFIED BY 'vpn123456' WITH GRANT OPTION; -- 更新sql数据库的权限设置,这步很重要,少了会导致测试认证失败 flush privileges; -- 创建数据库openvpn CREATE DATABASE IF NOT EXISTS openvpn DEFAULT CHARSET utf8; -- 切换数据库 USE openvpn; -- 创建用户数据表 CREATE TABLE IF NOT EXISTS user ( username char(32) COLLATE utf8_unicode_ci NOT NULL, password char(128) COLLATE utf8_unicode_ci NOT NULL, active int(10) NOT NULL DEFAULT 1, creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, expired_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, email char(128) COLLATE utf8_unicode_ci DEFAULT NULL, note text COLLATE utf8_unicode_ci NULL, quota_cycle int(10) NOT NULL DEFAULT 30, quota_bytes bigint(20) NOT NULL DEFAULT 10737418240, enabled int(10) NOT NULL DEFAULT 1, PRIMARY KEY (username), KEY idx_active (active), KEY idx_enabled (enabled) ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- 创建日志数据表 CREATE TABLE IF NOT EXISTS log ( username varchar(32) COLLATE utf8_unicode_ci NOT NULL, start_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, end_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, trusted_port int(10) DEFAULT NULL, protocol varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL, remote_ip varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, bytes_received bigint(20) DEFAULT 0, bytes_send bigint(20) DEFAULT 0, status int(10) NOT NULL DEFAULT 1, KEY idx_username (username), KEY idx_start_time (start_time), key idx_end_time (end_time) ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- 添加测试用户 INSERT INTO user(name,username, password, expired_time) VALUES('test','test', ENCRYPT('123456'), DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 30 DAY));
四、安装配置 pam_mysql
一、安装和配置
- 更新
apt-get update
- 搜索
apt-cache search pam
,apt-cache search libpam_mysql
安装apt-get install libpam_mysql
- 搜索
apt-cache search pam-krb5
安装apt-get install libpam-krb5
- 搜索
apt-cache search sasl
安装apt-get install sasl2-bin
- 设置saslauthd开机自启
systemctl enable saslauthd
- 创建
/etc/pam.d/openvpn
文件
cd /etv/pam.d
touch openvpn
nano ./openvpn
注意:文件中的路径需要替换auth required /lib/x86_64-linux-gnu/security/pam_mysql.so user=vpn passwd=vpn123456 host=localhost db=openvpn table=user usercolumn=username passwdcolumn=password where=active=1 sqllog=0 crypt=1 account required /lib/x86_64-linux-gnu/security/pam_mysql.so user=vpn passwd=vpn123456 host=localhost db=openvpn table=user usercolumn=username passwdcolumn=password where=active=1 sqllog=0 crypt=1 #crypt(0) -- Used to decide to use MySQL's PASSWORD() function or crypt() #0 = No encryption. Passwords in database in plaintext. NOT recommended! #1 = Use crypt #2 = Use MySQL PASSWORD() function
先在根目录下查找find . | grep pam_mysql.so
将得到路径替换文件中的 - 测试认证
#验证本地登录,用户名和密码是登录 Ubuntu 使用的用户名和密码 testsaslauthd -u user -p pwd -s sshd #验证openvpn,用户名密码是数据库openvpn.user中的用户名和密码(test,123456) testsaslauthd -u username -p password -s openvpn #成功会显示: 0: OK "Success."</code>
二、可能出现的问题
-
用
testsaslauthd -u test -p 123456 -s openvpn
测试认证时显示:connect() : No such file or directory
-
用
systemctl status saslauthd
查看saslauthd运行状态如下显示active(exited)
:saslauthd.service - LSB: saslauthd startup script Loaded: loaded (/etc/init.d/saslauthd; generated) Active: active (exited) since Thu 2018-11-0114:58:31 UTC; 43s ago Docs: man:systemd-sysv-generator(8)
-
解决方法
首先可能是未创建/etc/pam.d/openvpn
文件
其次可能是/etc/default/saslauthd
文件中的START=no
没有修改为yes
# Settings for saslauthd daemon # Please read /usr/share/doc/sasl2-bin/README.Debian for details. # # Should saslauthd run automatically on startup? (default: no) START=no # Description of this saslauthd instance. Recommended. # (suggestion: SASL Authentication Daemon) DESC="SASL Authentication Daemon" # Short name of this saslauthd instance. Strongly recommended. # (suggestion: saslauthd) NAME="saslauthd" # Which authentication mechanisms should saslauthd use? (default: pam) #
最后
systemctl restart saslauthd
重启
五、在 Windows 端生成证书
- 进入openVPN安装目录
cd E:\OpenVPN\easy-rsa
E:
dir
- 复制文件
copy vars.bat.sample vars.bat
- 执行文件
vars.bat
vars.bat
- 执行文件
clean-all.bat
clean-all.bat
- 执行文件
build-ca.bat
build-ca.bat
- 执行文件
build-key-server.bat openvpn1.bat
build-key-server.bat openvpn1.bat
- 执行文件
build-key.bat szq
build-key.bat szq
- 执行文件
build-key.bat szq1
build-key.bat szq1
7.和 8.生成了两个客户端分别是 szq 和 szq1 - 执行文件
build-dh.bat
build-dh.bat
生成的证书在keys
文件夹内 - 用 winscp 将 keys 文件夹复制到服务器的
etc/openvpn/easy-rsa
下
六、创建/etc/openvpn/server.conf文件
一、 server.conf 文件内容如下
port 1194 #指定端口
proto tcp #指定采用的传输协议,可以选择tcp或udp
dev tap #指定创建的通信隧道类型,可选tun或tap
#tap模式也就是桥接模式,通过软件在系统中模拟出一个tap设备,该设备是一个二层设备,同时支持链路层协议。
#tun模式也就是路由模式,通过软件在系统中模拟出一个tun路由,tun是ip层的点对点协议。
ca /etc/openvpn/easy-rsa/keys/ca.crt #ca证书
cert /etc/openvpn/easy-rsa/keys/openvpn1.crt #服务器公钥
key /etc/openvpn/easy-rsa/keys/openvpn1.key #服务器私钥
dh /etc/openvpn/easy-rsa/keys/dh2048.pem #指定迪菲赫尔曼参数的文件路径
local 10.6.0.103 #本机IP,这是一个内网IP,不过在路由上已经做了IP的映射到一个外网ip
server 10.8.0.0 255.255.255.0 #指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用10.8.0.1。
#设置管理,通过此端口管理管理正在连接的用户
management 10.6.0.103 1195
#定义openvpn运行时使用的用户及用户组。
user nobody
group nogroup
keepalive 20 120 # 保持连线,每 20 秒 ping 一次,若是 120 秒未收到封包,即认为 client 断线
#mysql 认证,如不需要可注释掉
#plugin /etc/openvpn/openvpn-auth-pam.so /usr/sbin/openvpn
plugin /etc/openvpn/openvpn-plugin-auth-pam.so openvpn
#client-cert-not-required #不请求客户的CA证书,使用User/Pass验证
username-as-common-name #使用客户提供的UserName作为Common Name
;密钥不用重协商,客户端也需要设置,否则iOS下,会出现一段时间后自动断开的情况
reneg-sec 0
#服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)
ifconfig-pool-persist ipp.txt
#push "redirect-gateway def1 bypass-dhcp"
#push "dhcp-option DNS 8.8.8.8"
#push "dhcp-option DNS 8.8.4.4"
#push "dhcp-option DNS 192.168.1.1"
#让所有客户端都增加到10.6.0.0/24
push "route 10.6.0.0 255.255.255.0"
client-to-client #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
comp-lzo #开启VPN连接压缩,如果服务器端开启,客户端也必须开启
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys。
persist-tun #通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的。否则网络连接,会先linkdown然后再linkup。
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
max-clients 1000 #最多允许连接1000个客户端
;script-security 3 #OpenVPN 2.1需要'--script-security 2'或更高版本来调用用户定义的脚本或可执行文件
log /etc/openvpn/logs/openvpn.log #指定记录OpenVPN的日志文件路径
log-append /etc/openvpn/logs/openvpn.log
status /etc/openvpn/logs/openvpn-status.log #指定记录OpenVPN状态的日志文件路径
#设置连接和断开脚本,以便统计流量信息 重要
#client-connect /etc/openvpn/connect.sh
#client-disconnect /etc/openvpn/disconnect.sh
二、 文件内容如下
#!/bin/sh
DB='openvpn'
DBADMIN='vpn'
DBPASSWD='vpn123456'
mysql -u$DBADMIN -p$DBPASSWD -e "INSERT INTO log(username,start_time,trusted_port,protocol,remote_ip,status) VALUES('$common_name',now(),'$trusted_port’,'$proto_1','$ifconfig_pool_remote_ip',1)" $DB
三、 文件内容如下
#!/bin/sh
DB='openvpn'
DBADMIN='vpn'
DBPASSWD='vpn123456'
#插入日志
mysql -u$DBADMIN -p$DBPASSWD -e "
UPDATE log SET end_time=now(),bytes_received=$bytes_received,bytes_send=$bytes_send,status=0 WHERE remote_ip='$ifconfig_pool_remote_ip' AND username='$common_name' AND status=1
" $DB
#如果流量超出,则锁定用户
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE user.username IN (SELECT username FROM (SELECT log.username AS username, quota_bytes FROM user, log WHERE log.username='$common_name' AND log.username=user.username AND log.status=0 AND TO_DAYS(NOW())-TO_DAYS(start_time)<=quota_cycle GROUP BY log.username HAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) AS u);" $DB
#如果过期时间超出,则锁定用户
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE username='$common_name' AND UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time);" $DB
七、 设置转发
一、 开启路由内核转发
图中红框内容改为绿框内容
为了读取sysctl.conf文件并且让调整后设置对当前系统的session生效,键入如下命令:
sysctl -p
二、 设置防火墙的端口转发
- 先查看网卡信息
ifconfig -a
显示全部接口信息
红框 ens160 表示第一块网卡
- 输入命令设置转发
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens160 -j MASQUERADE
向 NAT 表的 POSTROUTING 链条列尾添加一条规则,规则的具体内容是:
所有来自10.8.0.0/24、从ens160出去的数据包地址都伪装成指定IP输出,SNAT就是改变转发数据包的源地址 - iptables 命令规则
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
-P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-F 清空规则链
-L 查看规则链(列出已有规则)(-n 显示IP数字 默认会反向解析成域名)
-A 在规则链末尾加新规则
-I INPUT/… num 在规则链头部加入新规则
-D INPUT/… num 删除某一规则
-s 匹配来源地址IP/MASK(!取反)
-d 匹配目标地址
-i 网卡名 匹配从这块网卡流入的数据
-o 网卡名 匹配从这块网卡流出的数据
-p 匹配协议(tcp,udp,icmp)
–dport num 匹配目标端口
–sport num 匹配来源端口
-i eth0
匹配从网络接口 eth0 进来
-o eth0
匹配从网络接口 eth0 出去
DNAT
:目标地址转换
SNAT
:原地址转换
-j SNAT --to-source
-j DNAT --to-destination
-j MASQUERADE
#等价于-j SNAT --to-source
一起写。
八、 添加定时任务定时统计流量、超过流量或已过期的用户将踢出连接
- 添加/etc/openvpn/openvpn_flow_calc.sh 文件,主要是通过分析 openvpn-status.log 文件来即时统计用户流量信息
#!/bin/sh NAME_TAG=("OpenVPN CLIENT LIST" "ROUTING TABLE" "GLOBAL STATS" "END") LOG_FILE="/etc/openvpn/openvpn-status.log" DB='openvpn' DBADMIN='vpn' DBPASSWD='vpn123456' flow_info_index=0 function IsFlowInfoStatus() { if [ "${1}" == "${NAME_TAG[0]}" ] then #进入客户端列表,返回[1] flow_info_index=1 return 1 elif [ "${1}" == "${NAME_TAG[1]}" ] || [ "${1}" == "${NAME_TAG[2]}" ] || [ "${1}" == "${NAME_TAG[3]}" ] then #进入其他信息,返回结束[0] flow_info_index=0 return 0 fi if [ ${flow_info_index} -lt 1 ] then #没有进入客户端列表,返回[0] return 0 fi let "flow_info_index+=1" if [ ${flow_info_index} -lt 4 ] then #进入客户端列表,还没有进入IP列表,返回[1] return 1 fi #进入到IP列表,返回[2] return 2; } flow_infos=("") function GetFlowInfo() { OLD_IFS=${IFS} IFS=$2 unset flow_infos flow_infos=(${1}) IFS=${OLD_IFS} #echo "flow_infos: ${#flow_infos[@]}" } function StringSplit() { local OLD_IFS=${IFS} IFS=$2 local array=(${1}) IFS=${OLD_IFS} echo ${array[@]} } function UpdateUserFlowToDB() { local common_name=${flow_infos[0]} local bytes_received=${flow_infos[2]} local bytes_sent=${flow_infos[3]} #echo "username: $username received: $received sents: $sents" local ip_port=(`StringSplit ${flow_infos[1]} ':'`) local trusted_ip=${ip_port[0]} local trusted_port=${ip_port[1]} #echo "ip: $trusted_ip port: $trusted_port" #更新日志 mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE log SET end_time=now(),bytes_received=$bytes_received,bytes_send=$bytes_send WHERE trusted_port=$trusted_port AND username='$common_name' AND status=1" $DB #统计流量 mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE user.username IN (SELECT username FROM (SELECT log.username AS username, quota_bytes FROM user, log WHERE log.username='$common_name' AND log.username=user.username AND TO_DAYS(NOW())-TO_DAYS(start_time)<=quota_cycle GROUP BY log.username HAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) AS u);" $DB #判断用户是否被禁用或过期 mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE username='$common_name' AND (enabled=0 or UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time));" $DB local SQL="SELECT COUNT(*) FROM user WHERE username='$common_name' AND active=0" local COUNT=($(mysql -u$DBADMIN -p$DBPASSWD -e "$SQL" $DB)) if [ ${COUNT[1]} -ne 0 ] then (sleep 1 echo kill $common_name sleep 1)|telnet localhost 7505 fi } #判断用户是否过期 #mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET enabled=0 WHERE UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time);" $DB while read LOG_FILE; do IsFlowInfoStatus "${LOG_FILE}" status=$? #echo "output: ${status}" if [ ${status} -eq 2 ] then GetFlowInfo "${LOG_FILE}" "," if [ ${#flow_infos[@]} -ne 5 ] then continue fi UpdateUserFlowToDB fi done < ${LOG_FILE}
- 安装 incron
#搜索 root@tester:~# apt-cache search incron #安装 root@tester:~# apt-get install incron
- 添加/etc/incron.d/openvpn 文件,每分钟运行脚本,文件内容如下:
* * * * * root /etc/openvpn/openvpn_flow_calc.sh
九、 测试服务
- 启动openvpn服务
openvpn --daemon --config /etc/openvpn/server.conf
- 查看服务是否启动
ps -ef | grep openvpn
如图即启动成功
- 如果启动不成功查看日志排错
cat /etc/openvpn/logs/openvpn.log
十、 配置客户端
一、 设置网卡
二、 配置文件
client #指定当前VPN是客户端
dev tap #必须与服务器端的保持一致
proto tcp #必须与服务器端的保持一致
remote 10.6.0.103 1194 #设置Server的IP地址和端口,这个地方需要严格和Server端保持一致。
resolv-retry infinite #断线自动重新连接
nobind #不绑定特定的本地端口号
#route 10.172.192.0 255.255.255.0
persist-key
persist-tun
ca ca.crt #ca证书
cert szq.crt #客户端公钥
key szq.key #客户端私钥
#remote-cert-tls server
comp-lzo #与服务器保持一致
verb 4 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
auth-user-pass #询问用户名和密码
<ca>
#复制ca.crt的内容
</ca>
<cert>
复制szq.crt的内容
</cert>
<key>
复制szq.key的内容
</key>
十、 连接客户端时出现问题
一、 在开启用户连接日志记录后
-
报错
./xx.sh: Permission denied
需要修改 nobody 的权限:
nano /etc/sudoers
编辑 sudoers 文件,在红框的 root 下一行添加nobody ALL=(ALL) NOPASSWD:ALL
-
日志报错
WARNING: External program may not be called unless '--script-security 2' or higher is enabled. See --help text or man page for detailed info.
在server.conf中添加script-security 3
十一、 用户访问权限控制
每个客户端分配不同的IP地址,然后利用 iptables 防火墙对不同的 IP 地址进行控制;
- 为客户端分配IP段:
server 10.8.2.0 255.255.255.0
- 给指定客户端分配地址,根据名称获取指定客户端
ifconfig-push 10.8.2.5 10.8.2.6
- 来自10.8.2.0的数据包只有访问10.66.4.12时才能通过:
iptables -A FORWARD -i tun0 -s 10.8.2.0/24 -d 10.66.4.12 -j ACCEPT
N、需要掌握的命令
一、 cmd 命令
- 查看本机路由
route print
- 复制
copy D:\原始目录\文件.后缀 E:\新目录\文件.后缀
如果有同名文件,需要覆盖,那就在copy
后加上/f这个参数,是一个斜杠加字母F。如果名称中有空格,请把路径用英文双引号括起来。 - 显示d盘目录列表
dir d:\
二、 MySQL 命令
- 更新数据表
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause];
三、 Ubuntu 命令
- 查看端口占用情况
netstat -an
显示简要信息netstat -i
- 启动openVPN服务
openvpn --daemon --config /etc/openvpn/server.conf
- 查看所有接口信息
ifconfig -a
显示简要信息ifconfig -s
ifconfig 网络设备 参数
可以显示、修改、增加、删除网络设备的信息,比如启动指定网卡、配置IP地址、启动关闭网络协议等 - 所有日志都在
/var/log
目录下
ls /var/log
包括系统日志(syslog),软件包管理器日志(dpkg.log),身份验证日志(auth.log)等
- 复制文件
cp -p 源文件或目录 目标文件或目录
- a 通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录
- d 拷贝时保留链接
- f 删除已经存在的目标文件而不提示
- i 在覆盖目标文件之前将给出提示要求用户确认
- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中
- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
- l 不作拷贝,只是链接文件。 - 查找文件
find . | grep 文件名
注意:查找文件之前要先进入要查找的目录,如果没有就进入根目录cd /
- 查看命令
man xx
- 查看所有运行的程序
ps -ef
-e 显示所有进程,环境变量
-f 全格式
-h 不显示标题
-l 长格式
一般配合grep使用ps -ef | grep 进程名
- 终止进程
kill -9 进程ID
根据进程ID杀死进程,-9是强制终止退出killall 进程名
通过程序的名字,直接杀死所有进程,也可以使用-9强制杀死
chmod 777 xx.sh
- Ubuntu中,chmod 755代表用户对该文件拥有读,写,执行的权限,同组其他人员拥有执行和读的权限,没有写的权限,其他用户的权限和同组人员权限一样。
- chmod 777代表user,group和others 都有读写和可执行权限。
- 在终端输入ls -al,可以看到如: -rwx-r–r– (一共10个参数)
第一个跟参数跟chmod无关
2-4参数:属于user
5-7参数:属于group
8-10参数:属于others
接下来就简单了:r=>可读 | w=>可写 | x=>可执行
r=4 w=2 x=1
755就代表 rwx-xr-xr,而777代表rwx-rwx-rwx