原issue见https://github.com/linuxserver/Heimdall/issues/471

Setting up Heimdall behind an nginx reverse proxy from selfhosted

为了能够在外网使用Heimdall,我使用nginx进行反代,但是在外网访问时css出现跨域错误,最开始以为是端口问题,因为我用的是默认端口,而不是80或者443。但是具体检查没有发现是端口的报错,因为nginx上面已经进行了端口设置。

后面github上面找到很多类似的issue,有的是版本本身的问题,找了一个按照他的方法,改了下nginx的配置就可以正常使用了。

我用的是nginx作为反代,搜了下网上需要添加以下header:

 

location / {

proxy_set_header Host $host;

proxy_set_header X-Forwarded-Scheme $scheme;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_set_header X-Real-IP $remote_addr;

proxy_pass $forward_scheme://$server:$port$request_uri;

}

发表于wooder | 留下评论

背景如下:

使用了官方了onlyoffice/documentserver镜像启动onlyoffice, 但是因为我有一台nginx主机专门用来代理内网服务,所以容器本身没有配置ssl。在nginx反代这个onlyoffice容器之后,去nextcloud主机添加onlyoffice报错404,具体报错如下:

GuzzleHttp\Exception\ClientException: Client error: `GET http://onlyoffice.*.*/cache/files/conv_check_1691855337_docx/output.docx/check_1691855337.docx?md5=_zTHiuEWC9wwWGN50IR4Hw&expires=1655468312&filename=check_1691855337.docx` resulted in a `404 Not Found` response: <!DOCTYPE html> <html> <head> <title>Not Found</title> <style> body { width: 35em; margin: 0 auto; (truncated…)

这个报错,我在很多地方都能搜到,但是都没有写太多的解决办法,最后大多是没下文,我在nextcloud主机用curl直接访问onlyoffice,报错如下

 

[[email protected] ~]# curl -v https://onlyoffice.*.*/
* About to connect() to onlyoffice.*.* port 443 (#0)
* Trying 1.14.48.241...
* Connected to onlyoffice.*.* (*.*.*.*) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
* Server certificate:
* subject: CN=onlyoffice.*.*
* start date: Jun 17 08:14:33 2022 GMT
* expire date: Sep 15 08:14:32 2022 GMT
* common name: *.*.*
* issuer: CN=R3,O=Let's Encrypt,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: onlyoffice.*.*
> Accept: */*
> 
< HTTP/1.1 302 Moved Temporarily
< Server: nginx
< Date: Fri, 17 Jun 2022 12:03:51 GMT
< Content-Type: text/html
< Content-Length: 138
< Connection: keep-alive
< Location: http://onlyoffice.*.*/welcome/
< Cache-Control: no-cache
< 
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host onlyoffice.*.* left intact

 

***注意上面那个标粗放大的部分,以及我本身访问的域名,可以看到,我访问的https,但是跳转到了http,猜测这个跳转是onlyoffice自己跳转的,因为我在proxy这边用https映射onlyoffice的http链接,proxy的配置检查过也没发现什么不对的地方,就是很正常的proxy配置。

最后的解决办法:直接快刀斩乱麻吧,我最后把证书文件挂载到了容器里面,也就是启用onlyoffice的https,然后再代理这个https链接,问题得到解决。

 

[[email protected] ~]# curl -v https://onlyoffice.*.*/
* About to connect() to onlyoffice.fencatn.cn port 443 (#0)
* Trying 1.14.48.241...
* Connected to onlyoffice.*.* (*.*.*.*.) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
* Server certificate:
* subject: CN=onlyoffice.*.*
* start date: Jun 17 08:14:33 2022 GMT
* expire date: Sep 15 08:14:32 2022 GMT
* common name: onlyoffice.*.*
* issuer: CN=R3,O=Let's Encrypt,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: onlyoffice.*.*
> Accept: */*
> 
< HTTP/1.1 302 Moved Temporarily
< Server: nginx
< Date: Fri, 17 Jun 2022 12:35:35 GMT
< Content-Type: text/html
< Content-Length: 138
< Connection: keep-alive
< Location: https://onlyoffice.*.*/welcome/
< Strict-Transport-Security: max-age=31536000
< X-Content-Type-Options: nosniff
< Cache-Control: no-cache
< 
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host onlyoffice.*.* left intact

 

重新把https链接填入nextcloud,一切正常,测试也正常了

参考链接:

https://dev.to/powerflo/setup-onlyoffice-document-server-with-let-s-encrypt-3a6

https://github.com/ONLYOFFICE/document-server-proxy/blob/master/nginx/proxy-https-to-http.conf

https://helpcenter.onlyoffice.com/installation/docs-community-proxy.aspx

发表于wooder | 留下评论

我在安装了wp hide login之后,发现没法使用自定义的PATH去登录后台,找了一圈,发现是网站没有打开伪静态。我是BT面板安装的,因此打开就好了。

发表于wooder | 留下评论

转载自https://note.qidong.name/2020/05/docker-proxy/

有时因为网络原因,比如公司NAT,或其它啥的,需要使用代理。 Docker的代理配置,略显复杂,因为有三种场景。 但基本原理都是一致的,都是利用Linux的http_proxy等环境变量。

dockerd代理

在执行docker pull时,是由守护进程dockerd来执行。 因此,代理需要配在dockerd的环境中。 而这个环境,则是受systemd所管控,因此实际是systemd的配置。

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

其中,proxy.example.com:8080要换成可用的免密代理。 通常使用cntlm在本机自建免密代理,去对接公司的代理。 可参考《Linux下安装配置Cntlm代理》。

Container代理

在容器运行阶段,如果需要代理上网,则需要配置~/.docker/config.json。 以下配置,只在Docker 17.07及以上版本生效。

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://proxy.example.com:8080",
     "httpsProxy": "http://proxy.example.com:8080",
     "noProxy": "localhost,127.0.0.1,.example.com"
   }
 }
}

