Curl返回错误码

今天做微信支付开发,遇到Curl返回错误,对其返回的错误码找来了相关定义

Curl返回错误代码列表

0 表示正常
CURLE_UNSUPPORTED_PROTOCOL (1) – 您传送给 libcurl 的网址使用了此 libcurl 不支持的协议。 可能是您没有使用的编译时选项造成了这种情况(可能是协议字符串拼写有误,或没有指定协议 libcurl 代码)。 
CURLE_FAILED_INIT (2) – 非常早期的初始化代码失败。 可能是内部错误或问题。 
CURLE_URL_MALFORMAT (3) – 网址格式不正确。 
CURLE_COULDNT_RESOLVE_PROXY (5) – 无法解析代理服务器。 指定的代理服务器主机无法解析。 
CURLE_COULDNT_RESOLVE_HOST (6) – 无法解析主机。 指定的远程主机无法解析。 
CURLE_COULDNT_CONNECT (7) – 无法通过 connect() 连接至主机或代理服务器。 
CURLE_FTP_WEIRD_SERVER_REPLY (8) – 在连接到 FTP 服务器后,libcurl 需要收到特定的回复。 此错误代码表示收到了不正常或不正确的回复。 指定的远程服务器可能不是正确的 FTP 服务器。 
CURLE_REMOTE_ACCESS_DENIED (9) – 我们无法访问网址中指定的资源。 对于 FTP,如果尝试更改为远程目录,就会发生这种情况。 
CURLE_FTP_WEIRD_PASS_REPLY (11) – 在将 FTP 密码发送到服务器后,libcurl 需要收到正确的回复。 此错误代码表示返回的是意外的代码。 
CURLE_FTP_WEIRD_PASV_REPLY (13) – libcurl 无法从服务器端收到有用的结果,作为对 PASV 或 EPSV 命令的响应。 服务器有问题。 
CURLE_FTP_WEIRD_227_FORMAT (14) – FTP 服务器返回 227 行作为对 PASV 命令的响应。 如果 libcurl 无法解析此行,就会返回此代码。 
CURLE_FTP_CANT_GET_HOST (15) – 在查找用于新连接的主机时出现内部错误。 
CURLE_FTP_COULDNT_SET_TYPE (17) – 在尝试将传输模式设置为二进制或 ascii 时发生错误。 
CURLE_PARTIAL_FILE (18) – 文件传输尺寸小于或大于预期。 当服务器先报告了一个预期的传输尺寸,然后所传送的数据与先前指定尺寸不相符时,就会发生此错误。 
CURLE_FTP_COULDNT_RETR_FILE (19) – ‘RETR’ 命令收到了不正常的回复,或完成的传输尺寸为零字节。 
CURLE_QUOTE_ERROR (21) – 在向远程服务器发送自定义 “QUOTE” 命令时,其中一个命令返回的错误代码为 400 或更大的数字(对于 FTP),或以其他方式表明命令无法成功完成。 
CURLE_HTTP_RETURNED_ERROR (22) – 如果 CURLOPT_FAILONERROR 设置为 TRUE,且 HTTP 服务器返回 >= 400 的错误代码,就会返回此代码。 (此错误代码以前又称为 CURLE_HTTP_NOT_FOUND。) 
CURLE_WRITE_ERROR (23) – 在向本地文件写入所收到的数据时发生错误,或由写入回调 (write callback) 向 libcurl 返回了一个错误。 
CURLE_UPLOAD_FAILED (25) – 无法开始上传。 对于 FTP,服务器通常会拒绝执行 STOR 命令。 错误缓冲区通常会提供服务器对此问题的说明。 (此错误代码以前又称为 CURLE_FTP_COULDNT_STOR_FILE。) 
CURLE_READ_ERROR (26) – 读取本地文件时遇到问题,或由读取回调 (read callback) 返回了一个错误。 
CURLE_OUT_OF_MEMORY (27) – 内存分配请求失败。 此错误比较严重,若发生此错误,则表明出现了非常严重的问题。 
CURLE_OPERATION_TIMEDOUT (28) – 操作超时。 已达到根据相应情况指定的超时时间。 请注意: 自 Urchin 6.6.0.2 开始,超时时间可以自行更改。 要指定远程日志下载超时,请打开 urchin.conf 文件,取消以下行的注释标记: #DownloadTimeout: 30 
CURLE_FTP_PORT_FAILED (30) – FTP PORT 命令返回错误。 在没有为 libcurl 指定适当的地址使用时,最有可能发生此问题。 请参阅 CURLOPT_FTPPORT。 
CURLE_FTP_COULDNT_USE_REST (31) – FTP REST 命令返回错误。 如果服务器正常,则应当不会发生这种情况。 
CURLE_RANGE_ERROR (33) – 服务器不支持或不接受范围请求。 
CURLE_HTTP_POST_ERROR (34) – 此问题比较少见,主要由内部混乱引发。 
CURLE_SSL_CONNECT_ERROR (35) – 同时使用 SSL/TLS 时可能会发生此错误。 您可以访问错误缓冲区查看相应信息,其中会对此问题进行更详细的介绍。 可能是证书(文件格式、路径、许可)、密码及其他因素导致了此问题。 
CURLE_FTP_BAD_DOWNLOAD_RESUME (36) – 尝试恢复超过文件大小限制的 FTP 连接。 
CURLE_FILE_COULDNT_READ_FILE (37) – 无法打开 FILE:// 路径下的文件。 原因很可能是文件路径无法识别现有文件。 建议您检查文件的访问权限。 
CURLE_LDAP_CANNOT_BIND (38) – LDAP 无法绑定。LDAP 绑定操作失败。 
CURLE_LDAP_SEARCH_FAILED (39) – LDAP 搜索无法进行。 
CURLE_FUNCTION_NOT_FOUND (41) – 找不到函数。 找不到必要的 zlib 函数。 
CURLE_ABORTED_BY_CALLBACK (42) – 由回调中止。 回调向 libcurl 返回了 “abort”。 
CURLE_BAD_FUNCTION_ARGUMENT (43) – 内部错误。 使用了不正确的参数调用函数。 
CURLE_INTERFACE_FAILED (45) – 界面错误。 指定的外部界面无法使用。 请通过 CURLOPT_INTERFACE 设置要使用哪个界面来处理外部连接的来源 IP 地址。 (此错误代码以前又称为 CURLE_HTTP_PORT_FAILED。) 
CURLE_TOO_MANY_REDIRECTS (47) – 重定向过多。 进行重定向时,libcurl 达到了网页点击上限。 请使用 CURLOPT_MAXREDIRS 设置上限。 
CURLE_UNKNOWN_TELNET_OPTION (48) – 无法识别以 CURLOPT_TELNETOPTIONS 设置的选项。 请参阅相关文档。 
CURLE_TELNET_OPTION_SYNTAX (49) – telnet 选项字符串的格式不正确。 
CURLE_PEER_FAILED_VERIFICATION (51) – 远程服务器的 SSL 证书或 SSH md5 指纹不正确。 
CURLE_GOT_NOTHING (52) – 服务器未返回任何数据,在相应情况下,未返回任何数据就属于出现错误。 
CURLE_SSL_ENGINE_NOTFOUND (53) – 找不到指定的加密引擎。 
CURLE_SSL_ENGINE_SETFAILED (54) – 无法将选定的 SSL 加密引擎设为默认选项。 
CURLE_SEND_ERROR (55) – 无法发送网络数据。 
CURLE_RECV_ERROR (56) – 接收网络数据失败。 
CURLE_SSL_CERTPROBLEM (58) – 本地客户端证书有问题 
CURLE_SSL_CIPHER (59) – 无法使用指定的密钥 
CURLE_SSL_CACERT (60) – 无法使用已知的 CA 证书验证对等证书 
CURLE_BAD_CONTENT_ENCODING (61) – 无法识别传输编码 
CURLE_LDAP_INVALID_URL (62) – LDAP 网址无效 
CURLE_FILESIZE_EXCEEDED (63) – 超过了文件大小上限 
CURLE_USE_SSL_FAILED (64) – 请求的 FTP SSL 级别失败 
CURLE_SEND_FAIL_REWIND (65) – 进行发送操作时,curl 必须回转数据以便重新传输,但回转操作未能成功 
CURLE_SSL_ENGINE_INITFAILED (66) – SSL 引擎初始化失败 
CURLE_LOGIN_DENIED (67) – 远程服务器拒绝 curl 登录(7.13.1 新增功能) 
CURLE_TFTP_NOTFOUND (68) – 在 TFTP 服务器上找不到文件 
CURLE_TFTP_PERM (69) – 在 TFTP 服务器上遇到权限问题 
CURLE_REMOTE_DISK_FULL (70) – 服务器磁盘空间不足 
CURLE_TFTP_ILLEGAL (71) – TFTP 操作非法 
CURLE_TFTP_UNKNOWNID (72) – TFTP 传输 ID 未知 
CURLE_REMOTE_FILE_EXISTS (73) – 文件已存在,无法覆盖 
CURLE_TFTP_NOSUCHUSER (74) – 运行正常的 TFTP 服务器不会返回此错误 
CURLE_CONV_FAILED (75) – 字符转换失败 
CURLE_CONV_REQD (76) – 调用方必须注册转换回调 
CURLE_SSL_CACERT_BADFILE (77) – 读取 SSL CA 证书时遇到问题(可能是路径错误或访问权限问题) 
CURLE_REMOTE_FILE_NOT_FOUND (78) – 网址中引用的资源不存在 
CURLE_SSH (79) – SSH 会话中发生无法识别的错误 
CURLE_SSL_SHUTDOWN_FAILED (80) – 无法终止 SSL 连接 

微信公众号缓存控制

微信从8.0.19开始内核从x5换成了xweb,原来使用的vConsole无法使用了,可使用如下方法调试:

1.手机用usb连接至电脑

2.手机微信内点击http://debugxweb.qq.com/?inspector=true(只要跳转过微信首页就是开启了调试)

3.微信内打开所需调试网址

4.chrome浏览器打开 chrome://inspect/#devices

会看到com.tencent.mm下是我们打开的网址

