windows设置

无拓展名文件设置默认打开方式

cmd中,assoc用来关联后缀与文件类型,ftype用来关联文件类型和打开其的应用程序。

设置关联文件类型

管理员状态下运行cmd,查看无拓展的关联类型:

1
assoc  .

自定义无后缀文件对应的文件类型(此处为No Extension,可以自定义,注意在等号后面是没有空格的!),设置关联:

1
assoc .=No Extension

设置关联(此处我使用vscode,可以把路径替换为其他程序),输入:

1
ftype "No Extension"="D:\software\Microsoft VS Code\Code.exe" "%1"

批处理文件 bat 后台运行

方案一:批处理文件,开头加上以下三行代码

1
2
3
if "%1"=="hide" goto CmdBegin
start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit
:CmdBegin

方案二:再创建一个backrun.vbs文件,写入以下代码

1
createobject("wscript.shell").run "test.bat",0

双击该该vbs文件,批处理文件,就进入后台运行模式了;打开资源管理器, 会发现有一个cmd的进程,就是批处理文件的进程

Spreadsheet compare 2016崩溃解决

注册表中找到[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Common\Identity]位置下添加:
“EnableADAL”=dword:00000000
Spreadsheet compare工具下载地址:https://sourceforge.net/projects/spreadshcompare/

阅读全文
requests测试http(s)接口

httpbin服务

http://www.httpbin.org/

一个使用 Python + Flask 编写的 HTTP HTTP Request & Response Service。该服务主要用于测试 HTTP 库。你可以向他发送请求,然后他会按照指定的规则将你的请求返回。
httpbin支持HTTP/HTTPS,支持所有的HTTP动词,能模拟302跳转乃至302跳转的次数,还可以返回一个HTML文件或一个XML文件或一个图片文件(还支持指定返回图片的格式)。

部署

1
2
docker pull kennethreitz/httpbin
docker run -p 8880:80 kennethreitz/httpbin

questions:

抓包数据认证问题:设置参数verify:false

1
response = requests.get(url, params=params, headers=headers, verify=False)
阅读全文
命令行交互方式来访问HTTP服务(curl&httpie)

curl

用于命令行和脚本进行传输数据到服务器或者从服务器传输数据的工具

  • 支持广泛的协议,如:ftp、http、https、pop3、scp、sftp、telent等

  • 支持SSL证书,HTTP中各方法、cookies、head、authentication

  • 免费开源软件

    使用场景:

  • 请求、验证、测试链接

  • 支持连接超时、保活时间设置,支持下载上传速率的配置,支持重试机制等

  • 测试restful接口

  • 上传、下载文件

    语法

    curl [options] [URL…]

    参数 描述
    -V 显示当前的curl版本
    -# 对发送和接收进行简单的进度bar展示
    -0 强制使用HTTP 1.0协议
    -1 强制使用TLS version 1.x
    -4 解析域名为ipv4地址(域名有多个ip时)
    -a FTP/SFTP上传文件时,curl将追加到目标文件,而非覆盖
    -A 设置用户代理
    -b 设置cookies
    –basic 使用HTTP Basic authentication
    –compressed 使用curl支持的压缩算法请求压缩的响应, 如果请求的响应不是压缩的,curl抛出异常
    –connect-timeout 设置连接超时时间
    -d 用于post请求时表单提交数据, 请求类型将被设置为:application/x-www-form-urlencoded
    -e 发送”Referer Page”到服务器
    -F form表单提交
    -G 使用get请求发送 -d参数指定的数据
    -H 增加Head头
    -i 在输出Head头(响应)
    -I 只输出Head头(响应)
    –interface 指定使用的网络接口
    -k 允许curl使用非安全的ssl连接并且传输数据(证书不受信)
    -K 后接参数文件,参数文件中可以定义HTTP请求的相关的内容(URL、HEAD、DATA)
    –keepalive-time 设置连接的保活时间
    -L curl自动重定向(3xx)
    –limit-rate 特指最大的传输速率
    -m 设置整个操作的允许消耗的最大时间,对于在延时网络下的批量操作有利
    –max-filesize 允许下载文件的最大大小
    -N 禁用输出流缓冲区
    –no-keepalive 连接不保活
    -o 将响应数据输出到指定文件,后接文件参数
    –retry 发生瞬时错误时,curl将重试执行数据传输
    –retry-delay 延迟重试
    –trace dump出输入输出数据至文件
    -v 获取更多输入输出相关的内容,对于debug非常有用
    -y或者–speed-time 如果在speed-time期间,下载比speed-limit这个更慢,则下载废止
    -Y或者–speed-limit 如果在speed-time期间,下载比speed-limit这个更慢,则下载废止

    example

1
2
# -i表示显示返回消息的头部
curl -X METHOD -H HEADER -i
1
2
# -d后面表示请求消息体,如果消息体在文件中,那么使用@符号作为前缀对文件进行读取
curl -i -X POST -H "Content-Type: application/json" -d @auth.json http://host:port/v3/auth/tokens
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# 不带有任何参数时,curl 就是发出 GET 请求。
curl https://www.example.com
#上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出。

# -A参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/[version]。
curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com
# 上面命令将User-Agent改成 Chrome 浏览器。
curl -A '' https://google.com
# 上面命令会移除User-Agent标头。
# 也可以通过-H参数直接指定标头,更改User-Agent。
curl -H 'User-Agent: php/1.0' https://google.com

# -b参数用来向服务器发送 Cookie。
curl -b 'foo=bar' https://google.com
# 上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。
curl -b 'foo1=bar' -b 'foo2=baz' https://google.com
# 上面命令发送两个 Cookie。
curl -b cookies.txt https://www.google.com
# 上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。

# -c参数将服务器设置的 Cookie 写入一个文件。
curl -c cookies.txt https://www.google.com
# 上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。

# -C switch是恢复我们文件传输的设备,但还要注意,它后面紧跟一个破折号(-)。这告诉cURL继续文件传输,但是实现这一步,首先要查看已经下载的部分,找到下载的最后一个字节才可以确定从何处可以恢复。
curl -C - example.com/some-file.zip --output MyFile.zip

# -d参数用于发送 POST 请求的数据体。
curl -d'login=emma&password=123'-X POST https://google.com/login
# 或者
curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login
# 使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。
# -d参数可以读取本地文本文件的数据,向服务器发送。
curl -d '@data.txt' https://google.com/login
# 上面命令读取data.txt文件的内容,作为数据体向服务器发送。

# --data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。
curl --data-urlencode 'comment=hello world' https://google.com/login
# 上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。

# -e参数用来设置 HTTP 的标头Referer,表示请求的来源。
curl -e 'https://google.com?q=example' https://www.example.com
# 上面命令将Referer标头设为https://google.com?q=example。

# -H参数可以通过直接添加标头Referer,达到同样效果。
curl -H 'Referer: https://google.com?q=example' https://www.example.com

# -F参数用来向服务器上传二进制文件。
curl -F 'file=@photo.png' https://google.com/profile
# 上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。
# -F参数可以指定 MIME 类型。
curl -F 'file=@photo.png;type=image/png' https://google.com/profile
# 上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。
# -F参数也可以指定文件名。
curl -F 'file=@photo.png;filename=me.png' https://google.com/profile
# 上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。