这个是用户级的配置,除了proxiesdocker login等相关信息也会在其中。 而且还可以配置信息展示的格式、插件参数等。

此外,容器的网络代理,也可以直接在其运行时通过-e注入http_proxy等环境变量。 这两种方法分别适合不同场景。 config.json非常方便,默认在所有配置修改后启动的容器生效,适合个人开发环境。 在CI/CD的自动构建环境、或者实际上线运行的环境中,这种方法就不太合适,用-e注入这种显式配置会更好,减轻对构建、部署环境的依赖。 当然,在这些环境中,最好用良好的设计避免配置代理上网。

docker build代理

虽然docker build的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。 在构建时,需要注入http_proxy等参数。

docker build . \
    --build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
    --build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
    --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
    -t your/image:tag

注意:无论是docker run还是docker build,默认是网络隔绝的。 如果代理使用的是localhost:3128这类,则会无效。 这类仅限本地的代理,必须加上--network host才能正常使用。 而一般则需要配置代理的外部IP,而且代理本身要开启gateway模式。

重启生效

代理配置完成后,reboot重启当然可以生效,但不重启也行。

docker build代理是在执行前设置的,所以修改后,下次执行立即生效。 Container代理的修改也是立即生效的,但是只针对以后启动的Container,对已经启动的Container无效。

dockerd代理的修改比较特殊,它实际上是改systemd的配置,因此需要重载systemd并重启dockerd才能生效。

sudo systemctl daemon-reload
sudo systemctl restart docker

参考

发表于wooder | 留下评论

转载自https://www.unixso.com/NetWork/netstat.html

Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
常见参数

-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
状态列表:

LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态

常用使用方法:

并发请求数及其TCP连接状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

显示当前所有活动的网络连接:
netstat -na

列出所有端口 (包括监听和未监听的)
netstat -a

只显示监听端口 netstat -l
netstat -l

只列出所有监听 tcp 端口 netstat -lt
netstat -lt

只列出所有监听 udp 端口 netstat -lu
netstat -lu

只列出所有监听 UNIX 端口 netstat -lx
netstat -lx

显示所有端口的统计信息 netstat -s
netstat -s

显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su
netstat -st 
netstat -su

在 netstat 输出中显示 PID 和进程名称 netstat -p
netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。
netstat -pt

显示系统不支持的地址族 (Address Families)
netstat --verbose

显示核心路由信息 netstat -r
netstat -r

显示网络接口列表
netstat -i

显示出所有处于监听状态的应用程序及进程号和端口号:
netstat -aultnp

如果想对一个单一的进行查询,只需要在命令后面再加上“| grep $”。这里就用到了管道符,以及grep筛选命令,$代表参数,也就是你要查询的那个。
如要显示所有80端口的网络连接:
netstat -aultnp | grep 80

如果还想对返回的连接列表进行排序,这就要用到sort命令了,命令如下:
netstat -aultnp | grep :80 | sort