5.在点击chrome里的inspect 直接调试

微信公众号开发,使用webview机制,如果页面不加任何缓存控制的话,页面会长期访问缓存。

如果是前期开发测试,建议页面不加缓存,可以在head标签里加入以下内容:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

也可以在http的返回头里加缓存控制信息(比如缓存生效时间只设10秒):

header('Expires: '.gmdate('D, d M Y H:i:s', time()+'10').' GMT');
header('Cache-Control:max-age=10');
header('Pragma:cache');

还有要注意js和CSS的缓存控制,同样可以在服务器上配置header,也可以给文件名加上随机值

Linux常用命令总结

以下是平时用到的Linux命令(会不定期更新)

线上排查故障命令汇总

查看进程线程:

ps -T -p pid

top -H -p pid

htop

pstree -p pid

ls -l /proc/pid/task

strace -p pid

htop配置文件定制

$ cat /root/.config/htop/htoprc

# Beware! This file is rewritten by htop when settings are changed in the interface.
# The parser is also very primitive, and not human-friendly.
fields=0 48 17 18 38 39 40 2 46 47 49 1
sort_key=46
sort_direction=-1
tree_sort_key=0
tree_sort_direction=1
hide_kernel_threads=1
hide_userland_threads=0
shadow_other_users=0
show_thread_names=0
show_program_path=1
highlight_base_name=0
highlight_megabytes=1
highlight_threads=1
highlight_changes=0
highlight_changes_delay_secs=5
find_comm_in_cmdline=1
strip_exe_from_cmdline=1
show_merged_command=0
tree_view=1
tree_view_always_by_pid=0
header_margin=1
detailed_cpu_time=0
cpu_count_from_one=0
show_cpu_usage=1
show_cpu_frequency=0
show_cpu_temperature=0
degree_fahrenheit=0
update_process_names=0
account_guest_in_cpu_meter=0
color_scheme=0
enable_mouse=1
delay=15
left_meters=AllCPUs
left_meter_modes=1
right_meters=Tasks LoadAverage Uptime Memory Swap
right_meter_modes=2 2 2 1 1
hide_function_bar=0

进程内存分析

pmap -x pid

文件读写情况

lsof -p pid

查看端口监听情况

ss -lntp

netstat -lntp

JAVA 线上故障排查完整套路

Spring Boot“内存泄漏”?看看美团大牛是如何排查的

ubuntu清理软件包

比如清理掉redis

apt list --installed |grep redis|awk -F '/' '{print $1}'|xargs apt remove -y

清理依赖残留

dpkg -l|grep ^rc|awk '{print $2}'|xargs dpkg -P

vim linux下查找显示^M并且删除

linux下 ^M的输入方法是ctrl+v然后再ctrl+m

vim下
在文件中显示^M
:e ++ff=unix %

在文件中删除^M
:%s/^M$//g

在linux下查找^M
find ./ | xargs grep '^M' -l -s

在linux下删除^M
find ./ | xargs grep '^M' -l -s | xargs dos2unix

端口扫描

方法一(推荐):

nmap -Pn -p 80 192.168.0.1
nmap -sT 192.168.0.1

方法二:

nc -v -w 2 '192.168.0.1 -i' 80-90

方法三:

masscan -p80,8080-8100 192.168.0.0/24

计划任务crontab

命令行添加计划任务:

先建立计划任务文件root

crontab < root  #导入计划任务
cron            #启动计划任务后台程序

压缩工具

7z

安装:apt-get install p7zip p7zip-full p7zip-rar

解压:7z x xxx.7z

启动项管理工具

小工具 rcconf:
#sudo apt-get rcconf
#sudo apt-get install rcconf
root 下运行: #sudo rcconf

功能更全的工具:sysv-rc-conf
#sudo apt-get update
#sudo apt-get install sysv-rc-conf
运行:#sudo sysv-rc-conf
也可以直接加入启动程序,例如把 /etc/init.d/red5 加入到系统自动启动列表中:
#sudo sysv-rc-conf red5 on

方法二:

如果要添加为开机启动执行的脚本文件,
可先将脚本复制或者软连接到/etc/init.d/目录下,
然后用:update-rc.d xxx defaults NN命令(NN为启动顺序),
将脚本添加到初始化执行的队列中去。
注意如果脚本需要用到网络,则NN需设置一个比较大的数字,如99。

删除自动启动项:

cd /etc/init.d
update-rc.d -f xxx remove

cd /etc/init/
mv xxx.conf ~    #移动掉不需要的启动项

vim /etc/rc.local   #修改自启动脚本里的启动项

Linux后台进程管理利器

supervisor

安装

apt-get install supervisor

安装2

easy_install supervisor

生成配置文件

echo_supervisord_conf >/etc/supervisord.conf

配置文件(每个进程的配置文件都可以单独分拆,放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名,例如,app.conf定义了一个gunicorn的进程):

[program:app]
command=/usr/bin/gunicorn -w 1 wsgiapp:application
directory=/srv/www
user=www-data

其中,进程app定义在[program:app]中,command是命令,directory是进程的当前目录,user是进程运行的用户身份。

重启supervisor,让配置文件生效,然后运行命令supervisorctl启动进程:

supervisorctl start app

停止进程:

supervisorctl stop app

重新加载配置文件(平滑加载):

supervisorctl update

重启supervisor:

supervisorctl reload

*报错: unix:///var/run/supervisor.sock no such file

sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock
sudo service supervisor restart

*报错:supervisorctl start 报 ERROR (spawn error)

unlink /tmp/supervisor.sock

开启web管理,往配置文件里添加(supervisord.conf):

[inet_http_server]
# Web管理界面设定
port=9001
username = admin
password = admin

官方文档:http://supervisord.org/

哈希值

MD5

根据字符串输出一段md5值:

echo -n 'hello'|md5sum|cut -d ' ' -f1

byobu

比screen好用,推荐替代screen

配置文件:

$ cat /root/.byobu/.tmux.conf

set -g set-titles on
set -g set-titles-string "#H"

修改默认设置:

$ byobu-config

或进byobu模式后按下F9

Screen

screen显示状态栏,编辑配置文件 /etc/screenrc 或 ~/.screenrc

screen
screen $SHELL -c 'screen -X caption always "%{.bW}%-w%{.rW}$STY%{-}%+w %=%H %Y/%m/%d %0c "'

或标准用法

screen
screen $SHELL -c 'screen -X caption always "%{.bW}%-w%{.rW}%n %t%{-}%+w %=$STY %H %Y/%m/%d %0c "'

启动会话

[root@malu ~]# screen

[root@malu ~]# screen -ls
There is a screen on:
        123.pts-1.malu      (Detached)
1 Socket in /tmp/screens/S-root.
重新连接会话:
[root@malu ~]# screen -r 123

如果会话是Attached状态,可以用-d选项是之离线:

[ root@malu:~ ]$ screen -d
There are several suitable screens on:
	2412.pts-3.malu	(02/08/17 14:35:21)	(Attached)
	2314.pts-5.malu	(02/08/17 14:27:37)	(Attached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
[ root@malu:~ ]$ screen -d 2412
[2412.pts-3.malu detached.]

[ root@malu:~ ]$ screen -ls
There are screens on:
	2412.pts-3.malu	(02/08/17 14:35:21)	(Detached)
	2314.pts-5.malu	(02/08/17 14:27:37)	(Attached)
2 Sockets in /var/run/screen/S-root.

启动一个带shell的离线screen:

# screen -dmS hack /home/act.sh

向会话发送指令:

# screen -S hack -X stuff 'ls\n'

在screen会话中创建一个新窗口,并在其中运行ping命令

# screen -S hack -X screen ping www.baidu.com

向特定screen会话的指定窗口发送指定命令(-p 指定窗口编号)

# screen -S hack -p 1 -X stuff 'ping -i 10 g.cn\n'

显示指定会话window窗口列表

# screen -S hack -Q windows

语法

# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

删除一个会话

# screen -S hack -X quit

参数说明

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  连接到离线模式的会话(多窗口同步演示)
-ls 或 --list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。
-U   让screen启动是以utf-8模式启动,防止出现中文乱码

可以通过C-a ?来查看所有的键绑定,常用的键绑定有:

C-a ? 显示所有键绑定信息

C-a w 显示所有窗口列表

C-a C-a 切换到之前显示的窗口

C-a c 创建一个新的运行shell的窗口并切换到该窗口

C-a n 切换到下一个窗口

C-a p 切换到前一个窗口(与C-a n相对)

C-a 0..9 切换到窗口0..9

C-a a 发送 C-a到当前窗口

C-a d 暂时断开screen会话

C-a k 杀掉当前窗口

C-a [ 进入拷贝/回滚模式

翻页:

[Ctrl]+[A],再按[ESC],进入复制模式,默认翻页快捷键是 下翻[Ctrl]+[F] , [Ctrl]+[n]  上翻[Ctrl]+[B] , [Ctrl]+[u]

参考文档:

http://man.he.net/?topic=screen&section=all

https://www.hclrc.com/744

http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

CentOS安装redis

yum install epel-release
yum install list
yum install redis

sed 命令

插入到最后一行
sed -i '$a\要插入的文字' file.txt
使用 -i 选项直接修改文件。
$ 匹配文件的最后一行位置
a 命令在后面append

*其实可以这样:
echo '要插入的文字' >> file.txt

插入到第一行
sed -i '1i\要插入的文字' file.txt

替换一行文字
sed -i 's/^被替换的文字/要替换的文字/' file.txt

匹配一行后追加文字
sed -i 's/关键字/&要追加的文字/g' file.txt

在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' file.txt

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' file.txt

"^"代表行首,"$"代表行尾

把错误输出到标准输出:2>&1

2> 表示把标准错误(stderr)重定向,尖括号后面可以跟文件名,或者是&1, &2,分别表示重定向到标准输出和标准错误。

nohup后台执行

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。   

使用 jobs 查看任务。   

使用 fg %n 关闭

监视某进程的资源占用情况(pid进程id):

ps -p pid

在目录中找指定后缀的文件内容包含某个关键字的:

find ./ -name "*.php"|xargs grep -n xxx

grep匹配上下文

grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行

grep -B 5 foo file 显示foo及前5行

grep -A 5 foo file 显示foo及后5行

scp命令

scp -P 4588 root@www.abc.com:/root/sn.sh /home/admin

-r 递归目录

-v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .

-C 使能压缩选项 .

-P 选择端口 . 注意 -p 已经被 rcp 使用 .

-4 强行使用 IPV4 地址 .

-6 强行使用 IPV6 地址 .

mount挂载目录

//挂载exfat
mount -t exfat -o iocharset=cp936 /dev/sdb1

获取BGP骨干网IP地址

//facebook
whois -h whois.radb.net -i origin AS32934|grep ^route

//谷歌 GAE解析地址:ghs.googlehosted.com
whois -h whois.radb.net -i origin AS15169|grep ^route

//[Incapsula](http://bgp.he.net/AS19551)
whois -h whois.radb.net -i origin AS19551|grep ^route

//cloudflare 节点众多,用这个查吧
http://bgp.he.net/search?search%5Bsearch%5D=cloudflare

ln建立文件系统链接

给网站目录建立软连接:

ln -s /app/www /var/www/html

按行数切割文件

split access.log.1 -l 100000 -d -a 2 access_ && ls|grep access_|xargs -n1 -i{} mv {} {}.log

说明:

-l:按行分割,上面表示将access.log.1文件按100000行一个文件分割为多个文件

-d:添加数字后缀,如00,01,02

-a 2:表示用两位数据来顺序命名

ssh

ssh连接的时候会出现:

The authenticity of host 'ssh.malu.me (14.17.80.36)' can't be established.
RSA key fingerprint is cf:ee:17:cb:2e:fc:12:d7:72:7e:ae:80:c0:91:88:a7.
Are you sure you want to continue connecting (yes/no)?

提示用户该指纹密钥需要确认才能继续连接,一般选yes就过了。

但是有些特殊情况不需要显示这个提示,那么需要在连接命令添加-o参数:

ssh -o "StrictHostKeyChecking no" user@host

或者修改 /etc/ssh/ssh_config 全局配置文件 或 ~/.ssh/config 用户配置文件:

Host *
   StrictHostKeyChecking no

ssh 在客户端中强制使用密码验证方式登陆:

在客户端,你可以在~/.ssh/config文件里加入:

PreferredAuthentications password

或者加上参数:

ssh -o PreferredAuthentications=password user@host

也可以在服务端:

sshd_config中的PubkeyAuthentication设为no

还可以把AuthenticationMethods设为publickey,password publickey,keyboard-interactive这样你就同时需要私钥和密码才能登录。

根据端口查看进程

lsof -Pnl -i4

-P : 这个选项约束着网络文件的端口号到端口名称的转换。约束转换可以使lsof运行得更快一些。在端口名称的查找不能奏效时,这是很有用的。

-n : 这个选项约束着网络文件的端口号到主机名称的转换。约束转换可以使lsof的运行更快一些。在主机名称的查找不能奏效时,它非常有用。

-l : 这个选项约束着用户ID号到登录名的转换。在登录名的查找不正确或很慢时,这个选项就很有用。

+M : 此选项支持本地TCP和UDP端口映射程序的注册报告。

-i4 : 仅列示IPv4协议下的端口。

-i6 : 仅列示IPv6协议下的端口。

另一条命令:

netstat -antp

精简返回结果:

netstat -lntp

查看磁盘信息

fdisk -l /dev/sda

lsblk

df -h

hdparm -I /dev/sda

dmesg|grep sda

查看内存占用情况

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'

或者

top

alise 别名

常用别名设置 cat ~/.bashrc:

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

alias ls='ls -hFG'
alias l='ls -lFah'
alias ll='ls -alF'
alias lt='ls -ltrF'
alias ll='ls -alF'
alias lls='ls -alSrF'
alias llt='ls -altrF'

alias tarc='tar cvf'
alias tarcz='tar czvf'
alias tarx='tar xvf'
alias tarxz='tar xvzf'

alias g='git'
alias less='less -R'
alias os='lsb_release -a'
alias vi='vim'

# Colorize directory listing
alias ls="ls -ph --color=auto"

取消别名:

unalise cp

查看当前别名:

alise

国内源

教育网:http://mirrors.neusoft.edu.cn/

更多参考:http://wiki.ubuntu.org.cn/模板:16.04source

Linux压缩解压命令笔记

.7z

  安装:apt-get install p7zip p7zip-full p7zip-rar

  解压:7z x xxx.7z

  打包:7z a FileName.7z DirName


.tar

  解包:tar xvf FileName.tar

  tar xvf FileName.tar -C DirName(解压到指定文件夹DirName)

  打包:tar cvf FileName.tar DirName


.gz

  解压:tar zxvf FileName.tar.gz

  压缩:tar zcvf FileName.tar.gz FileName

其他:

  解压1:gunzip FileName.gz

  解压2:gzip -d FileName.gz

  压缩单个文件:gzip FileName

  压缩单个文件保留源文件: gzip –c FileName > FileName.gz


.bz2

  解压1:bzip2 -d FileName.bz2

  解压2:bunzip2 FileName.bz2

  压缩: bzip2 -z FileName

.tar.bz2

  解压:tar jxvf FileName.tar.bz2

  压缩:tar jcvf FileName.tar.bz2 FileName


.bz

  解压1:bzip2 -d FileName.bz

  解压2:bunzip2 FileName.bz

  压缩:未知

.tar.bz

  解压:tar jxvf FileName.tar.bz

  压缩:tar jcvf FileName.tar.bz FileName


.z

  解压:uncompress FileName.Z

  压缩:compress FileName

.tar.z

  解压:tar zxvf FileName.tar.z

  压缩:tar zcvf FileName.tar.z DirName


.zip

  解压:unzip FileName.zip

  压缩:zip FileName.zip DirName

乱码问题解决:

  1. 通过unzip行命令解压,指定字符集

    unzip -O CP936 xxx.zip (用GBK, GB18030也可以)

  2. 在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件/etc/environment中加入2行

    UNZIP=”-O CP936”

    ZIPINFO=”-O CP936”


.rar

  解压:rar x FileName.rar

  压缩:rar a FileName.rar DirName


.lha

  解压:lha -e FileName.lha

  压缩:lha -a FileName.lha FileName


.rpm

  解包:rpm2cpio FileName.rpm | cpio -div


.deb

  解包:ar p FileName.deb data.Tar.gz | Tar zxf -


.xz

  创建tar.xz文件:只要先 tar cvf xxx.tar xxx/ 这样创建xxx.tar文件先,然后使用 xz -z xxx.tar 来将 xxx.tar压缩成为 xxx.tar.xz

  解压tar.xz文件:先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar xvf xxx.tar来解包

Windows日常操作

快速ssh

%~n0: 获取当前脚本文件名,去除后缀

通过加入utools工具,呼出m2即可快速连接

m2.bat

wt -w 0 new-tab ssh %~n0

win10操作系统按F1就出来浏览器把它关闭

将下面代码编辑到a.bat文件中,然后以管理员身份运行就可以了

taskkill /f /im HelpPane.exe
takeown /f %WinDir%\HelpPane.exe
icacls %WinDir%\HelpPane.exe /deny Everyone:(X)

启动时加载bat

运行: shell:startup -> startup.vbs

set ws=WScript.CreateObject("WScript.Shell")
ws.Run "C:\auto_run\startup\start.bat /start",0

Win10 右键菜单Intel图形属性删除

管理员权限打开cmd,输入

regsvr32 /u igfxDTCM.dll

恢复

regsvr32 igfxDTCM.dll

Win11 添加右键菜单

https://github.com/ikas-mc/ContextMenuForWindows11/releases

图片alt

命令行工具

windows curl

下载地址:https://curl.haxx.se/windows/

计算文件Hash值:

  在Windows中可以通过以下方式:

certutil -hashfile yourfilename MD5
certutil -hashfile yourfilename SHA1
certutil -hashfile yourfilename SHA256

  而在Linux下,命令为:

md5sum yourfilename
sha1sum yourfilename
sha256sum yourfilename

windows命令行工具 nircmd

下载地址:http://www.nirsoft.net/utils/nircmd.html

关闭监视器:

nircmd.exe monitor off

锁屏:

nircmd.exe lockws

截屏:

nircmd.exe savescreenshotfull "f:\tmp\shot.png"

设置鼠标在屏幕位置:

nircmd.exe setcursor 100 50

按鼠标键:

① sendmouse right click 右键鼠标
② sendmouse left click  左键鼠标
③ sendmouse left dblclick 双击鼠标左键
④ sendmouse left down  按下鼠标左键
⑤ sendmouse left up  松开鼠标左键
⑥ sendmouse middle click

工具集

视频下载工具 annie

https://github.com/iawia002/annie

视频转码工具 FFmpeg

https://www.ffmpeg.org/

比如mp4转mp3: ffmpeg -i xx.mp4 xx.mp3

tcping

https://elifulkerson.com/projects/index.php

nircmd,wake_on_lan,GUIPropView

http://www.nirsoft.net/utils/index.html

网络唤醒wol

https://www.depicus.com/wake-on-lan/wake-on-lan-cmd

设置分辨率 QRes

http://www.softpedia.com/progDownload/QRes-Download-618.html

QRes.exe /x:1920 /y:1080

windows开启关闭防火墙

NetSh Advfirewall set allprofiles state off   #关闭防火墙
NetSh Advfirewall set allprofiles state on    #开启防火墙
Netsh Advfirewall show allprofiles            #查看防火墙状态

防火墙开放端口

netsh advfirewall firewall add rule name="1ml" protocol=tcp localport=22 action=allow dir=in
netsh advfirewall firewall show rule name="1ml"

端口映射

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=6006 connectaddress=192.168.50.2 connectport=6006
netsh interface portproxy show all

在 Windows 10 中启用可匿名访问的共享

就是不用输入用户名和密码,直接通过网上邻居可以访问的共享。

1、打开本地组策略编辑器(快捷键Win+R,打开运行,输入gpedit.msc,确定);
2、打开:“本地计算机策略->计算机配置->Windows设置->安全设置->本地策略->用户权限分配”;
3、找到:“拒绝从网络访问这台计算机”,将列表中的“Guest”删除;
4、打开:“本地计算机策略->计算机配置->Windows设置->安全设置->本地策略->安全选项”;
5、找到:“网络访问:本地帐户的共享和安全模型”,改为:“仅来宾 - 对本地用户进行身份验证,其身份为来宾”;
6、找到:“网络访问:将 Everyone 权限应用于匿名用户”,改为:“已启用”;
7、找到:“账户:来宾账户状态”,改为:“已启用”;

注意:如果访问共享文件夹时出现“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问,这些策略可帮助保护你的电脑免受网络上不安全设备或者恶意设备的威胁” 需要如下操作:

1、打开本地组策略编辑器(快捷键Win+R,打开运行,输入gpedit.msc,确定);
2、在“计算机配置”中找到“管理模板”->“网络”->“Lanman工作站”;
3、在本地策略编辑器的右侧双击“启用不安全的来宾登录”。选择“已启用”,并点击确定,解决问题。

Win10 开机自动登录

方法一:

control userpasswords2

方法二:

netplwiz

方法三:

rundll32 netplwiz.dll,UsersRunDll

方法四:

创建autologin.reg文件,双击导入

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"DefaultUserName"="Administrator"
"AutoAdminLogon"="1"
"DefaultPassword"="your_password"

windows 删除进程

查看指定端口的连接信息:

netstat -ano | findstr "8080"

查看进程列表:

tasklist | findstr "java"

通过上面的方式可以查看占用端口号的进程ID:

taskkill -PID 进程号 -F

自建KMS激活服务器

https://github.com/Wind4/vlmcsd/releases

Linux

#下载vlmcsd
wget https://github.com/Wind4/vlmcsd/releases/download/svn1113/binaries.tar.gz

#解压
tar -zxvf binaries.tar.gz

#进入对应目录
cd binaries/Linux/intel/static

#一些常用的vlmcsd命令

	-L <address>[:<port>]		监听IP地址<地址>,可选<端口>
	-P <port>				设置TCP端口<端口>的后续-L语句(默认1688)
	-F0 -F1					禁用/启用绑定到外部IP地址
	-e						日志到标准输出
	-D						在前台运行
	-R <interval>			每<间隔>更新激活一次(默认1w)
	-A <interval>			每<间隔>重试激活一次(默认2h)
	-v						日志详细
	-q						不记录详细(默认)
	-V						显示版本信息并退出 

windows

1.输入 vlmcsd-Windows-x64 -s 创建kms服务,提示Service installed successfully后创建kms服务成功

2.打开任务管理器-服务-找到vlmcsd服务-右击开始

3.防火墙开启1688端口

win10

安装

微软官方下载地址:https://www.microsoft.com/zh-cn/software-download/windows10

激活

激活工具: https://github.com/zbezj/HEU_KMS_Activator

序列号

Home: TX9XD-98N7V-6WMQ6-BX7FG-H8Q99
Home N: 3KHY7-WNT83-DGQKR-F7HPR-844BM
Home Single Language: 7HNRX-D7KGG-3K4RQ-4WPJ4-YTDFH
Home Country Specific: PVMJN-6DFY6-9CCP6-7BKTT-D3WVR
Professional: W269N-WFGWX-YVC9B-4J6C9-T83GX
Professional N: MH37W-N47XK-V7XM9-C7227-GCQG9
Education: NW6C2-QMPVW-D7KKK-3GKT6-VCFB2
Education N: 2WH4N-8QGBV-H22JP-CT43Q-MDWWJ
Enterprise: NPPR9-FWDCX-D2C8J-H872K-2YT43
Enterprise N: DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4

激活步骤:

slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX
slmgr /skms kms8.msguides.com
slmgr /ato

win11

安装

微软官方下载地址:https://www.microsoft.com/zh-cn/software-download/windows11

激活

激活工具: https://github.com/zbezj/HEU_KMS_Activator

Win11企业版序列号:

W269N-WFGWX-YVC9B-4J6C9-T83GX

NY2G4-WJT7M-7XFMW-B9R79-BKMQB

XGVPP-NMH47-7TTHJ-W3FW7-8HV2C

VK7JG-NPHTM-C97JM-9MPGT-3V66T

NPPR9-FWDCX-D2C8J-H872K-2YT43

NYW94-47Q7H-7X9TT-W7TXD-JTYPM

NJ4MX-Vqq7Q-FP3DB-VDGHX-7XM87

MH37W-N47XK-V7XM9-C7227-GCQG9

VK7JG-NPHTM-C97JM-9MPGT-3V66T

FWN7H-PF93Q-4GGP8-M8RF3-MDWWW

WGGHN-J84D6-QYCPR-T7PJ7-X766F

8G7XN-V7YWC-W8RPC-V73KB-YWRDB

C38W9-KWNBH-M4HWH-746BK-H6DGY

激活步骤:

slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX
slmgr /skms kms.03k.org
slmgr /ato

绕过 TPM 2.0 检测

Win11 会提示“该电脑无法运行 Win11”解决办法:

1、注册表大法

在安装界面按 Shift+F10,打开命令行界面,输入 regedit 打开注册表,然后定位到:

HKEY_LOCAL_MACHINE\SYSTEM\Setup

创建一个名为“LabConfig”的项,接着在“LabConfig”下创建两个 DWORD 值:

  • 键为“BypassTPMCheck”,值为“00000001”
  • 键为“BypassSecureBootCheck”,值为“00000001”
  • 键为“BypassRAMCheck”,值为“00000001”

保存退出后,上图的提示就消失了,就可以正常安装 Win11。

2、修改 ISO 镜像

如果想通过直接从 Win11 ISO 镜像运行 setup.exe 程序来升级系统,而非全新安装,还有另一种简单的解决方法。

需要找到 Win10 ISO 的 appraiserres.dll 文件,替换 Win11 ISO 的同名文件。完成后,需要使用第三方工具(如 Rufus 或 AnyBurn)重新创建 ISO 镜像,然后再次运行安装文件。

虚拟显示器

下载地址:https://www.amyuni.com/downloads/usbmmidd_v2.zip

安装过程:

解压后进目录,用管理员权限执行安装:

./deviceinstaller64 install usbmmidd.inf usbmmidd

然后启动:

 .\deviceinstaller64 enableidd 1

写了个启动脚本:

cd C:\auto_run\bin\usbmmidd_v2
.\deviceinstaller64.exe enableidd 1

官方文档:https://www.amyuni.com/forum/viewtopic.php?t=3030

脚本重连蓝牙耳机

首先去该网站下载:蓝牙命令行管理工具

然后打开命令行,输入

btdiscovery -s  # 扫描蓝牙设备,需要等待一会

获取到设备的 DEVICE_ADDRESS 和 SERVICE_UUID

DEVICE_ADDRESS 是蓝牙设备的mac地址

SERVICE_UUID 是设备的服务ID,比如耳麦是1108,免提网关111E

自动重新连接bat脚本

@echo off

rem   The following line is needed only if you haven't added Bluetooth Command Line Tools to system PATH
REM set PATH=C:\Program Files (x86)\Bluetooth Command Line Tools\bin;%PATH%

rem   Change the following 2 lines to match your device
set DEVICE_ADDRESS=1C:52:16:58:8F:95
set SERVICE_UUID=1108

rem   If your device requires PIN code other than '0000', uncomment and change the following line
set PIN=0000

rem   Remove the device. Ignoring possible error here 
btpair -u -b"%DEVICE_ADDRESS%"

rem   Pair the device
btpair -p%PIN% -b"%DEVICE_ADDRESS%"
if errorlevel 1 goto error

rem   Enable the service
REM btcom -c -b"%DEVICE_ADDRESS%" -s%SERVICE_UUID%
REM if errorlevel 1 goto error

goto success

rem   Allow user to read error message before window is closed
:error
pause
exit

:success
exit

查看AC电源状态

WMIC Path Win32_Battery Get BatteryStatus

操作系统中查看硬件制造商和BIOS版本

dxdiag

或者cmd里输入:

wmic bios get biosversion

wmic bios get SMBIOSBIOSVersion

查看磁盘硬件名称

wmic diskdrive get caption

查看内存

查看内存信息

wmic memorychip

查看内存硬件厂商

wmic memorychip get Manufacturer

利用Windows内置工具测试硬盘速度

测试默认磁盘

winsat disk

指定磁盘进行测速

winsat disk -drive d 

注:请使用管理员权限打开cmd,否则在win10下面最终测试结果会一闪而过

windows下查看wifi信息

进入cmd输入:

netsh wlan show interface

Win7下格式化成 FAT32

右键管理员身份打开cmd

如果你格式化的是E盘

输入format E: /fs:fat32

回车后会提示输入卷标,就是指该分区名称

win8远程连接win10

1.账户前面需跟计算机名,如:计算机名\用户名.

2.win10上,运行gpedit.msc-计算机配置-Windows设置-安全设置-本地策略-安全选项-网络访问:本地账户的共享安全模型

设置成:经典-对本地用户进行身份验证,不改变其本来身份

指定用户访问共享samba

清除用户记录:

net use \\192.168.1.1 /del

指定用户登录(需要输入密码)

net use \\192.168.1.1 /user:malu

携带密码登录:

net use \\192.168.1.1 "password" /user:malu /persistent:yes

查看状态:

net use

自动登录脚本:

@echo off
net use \\192.168.0.1 /delete
net use \\192.168.0.1 "password" /user:malu /persistent:yes
explorer \\192.168.0.1\

指定DNS

@echo off
netsh interface ip set dns name="本地连接" source=dhcp
netsh interface ip set dns name="以太网" source=dhcp
netsh interface ip add dns "以太网" 192.168.11.200
netsh interface ip add dns "本地连接" 192.168.11.200
netsh interface ip add dns "以太网" 61.177.7.1 index=2
netsh interface ip add dns "本地连接" 61.177.7.1 index=2

WAMP本地环境搭建笔记

开启虚拟主机

1.编辑文件 F:\wamp\bin\apache\apache2.4.9\conf\httpd.conf

去掉httpd-vhosts.conf的注释

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

把Directory修改成如下

<Directory />
    Order Deny,Allow
    Deny from all
	Allow from all
</Directory>

2.编辑文件 F:\wamp\bin\apache\apache2.4.9\conf\extra\httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot D:/00_cloud/server-php
    ServerName server-php.com
    <Directory "D:/00_cloud/server-php">
	    Options Indexes FollowSymLinks
	    AllowOverride None
	    Order allow,deny
	    Allow from all
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot F:/wamp/www
    ServerName localhost
    <Directory "F:/wamp/www">
	    Options Indexes FollowSymLinks
	    AllowOverride None
	    Order allow,deny
	    Allow from all
    </Directory>
</VirtualHost>

3.修改 C:\Windows\System32\drivers\etc\hosts

添加

127.0.0.1 server-php.com

Vim日常笔记

Vim乱码处理

/etc/vim/vimrc文件末尾添加

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

vim 去掉自动注释和自动回车

取消

:set paste

恢复

:set paste!

操作

vim删除

x        删除当前光标下的字符
dw       删除光标之后的单词剩余部分。
d$       删除光标之后的该行剩余部分。
dd       删除当前行。

c        功能和d相同,区别在于完成删除操作后进入INSERT MODE
cc       也是删除当前行,然后进入INSERT MODE

vim撤销、恢复

u   撤销上一步的操作
Ctrl+r 恢复上一步被撤销的操作

快速移动光标

w    移动到下一个单词

行编辑

Ctrl+v,hjkl,Shift+i

vim折叠

set foldmethod=syntax 或者是其它方法。设置好了之后可以用 zM 和 zR 来打开或关闭所有的折叠。

:h fold-commands 可以用来查看有关折叠的命令,所有的折叠命令全部由 z 开关。比如 zo 和 zc 用来打来和关闭折叠(助记符是 open 和 close)。

设置行号

:set number

设置相对行号

:set relativenumber

查找时忽略大小写

set ic

取消设置

:set no*****

每行最后添加字符

:%s/$/需要追加的字符

配置文件

编辑~/.vimrc文件

vim中文乱码

set encoding=utf-8

vim记录上次编辑的位置(编辑~/.vimrc文件)

autocmd BufReadPost *
      \  if line("'\"") > 0 && line ("'\"") <= line("$") |
      \      exe "normal g'\"" |
      \  endif

PHP日常笔记

php控制header头缓存时间

<?php
header('Expires: '.gmdate('D, d M Y H:i:s', time()+'86400').' GMT');
header('Cache-Control:max-age=86400');
header('Pragma:cache');
?>

PHP空数组转空对象

这个问题在与IOS、安卓客户端调试API的时候遇到,非空数组经过json_encode后会转为{}形式的对象(java里称字典)

而空数组会直接转成[]形式,这样造成客户端解析异常。

解决办法是在输出前强制转成object对象:

<?php
$a =array();
var_dump($a);
echo json_encode($a);
echo "\n";
$b = (object)$a;
var_dump($b);
echo json_encode($b);

输出:

array(0) {
}
[]
object(stdClass)#1 (0) {
}
{}

round() 函数对浮点数进行四舍五入

语法

float round( float val ,[int precision] )

返回将 val 根据指定精度 precision(十进制小数点后数字的数目)进行四舍五入的结果。

precision 也可以是负数或零(默认值)。

float精度丢失问题需要用BC函数库

要使用 BC 这个函数库,要在编译 PHP 程序时加入 –enable-bcmath 的选项。

bcadd:	 将二个高精确度数字相加。
bccomp:	 比较二个高精确度数字。
bcdiv:	 将二个高精确度数字相除。
bcmod:	 取得高精确度数字的余数。
bcmul:	 将二个高精确度数字相乘。
bcpow:	 求一高精确度数字次方值。
bcscale: 配置程序中所有 BC 函数库的默认小数点位数。
bcsqrt:	 求一高精确度数字的平方根。
bcsub:	 将二个高精确度数字相减。

static的属性,在内存中只有一份,为所有的实例共用。

使用self:: 关键字访问当前类的静态成员

使用parent::调用父类方法

abstract 抽象类 抽象方法

PHP 方法修饰符

Public(公开): 可以自由的在类的内部外部读取、修改。

Private(私有): 只能在这个当前类的内部读取、修改。

Protected(受保护):能够在这个类和类的子类中读取和修改。

Final (最终的) 不能被继承,也没有子类。

PHP序列化函数:

serialize()和unserialize():一个是进行序列化存储,另一个则是进行序列化恢复

PHP instatnceof运算符保障代码安全

使用instanceof运算符,可以判断当前实例是否可以有这样的一个形态。当前实例使用 instanceof与当前类,父类(向上无限追溯),已经实现的接口比较时,返回真。

代码格式:实例名 instanceof 类名

<?php
class User{
	private $name;
	public function  getName(){
		return "UserName is ".$this->name;
	}
}

class NormalUser extends User {
	private $age = 99;
	public function getAge(){
		return "age is ".$this->age;
	}
}

class UserAdmin{ //操作.

	public static function  getUserInfo(User $_user){
		if($_user instanceof NormalUser ){
			echo $_user->getAge();
		}else{
			echo "类型不对,不能使用这个方法.";
		}
	}
}
$User = new User(); // 这里new的是User.

UserAdmin::getUserInfo($User);
?>

程序运行结果:

类型不对,不能使用这个方法.

PHP Ajax 跨域允许多个域名访问

根据系统变量HTTP_ORIGIN请求头返回不同结果:

<?php
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';  
  
$allow_origin = array(  
    'http://client1.malu.me',  
    'http://client2.malu.me' 
);
  
if(in_array($origin, $allow_origin)){  
    header('Access-Control-Allow-Origin:'.$origin);       
}
?>

防注入

addslashes()

该函数在指定的预定义字符前添加反斜杠.

预定义字符是:

  • 单引号(’)
  • 双引号(”)
  • 反斜杠(\)
  • NULL

ECshop中addslashes_deep的原型

<?php
function addslashes_deep($value) {
    if (empty($value)) {
        return $value;  //如为空,直接返回;

    } else {
        return is_array($value) ? array_map('addslashes_deep', $value): addslashes($value);
    }  //递归处理数组,直至遍历所有数组元素;

}

mysql_real_escape_string()

该函数转义 SQL 语句中使用的字符串中的特殊字符。

特殊字符包括:

  • \x00
  • \n
  • \r
  • \
  • \x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

<?php
function check_input($value)
{
// 去除斜杠

    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
// 如果不是数字则加引号

    if (!is_numeric($value)) {
        $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
}

$con = mysql_connect("localhost", "hello", "321");
if (!$con) {
    die('Could not connect: ' . mysql_error());
}

// 进行安全的 SQL

$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";

mysql_query($sql);

mysql_close($con);
?>

字符过滤的机制无法根本解决注入,完美解决方案就是使用拥有Prepared Statement机制的PDO和MYSQLi来代替mysql_query(注:mysql_query自 PHP 5.5.0 起已废弃,并在将来会被移除):

PDO:

<?php
$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array('name' => $name));

foreach ($stmt as $row) {
    // do something with $row

}
?>

MYSQLi

<?php
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row

}
?>

