1 概述
部署工具
2 用户
2.1 adduser
fish@VM-0-14-ubuntu:~$ sudo adduser jan
Adding user `jan' ...
Adding new group `jan' (1001) ...
Adding new user `jan' (1001) with group `jan' ...
Creating home directory `/home/jan' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
使用adduser就能添加一个新用户,默认这个用户是独立的同名用户组
2.2 gpasswd
gpasswd -a peter users
将peter加入到users用户组
gpasswd -d peter users
将peter移出users用户组
groups peter
查看peter所属的用户组
2.3 useradd
useradd --no-create-home --shell /bin/false prometheus
useradd可以创建一个没有Home目录和没有shell的用户。在CentOS里面,useradd与adduser是一样的。在Ubuntu里面,adduser有交互提示,但useradd没有
3 nohup
nohup xxxx > nohup.out
在命令行启动程序的时候,要用nohup。否则默认会在退出命令行的时候,自动关掉
nohup xxxx > nohup.out & echo $! > pid
我们一般会加上后面的echo语句,这样会将启动的进程号写入到pid文件上。
nohup xxxx > nohup.out & echo $$! > pid
在Makefile里面要写$\(!,而不是\)!,因为Makefile里面会将$开头的看成是一个变量
4 ssh
4.1 RSA登录
4.1.1 客户端生成密匙
RSA就是大名鼎鼎的非对称加密技术了
ssh-keygen -t rsa
生成密匙
在用户目录的.ssh的文件夹下,就能找到.pub结尾的公有钥匙
4.1.2 服务器注册密匙
然后我们在服务器的.ssh文件夹里面,将客户端的公有钥匙复制到authorized_keys文件夹就可以了。
ssh-copy-id -i ~/.ssh/id_rsa.pub user@abc.com
你也可以用ssh-copy-id来远程复制公有钥匙
4.1.3 简要
非对称加密的原理是,加密与解密用的是不同钥匙,从私匙可以推算出公匙,但是从公匙难以推算出私匙。因此,公匙可以确定通过算法来检查对方是否真的有私匙,同时又不需要知道对方的私匙到底是什么。就像,我们知道一个文件的Hash值,就能校验出这个文件是否有改动过,但又不需要真的知道这个文件的内容是什么。
我们将公匙放在服务器,服务器就会在客户端登录的时候,可以用现有的公匙来验证对方是否真的有私匙,从而来检查登录。同时,公匙的难以推算出私匙的性质,可以安全地将公匙在网络上传播,而保证私匙不会被泄漏。
4.2 执行命令
ssh fish@idc.fishedee.com "mkdir $(DIRECTORY)/$(TARGET)_new"
我们可以用ssh命令,直接在远程机器执行命令
ssh -t fish@idc.fishedee.com "sudo supervisorctl stop xx"
当远程的ssh命令需要sudo需要密码时,我们可以用加入-t参数,这样ssh执行sudo命令时就会提示我们输入密码
5 scp
scp xxx.tar.gz efg@abc.com:xxx.tar.gz
你可以将scp看成是一个cp命令,只不过它可以复制到远程的文件夹上,相当方便
6 ps
ps aux | grep `cat pid`
pid是存放着进程pid号的文件,我们可以用ps命令来查看进程的状态
7 kill
kill -9 `cat pid`
强行关掉进程工具,kill
8 cp
cp source target
从源文件复制到目标文件
cp -r source target
如果是源文件是文件夹的话,你还需要加上-r参数
cp -n source target
cp命令的默认策略是,遇到同名文件或者文件夹就直接覆盖。我们可以指定-n参数来修改这种策略,遇到同名文件或者文件夹就跳过,而不是覆盖。
9 tar
tar -zcvf xx.tar.gz target/*
压缩的命令,tar -zcvf固定参数,target/*是指定的文件,注意打包好的压缩包不含有target顶层目录。
tar -zcvf xx.tar.gz target
如果你希望顶层是一个target目录,那么就要上面这样的写法。
tar -zxvf xxxx.tar.gz -C target_folder
解压的命令,将压缩的内容,指定解压到target_folder目录
10 cut
cut 命令就是对行用指定的分隔符切开,然后取第几列的意思
cut -f2 -d ";"
例如,-d是指定分割符,-f是指定第2列的意思,注意分隔符不会将多个分隔符合并的。
cut -f2,3 test.txt
你可以选择第2和第3列
11 tr
tr是转换命令,将每一行的特定字符A转换为特定字符B
tr a f
将字符a全部转换为字符f
tr a-z A-Z
将小写字符,转换为大写字符
tr -s ' '
tr有一个-s参数,将指定字符合并为一个。我们常用来将多个空格合并一个空格
12 sudo
sudo -H -u {username} command
然后我们指定某个用户来启动该应用,以加强安全性。注意,这个命令会产生两个进程,首先是sudo进程,它可能会在启动后自动关闭,然后是新的command进程,以指定username启动的
sudo -u nginx stat /var/www/abc
我们也可以用sudo命令来测试某个用户是否有某个文件的stat权限
# 无密码转sudoers
ab ALL=(ALL:ALL) NOPASSWD:NOPASSWD:ALL
# 需要密码转sudoers
cd ALL=(ALL:ALL) ALL
要使某个用户用sudo,需要注册在/etc/sudoers文件中配置了先。
13 权限
Linux的权限是个复杂的议题
一个文件夹的权限是drwxrwxr-x,意思是:
- d,该文件是一个目录
- rwx,左边数起的第2,3,4个字母,表示该文件的拥有者的权限为rwx。
- rwx,左边数起的第5,6,7个字母,表示该文件的群组其他用户的权限为rwx。
- r-x,左边数起的第8,9,10个字母,表示其他用户的权限为r-x。
最后第一个fish是用户,第二个fish是群组。
13.1 文件权限
文件有四种权限,r,w,x和s
- r的权限,是可读,可以对当前文件读
- w的权限,是可写,可以对当前文件写
- x的权限,是可执行,可以对当前文件执行
- s的权限比较特别,任何用户都可以执行该文件,而且执行的时候都是以root用户身份执行,实际的权限限制由本执行文件自己来决定。可以看这里
13.2 目录权限
目录有四种权限,r,w,x和t
- r的权限,是可读,可以获取目录的文件列表,例如ls
- w的权限,是可写,可以在目录里面新增和删除文件,例如mkdir和rm
- x的权限,是可执行,可以在目录执行cd命令,x权限是目录的基本权限,只有r权限的目录是无法执行ls的
- t的权限比较特别,要删除目录的任意文件,只需要w权限就可以了。但是,有时候,我们需要特别的权限控制,目录的任意文件只能被文件拥有者自身或者root用户来删除,其他用户不能删除。这个就需要对目录加入t权限了。
13.3 命令
chmod 777 abc
以数字的方式同时赋予文件的,所有权限
# 对于当前文件赋予当前拥有者的x权限
chmod u+x abc
# 对于当前文件去除当前拥有者的x权限
chmod u-x abc
# 对于当前文件赋予当前用户组的x权限
chmod g+x abc
# 对于当前文件去除当前用户组的x权限
chmod g-x abc
使用形象化的命令来改变每个部分的命令
# 对于当前文件赋予当前拥有者的s权限
chmod u+s abc
# 对于当前文件去除当前拥有者的s权限
chmod u-s abc
# 对于当前文件赋予当前用户组的s权限
chmod g+s abc
# 对于当前文件赋予当前用户组的s权限
chmod g-s abc
# 对于当前目录赋予t权限
chmod o+t abc
# 对于当前目录赋予t权限
chmod o-t abc
特殊权限的赋予与去除方式
13.4 实验
13.4.1 目录的w权限
当前在fish用户下,我们使用chmod g-w uu,去除对uu目录的w权限
nginx用户是属于fish用户组的,我们尝试以nginx用户身份在uu目录下创建文件是失败的。
13.4.2 目录的x权限
当前在fish用户下,我们使用chmod g-x uu,去除对uu目录的x权限
nginx用户是属于fish用户组的,我们尝试以nginx用户身份在cd进去uu目录是失败的,而且创建文件更是失败的,即使这个nginx用户有w权限。因为目录的x权限是基础,没有x权限的目录是什么事都做不了,即使有r和w权限。
13.4.3 文件的s权限
在/usr/bin的目录下,有一个可执行文件passwd是s权限,注意不是x权限。这个命令是用来修改用户密码的,用户密码是存放在/etc/passwd文件(这个文件是root用户)的。
如果用普通的x权限我们就会产生矛盾,用户可以修改自己的密码,但是密码文件是root用户拥有的,这注定不能实现用户修改自己密码的能力。于是,对/usr/bin/passwd可执行文件赋予s权限,使得任何人都可以执行这个文件,并且是以临时的root身份执行它。真正的可以修改//etc/passwd哪一行的权限是由/usr/bin/passwd可执行文件自己来决定的。
13.4.4 目录的t权限
fish用户创建了一个folder文件夹,并且用fish用户也创建了一个folder下的file文件。
显然,由于folder文件夹的权限是rwxrwxr-x,所以属于fish用户组的nginx用户,也能删除这个folder下的file文件
然后fish用户将folder目录赋予了t权限,然后也用fish用户创建了folder下的file文件。
这个时候,nginx用户就不能再删除folder下的file文件了。folder下的文件,只能是文件拥有者,或者目录拥有者fish,或者root用户才能删除。这就是t权限的意义。
t权限的一个例子是用在/tmp目录下,你可不想你创建的一个临时文件a,被其他用户无意中删除了。即使大家都能在/tmp目录下创建文件,但是删除文件只能是文件拥有者自身才可以行驶。
14 grep
cat a.txt | grep "md"
打开a.txt文件,并且搜索含有md字符的行
grep "md" -A 5 可以显示匹配内容以及后面的5行内容
grep "md" -B 5 可以显示匹配内容以及前面的5行内容
grep "md" -C 5 可以显示匹配内容以及前后面的5行内容
打开a.txt文件,并且搜索含有md字符的行
15 ab
ab -n 1000 -c 10 -k "http://localhost:9191/api/concurrentUser/incAge2?data=%7B%22id%22%3A10001%7D"
- -n,参数是总的数量
- -c,参数是并发量
- -k,参数是打开长连接,避免一个连接用完就丢,并且产生大量TIME_WAIT状态的TCP。这样既不符合实际情况,也会影响真实的性能表现
测试的时候,要注意不要打开https来测试,这样无法测试到真正的性能瓶颈。
16 wrk
wrk -t8 -c100 -d10s "http://localhost:9191/api/concurrentUser/incAge2?data=%7B%22id%22%3A10001%7D"
- -t,参数是线程数量,一般为核数的2倍就可以了。
- -c,参数是并发的连接数量
- -d,参数是持续时间
wrk是多线程+多路复用的模型,所以压测的并发数能做得比ab测试要更好,一般情况下,并发量能达到ab测试的2倍。另外要注意,wrk测试的总连接数量是不准确的,不要依赖这个数据做正确性测试
17 curl
看这里
curl http://localhost:9191/api/concurrentUser/incAge\?data\=%7B%22id%22%3A10001%7D
curl一直都是简单的连接测试工具了,也没啥好说的。
- -X,参数是请求方法,可以为GET,POST,DEL,PUT
- -d或者–data,参数是POST请求体的数据,-d ‘{“phoneId”:“124nd”,“data”:“data”}’
- -F或者–form,参数是请求体附带文件,-F “image=@./1.png”
- -H,指定Header信息,-H “Content-type: application/json”
- -I,只拿到,请求返回的头部信息
- -i,请求返回的头部和主体信息
18 lsof
lsof -i tcp:7878
lsof 查看倾听端口为7878的进程。
19 Makefile
a:go
echo ${boy} ${girl}
b:go2
echo ${boy} ${girl}
go:
$(eval boy:=1)
$(eval girl:=2)
go2:
$(eval boy:=11)
$(eval girl:=22)
运行时定义变量,用eval
- 本文作者: fishedee
- 版权声明: 本博客所有文章均采用 CC BY-NC-SA 3.0 CN 许可协议,转载必须注明出处!