当然,如果还想进行统计的话,就可以再往后面加wc命令。如:
netstat -aultnp | grep :80 | wc -l

其实,要想监测出系统连接是否安全,要进行多状态的查询,以及要分析,总结,还有就是经验。总的下来,才可以判断出连接是否处于安全状态。
netstat -n -p|grep SYN_REC | wc -l

这个命令可以查找出当前服务器有多少个活动的 SYNC_REC 连接。正常来说这个值很小,最好小于5。 当有Dos攻击或者邮件炸弹的时候,这个值相当的高。尽管如此,这个值和系统有很大关系,有的服务器值就很高,也是正常现象。
netstat -n -p | grep SYN_REC | sort -u

先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。
[email protected]:~$ netstat -nat |awk '{print $6}'|sort|uniq -c

列出所有连接过的IP地址。
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'

列出所有发送SYN_REC连接节点的IP地址。
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

使用netstat命令计算每个主机连接到本机的连接数。
netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

列出所有连接到本机的UDP或者TCP连接的IP数量。
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

检查 ESTABLISHED 连接并且列出每个IP地址的连接数量。
netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
发表于wooder | 留下评论

检测sshd异常登录的脚本,防止暴力破解:

#!/bin/bash
#This is a host.deny Shell Script
#2013-08-24
cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2 "=" $1;}' > /tmp/black_ip.txt
DEFINE=10
for i in `cat /tmp/black_ip.txt`
do
IP=`echo $i | awk -F= '{print $1}'`
NUM=`echo $i | awk -F= '{print $2}'`
if [ $NUM -gt $DEFINE ]
then
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ]
then
echo "sshd:$IP" >> /etc/hosts.deny
fi
fi
done

发表于wooder | 留下评论

今天发现了一个可以更换群晖登录界面壁纸的脚本,拉取的是Bing的图片,代码在下面这个链接:

https://github.com/kkkgo/DSM_Login_BingWallpaper

把它添加到群晖定时任务里边就行了。

发表于wooder | 留下评论

clickhouse统计数据库大小

注意最后以后右边是两个分号

 

select
sum(rows) as "总行数",
formatReadableSize(sum(data_uncompressed_bytes)) as "原始大小",
formatReadableSize(sum(data_compressed_bytes)) as "压缩大小",
round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100, 0) "压缩率"
from system.parts;;
发表在 clickhouse | 标签为 | 留下评论

centos清除磁盘标签

我之前有几块硬盘用作freenas的zfs分区,现在不用了,想换到centos主机上面用,那就得格式化,但是当我按常规fdisk分区,mkfs格式化,mount挂载分区,遇到这个问题:

[[email protected] samba]# mount /dev/sdb1 /var/nextcloud_bak1
mount: /dev/sdb1:检测到更多文件系统。这不应该出现,
请使用 -t <类型> 指明文件系统类型或
使用 wipefs(8) 清理该设备。

 

也就是说原先zfs格式的磁盘标签没有清理,当然,不影响使用,但是你挂载就得指磁盘分区,不是那么完美,然后blkid也查不到uuid,所以还是要清理干净

[[email protected] samba]# wipefs /dev/sdb1
offset type
----------------------------------------------------------------
0xe8e0c3e000 zfs_member [filesystem]

0x438 ext4 [filesystem]
UUID: b66153c7-dda6-496e-a9bc-04cd7e81a2bf

 

可以看到,我的ext4格式已经出来了,但是原先的zfs也还在

 

[[email protected] samba]# wipefs -a /dev/sdb
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d3e000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d3d000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d3c000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d3b000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d3a000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d39000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d38000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d37000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d36000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d35000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d34000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d33000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d7f000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d7e000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d7d000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d7c000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d7b000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d7a000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d79000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d78000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d77000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d76000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d75000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d74000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d73000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d72000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d71000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0d70000 (zfs_member):0c b1 ba 00 00 00 00 00
/dev/sdb:8 个字节已擦除,位置偏移为 0x00000200 (gpt):45 46 49 20 50 41 52 54
/dev/sdb:8 个字节已擦除,位置偏移为 0xe8e0db5e00 (gpt):45 46 49 20 50 41 52 54
/dev/sdb:2 个字节已擦除,位置偏移为 0x000001fe (PMBR):55 aa
/dev/sdb: calling ioclt to re-read partition table: 成功

 

直接执行-a就行了,但是得注意,所有的内容都会擦除,并且得重新分区和格式化!