# -G参数用来构造 URL 的查询字符串。
curl -G -d 'q=kitties' -d 'count=20' https://google.com/search
# 上面命令会发出一个 GET 请求,实际请求的 URL 为https://google.com/search?q=kitties&count=20。如果省略--G,会发出一个 POST 请求。
# 如果数据需要 URL 编码,可以结合--data--urlencode参数。
curl -G --data-urlencode 'comment=hello world' https://www.example.com

# -H参数添加 HTTP 请求的标头。
curl -H 'Accept-Language: en-US' https://google.com
# 上面命令添加 HTTP 标头Accept-Language: en-US。
curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
# 上面命令添加两个 HTTP 标头。
curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
# 上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据。

# -i参数打印出服务器回应的 HTTP 标头。
curl -i https://www.example.com
# 上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。

# -I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来。
curl -I https://www.example.com
# 上面命令输出服务器对 HEAD 请求的回应。

# --head参数等同于-I。
curl --head https://www.example.com

# -k参数指定跳过 SSL 检测。
curl -k https://www.example.com
# 上面命令不会检查服务器的 SSL 证书是否正确。

# -L参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。
curl -L -d 'tweet=hi' https://api.twitter.com/tweet

# --limit-rate用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。
curl --limit-rate 200k https://google.com
# 上面命令将带宽限制在每秒 200K 字节。

# -m switch指定执行命令所需的最长时间。
# 经过指定的时间后,cURL将退出正在执行的操作,即使它正在下载或上传文件。cURL会以秒为单位指定您想要的最长时间。因此,要在一分钟后超时,该命令将如下所示:
curl -m 60 example.com
# 您可以使用cURL指定的另一种超时类型是用于链接的时间量。这有助于确保cURL不会花费过多的时间来尝试连接处于脱机状态或无法访问的主机。

# 它也接受秒作为参数。该选项被写为–connect-timeout。
curl --connect-timeout 60 example.com

# -o, --output
# -o参数将服务器的回应保存成文件,等同于wget命令。
curl -o example.html https://www.example.com
# 上面命令将www.example.com保存成example.html。

# -O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。
curl -O https://www.example.com/foo/bar.html
# 上面命令将服务器回应保存成文件,文件名为bar.html。

# -s参数将不输出错误和进度信息。
curl -s https://www.example.com
# 上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。
# 如果想让 curl 不产生任何输出,可以使用下面的命令。
curl -s -o /dev/null https://google.com
# -S参数指定只输出错误信息,通常与-o一起使用。
curl -s -o /dev/null https://google.com
# 上面命令没有任何输出,除非发生错误。

# -u参数用来设置服务器认证的用户名和密码。
curl -u 'bob:12345' https://google.com/login
# 上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1。
# curl 能够识别 URL 里面的用户名和密码。
curl https://bob:12345@google.com/login
# 上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。
curl -u 'bob' https://google.com/login
# 上面命令只设置了用户名,执行后,curl 会提示用户输入密码。

# -v参数输出通信的整个过程,用于调试。
curl -v https://www.example.com

# --trace参数也可以用于调试,还会输出原始的二进制数据。
curl --trace - https://www.example.com

# -x参数指定 HTTP 请求的代理。
curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
# 上面命令指定 HTTP 请求通过myproxy.com:8080的 socks5 代理发出。
# 如果没有指定代理协议,默认为 HTTP。
curl -x james:cats@myproxy.com:8080 https://www.example.com
# 上面命令中,请求的代理使用 HTTP 协议。

# -X参数指定 HTTP 请求的方法。
curl -X POST https://www.example.com
# 上面命令对https://www.example.com发出 POST 请求。

ex:

1
2
3
4
5
6
7
8
9
10
11
12
curl -k -x 'http://127.0.0.1:8888' 'https://www.jianshu.com/shakespeare/notes/31762521/user_notes' \
-H 'Connection: keep-alive' \
-H 'Accept: application/json' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' \
-H 'Sec-Fetch-Site: same-origin' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Referer: https://www.jianshu.com/p/9f9c5cba36e8' \
-H 'Accept-Language: zh-CN,zh;q=0.9' \
-H 'Cookie: __yadk_uid=Ein4n8jn6l5P6GObqMAXjgWVHPQddHrg; _ga=GA1.2.1043383107.1597137593; _gid=GA1.2.1914484739.1597137593; web_login_version=MTU5NzQ4MzUwMw%3D%3D--5dbb5619f4070e31714c813c4eccafb00f0ed003; remember_user_token=W1sxNTAzNjgyMl0sIiQyYSQxMSQzbHZDZTBQLnFZVWpvak00SzFydlNPIiwiMTU5ODQ1MzAxMS44MjQ3NjQiXQ%3D%3D--0d91c3663c7ac2048e7f7cbc941b9f66ca3f3a88; _m7e_session_core=7b490b8cfcf97f08559f60d68f9a0258; read_mode=day; default_font=font2; locale=zh-CN; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22173dcd19edbafb-00bf4f7297fa3c-4353760-1327104-173dcd19edc8bc%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E8%87%AA%E7%84%B6%E6%90%9C%E7%B4%A2%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22httpbin%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fwww.baidu.com%2Fs%22%2C%22%24latest_utm_source%22%3A%22recommendation%22%2C%22%24latest_utm_medium%22%3A%22seo_notes%22%2C%22%24latest_utm_campaign%22%3A%22maleskine%22%2C%22%24latest_utm_content%22%3A%22note%22%7D%2C%22%24device_id%22%3A%22173dcd19edbafb-00bf4f7297fa3c-4353760-1327104-173dcd19edc8bc%22%7D; _gat=1; Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1598408433,1598413603,1598453016,1598460218; Hm_lpvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1598460218' \
-H 'If-None-Match: W/"b97803d19320e20eed0659fcda4b0957"' \
--compressed

CURL状态码列表