防XSS

对传入值强转,或者使用htmlspecialchars()

htmlspecialchars()函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号)
  • ” (双引号)
  • ’ (单引号)
  • < (小于)
  • (大于)

如需把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数。

php编码转换

用iconv进行gbk转utf-8 或者gb2312转utf-8的时候经常出现乱码问题,推荐另外一个扩展函数:mb_convert_encoding

mb_convert_encoding的用法见官方: http://cn.php.net/manual/zh/function.mb-convert-encoding.php

注:需要先enable mbstring 扩展库

MySQL日常笔记

旧的MySQL函数与MySQLi和PDO映射关系表

MySQL Extension MySQLi PDO
mysql_affected_rows mysqli::$affected_rows PDOStatement::rowCount
mysql_client_encoding mysqli::character_set_name  
mysql_close mysqli::close Assign NULL to PDO Object
mysql_connect mysqli::__construct PDO::__construct
mysql_create_db Query: CREATE DATABASE  
mysql_data_seek mysqli_stmt::data_seek PDO::FETCH_ORI_ABS (?)
mysql_db_name Query: SELECT DATABASE()  
mysql_db_query    
mysql_drop_db Query: DROP DATABASE  
mysql_errno mysqli::$errno PDO::errorCode
mysql_error mysqli::$error_list PDO::errorInfo
mysql_escape_string    
mysql_fetch_array mysqli_result::fetch_array PDOStatement::fetch
mysql_fetch_assoc mysqli_result::fetch_assoc PDOStatement::fetch
mysql_fetch_field mysqli_result::fetch_field PDOStatement::getColumnMeta
mysql_fetch_lengths mysqli_result::$lengths PDOStatement::getColumnMeta
mysql_fetch_object mysqli_result::fetch_object PDOStatement::fetch
mysql_fetch_row mysqli_result::fetch_row PDOStatement::fetch
mysql_field_flags mysqli_result::fetch_fields PDOStatement::getColumnMeta
mysql_field_len mysqli_result::fetch_field_direct PDOStatement::getColumnMeta
mysql_field_name mysqli_result::fetch_field_direct PDOStatement::getColumnMeta
mysql_field_seek mysqli_result::field_seek PDOStatement::fetch
mysql_field_table mysqli_result::fetch_field_direct PDOStatement::getColumnMeta
mysql_field_type mysqli_result::fetch_field_direct PDOStatement::getColumnMeta
mysql_free_result mysqli_result::free PDOStatement::closeCursor
mysql_get_client_info mysqli::get_client_info PDO::getAttribute
mysql_get_host_info mysqli::$host_info PDO::getAttribute
mysql_get_proto_info mysqli::$protocol_version  
mysql_get_server_info mysqli::$server_info PDO::getAttribute
mysql_info mysqli::$info  
mysql_insert_id mysqli::$insert_id PDO::lastInsertId
mysql_list_dbs Query: SHOW DATABASES  
mysql_list_fields Query: SHOW COLUMNS  
mysql_list_processes mysqli::$thread_id  
mysql_list_tables Query: SHOW TABLES  
mysql_num_fields mysqli::$field_count PDOStatement::columnCount
mysql_num_rows mysqli_stmt::$num_rows PDOStatement::rowCount
mysql_pconnect mysqli::__construct PDO::__construct
mysql_ping mysqli::ping  
mysql_query mysqli::query PDO::query
mysql_real_escape_string mysqli::real_escape_string PDO::quote
mysql_result Combination PDOStatement::fetchColumn
mysql_select_db mysqli::send_query PDO::__construct
mysql_set_charset mysqli::character_set_name PDO::__construct
mysql_stat mysqli::stat PDO::getAttribute
mysql_tablename Query: SHOW TABLES  
mysql_thread_id mysqli::$thread_id  
mysql_unbuffered_query See Buffering Concepts  

