shell & ssh

# 日常用到的Shell命令

命令名 功能描述
clear 清除屏幕或窗口内容
env 显示当前所有设置过的环境变量
date 显示系统的当前日期和时间
cal 显示日历
vi 修改文件 dd删除一行 A编辑选中的最后一行代码 ,
:set nu 加索引
touch 创建文件
mkdir 创建文件夹
du -ha [文件名称] 查看目录/文件占用空间大小
ls -lh 看文件大小
ll 等价 ls -al
netstat -nltp grep 443
mv 修改文件名 移动文件 mv index.html .bash_profile
cat 查看内容
sudo vim /etc/hosts ws破解
ssh -p 2289 root@182.92.117.162 登录ssh
chattr +i .user.ini 重新恢复文件不可更动属性
chmod -R 777 pet_07 赋权限
r:可读
w:可写
x:可执行

-rw------- (600) -- 只有属主有读写权限。
-rw-r--r-- (644) -- 只有属主有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) -- 只有属主有读、写、执行权限。
-rwxr-xr-x (755) -- 属主有读、写、执行权限;别的用户组只有读、执行权限。
-rwx--x--x (711) -- 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) -- 所有用户都有文件读、写权限。这种做法不可取。
-rwxrwxrwx (777) -- 所有用户都有读、写、执行权限。更不可取的做法。
参数解释
sudo chown -R $(whoami) or【你的用户名】 /Users/hzf/Desktop/projectSvelte 更改某个目录或文件的用户名和用户组
yarn version --new-version 1.0.0 更改版本号
curl http://www.jing999.cn:8000/banner http命令行工具
ping -c 10 www.jing999.cn ping
kill -9 PID 杀死这个进程
npx browser-sync start -s . -f . 静态页面动态刷新
browser-sync start --server --files . 静态页面动态刷新
rm -rf node_modules/.cache/babel-loader umi的bug
nginx -s reload 重启nginx
tar -czvf dist.tar.gz dist dist 压缩
tar -xzvf dist.tar.gz 解压
-c: 建立压缩档案
-x:解压
-z:有gzip属性的
-v:显示所有过程
-r:向压缩归档文件末尾追加文件
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
参数解释
find / -name jenkins 查看安装目录
sed -i '' "s/666/777/g" config 修改文字 666换成777

看一共写了多少代码

find . "(" -name ".vue" -or -name ".jsx" -or -name ".tsx" -or -name ".css" -or -name ".less" -or -name ".scss" -or -name ".js" -or -name ".ts" ")" -print | xargs wc -l

# 添加环境变量

  • 临时有效
    • export PATH=$(pwd)/bin:$PATH
  • 软连接 /usr/local/bin/就是环境变量目录
    • ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
  • 用户主目录下的.bashrc 或.profile文件(推荐)
    • export PATH=/Users/hzf/mongodb/bin:$PATH
      • 执行source ~/.bashrc, 立即生效

# VIM

批量注释

从需要被注释的第一行开始,将光标移动到行首,

按下 Ctrl + v

接着按下方向键下,一直移动到需要被注释的最后一行,

这时可以看到,这些需要被注释的行的行首第一个字符已经全部被选中

然后按下 Shift + i,批量插入,

这时光标会跳到第一行的行首,不用管,继续按下Shift + 3,也就是 #

最后按下 Esc 键,就可以看到刚才被选中的行的行首都会加多一个#

批量注释完毕

去注释

对于一大段被注释的代码,需要去掉注释的时候,也可以一次性操作完

不用一个一个去删,具体操作如下:

光标移到需要去除注释的第一行的行首,跟上面的一样,

按下 ·Ctrl + v

接着按下方向键下,一直移动到需要被注释的最后一行,

这时候可以看到,行首的第一个字符#已经被选中了,

然后按下d键就可以全部删掉行首的#字符了。

# Shell编程