状态码 状态原因 解释
0 正常访问
1 错误的协议 未支持的协议。此版cURL 不支持这一协议。
2 初始化代码失败 初始化失败。
3 URL格式不正确 URL 格式错误。语法不正确。
4 请求协议错误
5 无法解析代理 无法解析代理。无法解析给定代理主机。
6 无法解析主机地址 无法解析主机。无法解析给定的远程主机。
7 无法连接到主机 无法连接到主机。
8 远程服务器不可用 FTP 非正常的服务器应答。cURL 无法解析服务器发送的数据。
9 访问资源错误 FTP 访问被拒绝。服务器拒绝登入或无法获取您想要的特定资源或目录。最有可 能的是您试图进入一个在此服务器上不存在的目录。
11 FTP密码错误 FTP 非正常的PASS 回复。cURL 无法解析发送到PASS 请求的应答。
13 结果错误 FTP 非正常的的PASV 应答,cURL 无法解析发送到PASV 请求的应答。
14 FTP回应PASV命令 FTP 非正常的227格式。cURL 无法解析服务器发送的227行。
15 内部故障 FTP 无法连接到主机。无法解析在227行中获取的主机IP。
17 设置传输模式为二进制 FTP 无法设定为二进制传输。无法改变传输方式到二进制。
18 文件传输短或大于预期 部分文件。只有部分文件被传输。
19 RETR命令传输完成 FTP 不能下载/访问给定的文件, RETR (或类似)命令失败。
21 命令成功完成 FTP quote 错误。quote 命令从服务器返回错误。
22 返回正常 HTTP 找不到网页。找不到所请求的URL 或返回另一个HTTP 400或以上错误。 此返回代码只出现在使用了-f/–fail 选项以后。
23 数据写入失败 写入错误。cURL 无法向本地文件系统或类似目的写入数据。
25 无法启动上传 FTP 无法STOR 文件。服务器拒绝了用于FTP 上传的STOR 操作。
26 回调错误 读错误。各类读取问题。
27 内存分配请求失败 内存不足。内存分配请求失败。
28 访问超时 操作超时。到达指定的超时期限条件。
30 FTP端口错误 FTP PORT 失败。PORT 命令失败。并非所有的FTP 服务器支持PORT 命令,请 尝试使用被动(PASV)传输代替!
31 FTP错误 FTP 无法使用REST 命令。REST 命令失败。此命令用来恢复的FTP 传输。
33 不支持请求 HTTP range 错误。range “命令”不起作用。
34 内部发生错误 HTTP POST 错误。内部POST 请求产生错误。
35 SSL/TLS握手失败 SSL 连接错误。SSL 握手失败。
36 下载无法恢复 FTP 续传损坏。不能继续早些时候被中止的下载。
37 文件权限错误 文件无法读取。无法打开文件。权限问题?
38 LDAP可没有约束力 LDAP 无法绑定。LDAP 绑定(bind)操作失败。
39 LDAP搜索失败 LDAP 搜索失败。
41 函数没有找到 功能无法找到。无法找到必要的LDAP 功能。
42 中止的回调 由回调终止。应用程序告知cURL 终止运作。
43 内部错误 内部错误。由一个不正确参数调用了功能。
45 接口错误 接口错误。指定的外发接口无法使用。
47 过多的重定向 过多的重定向。cURL 达到了跟随重定向设定的最大限额跟
48 无法识别选项 指定了未知TELNET 选项。
49 TELNET格式错误 不合式的telnet 选项。
51 远程服务器的SSL证书 peer 的SSL 证书或SSH 的MD5指纹没有确定。
52 服务器无返回内容 服务器无任何应答,该情况在此处被认为是一个错误。
53 加密引擎未找到 找不到SSL 加密引擎。
54 设定默认SSL加密失败 无法将SSL 加密引擎设置为默认。
55 无法发送网络数据 发送网络数据失败。
56 衰竭接收网络数据 在接收网络数据时失败。
57
58 本地客户端证书 本地证书有问题。
59 无法使用密码 无法使用指定的SSL 密码。
60 凭证无法验证 peer 证书无法被已知的CA 证书验证。
61 无法识别的传输编码 无法辨识的传输编码。
62 无效的LDAP URL 无效的LDAP URL。
63 文件超过最大大小 超过最大文件尺寸。
64 FTP失败 要求的FTP 的SSL 水平失败。
65 倒带操作失败 发送此数据需要的回卷(rewind)失败。
66 SSL引擎失败 初始化SSL 引擎失败。
67 服务器拒绝登录 用户名、密码或类似的信息未被接受,cURL 登录失败。
68 未找到文件 在TFTP 服务器上找不到文件。
69 无权限 TFTP 服务器权限有问题。
70 超出服务器磁盘空间 TFTP 服务器磁盘空间不足。
71 非法TFTP操作 非法的TFTP 操作。
72 未知TFTP传输的ID 未知TFTP 传输编号(ID)。
73 文件已经存在 文件已存在(TFTP) 。
74 错误TFTP服务器 无此用户(TFTP) 。
75 字符转换失败 字符转换失败。
76 必须记录回调 需要字符转换功能。
77 CA证书权限 读SSL 证书出现问题(路径?访问权限? ) 。
78 URL中引用资源不存在 URL 中引用的资源不存在。
79 错误发生在SSH会话 SSH 会话期间发生一个未知错误。
80 无法关闭SSL连接 未能关闭SSL 连接。
81 服务未准备
82 无法载入CRL文件 无法加载CRL 文件,丢失或格式不正确(在7.19.0版中增加) 。
83 发行人检查失败 签发检查失败(在7.19.0版中增加) 。

HTTPie

https://github.com/httpie/httpie

1
pip install httpie

HTTPie基于python编写,内部使用了Requests和Pygments库

HTTPie比cURL直观,默认输入和输出都是json格式 (而cURL必须要指定-H "Content-Type: application/json")

1
2
http POST http://host:port/v3/auth/tokens @auth.json
http GET http://host:port/v2/xx/servers X-Auth-Token:xxx
阅读全文
Linux创建swap

Linux创建swap

查看内存的情况(此时swap行为0)

1
free -m

初始时Swap 相关数据都是0。

创建swap文件(本文创建了2G),并使之生效

a.创建用于交换分区的文件:

1
2
dd if=/dev/zero of=/swapfile bs=1M count=2048
# 注:block_size、number_of_block 大小可以自定义,比如 bs=1M count=1024 代表设置 1G 大小 SWAP 分区。

b.设置交换分区文件:

1
mkswap /swapfile

c.立即启用交换分区文件:

1
2
3
4
swapon /swapfile
# 这个命令可能会提示“swapon: /swapfile: insecure permissions 0644, 0600 suggested.”,意思是建议把swap设置成644或600权限。
# 这时运行free -m会发现swap一列已经有数字了,就是上面第一次执行free -m 后的结果。
# 注:如果在 /etc/rc.local 中有 swapoff -a 需要修改为 swapon -a

在 /etc/fstab 中添加如下一行,使之永久生效(自动挂载)

1
/swapfile swap swap defaults 0 0

修改 swpapiness 参数

在 Linux 系统中,可以通过查看 /proc/sys/vm/swappiness 内容的值来确定系统对 SWAP 分区的使用原则。当 swappiness 内容的值为 0 时,表示最大限度地使用物理内存,物理内存使用完毕后,才会使用 SWAP 分区。当 swappiness 内容的值为 100 时,表示积极地使用 SWAP 分区,并且把内存中的数据及时地置换到 SWAP 分区。
查看修改前为 0,需要在物理内存使用完毕后才会使用 SWAP 分区。
可以使用下述方法临时修改此参数,假设我们配置为空闲内存少于 10% 时才使用 SWAP 分区:

1
echo 10 >/proc/sys/vm/swappiness

若需要永久修改此配置,在系统重启之后也生效的话,可以修改 /etc/sysctl.conf 文件,并增加以下内容:

1
vm.swappiness=10

关闭 SWAP

当系统出现内存不足时,开启 SWAP 可能会因频繁换页操作,导致 IO 性能下降。如果要关闭 SWAP,可以采用如下方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1、查询 SWAP 分区设置:
free -m
# 2、使用命令swapoff 关闭 SWAP,比如:
swapoff /mnt/swap
# 3、修改 /etc/fstab 文件,删除或注释相关配置,取消 SWAP 的自动挂载:
vim /etc/fstab
#/swapfile swap swap defaults 0 0
# 4、 通过 free -m 确认 SWAP 已经关闭。
free -m
# 5、 swappiness 参数调整:
# 可以使用下述方法临时修改此参数,这里配置为 0%:
echo 0 >/proc/sys/vm/swappiness
# 若需要永久修改此配置,在系统重启之后也生效的话,可以修改 /etc/sysctl.conf文件,并增加以下内容:
vm.swappiness=0
阅读全文
抓包&协议分析

工具:charles, firebug, wireshark, burpsuite

fiddler