linux全新安装MySQL的步骤

注意

以下说明假定您的系统上尚未安装任何MySQL版本(无论是由Oracle还是其他方分发); 如果不是这种情况,请按照使用MySQL APT存储库替换MySQL的本机分发或 更换由Direct deb软件包下载的MySQL服务器中给出的说明进行操作 。

添加MySQL APT存储库

首先,将MySQL APT存储库添加到系统的软件存储库列表中。跟着这些步骤:

访问 https://dev.mysql.com/downloads/repo/apt/ 上的MySQL APT存储库的下载页面 。

选择并下载适用于Linux发行版的发行包。

使用以下命令安装下载的发行包,替换 version-specific-package-name 为下载的包的名称(如果未在包所在的文件夹中运行命令,则以其路径开头):

shell> sudo dpkg -i /PATH/version-specific-package-name.deb

例如,对于w.x.y-z包的版本 ,命令是:

shell> sudo dpkg -i mysql-apt-config_w.x.y-z_all.deb

请注意,相同的包适用于所有受支持的Debian和Ubuntu平台。

在安装软件包期间,系统会要求您选择要安装的MySQL服务器版本和其他组件(例如,MySQL Workbench)。如果您不确定选择哪个版本,请不要更改为您选择的默认选项。 如果您不想安装特定组件,也可以选择none。在为所有组件做出选择后,选择“ 确定”以完成发布包的配置和安装。