# run: sh depoly.sh 123 123
# 变量定义
str='test' # 注意赋值不需要空格
str2="this is $str" # 双引号可以直接写入变量
str3="this is ${str}"
arr=('1' '2') # 数组

# echo打印
echo this is test # this is test # 被默认为字符串,不会报错
echo $str # test # 变量引用需要家$符号
echo $str2 # this is test
echo $str3 # this is test
echo ${arr[1]} # 2 # 数组切割

# if判断
if [ $str == "test" ] # if条件需要在方括号中,并且注意需要空格
then
    echo 'successed'
fi

a='10'
b='20'
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

# 获取参数
echo $1 # 123 #第一个参数
echo $# # 2 # 参数个数
echo $* # 123 123 所有参数

# for循环
# C语言风格
for ((i=1; i<=100; i++))
do
  echo $i
done
# Python风格(in的使用)
for i in {1..100}
do
  echo $i
done
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# ssh 不能登录服务器

提示警告信息如下:

arnold@WSN:~$ ssh 120.79.229.197

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is 08:98:a9:cc:f8:37:20:6b:b4:b1:6c:3a:15:b9:a9:92. Please contact your system administrator. Add correct host key in /home/arnold/.ssh/known_hosts to get rid of this message. Offending key in /home/arnold/.ssh/known_hosts:2 RSA host key for 10.18.46.111 has changed and you have requested strict checking. Host key verification failed.

原因分析:

It is also possible that a host key has just been changed.

我之前对ssh服务器重装了系统,导致所有与原系统建立过ssh连接的系统都无法再建立连接,因为在于原系统建立首次连接时,双方相互记录了对方的公钥(ssh基于非对称密钥技术),在ssh服务主机重装系统后,公钥改变了,任以旧版本公钥的主机自然是无法与新系统连接的。

网上还有分析为ssh主机被人黑了,并在消除入侵记录时对known_hosts文件做了改动。当然也不排除这种可能,但我估计我是没那个福气了:)

解决方案:

删除 ~/.ssh/known_hosts文件,或者如果你可以判断出known_hosts中原ssh服务器的公钥,删去那部分

然后后再次建立新的连接,即可获得新的公钥。

# 关于sshpass使用举例

使用-p参数指定登录密码

# 免密码登录
$ sshpass -p password ssh username@host

# 远程执行命令
$ sshpass -p password ssh username@host <cmd>

# 通过scp上传文件
$ sshpass -p password scp local_file root@host:remote_file 

# 通过scp下载文件
$ sshpass -p password scp root@host:remote_file local_file
1
2
3
4
5
6
7
8
9
10
11

示例:


 


 







#把本地的source.txt文件拷贝到192.168.0.10机器上的/home/work目录下
scp /home/work/source.txt root@192.168.0.10:/home/work/ 

#把120.79.229.197机器上的hzf.gif文件拷贝到本地的/Users/zhenfeng/tempData/目录下
scp root@120.79.229.197:/tmp/hzf.gif /Users/zhenfeng/tempData/  

#把192.168.0.10机器上的source.txt文件拷贝到192.168.0.11机器的/home/work目录下
scp root@192.168.0.10:/home/work/source.txt root@192.168.0.11:/home/work/ 

#拷贝文件夹,加-r参数
scp -r /home/work/sourcedir root@192.168.0.10:/home/work/ 
1
2
3
4
5
6
7
8
9
10
11

# 脚本

#!/usr/bin/env bash
tar -czvf '$1' | sshpass -p password ssh root@host 'cd /home -rf;tar -xzvf -'
1
2

脚本用env启动的原因,是因为脚本解释器在linux中可能被安装于不同的目录,env可以在系统的PATH目录中查找。同时,env还规定一些系统环境变量。

# linux-ab压力测试

# 基本用法
ab -c 10 -n 100 https://www.xxxxx.com
1
2

参数释义 总共请求100次 一次请求10个 post文件 请求头信息 地址

对相关参数进行说明:

-n 即requests,用于指定压力测试总共的执行次数。
-c 即concurrency,用于指定的并发数。
-t 即timelimit,等待响应的最大时间(单位:秒)。
-b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。
-p 即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。
-u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。
-T 即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。
-v 即verbosity,指定打印帮助信息的冗余级别。
-w 以HTML表格形式打印结果。
-i 使用HEAD请求代替GET请求。
-x 插入字符串作为table标签的属性。
-y 插入字符串作为tr标签的属性。
-z 插入字符串作为td标签的属性。
-C 添加cookie信息,例如:“Apache=1234”(可以重复该参数选项以添加多个)。
-H 添加任意的请求头,例如:“Accept-Encoding: gzip”,请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。
-A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。
-P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。
-X 指定使用的和端口号,例如:“126.10.10.3:88”。
-V 打印版本号并退出。
-k 使用HTTP的KeepAlive特性。
-d 不显示百分比。
-S 不显示预估和警告信息。
-g 输出结果信息到gnuplot格式的文件中。
-e 输出结果信息到CSV格式的文件中。
-r 指定接收到错误信息时不退出程序。
-h 显示用法信息,其实就是ab -help。
[root@hadoop ab]# ab -c 10 -n 100 https://ah2.zhangyue.com/zybk/subscribe/talk?actId=949

This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking ah2.zhangyue.com (be patient).....done


Server Software:
Server Hostname:        ah2.zhangyue.com    #请求的URL主机名
Server Port:            443  #web服务器监听的端口
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Server Temp Key:        ECDH P-256 256 bits
TLS Server Name:        ah2.zhangyue.com

Document Path:          /zybk/subscribe/talk?actId=949 #请求的URL中的根绝对路径
Document Length:        13731 bytes #HTTP响应数据的正文长度

Concurrency Level:      10  # 并发用户数,这是我们设置的参数之一
Time taken for tests:   3.207 seconds   #所有这些请求被处理完成所花费的总时间 单位秒
Complete requests:      100  # 总请求数量,这是我们设置的参数之一
Failed requests:        33  # 表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况
   (Connect: 0, Receive: 0, Length: 33, Exceptions: 0)
Total transferred:      1404034 bytes #所有请求的响应数据长度总和。包括每个HTTP响应数据的头信息和正文数据的长度
HTML transferred:       1373034 bytes  # 所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度
Requests per second:    31.18 [#/sec] (mean)  #吞吐率,计算公式:Complete requests/Time taken for tests  总请求数/处理完成这些请求数所花费的时间
Time per request:       320.737 [ms] (mean) # 用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。处理完成所有请求数所花费的时间/(总请求数/并发用户数)
Time per request:       32.074 [ms] (mean, across all concurrent requests) #服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level
Transfer rate:          427.49 [Kbytes/sec] received #表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       39  138 150.2     76     906
Processing:    27  119 164.8     54     984
Waiting:       27  118 164.7     54     984
Total:         70  256 220.1    153    1135

Percentage of the requests served within a certain time (ms)
  50%    153
  66%    296
  75%    351
  80%    371
  90%    565
  95%    796
  98%   1069
  99%   1135
 100%   1135 (longest request)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

# 针对jenkins总结的

启动jenkins
java -jar jenkins.war --httpPort=8081

如果想要在linux后台一直运行,则要开始加nohup,在末尾加&号
nohup java -jar jenkins.war --httpPort=8081 &

启动后 会生成一个nohup.out输出,需要的话,可以tail -f nohup.out实时查看日志

列出jenkins的所有进程
ps -aux|grep jenkins

杀死这个进程
kill -9 [PID]

启动jenkins的另外方式
service jenkins start/stop/restart/status

systemctl start jenkins.service

查看运行的后台进程
jobs -l
jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)
ps -ef
ps -aux|grep jenkins

查看使用某端口的进程
lsof -i:3000
kill -9 [pid]

# 终端写入内容

echo "hello world" >> test.txt  # 追加
echo "hello world" > test.txt  # 覆盖
1
2