https://www.telerik.com/download/fiddler

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
# 配置Fiddler Options (配置完后记得要重启Fiddler)
Capture HTTPS CONNECTS # 截获HTTPS
Allow remote computers to connect # 是允许别的机器把HTTP/HTTPS请求发送到Fiddler上来,移动端
# 过滤
Filters tab
# 各种解码与加解密
decode TextWizard
# 重发请求
composer
# 设置断点修改请求request
1. 用浏览器打开登录界面 
2. 打开Fiddler, 在命令行中输入bpu URL(rules-auto breakpoint-before breakpoint)https://xueqiu.com/snowman/login
3. 输入错误的用户名和密码点击登录
4. Fiddler 能中断这次会话,选择被中断的会话,点击Inspectors tab下的WebForms tab 修改用户名密码,然后点击Run to Completion 如下图所示。
5. 结果是正确地登录了
# 设置断点修改Response
第一种:
打开Fiddler 点击Rules-> Automatic Breakpoint  ->After Response  (这种方法会中断所有的会话)
消除:点击Rules-> Automatic Breakpoint  ->Disabled
第二种:
在命令行中输入命令:  bpafter www.xueqiu.com   (这种方法只会中断www.xueqiu.com)
消除:在命令行中输入命令 bpafter,
# AutoResponder tab(修改会话拖到AutoResponder tab下)
1. 打开首页,把的图片保存到本地,并且对图片做些修改。
2. 打开Fiddler 找到一个图片的会话拖到AutoResponer Tab下
3. 选择Enable automatic reaponses 和Unmatched requests passthrough
4. 在下面的Rule Editor 下面选择 Find a file... 选择本地保存的图片.  最后点击Save 保存下。
5. 再首页清除缓存, 你会看到首页的图片用的是本地的
# 弱网
Rules → Performances → Simulate Modem Speeds
# 证书
浏览器打开代理地址 FiddlerRoot certificate

操作可参考:https://mp.weixin.qq.com/s?__biz=MzA5NzgzODI5NA==&mid=2454040445&idx=1&sn=d89068f8364fb20a42aed499255138cb&chksm=872bbac4b05c33d226c4c76fd9e803c44c507e77cf4e60816ae40178f172fd5de0a96d73445c&mpshare=1&scene=1&srcid=&sharer_sharetime=1582602447184&sharer_shareid=9f552d705e74f07c1d8c9ac2eea73bc9&key=0a2ec05589e15d483f615813291876556a0940749b209e06b13f3ba0ecf1cd6b1497d7399626902e039223df48ac2ca1bcb4460155711cd07890482f71ba7b512907ffc5219d5ab081010d771814dd9c&ascene=1&uin=Mjg1MzY3NzIyMA%3D%3D&devicetype=Windows+10&version=62080079&lang=zh_CN&exportkey=ATpRN0jDHMGmvtTm0OANNLk%3D&pass_ticket=ZBoOawavfdCpscbTzY2mOurA9YuvdXXtCl52c5%2BABJ2uG1VA3pHleAw7QL9XVJsz

Charles

特性 :

代理,限速,重写请求和响应,⿊⽩名单,组建请求,重复请求

下载安装

下载:https://www.charlesproxy.com/download/

补丁:https://www.zzzmode.com/mytools/charles/

默认替换路径:

macOS:/Applications/Charles.app/Contents/Java/charles.jar
Windows: C:\Program Files\Charles\lib\charles.jar

抓取Http请求包:https://blog.csdn.net/abc6368765/article/details/81101976

抓取Https请求包:https://blog.csdn.net/abc6368765/article/details/81103002

question

1
2
3
1.Charles 打不开 HTTPS ,显示您的连接不是私密连接
将Charles的SSL Certificates添加到受信任根证书列表中,需要将证书添加到受信任根证书列表中
重启电脑
⽹络模型与常见协议

image-20200917000053060

http

target
url: protocol host port
request
request method:
get post put head
resource path
protocol version
header: host cookie user-agent
get query
post body:json xml form

get&post

http的method字段
post可以附加body
通⽤server nginx apache默认不记录post body数据

server -> set-cookie -> cookie -> request with cookie
server ->token -> set-cookie token / query -> request

1
2
3
4
5
6
7
8
9
10
# ⽹络嗅探
TcpDump + WireShark
# Proxy
fiddler 、AnyProxy 、mitmproxy、charles、burpsuite
# 分析⼯具与协议客户端⼯具:
curl 最常使⽤的http请求⼯具
postman 调试⼯具
Chrome DevTool
nc 接近于编程⽅式
burpsuite http操纵的⿊客级别⼯具
1
2
3
4
5
6
7
8
# ⽹络嗅探
TcpDump + WireShark
# Proxy
fiddler 、AnyProxy 、mitmproxy、charles、burpsuite
# 分析⼯具与协议客户端⼯具:
curl
postman
Chrome DevTool

tcpdump

1
tcpdump port 443 -v -w tcp.lg

移动端代理抓包

开启代理端口
设置⼿机代理:Android 6.0以上需要修改包属性https://developer.android.com/training/articles/securityconfig.html
安装证书
(从Android Nougat(7.0)开始,应⽤程序默认不会信任⽤户证书,开发⼈员可以通过配置应⽤程序AndroidManifest.xml⽂件的networkSecurityConfig属性来选择接受⽤户证书)

数据拦截修改

修改请求,修改响应,断点,重写

⾃定义代理解析特殊协议

流量转发
协议解包
协议封包
原理是tcp proxy或者http proxy
参考⼯具 em-proxy nc

阅读全文
redis搭建

单机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 解压
tar zxf redis-5.0.8.tar.gz
# 编译
cd redis-5.0.8
make
# 安装编译后的redis代码到指定目录,一般存放于/usr/local下的redis目录,指令如下
make install PREFIX=/usr/local/redis
# 启动
./redis-server --port 6380&
#
./redis-server redis.conf
# redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf,注释掉bind 127.0.0.1可以使所有的ip访问redis
# 连接
./redis-cli -h 192.168.25.153 -p 6379

集群

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
# 集群
# 修改redis的配置文件:修改端口号,打开cluster-enable前面的注释,修改cluster-config-file nodes.conf文件名
./src/redis-server ../redis6.conf &
./src/

# 创建6个redis实例(6个节点)并启动:

# 在usr/local目录下新建redis-cluster目录,用于存放集群节点
# 把redis目录下的bin目录下的所有文件复制到/usr/local/redis-cluster/redis01目录下
cp -r redis/bin/ redis-cluster/redis01
# 删除redis01目录下的快照文件dump.rdb,并且修改该目录下的redis.cnf文件,修改端口号,打开cluster-enable前面的注释
# 将redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建6个redis实例,模拟Redis集群的6个节点。然后将其余5个文件下的redis.conf里面的端口号分别修改
# 启动所有redis节点

# 要搭建集群的话,需要使用一个工具(脚本文件),这个工具在redis解压文件的源代码里。因为这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境
yum install ruby
# 然后需要把ruby相关的包安装到服务器:redis的版本和ruby包的版本最好保持一致
gem install redis-XXX.gem
# ruby脚本工具在redis解压文件的源代码里,即redis/src目录下的redis-trib.rb文件,复制到usr/local/redis-cluster目录下。
# 搭建集群
./redis-trib.rb create --replicas 1 10.10.100.56:16449 10.10.100.56:16459 10.10.100.56:16469 10.10.100.56:16479 10.10.100.56:16489 10.10.100.56:16499
# 连接集群节点,连接任意一个即可,存储的数据(key-value)是均匀分配到不同的节点的:
redis01/redis-cli -p 端口号 -c

# 查看当前集群信息
cluster info
# 查看集群里有多少个节点
cluster nodes
阅读全文
Java启动参数设置
jvm | java

