0%

创建文件夹

1
$ mkdir -p /mnt/share

安装依赖
1
$ yum install  cifs-utils

修改/etc/fstab文件,文件最后加入:

1
//192.168.16.32/serverapp /mnt/share cifs  defaults  0 0

执行命令

1
mount -t cifs -o username='administrator',password='**'  //192.168.16.32/serverapp /mnt/share

群组管理

Linux中,每个用户都有一个群组。

那么新建用户的时候并没有指定群组啊,群组是怎么来的呢。

其实我们不需要设置群组,创建用户的时候会默认创建一个和用户名一样的群组,并且把用户添加到这个群组中。

下面来看一下用户的群组

可以看到第三列和第四列是相同的。第三列是用户名,第四列是群组名。

了解这些之后下面来操作一下群组

新增群组

当用户少的时候默认的群组就足以使用了,但是当用户多的时候还是每个用户都在自己的群组中,这种情况就不方便管理了。

下面演示一下新增群组,使用addgroup 命令,用法很简单,在后面直接加上要创建的群组就可以了。记得要用root身份

1
$ addgroup admin

看到这个消息,就表示新增成功。

这个时候群组里面还是空的,没有添加用户。

修改用户账户

假如我要将 dev 这个用户放到我刚创建的 admin 这个群组里,可以这样写

1
$ usermod -g admin dev

可以看到用户dev的群组已经改成了admin

除了使用ll命令之外还可以这样查看用户所在群组

1
$ groups dev

也可以不添加用户名,直接使用groups命令,则显示当前用户所在群组

我们也一次把用户添加到多个群组里面,就用-G参数

首先我们先来多创建两个群组,分别是g1g2

1
2
$ addgroup g1
$ addgroup g2

接着运行以下命令

1
2
$ usermod -G admin,dev,g1,g2 dev
$ gropus dev

配合 -g 或 -G 参数时,它会把用户从原先的群组里剔除,加入到新的群组。如果不想离开原先的群组,又想加入新的群组,可以在 -G 参数的基础上加上 -a 参数,表示“追加”。

  • 不添加-a的情况
1
2
3
$ groups dev # 先查看一下用户所在群组
$ usermod -G admin dev # 修改用户所在群组
$ groups dev # 在一次查询用户所在群组

可以看出,用户的群组只有dev了,之前的群组已经不存在了

  • 添加-a的情况
    1
    2
    3
    $ groups dev # 先查看一下用户所在群组
    $ usermod -aG dev dev # 修改用户所在群组
    $ groups dev # 在一次查询用户所在群组

可以看出原来的群组还在

删除群组

用法很简单,在命令后接想要删除的群组名。

1
$ delgroup dev

dev已经不再dev群组,因为它已经被删除

新增用户

adduser命令,添加新的用户

这个命令很容易理解,顾名思义:add是添加的意思,user是用户的意思,合在一起就是adduser 添加用户,用法也很简单,命令后面直接写上要添加的用户名

1
$ adduser frank

只需输入密码,然后一路回车,最后输入y完成新增用户

如果使用个人用户是没有权限操作的,只能使用root用户

现在可以查看home目录下,会发现多出一个frank的文件夹

修改密码

拿到管理员给创建的用户之后,一般情况下我们都要修改一下默认密码,修改密码的命令是passwd ,用法和adduser类似,后面加上用户名即可。

下面修改一下frank的默认密码

1
$ passwd frank

命令后面也可以不加用户名,默认是当前用户

删除用户

能添加用户,那就肯定可以删除用户的,下面就使用deluser命令来删除用户

deluserdeleteuser 的缩写,delete 是删除的意思,user 是用户的意思。合在一起就是删除用户

用法和adduser是一样的,如下

1
$ deluser frank

一行命令成功删除

可以看到删除用户是没有确认过程的,所以要慎用

这个时候在查看一下home目录查看一下用户文件夹还有几个

只使用deluser是不会删除用户目录的,如果想把目录文件一块删除,需要增加一个参数

1
deluser --remove-home frank

个人网站是无法接入微信扫一扫登录的,只能使用曲线救国的方式,采用小程序了,小程序是可以获取到微信用户的 UnionID 的。

首先第一步要注册一个小程序应用,很简单的,用邮箱申请即可,点击注册

注册完成之后就可以进行开发了,我后台服务使用的是node来写的

生成小程序二维码

要做扫一扫登录,二维码是不可少的,官方也提供了几种生成二维码的方式。查看生成方式

我使用的是A接口,详细信息可查看官方文档。

1
POST https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN

从api上可以看出,调用这个接口需要传入成一个 ACCESS_TOKEN ,这个不是我们生成的,需要调用小程序的服务来获取到。

ACCESS_TOKEN

获取 ACCESS_TOKEN 示例

1
2
3
4
5
6
7
8
9
10
11
12
const getWeChatAccessToken = () => {
return new Promise((resolve, reject) => {
let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${secretKey}`
axios.get(url).then(res => {
resolve(res.data)
}).catch(e => {
errorlog.error(e)
resolve(Common.unifyResponse("获取微信token失败", 500))
})
}
})
}

token过期的时间是由微信服务控制的,拿到之后可以存到redis中,不需要每次都去获取新的

获取到token之后就可以调用生成二维码的方法了

调用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 const getQRCode = (access_token) => {
return new Promise((resolve, reject) => {
let fileName = Common.randomNumber()
let url = `https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=${access_token}`
axios.request({
method: 'post',
responseType: 'arraybuffer',
url,
data: {
path: 'pages/login/login?clientId='+fileName
}
}).then(res => {
fs.writeFile(Common.config("qrCode") + fileName + ".jpeg", res.data, "binary", function (err) {
resolve(fileName)
});
}).catch(e => {
errorlog.error(e)
resolve(Common.unifyResponse("获取二维码失败", 500))
})
})
}

返回的是二维码的文件名称

1
2
3
4
5
6
7
8
9
10
11
  LoginRouter.post("/qrlogin/:clientId", (req, res) => {
let userId = req["userId"];
let clientId = req.params.clientId
let token = makeToken(userId);
axios.post(apiConfig.socketUrl, {
clientId,
message: token
})
res.send(true)

})

处理登录请求,在小程序完成授权之后,调用webSocket服务通知页面授权成功,跳转到首页

页面显示二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$.ajax({
url: api,
type: 'get',
success: function (data) {
$('#qrcode').attr("src","/"+data + ".jpeg")
webSocketConnect(data)

}
})

function webSocketConnect(clientId) {
if ('WebSocket' in window) {
ws = new WebSocket(SOCKET_URL + clientId);
} else if ('MozWebSocket' in window) {
ws = new WebSocket(SOCKET_URL + clientId);
} else {
alert("该浏览器不支持websocket");
}
ws.onmessage = function (evt) {
localStorage.setItem("accessToken", evt.data)
window.location.href = 'me.html'

};
}

登录页面调用服务器端生成二维码并显示在页面上,并且连接webSocket服务,等待服务器确认登录。

小程序

login.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   Page({
onLoad: function (options) {
const scene = decodeURIComponent(options.clientId);
wx.setStorage({
key: "clientId",
data: scene
})
},
login: async function (e) {
let result = await util.getLoginInfo()
if (result) {
let clientId = wx.getStorageSync('clientId')
await util.httpRequest({
method: 'post',
url: 'api/wx/qrlogin/' + clientId
})
wx.switchTab({
url: '../index/index'
})
}
}
})

login.wxml

1
<button open-type="getUserInfo" bindgetuserinfo="login">授权登录</button>