0%

前言

很多人都听过 600、644、777 等 linux 权限,但是记不住那么多。其实这是有规律的,把规律记住就很好理解了。

权限介绍

  • Linux 系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。
  • Linux 下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。
  • Linux 下权限的粒度有 拥有者、群组、其它组 三种。每个文件都可以针对三个粒度,设置不同的 rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。
  • Linux 上通常使用 chmod 命令对文件的权限进行设置和更改。

十位权限表示

第一位代表文件类型,后面每三位代表一个群组,三位中每一位对应 rwx。
-(文件类型)rwx(拥有者读写执行)r--(群组读写执行)r--(其他组读写执行)

-rw------- (600)    只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。

数字权限使用格式

r=4,w=2,x=1

如:

rwx = 4 + 2 + 1 = 7

rw = 4 + 2 = 6

rx = 4 + 1 = 5

若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7

若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6

若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 + 1 = 5

文件类型

d代表的是目录(directroy)
-代表的是文件(regular file)
s代表的是套字文件(socket)
p代表的管道文件(pipe)或命名管道文件(named pipe)
l代表的是符号链接文件(symbolic link)
b代表的是该文件是面向块的设备文件(block-oriented device file)
c代表的是该文件是面向字符的设备文件(charcter-oriented device file)

使用 chmod 更改权限

算出权限对应的数字,就直接使用数字设定法就好了。

chmod 644 test.js

使用 docker 搭建私有链

准备工作

创建创世区块文件/dapp/private_chain/genesis.json