Java启动参数设置

Java启动参数共分为三类;
其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;

内存参数

1
2
3
4
5
6
7
8
9
# Java 默认/缺省 内存大小,如果没有 -Xms -Xmx
# 输出默认值命令
java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=16336768 -XX:MaxHeapSize=522776576 -XX:+PrintCommandLineFlags
# -Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize)
# -Xms和-Xmx可以说是最流行的JVM参数,它们可以允许我们指定JVM的初始和最大堆内存大小。一般来说,这两个参数的数值单位是Byte,但同时它们也支持使用速记符号,比如“k”或者“K”代表“kilo”,“m”或者“M”代表“mega”,“g”或者“G”代表“giga”。举个例子,下面的命令启动了一个初始化堆内存为128M,最大堆内存为2G,名叫“MyApp”的Java应用程序。
java -Xms128m -Xmx2g MyApp
# example
java -Xms32m -Xmx96m -jar ${JARNAME}*RELEASE.jar --spring.profiles.active=test&

jar包启动

1
java -jar ai-registration-20170101.1.0.0.jar --server.port=9999 --spring.profiles.active=uat

输出日志不挂断地运行

1
nohup java -jar /home/mobiletest/workspace/iboss-ei-boss.jar --spring.profiles.active=uat>ei.log&
阅读全文
gitlab安装

yum安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 配置yum源
vi /etc/yum.repos.d/tsinghua.repo