发表在 通用 | 标签为 , , | 留下评论

xxx command denied to user xxx mysql权限管理

感谢原作者

https://www.cnblogs.com/smallrookie/p/7552097.html

今天遇到一个mysql 权限的问题,即标题所述  xxx command denied to user xxx,一般mysql 这种报错,基本都属于当前用户没有进行该操作的权限,需要 root 用户授权才能解决,从网上找了一些资料,感觉这篇写得不错,分享一下:

原文地址:http://www.rainsts.net/article.asp?id=988

可以用 CREATE USER 或 GRANT 创建用户,后者还同时分配相关权限。而 REVOKE 则用于删除用户权限,DROP USER 删除账户。

$ mysql -u root -p
password:

mysql> create database test; # 创建数据库
Query OK, 1 row affected (0.00 sec)

mysql> show databases; # 查看数据库是否创建成功
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> grant all on test.* to [email protected]'%' identified by '123456' with grant option; # 创建特权管理用户
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user; # 查看用户创建是否成功
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
5 rows in set (0.00 sec)

mysql> show grants for user1; # 查看用户权限
+--------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'%' IDENTIFIED BY PASSWORD '*6BB...2CA2AD9'                        |
| GRANT ALL PRIVILEGES ON `test`.* TO 'user1'@'%' WITH GRANT OPTION                                |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

GRANT 语法:

GRANT privileges (columns)
    ON what
    TO user IDENTIFIED BY "password"
    WITH GRANT OPTION

权限列表:

  • ALTER: 修改表和索引。
  • CREATE: 创建数据库和表。
  • DELETE: 删除表中已有的记录。
  • DROP: 抛弃(删除)数据库和表。
  • INDEX: 创建或抛弃索引。
  • INSERT: 向表中插入新行。
  • REFERENCE: 未用。
  • SELECT: 检索表中的记录。
  • UPDATE: 修改现存表记录。
  • FILE: 读或写服务器上的文件。
  • PROCESS: 查看服务器中执行的线程信息或杀死线程。
  • RELOAD: 重载授权表或清空日志、主机缓存或表缓存。
  • SHUTDOWN: 关闭服务器。
  • ALL: 所有权限,ALL PRIVILEGES同义词。
  • USAGE: 特殊的 “无权限” 权限。

用 户账户包括 “username” 和 “host” 两部分,后者表示该用户被允许从何地接入。[email protected]’%’ 表示任何地址,默认可以省略。还可以是 “[email protected]%”、”[email protected]%.abc.com” 等。数据库格式为 [email protected],可以是 “test.*” 或 “*.*”,前者表示 test 数据库的所有表,后者表示所有数据库的所有表。

子句 “WITH GRANT OPTION” 表示该用户可以为其他用户分配权限。

我们用 root 再创建几个用户,然后由 test 数据库的管理员 user1 为他们分配权限。

mysql> create user user2 identified by '123456', user3 identified by 'abcd';
Query OK, 0 rows affected (0.00 sec)

mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| user2            | %         |
| user3            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
7 rows in set (0.00 sec)

好了,我们退出改用 user1 登录并针对 test 数据库进行操作。

mysql> quit # 退出
Bye

$ mysql -u user1 -p123456 test # 使用新用户登录

mysql> select database(); # 确认当前工作数据库
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

mysql> select current_user(); # 确认当前工作账户
+----------------+
| current_user() |
+----------------+
| [email protected]%        |
+----------------+
1 row in set (0.00 sec)

继续,创建一个数据表。