您可以随时更改版本的选择; 有关说明,请参阅选择主要版本。

使用以下命令从MySQL APT存储库更新包信息(此步骤是必需的):

shell> sudo apt-get update

您也可以手动添加和配置MySQL APT存储库,而不是使用发行包。 有关详细信息,请参阅 附录A:手动添加和配置MySQL APT存储库。

注意 在系统上启用MySQL APT存储库后,您将无法再从平台的本机软件存储库安装任何MySQL软件包,直到禁用MySQL APT存储库。

使用APT安装MySQL

通过以下命令安装MySQL:

shell> sudo apt-get install mysql-server

这将安装MySQL服务器的包,以及客户端和数据库公共文件的包。

在安装过程中,系统会要求您为root用户提供MySQL安装的密码。

重要

确保记住您设置的root密码。想要稍后设置密码的用户可以在对话框中将 密码字段留空,只需按确定即可 ; 在这种情况下,对于使用Unix套接字文件的连接,Socket Peer-Credential Pluggable Authentication将对服务器的root访问进行身份 验证。您可以稍后使用程序mysql_secure_installation设置root密码 。

启动和停止MySQL服务器

MySQL服务器在安装后自动启动。您可以使用以下命令检查MySQL服务器的状态:

shell> sudo service mysql status

使用以下命令停止MySQL服务器:

shell> sudo service mysql stop

要重新启动MySQL服务器,请使用以下命令:

shell> sudo service mysql start

注意

一些依赖于本机MySQL包的第三方本机存储库包可能无法与MySQL APT存储库包一起使用,因此不应与它们一起使用; 这些包括akonadi-backend-mysql,handlersocket-mysql-5.5和zoneminder。

选择其他版本

默认情况下,MySQL服务器和其他所需组件的所有安装和升级都来自您在安装配置包期间选择的主要版本的发行版系列(请参阅添加MySQL APT存储库)。但是,您可以通过重新配置已安装的配置包随时切换到另一个受支持的主要版本系列。使用以下命令:

shell> sudo dpkg-reconfigure mysql-apt-config

然后会出现一个对话框,要求您选择所需的主要版本。做出选择并选择确定。返回到命令提示符后,使用以下命令从MySQL APT存储库更新包信息:

shell> sudo apt-get update

下次使用apt-get install命令时,将安装所选系列中的最新版本。

您可以使用相同的方法更改要使用MySQL APT存储库安装的任何其他MySQL组件的版本。

两张结构相同的表联合查询,返回至同一个结构中

SELECT * FROM hack_site1 WHERE name = 'query'
UNION ALL
SELECT * FROM hack_site2 WHERE name = 'query'

优化

查询慢查日志是否开启,以及日志路径:

mysql> show variables like 'slow%';
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_launch_time    | 2                                |
| slow_query_log      | OFF                              |
| slow_query_log_file | /app/mysql/c836212589df-slow.log |
+---------------------+----------------------------------+
3 rows in set

查询慢查日志超时时间:

show variables like 'long_query_time';

开启慢查日志:

set global slow_query_log=on; 

开启没使用索引的查询日志:

set global log_queries_not_using_indexes=on;

导入导出

把表t1里的100w-1000w之间的数据导出:

导出

select * from t1 limit 1000000,9000000 into outfile "d:/t1_1000000-9000000.txt";

在服务器上导入该文件进表t1:

导入

load data infile "/app/sql_tmp/t1_1000000-9000000.txt" into table t1;

远程导入本地的数据 (需要先开启远程导入):

set global local_infile=on;  
load data local infile  "d:/t1_1000000-9000000.txt" into table t1;

查看

MySQL中看看表是如何创建的:

show create table user;
show create table user\G;

查看默认储存引擎:

show engines;

show variables like '%storage_engine%';

查看一个数据库的所有表:

select table_name from information_schema.tables where table_schema='dbname' and table_type='base table';

查看一张表的所有字段信息:

desc tablename

查看数据库状态(包含注释):

SHOW TABLE STATUS FROM 'dbname';

查看数据库版本

select database(), version();

其他操作

存在则更新,不存在则插入 (表必须有主键或者是唯一索引)

replace into t_test set ikey=1,value='a';

mysql生成当前时间戳

unix_timestamp(now())

shell中执行mysql命令

mysql -uroot -e "show slave status \G"   #加-e参数

Windows Mysql修改默认储存引擎,my.ini添加以下行:

[mysqld]
default-storage-engine=MYISAM
default-tmp-storage-engine=MYISAM

MYSQL允许远程连接,监听所有IP

[mysqld]
bind-address="0.0.0.0" 

查看以及设置sql_mode

SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作,比如可以将NULL插入NOT NULL的字段中,也可以插入一些非法日期,如“2012-12-32”。因此在生产环境中强烈建议开发人员将这个值设为严格模式,这样有些问题可以在数据库的设计和开发阶段就能发现,而如果在生产环境下运行数据库后发现这类问题,那么修改的代价将变得十分巨大。此外,正确地设置SQL_MODE还可以做一些约束(Constraint)检查的工作。

SELECT @@sql_mode;
SELECT @@global.sql_mode;
SELECT @@session.sql_mode;

如果只想在会话中受到影响,请使用“@@session”,例如:

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

如果想影响所有客户端,请使用“@@global”,例如:

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

提高mysql备份效率,建议用mysql自带的mysqldump导出,它会把条目批量写入一条语句,而navicat导出是一条一条的语句(巨型数据量时,生成的文件会非常大)。

windows mysql导出数据库,进目录 wamp\bin\mysql\mysql5.6.17\bin\ 执行:

mysqldump.exe -u root -p user --default-character-set=utf8 > user.sql

其中user为数据库名

接下来可以用替换的方法把,把里面ENGINE=InnoDB改为ENGINE=MyISAM

导入:

mysql -u root -p aaa --default-character-set=utf8 < user.sql

innodb转myisam慢:

在超大数据量的时候(亿级数据量)innodb如果有索引,那么在转换的时候会很慢,建议先把索引删除再去转换。

use database_name
alter table xxx engine=myisam;

索引

myisam建立索引慢

数据量大的时候,建立索引会非常慢,可以通过以下办法去快速建立索引

1、进入mysql界面。use dbname;

2、导出相应表的数据。 select * from tab into outfile 'tab.txt'; 此处tab.txt文件在mysql的data目录里

3、删除相应表的数据,并置第一条记录为0。 truncate table tab;

4、创建索引。create index IDX_NAME using BTREE on tab (col);

   或:alter table tab add index name1 (name);  括号里name是表名,name1是索引名可以不写

   索引的方式有:BTREE、RTREE、HASH、FULLTEXT、SPATIAL

5、导入文件到相应表。load data infile 'tab.txt' into table tab;

优化索引大小

建立前缀索引

语法为:

ALTER TABLE table_name ADD KEY(column_name(prefix_length));

比如添加键值:

alter table test add key (city(7));

另一种前缀索引

ALTER TABLE `hack_site11` ADD INDEX `name` (`name`(7)) USING BTREE ,

命令行

登录:

mysql -uroot -h db.server.io -P 3306 -D temp_db -p
输入root用户的mysql密码

1、显示数据库列表:
show databases;
2、显示库中的数据表: 
use mysql;
show tables;
3、显示数据表的结构: 
describe 表名; 
4、建库: 
create database 库名; 
5、建表: 
use 库名; 
create table 表名 (字段设定列表); 
6、删库和删表: 
drop database 库名; 
drop table 表名; 
7、将表中记录清空: 
delete from 表名; 
8、显示表中的记录: 
select * from 表名

锁库

全局锁库(只读):

FLUSH TABLES WITH READ LOCK;

表级别的锁定:

lock tables test read;

解锁:

UNLOCK tables;

注:在退出mysql终端的时候都会隐式的执行unlock tables。也就是如果要让表锁定生效就必须一直保持对话。

