[实践OK]Charles在mac上进行抓包分析, mac端的优秀抓包工具——Charles使用.Iphone7在Macbook发出的热点下实现投屏,用的是破解软件AirServer 7.2.6 [MacSKY].dmg。
Unix/LinuxC技术 jackxiang 2016-8-11 13:25
I: Windows10下的Charles的https抓包方法及原理/下载ssl/http证书:
https://www.cnblogs.com/Jerseyblog/p/16419865.html
实践发现本地Windows上安装的SSL证书情况:颁发给:Charles Proxy CA 颁发者:Charles Proxy CA 有效期从: 2000/1/1 到 2051/10/20
第一步:电脑安装SSL证书
选择 “Help” -> “SSL Proxying” -> “Install Charles Root Certificate”,如果设置了安全防护,会ranging输入系统的帐号密码。
会让你开始安装charles的证书操作;一路下一步即可;
第二步,配置SSL的抓取域名;
你可以单独配置,必须看到某个想要抓取的域名,点击导航栏Proxy按钮,点击“SSL proxying ,勾选Enable SLL Proxying,设置想要抓包的域名并进行勾选,再次访问就可以抓到了
======================================================================================
II:思考为何Charles能获取到Https包的原理:
https://zhuanlan.zhihu.com/p/67199487
接合小灰的一篇漫画终于让我看懂了HTTPS协议的学习笔记,来源:
https://mp.weixin.qq.com/s/WQ0MV_76t-DvtpFYv2NZqA
中间人虽然不知道小红的私钥是什么,但是在截获了小红的公钥Key1之后,却可以偷天换日,自己另外生成一对公钥私钥,把自己的公钥Key3发送给小灰。
小灰不知道公钥被偷偷换过,以为Key3就是小红的公钥。于是按照先前的流程,用Key3加密了自己生成的对称加密密钥Key2,发送给小红。
这一次通信再次被中间人截获,中间人先用自己的私钥解开了Key3的加密,获得Key2,然后再用当初小红发来的Key1重新加密,再发给小红。
这样一来,两个人后续的通信尽管用Key2做了对称加密,但是中间人已经掌握了Key2,所以可以轻松进行解密。
自己的总结:
https://jackxiang.com/post/10110/
再次高度总结:
1)那个Charles设置的图标点下出现的Proxies 8888,其代理IP就是MacBook上获取上网的IP(如果是inode分派的也就是Current IP address is 172.20.232.31:8888,在手机端设置连接上WIFI后的代理就用该IP及端口)。
2)这个热点上的服务器和这个上网的IP是一个网段。(自己发送的热点一般就在一个网段)
3)这个证书信任一个是Mac上的证书,一个是Iphone的都是一个东西和配置,得信任。(参考:一、MacBook上面安装Mac证书并设置信任)
经实践证明,MacBook连接物理网线开一个Wifi热点也是可以进行抓包的,也就是说苹果笔记本自己和苹果手机组成一个局域网了,而我们大部分人用的是同一个Wifi里进行通讯,而有的单位Wifi通讯要二次短信认证,像爱奇艺,所以不太太方便,而自己发出Wifi的代价是自己得有能上网的网线才行。
如何用Mac做热点的文章,在系统偏好设置里的->通用->共享->互联网共享->[V]WI-FI:【实践操作发现得打开wifi先关下,在互联网共享处打开,会提示找开wifi,就选打开,后在桌面的右上的wifi符号显示:互联网共享频道11】,实践还发现手机上的wifi热点关了,macbook上可以让它打开,能连接上。
非常重要:先关上wifi后,在通用中打开互联网共享,然后会将关的wifi打开,就成为共享热点了(否则不行)。
https://jingyan.baidu.com/article/c1465413e122700bfcfc4c31.html
在Mac里物理网卡的IP是:172.20.232.19 (Macbook里的系统偏好设置-》网络-》Belkin-》IP地址:172.20.232.19)
而热点发出后,手机获得的IP是:192.168.2.2. (在设置-》无线局域网-》点圈起来的i,也就是配置代理的地方上面有一个IPV4地址是192.168.2.2。
A connection attempt to Charles has been made from the host 192.168.2.2.
原理:Macbook连接Wifi时有一个IP地址,而你的手机Iphone也有一个IP地址,应该是同一个网段的,手机的Wifi上面设置代理到MacBook的IP及8888端口,这样Charles开的8888端口就能抓到。而证书需要Iphone信任,从一个叫chls.pro/ssl里面下载即可,安装后,要设置为要信证书,系统要信任这张证书。
当然,Fiddler2也有这个功能,手机apk访问接口调试之用Wifi热点抓https包工具Fiddler2查看请求参数及返回详解,如下:http://jackxiang.com/post/7757/
代理服务器(Proxy Server)是网上提供转接功能的服务器,在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,是直接联系到目的站点服务器,然后由目的站点服务器把信息传送回来。代理服务器是介于客户端和Web服务器之间的另一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。
http://my.oschina.net/u/2340880/blog/508688
Crack:
http://download.csdn.net/download/xieyupeng520/9342987
https://www.52pojie.cn/thread-725112-1-1.html
http://www.sd173.com/html/3774.html
一、MacBook上面安装Mac证书并设置信任:
1)安装抓包应用的证书:在 Charles 的菜单栏点击 help => SSL Proxying => Install Charles Root Certificate,在这儿添加证书,会要指纹识别得以安装。
2)设置信任安装的证书,作如下操作:
启动台(四个手指在触摸板上并笼调出)->其它->钥匙串访问 -》左侧两项:上是系统钥匙串选:
系统->右侧钥匙串访问->下面是种类选证书(所有项目、密码、安全备注、我的证书、密钥、证书)->选 证书->找到Charles证书(Charles Proxy CA (13 六月 2018, jackXsMacBook-Pro.local)),然后,双击信任(信任、细节)。在钥匙串中搜索 “ Charles ”找到证书,双击证书,并选择 始终信任:使用证书时:始终信任。
重装系统后:
sharingd想使用登录钥匙串
1 打开 钥匙串访问
2 清空 登录 钥匙串,这样会清空电脑保存的所有密码,想好了再操作
3 重启电脑 解决
二、Iphone手机系统上要信任这张证书:
通用-关于本机-证书信任设置:
受信任证书存储区版本 2018040200
针对根证书启用完全信任:
Charles Proxy CA(11 一月 2017,yolende...(打开)
注:在VPN与设备管理里可以移除这个刚通过网站安装的证书。
在iPhone上安装证书细节:
1)在iPhone上安装证书:在mac上保持 Charles 打开状态,iPhone 和 Mac处于同一网络中。在iPhone 的 Safari 中打开如下网址:
https://chls.pro/ssl # 注意:这块一定要在同一个网络,也就是IP局域网或者说是属于一个路由的Wifi下面且配置了Iphone手机的代理,(现在有安全提示选仍然访问)否则会不会弹出【此网站正尝试打开”设置"以向您显示一个配置描述文件。您要允许吗? 【忽略、允许】 ,说白了这个URL就是通过了MAC本的8888端口进而和这个端口相关的代理的Https罢了,也就是为何如果这个Iphone如果不设置代理到Mac的192.168.134.172 8888端口,则是不会出现弹出这个安装SSL证书的。
2)会弹出一个安装描述文件的弹窗询问师傅允许添加描述文件,点击允许,并安装证书。 #特别注意:两个保证才会提示安装SSL证书:一个网内,二是保证代理到了MAC本的192.168.134.172:8888端口。
IP 从哪和来的:
ifconfig|grep 192
inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
telnet 192.168.2.1 8888 #这台是Mac端的IP
Trying 192.168.2.1... ##配置连接2.1这台的8888时 charles会提示是否接受,选接受。
Connected to localhost.
Escape character is '^]'.
手机端IP是:192.168.2.15
3)在 iPhone 上信任证书
通用 = > 关于本机 => 证书信任设置 =>信任
三、Https抓包的乱码问题:
打开Charles,上方菜单栏 —-》Proxy —-》SSL Proxy Settings —-》Add,
Host:填*表示所有网站都抓
Port:443
点击OK,就不再乱码了,亲测。
来自:https://blog.csdn.net/a327369238/article/details/52856833
四、移除刚安装证书步骤:
查看或移除在设置-通用-描述文件-找到同名的-移除也是需要输入密码的。
在浏览器里安装证书参考(这块安装时候需要输入密码)才能安装成功:
https://www.jianshu.com/p/e8dd1091d6d7
From:https://www.jianshu.com/p/8825179786ac
五)安装Charles抓包破解版软件:
激活:下载地址:charles系列破解激活办法(最高charles4.2都可以激活)
// Charles Proxy License
// 适用于Charles任意版本的注册码,谁还会想要使用破解版呢。
// Charles 4.2目前是最新版,可用。
Registered Name: https://zhile.io
License Key: 48891cf209c6d32bf4
来自:https://blog.csdn.net/qq_25821067/article/details/79848589
Charles 在线破解工具:
请正确选择要破解的版本 建议安装使用最新版,官方下载地址 https://www.charlesproxy.com/download/
描述
此工具用于生成破解后的charles.jar文件,blog介绍: https://www.jianshu.com/p/46d29e60dd1b
用法
输入RegisterName(此名称随意,用于显示 Registered to xxx),选择本地已安装的版本,点击生成,并下载charles.jar文件
替换本地charles.jar文件
macOS: /Applications/Charles.app/Contents/Java/charles.jar
Windows: C:\Program Files\Charles\lib\charles.jar
https://www.zzzmode.com/mytools/charles/
Charles 4.2.5 破解:https://blog.zzzmode.com/2017/05/16/charles-4.0.2-cracked/
https://www.cnblogs.com/Jerseyblog/p/16419865.html
实践发现本地Windows上安装的SSL证书情况:颁发给:Charles Proxy CA 颁发者:Charles Proxy CA 有效期从: 2000/1/1 到 2051/10/20
第一步:电脑安装SSL证书
选择 “Help” -> “SSL Proxying” -> “Install Charles Root Certificate”,如果设置了安全防护,会ranging输入系统的帐号密码。
会让你开始安装charles的证书操作;一路下一步即可;
第二步,配置SSL的抓取域名;
你可以单独配置,必须看到某个想要抓取的域名,点击导航栏Proxy按钮,点击“SSL proxying ,勾选Enable SLL Proxying,设置想要抓包的域名并进行勾选,再次访问就可以抓到了
======================================================================================
II:思考为何Charles能获取到Https包的原理:
https://zhuanlan.zhihu.com/p/67199487
接合小灰的一篇漫画终于让我看懂了HTTPS协议的学习笔记,来源:
https://mp.weixin.qq.com/s/WQ0MV_76t-DvtpFYv2NZqA
中间人虽然不知道小红的私钥是什么,但是在截获了小红的公钥Key1之后,却可以偷天换日,自己另外生成一对公钥私钥,把自己的公钥Key3发送给小灰。
小灰不知道公钥被偷偷换过,以为Key3就是小红的公钥。于是按照先前的流程,用Key3加密了自己生成的对称加密密钥Key2,发送给小红。
这一次通信再次被中间人截获,中间人先用自己的私钥解开了Key3的加密,获得Key2,然后再用当初小红发来的Key1重新加密,再发给小红。
这样一来,两个人后续的通信尽管用Key2做了对称加密,但是中间人已经掌握了Key2,所以可以轻松进行解密。
自己的总结:
https://jackxiang.com/post/10110/
再次高度总结:
1)那个Charles设置的图标点下出现的Proxies 8888,其代理IP就是MacBook上获取上网的IP(如果是inode分派的也就是Current IP address is 172.20.232.31:8888,在手机端设置连接上WIFI后的代理就用该IP及端口)。
2)这个热点上的服务器和这个上网的IP是一个网段。(自己发送的热点一般就在一个网段)
3)这个证书信任一个是Mac上的证书,一个是Iphone的都是一个东西和配置,得信任。(参考:一、MacBook上面安装Mac证书并设置信任)
经实践证明,MacBook连接物理网线开一个Wifi热点也是可以进行抓包的,也就是说苹果笔记本自己和苹果手机组成一个局域网了,而我们大部分人用的是同一个Wifi里进行通讯,而有的单位Wifi通讯要二次短信认证,像爱奇艺,所以不太太方便,而自己发出Wifi的代价是自己得有能上网的网线才行。
如何用Mac做热点的文章,在系统偏好设置里的->通用->共享->互联网共享->[V]WI-FI:【实践操作发现得打开wifi先关下,在互联网共享处打开,会提示找开wifi,就选打开,后在桌面的右上的wifi符号显示:互联网共享频道11】,实践还发现手机上的wifi热点关了,macbook上可以让它打开,能连接上。
非常重要:先关上wifi后,在通用中打开互联网共享,然后会将关的wifi打开,就成为共享热点了(否则不行)。
https://jingyan.baidu.com/article/c1465413e122700bfcfc4c31.html
在Mac里物理网卡的IP是:172.20.232.19 (Macbook里的系统偏好设置-》网络-》Belkin-》IP地址:172.20.232.19)
而热点发出后,手机获得的IP是:192.168.2.2. (在设置-》无线局域网-》点圈起来的i,也就是配置代理的地方上面有一个IPV4地址是192.168.2.2。
A connection attempt to Charles has been made from the host 192.168.2.2.
原理:Macbook连接Wifi时有一个IP地址,而你的手机Iphone也有一个IP地址,应该是同一个网段的,手机的Wifi上面设置代理到MacBook的IP及8888端口,这样Charles开的8888端口就能抓到。而证书需要Iphone信任,从一个叫chls.pro/ssl里面下载即可,安装后,要设置为要信证书,系统要信任这张证书。
当然,Fiddler2也有这个功能,手机apk访问接口调试之用Wifi热点抓https包工具Fiddler2查看请求参数及返回详解,如下:http://jackxiang.com/post/7757/
代理服务器(Proxy Server)是网上提供转接功能的服务器,在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,是直接联系到目的站点服务器,然后由目的站点服务器把信息传送回来。代理服务器是介于客户端和Web服务器之间的另一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。
http://my.oschina.net/u/2340880/blog/508688
Crack:
http://download.csdn.net/download/xieyupeng520/9342987
https://www.52pojie.cn/thread-725112-1-1.html
http://www.sd173.com/html/3774.html
一、MacBook上面安装Mac证书并设置信任:
1)安装抓包应用的证书:在 Charles 的菜单栏点击 help => SSL Proxying => Install Charles Root Certificate,在这儿添加证书,会要指纹识别得以安装。
2)设置信任安装的证书,作如下操作:
启动台(四个手指在触摸板上并笼调出)->其它->钥匙串访问 -》左侧两项:上是系统钥匙串选:
系统->右侧钥匙串访问->下面是种类选证书(所有项目、密码、安全备注、我的证书、密钥、证书)->选 证书->找到Charles证书(Charles Proxy CA (13 六月 2018, jackXsMacBook-Pro.local)),然后,双击信任(信任、细节)。在钥匙串中搜索 “ Charles ”找到证书,双击证书,并选择 始终信任:使用证书时:始终信任。
重装系统后:
sharingd想使用登录钥匙串
1 打开 钥匙串访问
2 清空 登录 钥匙串,这样会清空电脑保存的所有密码,想好了再操作
3 重启电脑 解决
二、Iphone手机系统上要信任这张证书:
通用-关于本机-证书信任设置:
受信任证书存储区版本 2018040200
针对根证书启用完全信任:
Charles Proxy CA(11 一月 2017,yolende...(打开)
注:在VPN与设备管理里可以移除这个刚通过网站安装的证书。
在iPhone上安装证书细节:
1)在iPhone上安装证书:在mac上保持 Charles 打开状态,iPhone 和 Mac处于同一网络中。在iPhone 的 Safari 中打开如下网址:
https://chls.pro/ssl # 注意:这块一定要在同一个网络,也就是IP局域网或者说是属于一个路由的Wifi下面且配置了Iphone手机的代理,(现在有安全提示选仍然访问)否则会不会弹出【此网站正尝试打开”设置"以向您显示一个配置描述文件。您要允许吗? 【忽略、允许】 ,说白了这个URL就是通过了MAC本的8888端口进而和这个端口相关的代理的Https罢了,也就是为何如果这个Iphone如果不设置代理到Mac的192.168.134.172 8888端口,则是不会出现弹出这个安装SSL证书的。
2)会弹出一个安装描述文件的弹窗询问师傅允许添加描述文件,点击允许,并安装证书。 #特别注意:两个保证才会提示安装SSL证书:一个网内,二是保证代理到了MAC本的192.168.134.172:8888端口。
IP 从哪和来的:
ifconfig|grep 192
inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
telnet 192.168.2.1 8888 #这台是Mac端的IP
Trying 192.168.2.1... ##配置连接2.1这台的8888时 charles会提示是否接受,选接受。
Connected to localhost.
Escape character is '^]'.
手机端IP是:192.168.2.15
3)在 iPhone 上信任证书
通用 = > 关于本机 => 证书信任设置 =>信任
三、Https抓包的乱码问题:
打开Charles,上方菜单栏 —-》Proxy —-》SSL Proxy Settings —-》Add,
Host:填*表示所有网站都抓
Port:443
点击OK,就不再乱码了,亲测。
来自:https://blog.csdn.net/a327369238/article/details/52856833
四、移除刚安装证书步骤:
查看或移除在设置-通用-描述文件-找到同名的-移除也是需要输入密码的。
在浏览器里安装证书参考(这块安装时候需要输入密码)才能安装成功:
https://www.jianshu.com/p/e8dd1091d6d7
From:https://www.jianshu.com/p/8825179786ac
五)安装Charles抓包破解版软件:
激活:下载地址:charles系列破解激活办法(最高charles4.2都可以激活)
// Charles Proxy License
// 适用于Charles任意版本的注册码,谁还会想要使用破解版呢。
// Charles 4.2目前是最新版,可用。
Registered Name: https://zhile.io
License Key: 48891cf209c6d32bf4
来自:https://blog.csdn.net/qq_25821067/article/details/79848589
Charles 在线破解工具:
请正确选择要破解的版本 建议安装使用最新版,官方下载地址 https://www.charlesproxy.com/download/
描述
此工具用于生成破解后的charles.jar文件,blog介绍: https://www.jianshu.com/p/46d29e60dd1b
用法
输入RegisterName(此名称随意,用于显示 Registered to xxx),选择本地已安装的版本,点击生成,并下载charles.jar文件
替换本地charles.jar文件
macOS: /Applications/Charles.app/Contents/Java/charles.jar
Windows: C:\Program Files\Charles\lib\charles.jar
https://www.zzzmode.com/mytools/charles/
Charles 4.2.5 破解:https://blog.zzzmode.com/2017/05/16/charles-4.0.2-cracked/
IP地址漂移技术-全部重启后好了。
Unix/LinuxC技术 jackxiang 2016-8-10 11:27
背景:阿里私有云呐,出现Agent异常,查各种配置均没有问题,后把EDAS的agent服务器均重启了又好了(重启6台中的一台还是有问题),东软哥们问阿里说是给他来了句,叫什么地址漂移,不知道什么鬼高科技。查一下了解了解。
采用地址漂移技术,利用虚拟IP地址来绑定主服务器,可有效解决不能利用组播的情况下,多台服务器集群之间的信息交互问题。此方法具有一定的代表性,在很多行业可以采用。 双机集群方式广泛应用于各级航空飞行管制中心,两台中心服务器通过网络构成一套高可靠性双机热备份系统,同步工作、互为备份,当主机发生故障时,自动切换到备机工作,系统不间断运行。而地址漂移技术是当其中一台主机有故障时,另一主机接管故障主机的网络IP地址,使网络仍能正常运行。
三是采用地址漂移技术,给管制中心分配一个航空管制中心虚拟IP 地址,航空管制中心之间传递情报采用此IP地址,然后由各航空管制中心的主服务器与此IP地址绑定,负责接收和发送情报。同时在主服务器启动一个三通进 程,所谓三通进程是指此进程负责接收信息,然后将收到的信息分别转发到集群内两台服务器,类似于水龙头的三通,因此称之为三通进程。主服务器收到一份情报 后,送往局域网内主服务器和备服务器的接收进程。当主机切换为备机时,此服务器卸载此虚拟IP地址,切换为主机的服务器加载虚拟IP地址,并启用三通进程 负责接收和分发情报。虚拟IP地址在主备服务器之间漂移,也称之为地址漂移技术,目前很多集群软件也采用此技术来解决集群内多台计算机只有惟一IP地址的 问题。
文中有说ARP+Socket实现的。详情如下:
阅读全文
采用地址漂移技术,利用虚拟IP地址来绑定主服务器,可有效解决不能利用组播的情况下,多台服务器集群之间的信息交互问题。此方法具有一定的代表性,在很多行业可以采用。 双机集群方式广泛应用于各级航空飞行管制中心,两台中心服务器通过网络构成一套高可靠性双机热备份系统,同步工作、互为备份,当主机发生故障时,自动切换到备机工作,系统不间断运行。而地址漂移技术是当其中一台主机有故障时,另一主机接管故障主机的网络IP地址,使网络仍能正常运行。
三是采用地址漂移技术,给管制中心分配一个航空管制中心虚拟IP 地址,航空管制中心之间传递情报采用此IP地址,然后由各航空管制中心的主服务器与此IP地址绑定,负责接收和发送情报。同时在主服务器启动一个三通进 程,所谓三通进程是指此进程负责接收信息,然后将收到的信息分别转发到集群内两台服务器,类似于水龙头的三通,因此称之为三通进程。主服务器收到一份情报 后,送往局域网内主服务器和备服务器的接收进程。当主机切换为备机时,此服务器卸载此虚拟IP地址,切换为主机的服务器加载虚拟IP地址,并启用三通进程 负责接收和分发情报。虚拟IP地址在主备服务器之间漂移,也称之为地址漂移技术,目前很多集群软件也采用此技术来解决集群内多台计算机只有惟一IP地址的 问题。
文中有说ARP+Socket实现的。详情如下:
阅读全文
redis默认记录超过10000us的命令,默认保留128条慢查询日志。
Cache与Store jackxiang 2016-8-9 14:35
Redis的慢日志是一个系统记录了超出规定的执行时间查询。执行时间不包括I/O操作,比如与客户会话,发送回复等等,只是实际执行的命令(这就是线程被阻塞而无法执行命令的唯一阶段所需的时间为在此期间其他请求)。可以用两个参数来配置的慢日志:slowlog-log-slower-than告诉Redis是什么的执行时间,以微秒为单位,以超过为获得记录的命令。需要注意的是负数禁用慢日志,而零值强制每个命令的记录。slowlog-max-len是慢日志的长度。最小值是零。当一个新的命令被记录和慢日志已处于其最大长度时,最早的一个是从记录的命令队列中移出以腾出空间。该配置可以通过编辑redis.conf完成或当服务器使用CONFIG GET和Config中设置的命令运行。
一、Redis默认记录超过10000us的命令:
10.64.*.54:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
二、默认保留128条慢查询日志:
10.64.*.54:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
三、慢查询日志查询,2条:
[root@rh08 ~]# redis-cli -h 10.64.*.54
10.64.6.54:6379> slowlog get 2
1) 1) (integer) 2
2) (integer) 1470219973
3) (integer) 36910
4) 1) "info"
2) 1) (integer) 1
2) (integer) 1469739564
3) (integer) 14997
4) 1) "save"
一、Redis默认记录超过10000us的命令:
10.64.*.54:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
二、默认保留128条慢查询日志:
10.64.*.54:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
三、慢查询日志查询,2条:
[root@rh08 ~]# redis-cli -h 10.64.*.54
10.64.6.54:6379> slowlog get 2
1) 1) (integer) 2
2) (integer) 1470219973
3) (integer) 36910
4) 1) "info"
2) 1) (integer) 1
2) (integer) 1469739564
3) (integer) 14997
4) 1) "save"
知识只求寻常实用。在众人面前,即使你具有非凡的才智也要装作不知。人的思维方式各异,就像人的胃口一样。不要作古人的深沉,但要和今人同味。要注意人数的多寡,这是最要紧的。要想出人头地,先得在品味上随大流。即使过去更令人倾心,明智的人也会努力适应现时而调整自己,不论是在思想的包装还是在身体的包装方面。这一法则可放之四海,只有善字除外,因为人需要时时行善。许多东西看似陈旧古板,比如讲真话,守诺言。善良的人看起来属于美好的过去,但却常受人爱戴。这种人虽有,却非常稀少,人们多半不仿效他们。如果一个时代里恶意盛行,善行难觅,那该是何等可悲的时代!明智之人只是尽力自保,纵使不能尽如心愿。希望他们乐意接收命运所赐而不是向命运讨要!
一个很难的是“知行合一”。学知识很容易,但是把知道的东西做出来,并且做出来的东西让别人喜欢,是多么地难。所以我经常不好意思地说,不是我很狂,我看到学者专家讲评的时候,说说我比他还会说,但做起来很难。知行合一是企业家非常难做到的东西。
学知识很容易,但是把知道的东西做出来,并且做出来的东西让别人喜欢,是多么地难。
说我比他还会说,但做起来很难。知行合一是咱们面前非常难做到的一个东西,加油吧。
学知识很容易,但是把知道的东西做出来,并且做出来的东西让别人喜欢,是多么地难。
说我比他还会说,但做起来很难。知行合一是咱们面前非常难做到的一个东西,加油吧。
像discuz论坛啥的, 要是楼数多,分页发现有这个问题,导致mysql的cpu负载较高,分页需要优化,如limit 222222,20,从20万以上取这样的。
再说是对mysql的INNODB引擎进行分区,以提高mysql的性能:
资料:
【分页查询时如何优化MySQL的性能?必藏】
http://toutiao.com/group/6303291874997141762/?iid=4621176401&app=news_article&tt_from=android_share&utm_medium=toutiao_android&utm_campaign=client_share
MySQL架构优化实战系列3:定时计划任务与表分区:
http://sc.qq.com/fx/u?r=BHE7tkA
MySQL架构优化实战系列2:主从复制同步与查询性能调优:
http://blog.csdn.net/huaweitman/article/details/51822082
MySQL架构优化实战系列1:数据类型与索引调优全解析:
http://udn.yyuap.com/article-11729.html
再说是对mysql的INNODB引擎进行分区,以提高mysql的性能:
资料:
【分页查询时如何优化MySQL的性能?必藏】
http://toutiao.com/group/6303291874997141762/?iid=4621176401&app=news_article&tt_from=android_share&utm_medium=toutiao_android&utm_campaign=client_share
MySQL架构优化实战系列3:定时计划任务与表分区:
http://sc.qq.com/fx/u?r=BHE7tkA
MySQL架构优化实战系列2:主从复制同步与查询性能调优:
http://blog.csdn.net/huaweitman/article/details/51822082
MySQL架构优化实战系列1:数据类型与索引调优全解析:
http://udn.yyuap.com/article-11729.html
背景:公司发的本本发现关闭Alt+F4,需要加上Fn键盘,那个音量键盘,默认就是F3即可,这产品设计得是为用户,不是为开发的呀,得修改。
thinkpad X250笔记本ALT+F4组合键不能用 只能FN+ALT+F4:
这款笔记本要使用 F1 - F12 功能,需要同时按 Fn 键和所需的功能键;
这是默认设置。要更改默认设置,方法如下。
笔记本开机之后在品牌LOGO画面按F2,进入到BIOS设置界面。
从 BIOS Setup Utility 菜单中选择 Config。
从Keyboard/Mouse 子菜单中找到Fn Key Lock:禁用 Fn 键锁定即可。
实践发现有一项是F1-F12什么的给Enable,好像就好了。
实际怎么弄的呢?步骤如下:
1.开机进入时,按F12,不是F2,也不是del,进入到一个界面。这个界面好像又是一个tab的,如下:
Boot Menu | App Menu --》 Setup
2.Config->Keyboard/Mouse->F1-F12 as Primary Function [enable], 这下Al+F4,就能使用了,不用按FN这个键了。
thinkpad X250笔记本ALT+F4组合键不能用 只能FN+ALT+F4:
这款笔记本要使用 F1 - F12 功能,需要同时按 Fn 键和所需的功能键;
这是默认设置。要更改默认设置,方法如下。
笔记本开机之后在品牌LOGO画面按F2,进入到BIOS设置界面。
从 BIOS Setup Utility 菜单中选择 Config。
从Keyboard/Mouse 子菜单中找到Fn Key Lock:禁用 Fn 键锁定即可。
实践发现有一项是F1-F12什么的给Enable,好像就好了。
实际怎么弄的呢?步骤如下:
1.开机进入时,按F12,不是F2,也不是del,进入到一个界面。这个界面好像又是一个tab的,如下:
Boot Menu | App Menu --》 Setup
2.Config->Keyboard/Mouse->F1-F12 as Primary Function [enable], 这下Al+F4,就能使用了,不用按FN这个键了。
背景:经常看到为了省流量出现js代码或css代码经过了压缩,怎么不用工具,直接在浏览器里看呢?如下 巧用Chrome格式化压缩后的js文件。
实践如下:F12->Source->左侧找到找看的js->选中js->选中后右侧有一个line1、column1-> 在它的左边有一个花括号->于是就会变成格式化正常可看代码。
———————————————————————————————————————————————————————————————————
按下快捷键F12,或者Ctrl+Shift+I
我们点击Sources中的一个百度Javascript代码文件。
可以看出,这些代码是经过压缩的。如果直接阅读这一块代码,很快就会感到理解困难了。
我们点击下方的大括号{}图标,即可使用Pretty Print功能了。
来自:http://blog.csdn.net/yenange/article/details/7162405
实践如下:F12->Source->左侧找到找看的js->选中js->选中后右侧有一个line1、column1-> 在它的左边有一个花括号->于是就会变成格式化正常可看代码。
———————————————————————————————————————————————————————————————————
按下快捷键F12,或者Ctrl+Shift+I
我们点击Sources中的一个百度Javascript代码文件。
可以看出,这些代码是经过压缩的。如果直接阅读这一块代码,很快就会感到理解困难了。
我们点击下方的大括号{}图标,即可使用Pretty Print功能了。
来自:http://blog.csdn.net/yenange/article/details/7162405
[实践OK]Linux下如何用sync复制也就是同步2个位于【本地磁盘和移动硬盘或U盘usb或远程服务器上】文件夹中的所有内容
Unix/LinuxC技术 jackxiang 2016-7-29 16:44
背景:如果一个文件目录很大且需要定时同步,怎么办,linux下有一个rsync,同步到的可能是本地,更多是同步到把nas给mount上来的一个网络超大磁盘,这就很有用了。
/usr/bin/rsync -avh /backup/yum.xxxx.com /data/www
rsync -avh #备注:只是增量同步,远端有不一样的文件,它不会自动删除。
rsync -avh --delete gliethttp/ /media/udisk/gliethttp
其中gliethttp/为src这里的结尾/很重要,这表示同步的是gliethttp/目录中的内容,而不是gliethttp目录本身.
/media/udisk/gliethttp为dst
表示将src中的内容与dst进行严格同步,如果dst不存在,那么创建之.
-r 表示递归目录
-t 表示保留时间
-l 表示保留符号链接
我们也可以使用ssh辅助rsync远程同步文件夹
luther@gliethttp:~$ rsync -avh --delete luther@127.0.0.1:/media/udisk/gliethttp/ gliethttp.local
默认使用ssh远程登录luther用户,然后使用ssh加密通道进行数据传输,同步/media/udisk/gliethttp/文件夹中的内容到本地的gliethttp.local目录下
网上有通过配置/etc/rsyncd.conf来设置访问权限,个人感觉很不安全,远远不如使用成熟的ssh进行数据加密,对于用户认证,可以将生成的.ssh对应的key发布出去,这样就不用每次输入密码了[luther.gliethttp]
《windows登陆远程Linux主机的一种途径putty-详细安装使用过程》
下面看看如何创建key
1. luther@gliethttp:~$ ssh-keygen -t rsa
2. 将~/.ssh/id_rsa.pub改名为/root/.ssh/authorized_keys
3. 将私钥~/.ssh/id_rsa拷贝到远程客户端的~/.ssh/目录下
当然可以安装rsync的GUI版本grsync
luther@gliethttp:~$ sudo apt-get install grsync
来自:http://blog.chinaunix.net/uid-20564848-id-74200.html
/usr/bin/rsync -avh /backup/yum.xxxx.com /data/www
rsync -avh #备注:只是增量同步,远端有不一样的文件,它不会自动删除。
rsync -avh --delete gliethttp/ /media/udisk/gliethttp
其中gliethttp/为src这里的结尾/很重要,这表示同步的是gliethttp/目录中的内容,而不是gliethttp目录本身.
/media/udisk/gliethttp为dst
表示将src中的内容与dst进行严格同步,如果dst不存在,那么创建之.
-r 表示递归目录
-t 表示保留时间
-l 表示保留符号链接
我们也可以使用ssh辅助rsync远程同步文件夹
luther@gliethttp:~$ rsync -avh --delete luther@127.0.0.1:/media/udisk/gliethttp/ gliethttp.local
默认使用ssh远程登录luther用户,然后使用ssh加密通道进行数据传输,同步/media/udisk/gliethttp/文件夹中的内容到本地的gliethttp.local目录下
网上有通过配置/etc/rsyncd.conf来设置访问权限,个人感觉很不安全,远远不如使用成熟的ssh进行数据加密,对于用户认证,可以将生成的.ssh对应的key发布出去,这样就不用每次输入密码了[luther.gliethttp]
《windows登陆远程Linux主机的一种途径putty-详细安装使用过程》
下面看看如何创建key
1. luther@gliethttp:~$ ssh-keygen -t rsa
2. 将~/.ssh/id_rsa.pub改名为/root/.ssh/authorized_keys
3. 将私钥~/.ssh/id_rsa拷贝到远程客户端的~/.ssh/目录下
当然可以安装rsync的GUI版本grsync
luther@gliethttp:~$ sudo apt-get install grsync
来自:http://blog.chinaunix.net/uid-20564848-id-74200.html
DokuWiki 升级方法
diff -ruN /data/htdocs/wiki.jackxiang.com/ dokuwiki/ > wiki.diff
cp -Rf /data/htdocs/wiki.jackxiang.com /data/backup/wiki.jackxiang.com.backup.2016.7.28
cd /data/htdocs/wiki.jackxiang.com
patch -p1 < /tmp/doukuwiki/wiki.diff --dry-run
patch -p1 < /tmp/doukuwiki/wiki.diff
yes|cp -Rf /data/backup/wiki.jackxiang.com.backup.2016.7.28/conf/* ./conf/.
yes|cp -Rf /data/backup/wiki.jackxiang.com.backup.2016.7.28/data/* ./data/.
chmod -R 755 /data/htdocs/wiki.jackxiang.com/data/
---------------------------------------------------------------------------------------------------------
说明:Dokuwiki Install Path:~/public_html/wiki
1、先确认目前所使用的版本号:
$cd ~/public_html/wiki
$cat VERSION
2009-02-14b
2、官网下载最新版本版本进行差异对比:
点击查看: http://www.splitbrain.org/projects/dokuwiki
$mkdir src
$cd src
$wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2009-02-14b.tgz
$wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2009-12-25c.tgz
$tar zxvf dokuwiki-2009-02-14b.tgz
$tar zxvf dokuwiki-2009-12-25c.tgz
$diff -Nauf dokuwiki-2009-02-14 dokuwiki-2009-12-25 > wiki.diff
3、二次确保安全,先做好原数据的备份工作:
$cd ~/public_html
$tar -zcvf src/wiki.tar.gz wiki/
4、最后靠谱过渡升级:
$cd ~/pubilic_html/wiki
$patch -p1 < ~/public_html/src/wiki.diff --dry-run //测试升级
$patch -p1 < ~/public_html/src/wiki.diff //正式升级
5、确认无误后即可清除废墟:
$rm -rf ~/public_html/src
参考资料:
官方指南: http://www.dokuwiki.org/zh:install:upgrade
本文来自:http://www.pythonclub.org/dokuwiki/upgrade
diff -ruN /data/htdocs/wiki.jackxiang.com/ dokuwiki/ > wiki.diff
cp -Rf /data/htdocs/wiki.jackxiang.com /data/backup/wiki.jackxiang.com.backup.2016.7.28
cd /data/htdocs/wiki.jackxiang.com
patch -p1 < /tmp/doukuwiki/wiki.diff --dry-run
patch -p1 < /tmp/doukuwiki/wiki.diff
yes|cp -Rf /data/backup/wiki.jackxiang.com.backup.2016.7.28/conf/* ./conf/.
yes|cp -Rf /data/backup/wiki.jackxiang.com.backup.2016.7.28/data/* ./data/.
chmod -R 755 /data/htdocs/wiki.jackxiang.com/data/
---------------------------------------------------------------------------------------------------------
说明:Dokuwiki Install Path:~/public_html/wiki
1、先确认目前所使用的版本号:
$cd ~/public_html/wiki
$cat VERSION
2009-02-14b
2、官网下载最新版本版本进行差异对比:
点击查看: http://www.splitbrain.org/projects/dokuwiki
$mkdir src
$cd src
$wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2009-02-14b.tgz
$wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2009-12-25c.tgz
$tar zxvf dokuwiki-2009-02-14b.tgz
$tar zxvf dokuwiki-2009-12-25c.tgz
$diff -Nauf dokuwiki-2009-02-14 dokuwiki-2009-12-25 > wiki.diff
3、二次确保安全,先做好原数据的备份工作:
$cd ~/public_html
$tar -zcvf src/wiki.tar.gz wiki/
4、最后靠谱过渡升级:
$cd ~/pubilic_html/wiki
$patch -p1 < ~/public_html/src/wiki.diff --dry-run //测试升级
$patch -p1 < ~/public_html/src/wiki.diff //正式升级
5、确认无误后即可清除废墟:
$rm -rf ~/public_html/src
参考资料:
官方指南: http://www.dokuwiki.org/zh:install:upgrade
本文来自:http://www.pythonclub.org/dokuwiki/upgrade
Web端PHP代码函数覆盖率测试解决方案
Php/Js/Shell/Go jackxiang 2016-7-28 14:45
背景:在拿代码量算KPI...跟程序员来这一套。--西乔漫画。IT部门谈到:马上部署代码覆盖测试,PHP这块有查了一下还真有类似的工具。
Web端PHP代码函数覆盖率测试解决方案:
主要是结合xdebug和Spike PHPCoverage这两个工具进行统计:
原创网址:http://blog.csdn.net/httpnet/article/details/1707377
辅助参考:
http://www.cnblogs.com/xuning/archive/2015/11/09/4950110.html
http://blog.jobbole.com/97236/
Web端PHP代码函数覆盖率测试解决方案:
主要是结合xdebug和Spike PHPCoverage这两个工具进行统计:
原创网址:http://blog.csdn.net/httpnet/article/details/1707377
辅助参考:
http://www.cnblogs.com/xuning/archive/2015/11/09/4950110.html
http://blog.jobbole.com/97236/
我是win10:
win8上安装tortoisegit1.8.12 64位时无法安装,报2503错误。查资料,经测试后可以安装。
这是Win8系统的权限问题,可以如下解决:
1.运行CMD(管理员权限):
在桌面直接使用 WIN+X 组合键 在弹出菜单目录中选择 运行命令提示符(管理员) ;
也可以在桌面直接使用 WIN+X+A 组合键操作;
2.输入以下命令: msiexec /package "你安装程序包的路径"(例如:msiexec /package "d:\soft\TortoiseGit-1.8.12.0-64bit.msi" )
msiexec /package "E:\download\TortoiseGit-2.2.0.0-32bit.msi“
From:http://www.bubuko.com/infodetail-1022395.html
win8上安装tortoisegit1.8.12 64位时无法安装,报2503错误。查资料,经测试后可以安装。
这是Win8系统的权限问题,可以如下解决:
1.运行CMD(管理员权限):
在桌面直接使用 WIN+X 组合键 在弹出菜单目录中选择 运行命令提示符(管理员) ;
也可以在桌面直接使用 WIN+X+A 组合键操作;
2.输入以下命令: msiexec /package "你安装程序包的路径"(例如:msiexec /package "d:\soft\TortoiseGit-1.8.12.0-64bit.msi" )
msiexec /package "E:\download\TortoiseGit-2.2.0.0-32bit.msi“
From:http://www.bubuko.com/infodetail-1022395.html
linux下面误删root里面的文件夹 恢复方法~~
Unix/LinuxC技术 jackxiang 2016-7-25 11:19
背景:删除文件时吧 /root/ 里面的文件删除了.过程如下:
[root@localhost x86_64]# ll
total 534136
-rwxr-xr-x 1 www www 6227876 May 4 13:45 amoeba-2.1.0-160504134426.el6.x86_64.rpm
-rwxr-xr-x 1 www www 149892 Apr 26 18:11 apcu-php56-4.0.11-160426181109.el6.x86_64.rpm
-rwxr-xr-x 1 www www 114160 May 5 11:12 apcu-php70-5.1.3-160505111247.el6.x86_64.rpm
-rwxr-xr-x 1 www www 25338712 May 27 15:40 berkeleydb-6.2.23-160527153833.el6.x86_64.rpm
-rwxr-xr-x 1 www www 27203008 Jun 23 14:57 elasticsearch-2.3.3-160623145745.el6.noarch.rpm
drwx------ 3 root root 4096 Jul 15 15:20 $HOME
rm -Rf '$HOME'
[root@localhost x86_64]# rm -Rf $HOME
[root@localhost x86_64]# echo $HOME
/root
[root@localhost /]# ls /root
ls: cannot access /root: No such file or directory
cd /data/www/yum/centos/7/x86_64
rm -Rf usr
rm -Rf lib
rm -Rf lib64
rm -Rf boot
rm -Rf data
rm -Rf dev
rm -Rf etc
rm -Rf home
rm -Rf '$HOME'
rm -Rf lost+found
rm -Rf media
rm -Rf mnt
rm -Rf opt
rm -Rf proc
rm -Rf repodata
rm -Rf root
rm -Rf root_901
rm -Rf run
rm -Rf sbin
rm -Rf srv
rm -Rf sys
rm -Rf tmp
rm -Rf usr
rm -Rf zabbix
rm -rf bin
rm -Rf selinux software var
rm -Rf lamp
rm -Rf scp.sh screenquit.sh temp.retry web.retry mysql.retry mountIrdcBackUp.sh irdcops.retry install.sh install.log.syslog install.log id_rsa debug.retry crontab_ntpdate anaconda-ks.cfg monitor.sh
rm -Rf a getip
============================================================
解决办法:
.mkdir /root
cp -a /etc/skel/.[!.]* /root
主要是吧 /etc/skel/里面的文件拷贝回去就行了~~~哈..
cp -r /etc/skel/.bash
.bash_logout .bash_profile .bashrc
法一:
cp -a /etc/skel/.[!.]* /root
chown -R root /root
chmod -R 700 /root
法二:从别的linux上拷贝一个root过来,后面删除时注意一下:
带你飞(39345****) 11:37:21
@回忆未来-向东-Jàck rm '$HOME'
加个引号就行了
参考:http://blog.csdn.net/wlqf366/article/details/50081389
[root@localhost x86_64]# ll
total 534136
-rwxr-xr-x 1 www www 6227876 May 4 13:45 amoeba-2.1.0-160504134426.el6.x86_64.rpm
-rwxr-xr-x 1 www www 149892 Apr 26 18:11 apcu-php56-4.0.11-160426181109.el6.x86_64.rpm
-rwxr-xr-x 1 www www 114160 May 5 11:12 apcu-php70-5.1.3-160505111247.el6.x86_64.rpm
-rwxr-xr-x 1 www www 25338712 May 27 15:40 berkeleydb-6.2.23-160527153833.el6.x86_64.rpm
-rwxr-xr-x 1 www www 27203008 Jun 23 14:57 elasticsearch-2.3.3-160623145745.el6.noarch.rpm
drwx------ 3 root root 4096 Jul 15 15:20 $HOME
rm -Rf '$HOME'
[root@localhost x86_64]# rm -Rf $HOME
[root@localhost x86_64]# echo $HOME
/root
[root@localhost /]# ls /root
ls: cannot access /root: No such file or directory
cd /data/www/yum/centos/7/x86_64
rm -Rf usr
rm -Rf lib
rm -Rf lib64
rm -Rf boot
rm -Rf data
rm -Rf dev
rm -Rf etc
rm -Rf home
rm -Rf '$HOME'
rm -Rf lost+found
rm -Rf media
rm -Rf mnt
rm -Rf opt
rm -Rf proc
rm -Rf repodata
rm -Rf root
rm -Rf root_901
rm -Rf run
rm -Rf sbin
rm -Rf srv
rm -Rf sys
rm -Rf tmp
rm -Rf usr
rm -Rf zabbix
rm -rf bin
rm -Rf selinux software var
rm -Rf lamp
rm -Rf scp.sh screenquit.sh temp.retry web.retry mysql.retry mountIrdcBackUp.sh irdcops.retry install.sh install.log.syslog install.log id_rsa debug.retry crontab_ntpdate anaconda-ks.cfg monitor.sh
rm -Rf a getip
============================================================
解决办法:
.mkdir /root
cp -a /etc/skel/.[!.]* /root
主要是吧 /etc/skel/里面的文件拷贝回去就行了~~~哈..
cp -r /etc/skel/.bash
.bash_logout .bash_profile .bashrc
法一:
cp -a /etc/skel/.[!.]* /root
chown -R root /root
chmod -R 700 /root
法二:从别的linux上拷贝一个root过来,后面删除时注意一下:
带你飞(39345****) 11:37:21
@回忆未来-向东-Jàck rm '$HOME'
加个引号就行了
参考:http://blog.csdn.net/wlqf366/article/details/50081389
linux获取daemon进程的控制台数据
Unix/LinuxC技术 jackxiang 2016-7-24 15:53
linux提供了一个daemon函数,使得进程可以脱离控制台运行,实现了后台运行的效果。但是进程后台运行后,原本在终端控制台输出的数据就看不到了。那么,怎样才能找回这些数据?
这里,文章主题就围绕着 如何获得后台进程的控制台数据,其中的原理要从daemon说起。
daemon主要做两件事:
1、创建子进程,退出当前进程,并且以子进程创建新会话。这样,就算父进程退出,子进程也不会被关闭
2、将标准输入,标准输出,标准错误都重定向/dev/null
daemon 实现大致如下:
int daemonize(int nochdir, int noclose)
{
int fd;
switch (fork()) {
case -1:
return (-1);
case 0:
break;
default:
_exit(EXIT_SUCCESS);
}
if (setsid() == -1)
return (-1);
if (nochdir == 0) {
if(chdir("/") != 0) {
perror("chdir");
return (-1);
}
}
if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) {
if(dup2(fd, STDIN_FILENO) < 0) {
perror("dup2 stdin");
return (-1);
}
if(dup2(fd, STDOUT_FILENO) < 0) {
perror("dup2 stdout");
return (-1);
}
if(dup2(fd, STDERR_FILENO) < 0) {
perror("dup2 stderr");
return (-1);
}
if (fd > STDERR_FILENO) {
if(close(fd) < 0) {
perror("close");
return (-1);
}
}
}
return (0);
}
所以,想取回进程的控制台数据,只要将标准输出,标准错误重定向到指定文件,然后读取这个文件就好了。
文章这里写了个例子,简单演示下(这里通过kill信号完成进程通信,有点粗暴)
代码如下,保存为 daemon_example.c
#include
#include
#include
#include
static int fd = -1;
void sigroutine(int dunno) {
switch (dunno) {
case SIGUSR1:
fprintf(stderr, "Get a signal -- SIGUSR1 \n");
if (fd != -1) close(fd);
fd = open("/tmp/console_temp.log", O_RDWR|O_APPEND|O_CREAT, 0600);
if (fd == -1) break;
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
break;
case SIGUSR2:
fprintf(stderr, "Get a signal -- SIGUSR2 \n");
if (fd != -1) close(fd);
fd = open("/dev/null", O_RDWR, 0);
if (fd == -1) break;
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
break;
}
return;
}
int main() {
signal(SIGUSR1, sigroutine);
signal(SIGUSR2, sigroutine);
daemon(1,0);
for (;;){
fprintf(stderr,"test \n") ; // 不断打印test
sleep(1);
}
return 0;
}
然后,编译和执行这个程序:
$ gcc -o daemon_example daemon_example.c
$ chmod +x daemon_example
$ ./daemon_example
$ ps -ef| grep daemon_example
root 11328 1 0 19:15 ? 00:00:00 ./daemon_example
如上,进程后台运行了,拿到pid 11328
按ctrl+c 退出脚本,这时脚本会通知进程将标准输出和标准错误重定向到 /dev/null,继续后台运行。
[root@iZ25dcp92ckZ testdemo]# sh -x ./test.sh 16935
+ pid=16935
+ ps -p 16935
+ '[' '!' 0 -eq 0 ']'
+ echo pid 16935
pid 16935
+ trap 'kill -usr2 16935 && exit 1' HUP INT QUIT TERM
+ kill -usr1 16935
+ echo it works,please wait..
it works,please wait..
+ sleep 1
+ tail -f -n 0 /tmp/console_temp.log
test
test
test
test
==========================================================
接着,写个脚本测试这个程序, 保存为test.sh:
#!/bin/bash
pid=$1
ps -p $pid>/dev/null
if [ ! $? -eq 0 ] ; then
echo pid does not exist!
exit 1
fi
echo pid $pid
trap "kill -usr2 $pid && exit 1" HUP INT QUIT TERM
kill -usr1 $pid
echo it works,please wait..
sleep 1
tail -f -n 0 /tmp/console_temp.log
echo done!
执行这个脚本,结果如下:
$ ./test.sh 11328
pid 11328
it works,please wait..
test
test
然后,按ctrl+c 退出脚本,这时脚本会通知进程将标准输出和标准错误重定向到 /dev/null,继续后台运行。
这样,这个脚本就成了后台进程的调试工具了,需要后台数据的时候执行一下,不需要就关闭。当然,这只是一个示例,实际应用中要做改善,比如kill信号改成pipe或socket通讯,缓存文件要限制大小,或自动清除等。
摘自:http://blog.csdn.net/mycwq/article/details/50479735
这里,文章主题就围绕着 如何获得后台进程的控制台数据,其中的原理要从daemon说起。
daemon主要做两件事:
1、创建子进程,退出当前进程,并且以子进程创建新会话。这样,就算父进程退出,子进程也不会被关闭
2、将标准输入,标准输出,标准错误都重定向/dev/null
daemon 实现大致如下:
int daemonize(int nochdir, int noclose)
{
int fd;
switch (fork()) {
case -1:
return (-1);
case 0:
break;
default:
_exit(EXIT_SUCCESS);
}
if (setsid() == -1)
return (-1);
if (nochdir == 0) {
if(chdir("/") != 0) {
perror("chdir");
return (-1);
}
}
if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) {
if(dup2(fd, STDIN_FILENO) < 0) {
perror("dup2 stdin");
return (-1);
}
if(dup2(fd, STDOUT_FILENO) < 0) {
perror("dup2 stdout");
return (-1);
}
if(dup2(fd, STDERR_FILENO) < 0) {
perror("dup2 stderr");
return (-1);
}
if (fd > STDERR_FILENO) {
if(close(fd) < 0) {
perror("close");
return (-1);
}
}
}
return (0);
}
所以,想取回进程的控制台数据,只要将标准输出,标准错误重定向到指定文件,然后读取这个文件就好了。
文章这里写了个例子,简单演示下(这里通过kill信号完成进程通信,有点粗暴)
代码如下,保存为 daemon_example.c
#include
#include
#include
#include
static int fd = -1;
void sigroutine(int dunno) {
switch (dunno) {
case SIGUSR1:
fprintf(stderr, "Get a signal -- SIGUSR1 \n");
if (fd != -1) close(fd);
fd = open("/tmp/console_temp.log", O_RDWR|O_APPEND|O_CREAT, 0600);
if (fd == -1) break;
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
break;
case SIGUSR2:
fprintf(stderr, "Get a signal -- SIGUSR2 \n");
if (fd != -1) close(fd);
fd = open("/dev/null", O_RDWR, 0);
if (fd == -1) break;
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
break;
}
return;
}
int main() {
signal(SIGUSR1, sigroutine);
signal(SIGUSR2, sigroutine);
daemon(1,0);
for (;;){
fprintf(stderr,"test \n") ; // 不断打印test
sleep(1);
}
return 0;
}
然后,编译和执行这个程序:
$ gcc -o daemon_example daemon_example.c
$ chmod +x daemon_example
$ ./daemon_example
$ ps -ef| grep daemon_example
root 11328 1 0 19:15 ? 00:00:00 ./daemon_example
如上,进程后台运行了,拿到pid 11328
按ctrl+c 退出脚本,这时脚本会通知进程将标准输出和标准错误重定向到 /dev/null,继续后台运行。
[root@iZ25dcp92ckZ testdemo]# sh -x ./test.sh 16935
+ pid=16935
+ ps -p 16935
+ '[' '!' 0 -eq 0 ']'
+ echo pid 16935
pid 16935
+ trap 'kill -usr2 16935 && exit 1' HUP INT QUIT TERM
+ kill -usr1 16935
+ echo it works,please wait..
it works,please wait..
+ sleep 1
+ tail -f -n 0 /tmp/console_temp.log
test
test
test
test
==========================================================
接着,写个脚本测试这个程序, 保存为test.sh:
#!/bin/bash
pid=$1
ps -p $pid>/dev/null
if [ ! $? -eq 0 ] ; then
echo pid does not exist!
exit 1
fi
echo pid $pid
trap "kill -usr2 $pid && exit 1" HUP INT QUIT TERM
kill -usr1 $pid
echo it works,please wait..
sleep 1
tail -f -n 0 /tmp/console_temp.log
echo done!
执行这个脚本,结果如下:
$ ./test.sh 11328
pid 11328
it works,please wait..
test
test
然后,按ctrl+c 退出脚本,这时脚本会通知进程将标准输出和标准错误重定向到 /dev/null,继续后台运行。
这样,这个脚本就成了后台进程的调试工具了,需要后台数据的时候执行一下,不需要就关闭。当然,这只是一个示例,实际应用中要做改善,比如kill信号改成pipe或socket通讯,缓存文件要限制大小,或自动清除等。
摘自:http://blog.csdn.net/mycwq/article/details/50479735
Linux chattr命令参数及使用方法详解
Unix/LinuxC技术 jackxiang 2016-7-19 17:32
背景:发现用ansible去做sudo时,发现权限不够:
TASK [irdcops : 修改 /etc/sudoers] ***********************************************
skipping: [10.70.37.24]
fatal: [10.70.36.172]: FAILED! => {"changed": false, "failed": true, "msg": "Could not replace file: /tmp/tmpfToWiS to /etc/sudoers: [Errno 1] Operation not permitted"}
fatal: [10.70.36.173]: FAILED! => {"changed": false, "failed": true, "msg": "Could not replace file: /tmp/tmpvA5FJh to /etc/sudoers: [Errno 1] Operation not permitted"}
[root@v-szq-Localizationweb13 etc]# chmod 755 sudoers
chmod: changing permissions of `sudoers': Operation not permitted
[root@v-szq-Localizationweb13 etc]# lsattr sudoers
----i--------e- sudoers
[root@v-szq-Localizationweb13 etc]# chattr -i sudoers
[root@v-szq-Localizationweb13 etc]# visudo
http://www.linuxeye.com/command/chattr.html
去掉保护命令:
黑客最容易修改这个sshd:
Form:http://jackxiang.com/post/1792/
TASK [irdcops : 修改 /etc/sudoers] ***********************************************
skipping: [10.70.37.24]
fatal: [10.70.36.172]: FAILED! => {"changed": false, "failed": true, "msg": "Could not replace file: /tmp/tmpfToWiS to /etc/sudoers: [Errno 1] Operation not permitted"}
fatal: [10.70.36.173]: FAILED! => {"changed": false, "failed": true, "msg": "Could not replace file: /tmp/tmpvA5FJh to /etc/sudoers: [Errno 1] Operation not permitted"}
[root@v-szq-Localizationweb13 etc]# chmod 755 sudoers
chmod: changing permissions of `sudoers': Operation not permitted
[root@v-szq-Localizationweb13 etc]# lsattr sudoers
----i--------e- sudoers
[root@v-szq-Localizationweb13 etc]# chattr -i sudoers
[root@v-szq-Localizationweb13 etc]# visudo
http://www.linuxeye.com/command/chattr.html
去掉保护命令:
黑客最容易修改这个sshd:
Form:http://jackxiang.com/post/1792/