mysql> create table table1 # 创建表
    -> (
    ->    name varchar(50),
    ->    age integer
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> show tables; # 查看表是否创建成功
+----------------+
| Tables_in_test |
+----------------+
| table1         |
+----------------+
1 row in set (0.00 sec)

mysql> describe table1; # 查看表结构
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into table1 values('Tom', 20); # 插入记录
Query OK, 1 row affected (0.00 sec)

mysql> select * from table1; # 查询记录
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
+------+------+
1 row in set (0.00 sec)

接下来我们为 user2, user3 分配权限。

mysql> grant select on test.* to user2; # 为 user2 分配 SELECT 权限。
Query OK, 0 rows affected (0.00 sec)

mysql> grant select on test.* to user3; # 为 user3 分配 SELECT 权限。
Query OK, 0 rows affected (0.00 sec)

mysql> grant insert, update on test.* to user2; # 再为 user2 增加 INSERT, UPDATE 权限。
Query OK, 0 rows affected (0.00 sec)

好了,我们退出,切换成 user2 操作看看。

$ mysql -u user2 -p123456

mysql> use test; # 切换工作数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select database(); # 验证当前工作数据库
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

mysql> select user(); # 验证当前账户
+-----------------+
| user()          |
+-----------------+
| [email protected] |
+-----------------+
1 row in set (0.00 sec)

mysql> show grants for user2; # 查看当前用户权限,显然后来添加的 INSERT, UPDATE 被添加了。
+--------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6BB837....2C9'                        |
| GRANT SELECT, INSERT, UPDATE ON `test`.* TO 'user2'@'%'                                          |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

进行操作测试。

mysql> insert into table1 values("Jack", 21); # INSERT 操作成功
Query OK, 1 row affected (0.00 sec)

mysql> update table1 set age=22 where name='Jack'; # UPDATE 操作成功
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from table1; # SELECT 操作成功
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
| Jack |   22 |
+------+------+
2 rows in set (0.00 sec)

mysql> delete from table1 where age=22; # DELETE 操作无权限
ERROR 1142 (42000): DELETE command denied to user 'user2'@'localhost' for table 'table1'

我们切换回 user1 管理账户,移除 user2 的 UPDATE 权限看看。

$ mysql -u user1 -p123456 test

mysql> revoke update on test.* from user2; # 移除 UPDATE 权限
Query OK, 0 rows affected (0.00 sec)

再次切换回 user2。

$ mysql -u user2 -p123456 test

mysql> show grants for user2; # UPDATE 权限被移除
+--------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                               |
+--------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6B...2AD9'                            |
| GRANT SELECT, INSERT ON `test`.* TO 'user2'@'%'                                                  |
+--------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> update table1 set age=23 where name='Jack'; # 不在拥有 UPDATE 权限
ERROR 1142 (42000): UPDATE command denied to user 'user2'@'localhost' for table 'table1'

好了,到此我们基本完成了创建用户和分配权限的操作。接下来,我们回到 root 进行修改用户密码和删除用户操作。

$ mysql -u root -p123456

mysql> set password for user3=password('abcabc'); # 修改用户 user3 密码
Query OK, 0 rows affected (0.00 sec)

mysql>flush privileges; # 刷新权限表(通常只在直接修改相关管理数据表后需要该操作)
Query OK, 0 rows affected (0.00 sec)

mysql> revoke all on *.* from user2; # 移除 user2 在所有数据库上的权限 
Query OK, 0 rows affected (0.00 sec)

mysql> drop user user2; # 删除 user2 账户
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user; # 验证删除结果
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| user1            | %         |
| user3            | %         |
| root             | 127.0.0.1 |
| debian-sys-maint | localhost |
| root             | localhost |
| root             | server    |
+------------------+-----------+
6 rows in set (0.00 sec)

用户 user2 无法再次使用。

$ mysql -u user2 -p123456 test

ERROR 1045 (28000): Access denied for user 'user2'@'localhost' (using password: YES)

试试 user3。

$ mysql -u user3 -pabc test # 连接失败!哦,对了,我们修改了密码。
ERROR 1045 (28000): Access denied for user 'user3'@'localhost' (using password: YES)

$ mysql -u user3 -pabcabc test # 新密码成功

mysql> select * from table1; # SELECT 操作成功
+------+------+
| name | age  |
+------+------+
| Tom  |   20 |
| Jack |   22 |
+------+------+
2 rows in set (0.00 sec)

要修改自己的密码直接执行 “set password = password(‘new_password’);” 即可。

——- 摘要 ————————————–

创建用户:

GRANT insert, update ON testdb.* TO [email protected]'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
CREATE USER user2 IDENTIFIED BY 'password';

分配权限:

GRANT select ON testdb.* TO user2;

查看权限:

SHOW GRANTS FOR user1;

修改密码:

SET PASSWORD FOR user1 = PASSWORD('newpwd');
SET PASSWORD = PASSWORD('newpwd');

移除权限:

REVOKE all ON *.* FROM user1;

删除用户:

DROP USER user1;

数据库列表:

SHOW DATABASES;

数据表列表:

SHOW TABLES;

当前数据库:

SELECT DATABASE();

当前用户:

SELECT USER();

数据表结构:

DESCRIBE table1;

刷新权限:

FLUSH PRIVILEGES;
发表在 mysql | 标签为 | 留下评论