用户操作

错误解决 1251- Client does not support authentication protocol

开启mysql远程登录,允许所有IP登录

mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'passwd' PASSWORD EXPIRE NEVER;
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'passwd';
mysql> FLUSH PRIVILEGES;

查看MYSQL数据库所有用户

mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
+---------------------------------------+
| query                                 |
+---------------------------------------+
| User: 'debian-sys-maint'@'localhost'; |
| User: 'mysql.session'@'localhost';    |
| User: 'mysql.sys'@'localhost';        |
| User: 'admin'@'localhost';             |
+---------------------------------------+
4 rows in set (0.26 sec)

给IP开放访问

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'1.92.16.10' IDENTIFIED BY 'password' WITH GRANT OPTION;

给所有IP开放访问

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

给指定数据库添加用户

mysql> GRANT ALL PRIVILEGES ON dbname.* to malu@'%' identified by 'password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

dbname:表示数据库名

删除用户

mysql> DROP USER username@hostname;

修改用户密码

方法一:

适用于管理员或者有全局权限的用户重设其它用户的密码,进入命令行模式

mysql -u root -p
mysql> use mysql;
mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='username';
mysql> FLUSH PRIVILEGES;
mysql> quit;

方法二:

mysql -u root -p 
mysql> use mysql; 
mysql> SET PASSWORD FOR  username=PASSWORD('new password');
mysql> quit;

方法三:

mysqladmin -u root "old password" "new password"

注:new password请输入你想要设置的密码。

方法四:

重置mysql里root用户密码, 解决报错:Access denied for user ‘root’@’localhost’ (using password: YES)

# /etc/init.d/mysqld stop 
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking & 
# mysql -u root mysql 
mysql> UPDATE mysql.user SET password=PASSWORD('newpassword') where USER='root'; 
mysql> FLUSH PRIVILEGES; 
mysql> quit 
# /etc/init.d/mysqld restart 

MySQL 5.7以上版本,会出现 ERROR 1054 (42S22): Unknown column ‘password’ in ‘field list’,请使用以下语句修改:

mysql> update mysql.user set authentication_string=password('newpassword') where user='root'; 
mysql> FLUSH PRIVILEGES;

错误解决

运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist

解决的方法是:

第一步:在管理员命令中输入:

mysql_upgrade -u root -p --force

第二步:重新启动mysql的服务:

net stop mysql
net start mysql

再次运行mysql,就解决了。

注意,两步缺一不可。

解决报错: table is marked as crashed and should be repaired

意思是表被标记为损坏,应进行修复

找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:

myisamchk -c -r ../data/tablename/xxx.MYI

然后重启mysql (记得要重启mysql!)