[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1

# 缓存相关包
yum makecache

# 安装相关依赖
yum install curl policycoreutils-python openssh-server

# 安装gitlab-ce
yum install gitlab-ce

# 配置
# 修改gitlab配置文件指定服务器ip和自定义端口:
vim /etc/gitlab/gitlab.rb
external_url='http://122.51.139.130'
unicorn['port'] = 8888

启动

1
2
3
4
5
6
7
8
9
10
11
12
13
# 重置并启动GitLab
gitlab-ctl reconfigure
# 修改clone host地址
vi /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
122.51.139.130
cat /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
gitlab-ctl restart

# 测试sshkey
ssh -vT git@ip

# 用yum安装完gitLab,设置ssh key,在进行项目的clone
git clone git@xxx/xxx.git #提示需要输入密码,这个密码并不是gitlab账户的密码,而是服务器git用户的密码。

question

1
2
3
4
5
6
7
最终决定登陆到gitlab服务器发现git用户为锁定状态,由于git账户是在安装gitlab时自动创建的,初始密码没有设置,用户锁定导致ssh连接不可用

解决:
1.首先切换到root用户: sudo su root
2.输入有root权限的当前账户的密码(如果你已经在root账户下 1 2两步忽略)
3.给git用户设置密码:passwd git 
4.按提示输入两遍新密码即可

docker部署

镜像拉取与启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker pull gitlab/gitlab-ce
#-i 以交互模式运行容器,通常与 -t 同时使用命令解释:
#-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
#-d 后台运行容器,并返回容器ID
#-p 9980:80 将容器内80端口映射至宿主机9980端口,这是访问gitlab的端口
#-p 9922:22 将容器内22端口映射至宿主机9922端口,这是访问ssh的端口
#-v /home/bq/docker/gitlab/etc:/etc/gitlab 将容器/etc/gitlab目录挂载到宿主机/home/bq/docker/gitlab/etc目录下,若宿主机内此目录不存在将会自动创建,其他两个挂载同这个一样
#--restart always 容器自启动
#--privileged=true 让容器获取宿主机root权限
#--name gitlab 设置容器名称为gitlab
#gitlab/gitlab-ce 镜像的名称,这里也可以写镜像ID
docker run \
-itd \
-p 9980:80 \
-p 9922:22 \
-v /home/bq/docker/gitlab/etc:/etc/gitlab \
-v /home/bq/docker/gitlab/log:/var/log/gitlab \
-v /home/bq/docker/gitlab/opt:/var/opt/gitlab \
--name gitlab \
gitlab/gitlab-ce

配置

1
2
3
4
5
6
7
8
9
10
#进入容器
docker exec -it gitlab /bin/bash
# 修改配置
vi /etc/gitlab/gitlab.rb
# 配置生效
gitlab-ctl reconfigure
# 重启gitlab
gitlab-ctl restart
# 退出容器
exit

关闭用户注册

1、使用root用户登录gitlab
2、点击【Admin Area】
3、点击【Settings】
4、点击Sign-in restrictions这一栏的【Expand】
5、取消勾选【Sign-up enabled】
6、保存修改

优化精简git仓库

清除垃圾文件(大量无用的mp3文件)

1
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.mp3' --prune-empty --tag-name-filter cat -- --all

提交到远程仓库(如GitHub, 我再次从git clone GitHub代码库会变小为1.3M)

1
git push origin --force --all

必须回收垃圾,本地仓库才变小

1
2
3
4
5
6
7
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin   
git reflog expire --expire=now --all
git gc --prune=now
rm -rf .git/refs/original
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#1.统计仓库精简前容量信息,造成最大的文件pack记录
#查看仓库容量信息:
du -h --max-depth=1
#找出最大的3个文件的pack记录:
git verify-pack -v .git/objects/pack/pack-*.idx |sort -k 3 n | tail -3
#2.通过blob id查询大文件的文件名
git rev-list --objects --all | grep blobid
#3.查看该文件的所有提交记录
git log --branches -- zz/xx.zip 或
git log --pretty=oneline --branches -- zz/xx.zip
#4.将该文件从历史记录的所有tree中移除,并用filter-branch命令重写所有commit才能将该文件从git历史中完全移除
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch zz/xx.zip' --prune-empty --tag-name-filter cat -- --all
#5.依次执行以下命令,清理和回收空间
rm -rf .git/refs/original/
rm -rf .git/logs/
git gc
gir prune
git push origin --force --all

配置ssh key

打开本地git bash,使用如下命令生成ssh公钥和私钥对

1
`ssh-keygen -t rsa -C 'xxx@xxx.com'` # 然后一路回车(-C 参数是你的邮箱地址)
1
2
3
打开~/.ssh/id_rsa.pub文件(~表示用户目录),复制其中的内容
打开gitlab,找到Profile Settings-->SSH Keys--->Add SSH Key,并把上一步中复制的内容粘贴到Key所对应的文本框,在Title对应的文本框中给这个sshkey设置一个名字,点击Add key按钮
到此就完成了gitlab配置ssh key的所有步骤,可以使用ssh协议不需要输入密码进行代码的拉取以及提交等操作了

本地配置多个ssh key

大多数时候,我们的机器上会有很多的git host,比如公司gitlab、github、oschina等,那我们就需要在本地配置多个ssh key,使得不同的host能使用不同的ssh key ,做法如下(以公司gitlab和github为例):

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
# 为公司生成一对秘钥ssh key
ssh-keygen -t rsa -C 'yourEmail@xx.com' -f ~/.ssh/gitlab-rsa
# 为github生成一对秘钥ssh key
ssh-keygen -t rsa -C 'yourEmail2@xx.com' -f ~/.ssh/github-rsa
# 在~/.ssh目录下新建名称为config的文件(无后缀名)。用于配置多个不同的host使用不同的ssh key,内容如下:
# gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitlab_id-rsa
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id-rsa

# 配置文件参数
# Host : Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件
# HostName : 要登录主机的主机名
# User : 登录名
# IdentityFile : 指明上面User对应的identityFile路径

# 按照上面的步骤分别往gitlab和github上添加生成的公钥gitlab_id-rsa.pub和github_id-rsa.pub
# OK,大功告成,再次执行git命令验证是不是已经不需要再次验证权限了。
# 再次查看~/..ssh目录下的文件,会有gitlab_id-rsa、gitlab_id-rsa.pub和github_id-rsa、github_id-rsa.pub四个文件
阅读全文
git基本操作

常用

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# 本地操作
# 查看当前配置:
git config -l
# 以当前目录为基础创建本地仓库:
git init
# 添加暂存区:.所有修改新增文件 -u所有修改删除 -A所有
git add xxx文件
# 查看暂存区倌息:
git status
# 暂存区提交历史区:
git commit -m‘说明’
# 一并提交暂存区历史区(只适合已提交过文件):
git commit -a -m‘说明’
# 查看分支:
git branch
.gitignore文件,提交忽略项如.idea和node_modules等
# 历史记录:
git log /reflog
# 把暂存区所有内容撤回工作区所有记录,少用:
git rm -cached . r
# 暂存区撤回工作区,覆盖工作区不可恢复:
git checkout .
# 暂存区回滚到上一次:
git reset HEAD .
# 工作区VS暂存区:
git diff
# 工作区VS历史区:
git diff master
# 暂存区VS历史区:
git diff -cached
# 回滚历史版本暂存区工作区都被替代:
git reset --hard 版本号
history》history.txt

# 关联远程仓库:
git remote add 名字(oringin) 远程仓库地址
# 移除:
git remote rm
# 查看:
git remote -v

# 初始化:
git clone 仓库地址

# 历史区同步
# 推送到远程仓库:
git push oringin master
# 从远程仓库拉取:
git pull oringin master

# 单独分支管理:
# 操作分支
# 查看分支
git branch
# 创建分支
git branch xxx
# 切换分支
git checkout xxx
# 创建分支并切换
git checkout -b xxx
# 删除分支
git branch -D xxx
# 合并分支
git merge xxx
# 查看分支提交和合并内容
git log --graph / --oneline
# 获取当前分支名
git symbolic-ref --short -q HEAD
# 基于历史commit创建分支
git checkout -b branchname 92483401abdc41bc64bbdde1a63ed7bbee403e19
# 本地分支push到远程服务器,远程分支与本地分支同名(当然可以随意起名)
git push origin branchname:branchname
# 删除远程分支
git push origin --delete branchname
# 推送一个空分支到远程分支,其实就相当于删除远程分支
git push origin :branchname

# 从仓库同步
git pull
# 历史坂本:
git reset版本号
git checkout文件名

# 强制覆盖本地
git fetch --all
git reset --hard origin/master
git pull
# 设置关联远程
git config remote.origin.url git@github.com:your_username/your_project.git

# https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速
# 设置记住密码(默认15分钟):
git config --global credential.helper cache
# 自定义设置时间:(设置一个小时之后失效)
git config credential.helper 'cache --timeout=3600'

# 长期存储密码
git config --global credential.helper store

# 增加远程地址的时候带上密码也是可以的。(推荐)
# 使用客户端也可以存储密码。

# 切换ssh->https
# 切换到项目目录下 :
cd projectfile/
# 移除远程ssh方式的仓库地址
git remote rm origin
# 增加https远程仓库地址
git remote add origin http://yourname:password@git.oschina.net/name/project.git

# git config 查看配置信息
#config 配置有system级别 global(用户级别) 和local(当前仓库)三个 设置先从system-》global-》local  底层配置会覆盖顶层配置 分别使用--system/global/local 可以定位到配置文件
#查看系统config
git config --system --list
#查看当前用户(global)配置
git config --global  --list
#查看当前仓库配置信息
#git config -- local    --list

git branch #查看本地所有分支
git status #查看当前状态
git commit #提交
git branch -a #查看所有的分支
git branch -r #查看远程所有分支
git commit -am "init" #提交并且加注释
git remote add origin git@192.168.1.119:ndshow
git push origin master 将文件给推到服务器上
git remote show origin 显示远程库origin里的资源
git push origin master:develop
git push origin master:hb-dev #将本地库与服务器上的库进行关联
git checkout --track origin/dev #切换到远程dev分支
git branch -D master develop #删除本地库develop
git checkout -b dev #建立一个新的本地分支dev
git merge origin/dev #将分支dev与当前分支进行合并
git checkout dev #切换到本地dev分支
git remote show #查看远程库
git add .
git rm 文件名(包括路径) #从git中删除指定文件
git clone git://github.com/schacon/grit.git #从服务器上将代码给拉下来
git config --list #看所有用户
git ls-files #看已经被提交的
git rm [file name] #删除一个文件
git commit -a #提交当前repos的所有的改变
git add [file name] #添加一个文件到git index
git commit -v #当你用-v参数的时候可以看commit的差异
git commit -m "This is the message describing the commit" #添加commit信息
git commit -a -a #是代表add,把所有的change加到git index里然后再commit
git commit -a -v #一般提交命令
git log #看你commit的日志
git diff #查看尚未暂存的更新
git rm a.a #移除文件(从暂存区和工作区中删除)
git rm --cached a.a #移除文件(只从暂存区中删除)
git commit -m "remove" #移除文件(从Git中删除)
git rm -f a.a #强行移除修改后文件(从暂存区和工作区中删除)
git diff --cached 或 $ git diff --staged #查看尚未提交的更新
git stash push #将文件给push到一个临时空间中
git stash pop #将文件从临时空间pop下来
\---------------------------------------------------------
git remote add origin git@github.com:username/Hello-World.git
git push origin master #将本地项目给提交到服务器中
\-----------------------------------------------------------
git pull #本地与服务器端同步
\-----------------------------------------------------------------
git push (远程仓库名) (分支名) #将本地分支推送到服务器上去。
git push origin serverfix:awesomebranch
\------------------------------------------------------------------
git fetch #相当于是从远程获取最新版本到本地,不会自动merge
git commit -a -m "log_message" #(-a是提交所有改动,-m是加入log信息) 本地修改同步至服务器端 :
git branch branch_0.1 master #从主分支master创建branch_0.1分支
git branch -m branch_0.1 branch_1.0 #将branch_0.1重命名为branch_1.0
git checkout branch_1.0/master #切换到branch_1.0/master分支
git branch
git push origin :branch_remote_name
git branch -r -d branch_remote_name #删除远程branch
\-----------------------------------------------------------
#初始化版本库,并提交到远程服务器端
mkdir WebApp
cd WebApp
git init #本地初始化
touch README
git add README #添加文件
git commit -m 'first commit'
git remote add origin git@github.com:username/Hello-World.git #增加一个远程服务器端
#上面的命令会增加URL地址为'git@github.com:username/Hello-World.git',名称为origin的远程服务器库,以后提交代码的时候只需要使用 origin别名即可

命令速查表

1、常用的Git命令

命令 简要说明
git add 添加至暂存区
git add–interactive 交互式添加
git apply 应用补丁
git am 应用邮件格式补丁
git annotate 同义词,等同于 git blame
git archive 文件归档打包
git bisect 二分查找
git blame 文件逐行追溯
git branch 分支管理
git cat-file 版本库对象研究工具
git checkout 检出到工作区、切换或创建分支
git cherry-pick 提交拣选
git citool 图形化提交,相当于 git gui 命令
git clean 清除工作区未跟踪文件
git clone 克隆版本库
git commit 提交
git config 查询和修改配置
git describe 通过里程碑直观地显示提交ID
git diff 差异比较
git difftool 调用图形化差异比较工具
git fetch 获取远程版本库的提交
git format-patch 创建邮件格式的补丁文件。参见 git am 命令
git grep 文件内容搜索定位工具
git gui 基于Tcl/Tk的图形化工具,侧重提交等操作
git help 帮助
git init 版本库初始化
git init-db* 同义词,等同于 git init
git log 显示提交日志
git merge 分支合并
git mergetool 图形化冲突解决
git mv 重命名
git pull 拉回远程版本库的提交
git push 推送至远程版本库
git rebase 分支变基
git rebase–interactive 交互式分支变基
git reflog 分支等引用变更记录管理
git remote 远程版本库管理
git repo-config* 同义词,等同于 git config
git reset 重置改变分支“游标”指向
git rev-parse 将各种引用表示法转换为哈希值等
git revert 反转提交
git rm 删除文件
git show 显示各种类型的对象
git stage* 同义词,等同于 git add
git stash 保存和恢复进度
git status 显示工作区文件状态
git tag 里程碑管理

2、对象库操作相关命令

命令 简要说明
git commit-tree 从树对象创建提交
git hash-object 从标准输入或文件计算哈希值或创建对象
git ls-files 显示工作区和暂存区文件
git ls-tree 显示树对象包含的文件
git mktag 读取标准输入创建一个里程碑对象
git mktree 读取标准输入创建一个树对象
git read-tree 读取树对象到暂存区
git update-index 工作区内容注册到暂存区及暂存区管理
git unpack-file 创建临时文件包含指定 blob 的内容
git write-tree 从暂存区创建一个树对象

3、引用操作相关命令

命令 简要说明
git check-ref-format 检查引用名称是否符合规范
git for-each-ref 引用迭代器,用于shell编程
git ls-remote 显示远程版本库的引用
git name-rev 将提交ID显示为友好名称
git peek-remote* 过时命令,请使用 git ls-remote
git rev-list 显示版本范围
git show-branch 显示分支列表及拓扑关系
git show-ref 显示本地引用
git symbolic-ref 显示或者设置符号引用
git update-ref 更新引用的指向
git verify-tag 校验 GPG 签名的Tag

4、版本库管理相关命令

命令 简要说明
git count-objects 显示松散对象的数量和磁盘占用
git filter-branch 版本库重构
git fsck 对象库完整性检查
git fsck-objects* 同义词,等同于 git fsck
git gc 版本库存储优化
git index-pack 从打包文件创建对应的索引文件
git lost-found* 过时,请使用 git fsck –lost-found 命令
git pack-objects 从标准输入读入对象ID,打包到文件
git pack-redundant 查找多余的 pack 文件
git pack-refs 将引用打包到 .git/packed-refs 文件中
git prune 从对象库删除过期对象
git prune-packed 将已经打包的松散对象删除
git relink 为本地版本库中相同的对象建立硬连接
git repack 将版本库未打包的松散对象打包
git show-index 读取包的索引文件,显示打包文件中的内容
git unpack-objects 从打包文件释放文件
git verify-pack 校验对象库打包文件

5、数据传输相关命令

命令 简要说明
git fetch-pack 执行 git fetch 或 git pull 命令时在本地执行此命令,用于从其他版本库获取缺失的对象
git receive-pack 执行 git push 命令时在远程执行的命令,用于接受推送的数据
git send-pack 执行 git push 命令时在本地执行的命令,用于向其他版本库推送数据
git upload-archive 执行 git archive –remote 命令基于远程版本库创建归档时,远程版本库执行此命令传送归档
git upload-pack 执行 git fetch 或 git pull 命令时在远程执行此命令,将对象打包、上传

6、邮件相关命令

命令 简要说明
git imap-send 将补丁通过 IMAP 发送
git mailinfo 从邮件导出提交说明和补丁
git mailsplit 将 mbox 或 Maildir 格式邮箱中邮件逐一提取为文件
git request-pull 创建包含提交间差异和执行PULL操作地址的信息
git send-email 发送邮件

7、协议相关命令

命令 简要说明
git daemon 实现Git协议
git http-backend 实现HTTP协议的CGI程序,支持智能HTTP协议
git instaweb 即时启动浏览器通过 gitweb 浏览当前版本库
git shell 受限制的shell,提供仅执行Git命令的SSH访问
git update-server-info 更新哑协议需要的辅助文件
git http-fetch 通过HTTP协议获取版本库
git http-push 通过HTTP/DAV协议推送
git remote-ext 由Git命令调用,通过外部命令提供扩展协议支持
git remote-fd 由Git命令调用,使用文件描述符作为协议接口
git remote-ftp 由Git命令调用,提供对FTP协议的支持
git remote-ftps 由Git命令调用,提供对FTPS协议的支持
git remote-http 由Git命令调用,提供对HTTP协议的支持
git remote-https 由Git命令调用,提供对HTTPS协议的支持
git remote-testgit 协议扩展示例脚本

8、版本库转换和交互相关命令

命令 简要说明
git archimport 导入Arch版本库到Git
git bundle 提交打包和解包,以便在不同版本库间传递
git cvsexportcommit 将Git的一个提交作为一个CVS检出
git cvsimport 导入CVS版本库到Git。或者使用 cvs2git
git cvsserver Git的CVS协议模拟器,可供CVS命令访问Git版本库
git fast-export 将提交导出为 git-fast-import 格式
git fast-import 其他版本库迁移至Git的通用工具
git svn Git 作为前端操作 Subversion

9、合并相关的辅助命令

命令 简要说明
git merge-base 供其他脚本调用,找到两个或多个提交最近的共同祖先
git merge-file 针对文件的两个不同版本执行三向文件合并
git merge-index 对index中的冲突文件调用指定的冲突解决工具
git merge-octopus 合并两个以上分支。参见 git merge 的octopus合并策略
git merge-one-file 由 git merge-index 调用的标准辅助程序
git merge-ours 合并使用本地版本,抛弃他人版本。参见 git merge 的ours合并策略
git merge-recursive 针对两个分支的三向合并。参见 git merge 的recursive合并策略
git merge-resolve 针对两个分支的三向合并。参见 git merge 的resolve合并策略
git merge-subtree 子树合并。参见 git merge 的 subtree 合并策略
git merge-tree 显式三向合并结果,不改变暂存区
git fmt-merge-msg 供执行合并操作的脚本调用,用于创建一个合并提交说明
git rerere 重用所记录的冲突解决方案

10、 杂项

命令 简要说明
git bisect–helper 由 git bisect 命令调用,确认二分查找进度
git check-attr 显示某个文件是否设置了某个属性
git checkout-index 从暂存区拷贝文件至工作区
git cherry 查找没有合并到上游的提交
git diff-files 比较暂存区和工作区,相当于 git diff –raw
git diff-index 比较暂存区和版本库,相当于 git diff –cached –raw
git diff-tree 比较两个树对象,相当于 git diff –raw A B
git difftool–helper 由 git difftool 命令调用,默认要使用的差异比较工具
git get-tar-commit-id 从 git archive 创建的 tar 包中提取提交ID
git gui–askpass 命令 git gui 的获取用户口令输入界面
git notes 提交评论管理
git patch-id 补丁过滤行号和空白字符后生成补丁唯一ID
git quiltimport 将Quilt补丁列表应用到当前分支
git replace 提交替换
git shortlog 对 git log 的汇总输出,适合于产品发布说明
git stripspace 删除空行,供其他脚本调用
git submodule 子模组管理
git tar-tree 过时命令,请使用 git archive
git var 显示 Git 环境变量
git web–browse 启动浏览器以查看目录或文件
git whatchanged 显示提交历史及每次提交的改动
git-mergetool–lib 包含于其他脚本中,提供合并/差异比较工具的选择和执行
git-parse-remote 包含于其他脚本中,提供操作远程版本库的函数
git-sh-setup 包含于其他脚本中,提供 shell 编程的函数库

设置代理访问git

Git允许使用三种协议来连接远程仓库:ssh、http、git。所以,如果你要设置代理,必须首先明确本地git使用何种协议连接远程仓库,然后根据不同协议设置代理。
前提:socks5代理服务器,默认端口1080

设置SSH协议的代理

如果远程仓库拥有如下的格式:

1
2
git@github.com:guobq/guobq.github.io.git
ssh://git@github.com:guobq/guobq.github.io.git

说明是使用SSH协议连接的远程仓库。git依赖ssh去连接,需要配置ssh的socks5代理实现git的代理。在ssh的配置文件~/.ssh/config(没有则新建)使用ProxyCommand配置:

1
2
3
4
5
6
#Linux
Host bitbucket.org
User git
Port 22
Hostname bitbucket.org
ProxyCommand nc -x 127.0.0.1:1080 %h %p
1
2
3
4
5
6
#windows
Host bitbucket.org
User git
Port 22
Hostname bitbucket.org
ProxyCommand connect -S 127.0.0.1:1080 %h %p

如果使用github,只需要把bitbucket.org换成github.com。
具体配置的含义请参考:http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man5/ssh_config.5?query=ssh_config&sec=5&arch=amd64。

设置http/https协议代理

如果远程仓库链接拥有如下格式:

1
2
http://github.com/guobq/guobq.github.io.git
https://github.com/guobq/guobq.github.io.git

说明使用的是http/https协议,可以使用git配套的CMSSW支持的代理协议:SOCKS4、SOCKS5和HTTPS/HTTPS。可通过配置http.proxy实现:

1
2
3
4
#全局设置
git config --global http.proxy socks5://localhost:1080
#本次设置
git clone https://github.com/guobq/guobq.github.io.git --config "http.proxy=127.0.0.1:1080"

这里演示的是socks5的配置,需要其他配置的可参考git-config配置中的http.proxy。

设置Git协议的代理

Git协议是Git提供的一个守护进程,它监听专门的端口(9418),然后提供类似于ssh协议一样的服务,只是它不需要验证。所以,然后用户通过网络都可以使用git协议连接提供git连接的仓库。
如果远程仓库的链接是如下形式:

1
git://github.com/archerie/learngit.git

该仓库使用git协议连接。需要使用CMSSW提供的简单脚本去通过socks5代理访问:git-proxy。配置如下:

1
2
git config --global core.gitproxy "git-proxy"
git config --global socks.proxy "localhost:1080"

questions

Git Pull Failed:You have not concluded your merge.Exiting because of unfinished merge

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#在拉取远程代码时,出现这样的情况,Git Pull Failed:You have not concluded your merge.Exiting because of unfinished merge。出现这种情况的原因如系统提示,可能在pull代码之前merge合并失败。
#在解决这个问题之前,先看看需要了解的知识。
git fetch
#用于从另一个存储库下载对象和引用。远程跟踪已更新分支(git术语叫commit),需要将这些更新取回本地,这时就要用到git fetch命令。
#语法:git fetch <远程主机名>。例如:git fetch orgin master,表示取回origin主机的master分支。更新所有分支,命令可以简写为git fetch。
git pull
#用于取回远程主机某个分支的更新,再与本地的指定分支合并。这时你可能已经真正明白为什么会出现拉取失败的原因了,原因就在于拉取之后的代码合并失败造成的。
#语法:git pull <远程主机名><远程分支名>:<本地分支名>。例如:git pull origin next:master,表示取回origin主机的next分支,与本地的master分支合并。如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。
git reset
#语法:git reset [- -hard|soft|mixed|merge|keep][或HEAD],将当前的分支重新设置到指定的commit id或者HEAD,其中HEAD是默认路径。其中hard、soft、mixed、merge、keep是设置的模式。通常使用- -hard,表示自commit id以来,工作目录中的任何改变都被丢弃,并把HEAD指向commit id。

#解决方法
#方法一:舍弃本地代码,远程版本覆盖本地版本
#使用这种方法之前,可以先将本地修改的代码备份一下,避免重敲代码。具体命令如下:
git fetch --all
git reset --hard origin/master
git pull

#方法二:保留本地代码,中止合并–>重新合并–>重新拉取
git merge --abort
git reset --merge
git pull
#这种做法需要处理代码冲突,因此以上两种做法,根据你的需要,选择合适的解决办法。
阅读全文
需求管理成熟度

需求管理成熟度

级别一:被记录的需求(Written Requirements)

简单的写出需求。好处:

与客户有一个基本的约定。如果写的好,需求能够清晰地描述你对客户需要的理解,他们可以通过阅读需求来检查是否与他们想的一致

开发团队的每个成员通过需求可以很好的支持他们的工作。架构师和设计师可以开始考虑如何架构系统来支持客户期望,也可以支持测试人员及早开始测试案例的编写,当然更能支持开发人员理解软件要求来编写代码

需求可以让新来的成员更快速的了解系统是什么

成本:

需要有人花时间来写需求

为了保证需求的及时性,需要不断地维护需求

级别二:被组织的需求(Organized)

需求的目的是为了清晰地与用户、客户和其他涉众(例如开发团队)等人就问题的解决方案进行沟通。级别二关注需求质量、格式化、安全和存储,以及版本管理。

质量:好的需求容易让大家明白,架构师、开发人员和测试人员也都能很好的使用它,不好的需求会导致大家比较模糊、认识存在差异等问题。

格式化:需求必须以统一的方式来描述,例如序号、标题、字体、表格等,可以使得文档更容易阅读、理解和使用,文档模板可以帮助我们以统一格式来编制

访问性、安全性和版本管理:当存在很多需求时,我们会经常遇到不知道在哪里可以找到需要的需求,这时我们就需要有一个统一管理需求地方

级别三:结构化需求(Structured)

对需求进行归类,它们是功能性需求还是非功能性需求?是业务需求还是系统需求?是特性还是软件需求?客户、市场和用户需求是什么?区分这些可以帮助我们更好的理解和管理需求。之前级别都是用一些文字类语言来描述,而级别三是一种结构化需求,例如给需求添加一些属性。

级别四:可跟踪性需求(Traced)

需求本身就是层级的,由业务需求到用户需求再到系统需求;而需求又与开发和测试有所关联,通过可跟踪性管理,我们可以知道在更改一个需求时,会影响到哪些子需求以及相关的同级需求,还能够分析出影响哪些开发和测试内容。

级别五:集成化需求(Integrated)

通常我们做了很多需求,但是并没有一种集成化的方法把需求直接引入开发中,可能导致实现出来的是另一回事。集成化需求管理流程可以直接由需求导入软件设计、变更管理、测试和项目管理。团队将需求作为主要输入,如果将需求模型化,我们则可以通过模型化需求来开发应用程序,目标就是要做成能够让业务工程师来开发应用程序。

阅读全文
Algolia