{
"config": {
"chainId": 008,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0
},
"alloc": {
"0x0000000000000000000000000000000000000001": {
"balance": "100000000000000000000000"
},
"0x0000000000000000000000000000000000000002": {
"balance": "200000000000000000000000"
}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x2000",
"extraData": "0x",
"gasLimit": "0x800000000000",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}

chainId: 私有区块链的 ID
homesteadBlock:Homestead 是以太坊平台的第二个主要版本,也是以太坊的第一个生产版本。它包括几个协议更改。由于我们已经在 Homestead 版本,因此该属性为 0。
eip155Block/eip158Block:Homestead 版本发布时带有一些向后不兼容的协议更改,因此需要硬分叉。通过以太坊改进提案(EIPs)提出的这些协议变更/改进。然而,我们的链条不会因为这些变化而难以分解,所以保留为 0。
difficulty:此值用于控制区块链的块生成时间。难度越高,Miner 在发现有效块时必须执行的统计更多计算。在我们的测试网络中,我们将保持此值低以避免在测试期间等待,因为需要生成有效块来执行交易处理区块链。
gasLimit:此值指定每块的“gas”支出的当前链范围限制。gas 是以太坊在交易过程中消耗的燃料。我们将在这种情况下将此值标记得足够高,以避免在测试期间受到限制。
alloc:这是你可以创建你的钱包并用假 ether 预填充的地方。注这里的单位是 wei,1ETH=10^18wei,同下面获取余额单位。
coinbase:矿工的账号

获取 geth 镜像

docker pull ethereum/client-go:latest

运行私有链

docker run \
-itd \
--name geth \
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone \
-v /dapp/private_chain/genesis.json:/dapp/genesis.json \
-v /dapp/private_chain:/dapp \
-p 8545:8545 \
-p 30303:30303 \
-p 30303:30303/udp \
--entrypoint /bin/sh \
ethereum/client-go:latest \

进入容器

docker exec -it geth sh

容器内 ethereum 环境操作

  • 初始化 genesis
geth init --datadir /dapp /dapp/genesis.json
  • 启动私有链 进入 geth 控制台
geth --identity "miner_node" --datadir /dapp --networkid 88 --rpc --rpccorsdomain "*" --rpcaddr 0.0.0.0 --rpcport "8545" --port "30303" --rpcapi "db,eth,net,web3" --nodiscover console
  • 创建账户
# 创建账号
# 输入密码
# 获得账号地址

>personal.newAccount()

Passphrase:
Repeat passphrase:

INFO [01-19|06:22:35.833] Your new key was generated address=0x046c9A712c6c82579cf4F05379b157BAba760e6E
WARN [01-19|06:22:35.833] Please backup your key file! path=/root/privtedata/keystore/UTC--2021-01-18T22-22-32.826039142Z--046c9a712c6c82579cf4f05379b157baba760e6e
WARN [01-19|06:22:35.833] Please remember your password!
"0x19fAe8328f9CD2869153a6fBF898ab6713337641"

注:此时在/dapp/private_chain/keystore 下面可以看到生成的 keystore,需保存好密码及 keystore

  • 查看余额
> eth.getBalance("0x19fAe8328f9CD2869153a6fBF898ab6713337641")
0
>

此时余额为零

  • 获取以太币-挖矿
> miner.start()

INFO [01-19|06:25:02.328] Updated mining threads threads=8
INFO [01-19|06:25:02.328] Transaction pool price threshold updated price=1000000000
INFO [01-19|06:25:02.328] Etherbase automatically configured address=0x046c9A712c6c82579cf4F05379b157BAba760e6E
null
> INFO [01-19|06:25:02.329] Commit new mining work number=1 sealhash="a14903…a8920b" uncles=0 txs=0 gas=0 fees=0 elapsed="353.38µs"
INFO [01-19|06:25:04.318] Generating DAG in progress epoch=0 percentage=0 elapsed=1.055s
INFO [01-19|06:25:05.398] Generating DAG in progress epoch=0 percentage=1 elapsed=2.135s
INFO [01-19|06:25:06.452] Generating DAG in progress epoch=0 percentage=2 elapsed=3.189s
INFO [01-19|06:25:07.727] Generating DAG in progress epoch=0 percentage=3 elapsed=4.464s
INFO [01-19|06:25:08.802] Generating DAG in progress epoch=0 percentage=4 elapsed=5.539s
INFO [01-19|06:25:09.920] Generating DAG in progress epoch=0 percentage=5 elapsed=6.657s
INFO [01-19|06:25:11.077] Generating DAG in progress epoch=0 percentage=6 elapsed=7.814s
INFO [01-19|06:25:12.366] Generating DAG in progress epoch=0 percentage=7 elapsed=9.103s
INFO [01-19|06:25:13.857] Generating DAG in progress epoch=0 percentage=8 elapsed=10.595s
INFO [01-19|06:25:14.963] Generating DAG in progress epoch=0 percentage=9 elapsed=11.700s
INFO [01-19|06:25:16.023] Generating DAG in progress epoch=0 percentage=10 elapsed=12.760s
INFO [01-19|06:25:17.370] Generating DAG in progress epoch=0 percentage=11 elapsed=14.107s
INFO [01-19|06:25:18.688] Generating DAG in progress epoch=0 percentage=12 elapsed=15.425s
INFO [01-19|06:25:19.994] Generating DAG in progress epoch=0 percentage=13 elapsed=16.731s
INFO [01-19|06:25:21.245] Generating DAG in progress epoch=0 percentage=14 elapsed=17.983s
INFO [01-19|06:25:22.474] Generating DAG in progress epoch=0 percentage=15 elapsed=19.211s
  • 挖到矿了
    直到 percentage 到 100 时,计算完毕就挖到矿了

INFO [01-19|06:31:50.709] Generating DAG in progress epoch=1 percentage=97 elapsed=4m29.670s
INFO [01-19|06:31:54.026] Generating DAG in progress epoch=1 percentage=98 elapsed=4m32.987s
INFO [01-19|06:31:57.452] Generating DAG in progress epoch=1 percentage=99 elapsed=4m36.414s

INFO [01-19|06:31:57.479] Generated ethash verification cache epoch=1 elapsed=4m36.420s
INFO [01-19|06:34:45.039] Successfully sealed new block number=1 sealhash="a14903…a8920b" hash="9ff2b2…bb5c8b" elapsed=9m42.710s
INFO [01-19|06:34:45.076] 🔨 mined potential block number=1 hash="9ff2b2…bb5c8b"
INFO [01-19|06:34:45.056] Commit new mining work number=2 sealhash="e438e6…ff51c4" uncles=0 txs=0 gas=0 fees=0 elapsed=17.093ms
INFO [01-19|06:34:45.141] Successfully sealed new block number=2 sealhash="e438e6…ff51c4" hash="d70210…3bca0d" elapsed=84.626ms
INFO [01-19|06:34:45.141] 🔨 mined potential block number=2 hash="d70210…3bca0d"
INFO [01-19|06:34:45.141] Commit new mining work number=3 sealhash="6a98b3…4bdc80" uncles=0 txs=0 gas=0 fees=0 elapsed="367.472µs"
INFO [01-19|06:34:51.295] Successfully sealed new block number=3 sealhash="6a98b3…4bdc80" hash="78d6cb…c033f5" elapsed=6.153s
INFO [01-19|06:34:51.324] 🔨 mined potential block number=3 hash="78d6cb…c033f5"
INFO [01-19|06:34:51.296] Commit new mining work number=4 sealhash="51be0d…46f2e8" uncles=0 txs=0 gas=0 fees=0 elapsed="642.359µs"
INFO [01-19|06:35:02.689] Successfully sealed new block number=4 sealhash="51be0d…46f2e8" hash="6086ce…98c928" elapsed=11.393s
INFO [01-19|06:35:02.828] 🔨 mined potential block number=4 hash="6086ce…98c928"
INFO [01-19|06:35:02.824] Commit new mining work number=5 sealhash="297750…ece4fb" uncles=0 txs=0 gas=0 fees=0 elapsed=134.563ms
INFO [01-19|06:35:12.483] Successfully sealed new block number=5 sealhash="297750…ece4fb" hash="addb2f…85c1ac" elapsed=9.659s
INFO [01-19|06:35:12.527] 🔨 mined potential block number=5 hash="addb2f…85c1ac"
INFO [01-19|06:35:12.500] Commit new mining work number=6 sealhash="284733…e3cbab" uncles=0 txs=0 gas=0 fees=0 elapsed=16.081ms


> eth.getBalance("0x19fAe8328f9CD2869153a6fBF898ab6713337641")
96000000000000000000
>

MetaMask

安装 MeataMask 可以切换网络至 http://localhost:8545,账户是用 JSON 文件导入,导入 keystore,输入密码,可以实时查询余额

Web3.js

const Web3 = require("web3");
// 连接私有链
const web3 = new Web3("http://localhost:8545");

// 查询账户
web3.eth.getAccounts((error, res) => {
if (!error) {
console.log(res);
}
});

// 查询余额
web3.eth
.getBalance("0x19fAe8328f9CD2869153a6fBF898ab6713337641")
.then(console.log);

附录

密码

密码不是私钥,是创建账户的密码

私钥

私钥由 64 位长度的十六进制的字符组成,私钥可以生成公钥,再生成地址,都不可逆。

助记词

助记词是私钥的另外一种展现形式,可以生成私钥,但不可逆。

keystore

将私钥已加密的形式保存为一份 JSON 文件,配合密码可以操作账户。

如何解锁账户

解锁账户有如下几种方式:

  • 私钥(Private Key)
  • Keystore+密码(Keystore+Password)
  • 助记词(Mnemonic code)

我们可以得到以下总结:

  • 通过私钥+密码可以生成 keystore,即加密私钥。
  • 通过 keystore+密码可以获取私钥,即解密 keystore。
  • 通过助记词根据不同的路径获取不同的私钥,即使用 HD 钱包将助记词转化成种子来生成主私钥,然后派生海量的子私钥和地址。

使用 node-xlsx 生成 excel

姓名 性别 年龄 身高
Jack 18 180
Amy 19 165
Ann 18 162
const xlsx = require("node-xlsx");
const data = [
["Jack", "男", 18, 180],
["Amy", "女", 19, 165],
["Ann", "女", 18, 162],
];

const buffer = xlsx.build([{ name: "mySheetName", data: data }]);

fs.writeFile("member.xlsx", buffer, "binary", (err) => {
if (err) {
console.log(err);
} else {
console.log("生成成功");
}
});

表头需要自行添加

提交回退修改合并

查看提交记录

$ git log

回到某个提交 代码在暂存区

$ git reset -soft [hash]

回到某个提交 代码还在 不在暂存区

$ git reset --hard [hash]

回到某个提交 代码重置

$ git reset --hard [hash]

修改上次提交

$ git commit --amend

合并前几次提交

$ git rebase -i HEAD~3

强行推送

$ git push origin HEAD --force

git stash 用法

将暂存区和工作区保存,可保存多次

$ git stash

查看保存进度列表

$ git stash list

恢复保存进度

$ git stash pop [stash_id]

删除一个进度

$ git stash drop [stash_id]

删除所有进度

$ git stash clear

git rebase

这篇文章下面讲解比较详细
http://jartto.wang/2018/12/11/git-rebase/

其他操作

对比文件更改

$ git diff <file name>

查看文件更改记录

$ git blame <file name>

查看历史记录

压缩模式
$ git log --oneline

图形模式
$ git log --graph

显示所有分支的历史记录
$ git log --all

混合使用
$ git log --all --graph
$ git log --oneline --graph

列出 commit

git reflog 则列出了 head 曾经指向过的一系列 commit。要明白它们只存在于你本机中;而不是你的版本仓库的一部分,也不包含在 push 和 merge 操作中。

$ git reflog

目的

在 docker 里启动一个服务

编写服务代码

import Koa from "koa";

const app = Koa();

app.use(async (ctx) => {
ctx.body = "Hello world";
});

app.listen(3000, () => {
console.log("listen in 3000");
});

编写 Dockerfile

# 拉取镜像
FROM node:11.15-alpine

# 执行命令
RUN node -v \
&& npm -v

# 设定工作目录
WORKDIR /opt

# 复制文件
COPY . /opt

# 执行命令
CMD npm start

根据 Dockerfile 生成 image

$ docker build . -t node-server:1.0.0

创建容器 映射端口

$ docker run -d -p 3000:3000 -it --name hello-world node-server:1.0.0
  • -it:这是两个参数,一个是 -i 表示交互式操作,一个是 -t 为终端。
  • -d: 后台运行
  • -v: 目录挂载
  • -p: 端口隐射, 宿主机在前,容器在后
  • -P: 随机映射宿主机端口

查看所有容器和状态

$ docker ps -a

启动容器

$ docker start 2477af4679e2

访问 http://localhost:3000 查看

查看运行的容器

$ docker ps

进入容器

$ docker exec -it 2477af4679e2 sh