解决报错: [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.

可以先初始化datadir目录,处理办法,shell下执行:

$ mysql_install_db --user=mysql --datadir=/app/mysql/

innodb引擎frm文件被删除成为”孤表”的解决办法

直接删除’db/table1’表时提示出错。仔细观察数据目录db下,没有发现table1.frm文件。看来只是InnoDB 内部数据字典中存在该表,在数据文件中是缺少.frm文件的,也就是常常所说的“孤表”。

解决办法:

1.在另外一个数据库db2中创建一个与’db/table1’结构一样的表,把db2目录下的该表的table1.frm拷贝到目录db下。

2.现在你就可以进入数据库db下,删除该表table1了,删除后可以重建。

解决报错 PDOException: SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.

解决办法:

mysql> SHOW VARIABLES LIKE 'old_passwords';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| old_passwords | ON    |   ####这里表明开启了旧密码选项,旧密码方式认证对于有些客户端是不支持的,所以我们关闭它。
+---------------+-------+
1 row in set

### 接下来需要关闭旧密码

SET SESSION old_passwords=FALSE;
SET old_passwords=OFF;
SET PASSWORD = PASSWORD('mypasswd');

执行完以上三步就可以用客户端连接了。

mysql 5.1升级到mariab 10.1.30后报错 Cannot load from mysql.proc. The table is probably corrupted 解决办法

根据mysql手册,每次升级MySQL时,都应执行mysql_upgrade:

E:\Enviroment\Xampp_5.6.33\mysql\bin>mysql_upgrade.exe -u root -p
Enter password:
MySQL upgrade detected
Phase 1/7: Checking and upgrading mysql database
Processing databases
mysql
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
......
Phase 7/7: Running 'FLUSH PRIVILEGES'
OK

Ubuntu下mysql目录迁移导致无法启动问题解决

查看mysql错误日志会发现如下信息:

/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

解决办法:

把/etc/apparmor.d/usr.sbin.mysqld文件里 /var/lib/mysql/改成对应迁移后的路径 /mnt/HD2/mysql_data

vim /etc/apparmor.d/usr.sbin.mysqld

#/var/lib/mysql/ r,
#/var/lib/mysql/** rwk,
/mnt/HD2/mysql_data/ r,
/mnt/HD2/mysql_data/** rwk,

然后重新加载apparmor:

/etc/init.d/apparmor reload

最后启动mysql:

service mysql start

注:AppArmor 是一个类似于selinux 的东东,主要的作用是设置某个可执行程序的访问控制权限,可以限制程序 读/写某个目录/文件,打开/读/写网络端口等等。

some SQL

-- APP注册用户量:

SELECT count(*)+6000 FROM `users` WHERE group_id=3 and is_import=2;

-- APP下载量:

SELECT COUNT(*) FROM `app_downloads`;

-- 复购量(大于1次有购买行为的用户数量):

SELECT COUNT(*) FROM (SELECT user_id,COUNT(*) as buy_times FROM `orders` GROUP BY user_id HAVING count(*)>1) a;  

-- 有过购买行为的用户量:

SELECT COUNT(*) FROM (SELECT user_id,COUNT(*) as buy_times FROM `orders` GROUP BY user_id) a;

-- APP订单量:

SELECT COUNT(*) FROM `orders` WHERE import_type!=1;

-- APP成交总额(通过APP下单,已完成订单的成交总额):

SELECT SUM(sum_price) FROM `orders` WHERE import_type!=1 AND `status`=8;

MyBatis动态SQL

https://mp.weixin.qq.com/s/3erF19M9tQ5L-ZqaaAmxOg

https://www.cnblogs.com/homejim/p/9909657.html

SQL 语法速成手册

https://juejin.im/post/6844903790571700231

Docker日常笔记

安装

apt install docker.io
apt install docker-compose

使用国内加速源

默认情况下,Docker 会使用以下配置文件:

Linux: /etc/docker/daemon.json
Windows: C:\ProgramData\Docker\config\daemon.json

将镜像加速地址加入到你的Docker配置文件/etc/docker/daemon.json中

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

私有阿里源: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

quay.io等的国内镜像源记录

docker.io       docker.m.daocloud.io
gcr.io          gcr.m.daocloud.io
ghcr.io         ghcr.m.daocloud.io
k8s.gcr.io      k8s-gcr.m.daocloud.io
registry.k8s.io k8s.m.daocloud.io
quay.io         quay.m.daocloud.io

常见镜像仓库

docker.io:Docker Hub 官方镜像仓库,也是 Docker 默认的仓库
gcr.io、k8s.gcr.io:谷歌镜像仓库
quay.io:Red Hat 镜像仓库
ghcr.io:GitHub 镜像仓库

常见镜像源

中国区官方镜像: https://registry.docker-cn.com
中科大源: https://docker.mirrors.ustc.edu.cn
腾讯源: https://mirror.ccs.tencentyun.com
网易源: http://hub-mirror.c.163.com
中科大镜像地址:http://mirrors.ustc.edu.cn/
Azure中国镜像地址:http://mirror.azure.cn/
DockerHub镜像仓库: https://hub.docker.com/ 
RedHat镜像仓库: https://quay.io/repository/ 
RedHat镜像仓库: https://access.redhat.com/containers

配置1

{
  "registry-mirrors": ["https://reg-mirror.qiniu.com"]
}

配置2

{
	"registry-mirrors": ["https://registry.docker-cn.com","https://hub-mirror.c.163.com","https://docker.m.daocloud.io"]
}

Dockerfile

Debian替换国内源

RUN sed -i -r 's#http://deb.debian.org#https://mirrors.aliyun.com#g' /etc/apt/sources.list

Docker可视化工具

Portainer

创建一个Portainer专用的卷,然后在8000和9000端口创建容器并运行:

$ docker volume create portainer_data
$ docker run --name portainer -d -p 8000:8000 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

然后在浏览器打开对应地址。第一次运行的时候需要设置账号,然后选择要管理的Docker主机。

LazyDocker

LazyDocker是基于终端的一个可视化查询工具,支持键盘操作和鼠标点击。

Docker 卷管理

官方文档:https://docs.docker.com/storage/volumes/

CentOS 7 安装docker-ce

先去这里下载rpm包:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

然后安装:

yum install docker-ce-18.06.1.ce-3.el7.x86_64.rpm

docker-composer安装则根据官方推荐的方式安装:https://docs.docker.com/compose/install/#install-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

国内用户 kali-rolling 快速安装docker-ce

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add -
echo "deb https://mirrors.aliyun.com/docker-ce/linux/debian/ stretch stable" >> /etc/apt/sources.list
apt update 
apt install docker-ce

快速拉一个镜像下来

docker pull reg.qiniu.com/library/mongo

运行中容器配置位置

/var/lib/docker/containers/<conainerID>

运行示例:

docker run \
-p 5211:22 \
-p 5212:80 \
-p 5213:6379 \
-p 5214:443 \
-p 5215:21 \
-p 5216:23 \
-p 5217:3306 \
-p 5218:27017 \
-p 5219:9200 \
-p 5220:9300 \
-p 5221:5221 \
-p 5222:5222 \
-p 5223:5223 \
-e ROOT_PASS=password \
-e MYSQL_PASS=password \
-v /home/workspace/malu/docker/app:/app \
-h lamp \
--name lamp \
-d malu.me/malu/docker_lamp:master

参数说明:

-p   端口映射
-e   环境变量
-v   卷挂载点
-h   主机名
--name   容器名称
-d   后台运行

-P 参数: 将dockerfile中EXPOSE指令指定的端口(容器内端口)对本地宿主机公开,并随机绑定到本地宿主机的端口上。

部署示例

influxdb

docker run -p 8086:8086 -v /app/data/influxdb:/var/lib/influxdb2 influxdb

OLD

快速安装

apt-get -y install docker.io

升级Docker

sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
apt-get update
apt-get install lxc-docker

从本地提交镜像

1. 登录私有镜像仓库
docker login -u [用户名] -p [密码] -e [电子邮件] https://xxx.com
2. 给本地host的镜像打tag
docker tag [镜像ID] xxx.com/[用户名]/[镜像名称:标签]
3. 推送镜像到私有仓库
docker push xxx.com/[用户名]/[镜像名称:标签]

查看镜像

docker images

删除镜像

docker rmi [镜像名称:标签]

删除容器

docker rm [容器ID]
docker rm -f [容器ID]   #强制删除运行中的容器
docker ps -a -q|xarge docker rm   #删除所有不在运行的容器

拉取镜像

docker pull [镜像路径]

登录daocloud帐号:

docker login daocloud.io

运行镜像:

docker run -d -p [外网端口]:[镜像端口] -e [环境变量] [镜像ID]

查看运行中的docker:

docker ps

查看所有启动过的docker:

docker ps -a

停止/启动docker:

docker stop  [docker运行ID]
docker start [docker运行ID]

启动已经关闭的容器(以交互模式启动,有些没有守护的容器可以用这种方式启动)

docker start -ia [docker运行ID]

登录容器:

docker exec -it [container_id] /bin/bash

查看容器日志:

docker logs [docker运行ID]

查看容器运行信息:

docker inspect [docker运行ID]

查看容器资源占用信息:

docker stats [docker运行ID]

查看正在运行容器端口映射情况:

docker port NAME

添加新用户:

useradd -r -m -s /bin/bash

删除docker0网卡

虚拟网卡docker0其实是一个网桥,如果想删除它,只需要按照删除网桥的方法即可。

ifconfig docker0 down
brctl delbr docker0

docker0这个网桥是在启动Docker Daemon时创建的,因此,这种删除方法并不能根本上删除docker0,下次daemon启动(假设没有指定-b参数)时,又会自动创建docker0网桥。

在启动时不创建网桥:

docker -d --bridge=none 

开启docker远程API

1.编辑配置文件

vim /etc/default/docker

DOCKER_OPTS='-H unix:///var/run/docker.sock -H 0.0.0.0:5000'

比如我开放5000端口

2.重启docker

service docker restart

3.通过接口查看所有容器运行状态

http://localhost:5000/containers/json?all=1

更多接口使用,参考官方文档

给运行中容器添加端口:

获得容器IP,将container_name 换成实际环境中的容器名

docker inspect 'container_name' | grep IPAddress

iptable转发端口,将容器的8000端口映射到Docker主机的8001端口

iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.2:8000

查看iptables映射情况:

iptables -t nat -L

只查看DOCKER链并显示规则编号:

iptables -L DOCKER --line-numbers -n -t nat

删除(其中5就是规则编号):

iptables -D DOCKER 5 -t nat

也可以commit一个出来,再重新运行

docker commit 示例

docker commit [docker运行ID] reg.qiniu.com/malu/docker_base:ffmpeg-2

32位系统部署Docker

由于Docker Hub Registry上面的镜像都是64位的,所以这里需要自己做一个Ubuntu的镜像,这里使用import命令,该命令的官方解释为:Create a new filesystem image from the contents of a tarball.这里使用openVZ的模板来创建.

openVZ模板的下载地址为:http://openvz.org/Download/templates/precreated

执行导入:

wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz
cat ubuntu-14.04-x86-minimal.tar.gz | docker import - ubuntu:14.04

也可以直接导入:

docker import http://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz

接下来就可以运行了:

docker run -i -d ubuntu:14.04 -t /bin/bash

然后可以根据需要自己构建(进入Dockerfile目录):

docker build -t malu/docker_lamp .

基于32位的镜像生成新的镜像,期间如果构建出错可以修改Dockerfile再次构建,默认会调用缓存。

重命名镜像tag

docker run -d [镜像ID] -t /bin/bash    #先启动一个
docker commit -a 'aa' [容器ID] ubuntu:first    #然后把它提交成新镜像

这样就新生成了一个镜像:

root@ACER-mini:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              first               a70f0f795d4b        5 seconds ago       205.2 MB
ubuntu              14.04               65161a7b2077        3 hours ago         205.2 MB

当然上面的方法很傻,其实我们只要:

docker tag imageid name:tag   #新建tag
docker rmi name:oldtag    #删除原来tag

备份迁移

打包成tar

docker save -o filename.tar [镜像ID]

恢复打包文件

docker load -i filename.tar

重命名容器名:

root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE                 COMMAND               CREATED             STATUS                    PORTS                    NAMES
ec7d53c91621        70683c8feae9:latest   "/run.sh"             2 hours ago         Exited (64) 2 hours ago                            goofy_stallman      
0a3869ba2838        b9ec47bb8b8d:latest   "/run.sh"             22 hours ago        Up 2 hours                0.0.0.0:9221->9200/tcp   logstash            
3ad0379db41d        70683c8feae9:latest   "/run.sh"             25 hours ago        Exited (0) 25 hours ago                            cranky_rosalind     
6d829565caf4        f9aabae65d48:latest   "/usr/local/run.sh"   28 hours ago        Exited (0) 5 hours ago                             naughty_curie       
root@ubuntu:~# docker rename goofy_stallman one
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE                 COMMAND               CREATED             STATUS                    PORTS                    NAMES
ec7d53c91621        70683c8feae9:latest   "/run.sh"             2 hours ago         Exited (64) 2 hours ago                            one                 
0a3869ba2838        b9ec47bb8b8d:latest   "/run.sh"             22 hours ago        Up 2 hours                0.0.0.0:9221->9200/tcp   logstash            
3ad0379db41d        70683c8feae9:latest   "/run.sh"             25 hours ago        Exited (0) 25 hours ago                            cranky_rosalind     
6d829565caf4        f9aabae65d48:latest   "/usr/local/run.sh"   28 hours ago        Exited (0) 5 hours ago                             naughty_curie 

aufs文件系统安装

http://cloud.51cto.com/art/201412/461261.htm

生成requirements.txt文件:

pip install redis
pip freeze > requirements.txt

docker容器故障致无法启动解决办法

首先通过启动日志查看问题原因:

docker logs [docker运行ID]

然后根据问题,到启动数据/var/lib/docker/aufs/diff/路径下。

比如我遇到Nginx启动失败,那就查找nginx配置文件:

root@ubuntu:/var/lib/docker/aufs/diff# find ./ -name 'nginx.conf'
./399145668ccb628a0a9cc572431b93c17a72f84625d8430d9897fd46e572f4dd/etc/nginx/nginx.conf
./0609441079c15cc8214d1f55bdcdb270da9b94008e4432f81d98a96460f54f25/etc/nginx/nginx.conf

然后去修改对应问题。

参考文档:http://dockerpool.com/static/books/docker_practice/index.html

新浪SEC安装docker环境

以下是安装记录

yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum install docker-io

yum upgrade device-mapper-libs 

sudo groupadd docker

sudo usermod -a -G docker $USER 

service docker start

chkconfig docker on

docker -d

docker images

sudo docker info

建立网桥

docker network create -d bridge --gateway=192.168.0.1 --subnet=192.168.0.1/24 mybridge

docker-compose

快速安装:

pip install docker-compose

docker-compose.yml Example:

version: '2'
services:
        python:
                image: reg.qiniu.com/pub/docker_base:python-2
                ports:
                        - "50100:22"
                        - "52100-52200:5100-5200"
                volumes:
                        - /home/malu/python/app:/app
                container_name: python
                hostname: python
                command: 
                        - /bin/bash
                        - -c
                        - |
                          cron
                          /usr/sbin/sshd -D
networks:
  default:
    driver: bridge                
    ipam:                         
      driver: default           
      config:                       
        - subnet: 172.19.0.0/16

Docker的Web管理平台portainer (https://portainer.io) docker-compose.yml:

portainer:
  restart: always
  image: portainer/portainer
  ports:
    - "11110:9000"
  command: -H unix:///var/run/docker.sock
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ./data:/data
  container_name: portainer

Docker-registry仓库 docker-compose.yml:

registry:
  restart: always
  image: registry:2
  ports:
    - 11111:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/malu.me.crt
    REGISTRY_HTTP_TLS_KEY: /certs/malu.me.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - ./data:/var/lib/registry
    - ./certs:/certs
    - ./auth:/auth
  container_name: registry

Docker-registry仓库Web管理平台(https://github.com/mkuchin/docker-registry-web) docker-compose.yml:

registry-web:
    restart: always
    image: hyper/docker-registry-web
    ports:
      - 11112:8080
    volumes:
       - ./conf:/conf:ro
       - ./db:/data
    container_name: registry-web

conf/config.yml

registry:
   url: http://registry:5000/v2
   name: localhost:5000
   readonly: false
   auth:
     enabled: false

官方安装文档:https://docs.docker.com/compose/install/

安装:

curl -L --fail https://github.com/docker/compose/releases/download/1.14.0/run.sh > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

如果提示版本不匹配,docker最新版本安装

apt-get update
apt-get install -t wheezy-backports linux-image-amd64
curl -sSL https://get.docker.com/ | sh

docker-compose 命令

docker-compose up    # 重新构建并在 Compose 中运行应用
docker-compose up -d # 后台启动
docker-compose stop  # 停止
docker-compose down --volumes # 你可以停掉所有一切,使用 down 命令完全移除容器。传递 —volumes 还可以删除 Redis 容器中所使用的数据卷。

docker-compose其他标签:

cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /app

domainname: malu.me
hostname: malu
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true

restart: always

read_only: true
shm_size: 64M
stdin_open: true
tty: true

中文输入乱码,查看乱码解决

docker run env LANG=C.UTF-8 

然后在docker启动文件.bashrc里加上

export LC_ALL=C.UTF-8