常常在发邮件时用到上下移动行调整服务器的IP简单排序:
Sublime:
Ctrl + Shift + Enter 可以在当前行上面添加一行。
Ctrl + Shift + 上箭头 ,作用:将当前行上移一行。
Ctrl + Shift + 下箭头 ,作用:将当前行下移一行。
Editplus:
Alt + Shift + 上箭头 ,作用:将当前行上移一行。
Alt + Shift + 下箭头 ,作用:将当前行下移一行。
visual studio code:
Alt+ ↑ / ↓ 作用:向上/向下移动当前行
Shift+Alt + ↓ / ↑ 作用:向上/向下复制当前行
Ctrl+Shift+K 作用:删除当前行
Ctrl+Enter 作用:在当前行以下插入
Ctrl+Shift+Enter 作用:在当前行以上插入
Sublime:
Ctrl + Shift + Enter 可以在当前行上面添加一行。
Ctrl + Shift + 上箭头 ,作用:将当前行上移一行。
Ctrl + Shift + 下箭头 ,作用:将当前行下移一行。
Editplus:
Alt + Shift + 上箭头 ,作用:将当前行上移一行。
Alt + Shift + 下箭头 ,作用:将当前行下移一行。
visual studio code:
Alt+ ↑ / ↓ 作用:向上/向下移动当前行
Shift+Alt + ↓ / ↑ 作用:向上/向下复制当前行
Ctrl+Shift+K 作用:删除当前行
Ctrl+Enter 作用:在当前行以下插入
Ctrl+Shift+Enter 作用:在当前行以上插入
[实践OK]PHP-FPM子进程数量应该如何设置?php-fpm.conf 配置说明。
Php/Js/Shell/Go jackxiang 2018-7-16 21:41
对于Docker又反转为静态方式进程数了,如下:
pm = dynamic 如何控制子进程,选项有static和dynamic
pm.max_children:静态方式下开启的php-fpm进程数量
自己实践如下:
/usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
#docker 无service/systemctl,为2时两个进程,为1时一个进程,如下:
root 35308 1 0 16:12 ? 00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
www 35309 35308 0 16:12 ? 00:00:00 php-fpm: pool www
www 35310 35308 0 16:12 ? 00:00:00 php-fpm: pool www
pkill -9 php 可杀死,然后可修改pm.max_children = 1 ==》pm.max_children = 2,也就是上面的2个进程 。
来自:http://www.cnblogs.com/ahaii/p/5776809.html
背影:对于低配置机器,建议写死PHP-FPM进程数得了,而对于高配置机器,则如果写在动态的,因为根据流量进行fork了PHP-FPM进程运动量很大,应该是在高配置身体健康的时候去做,等你是一个低配置的机器,你再去做增加进程去做时就死了。
一)PHP-FPM子进程数量应该如何设置?
二)php-fpm.conf 配置说明:
php-fpm中pm.start_servers 多大合适?
{(cpu空闲时等待连接的php的最小子进程数) + (cpu空闲时等待连接的php的最大子进程数 - cpu空闲时等待连接的php的最小子进程数)/ 2};
用配置表示就是:min_spare_servers + (max_spare_servers - min_spare_servers) / 2;一般而言,设置成10-20之间的数据足够满足需求了。
英文表示@/usr/local/php/etc/php-fpm.conf:
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
1)XIYOU-API线上24G(24576M),24CPU生产机器配置:
2)目前RPMBUILD打包写死:
/home/test/rpmbuild/SOURCES/php-fpm.conf
/home/test/rpmbuild/SOURCES/www.conf
3)通过grep从/usr/local/php/etc/php-fpm.conf里陪陪出对应项的值:
附,php-fpm.conf 配置说明:
来自:https://blog.csdn.net/u013372487/article/details/80168979
HP-FPM子进程数量应该如何设置?摘录自:https://blog.csdn.net/jt521xlg/article/details/50992631 ,最前面参考计算最小PHP进程来源:
首先,我们关注下 PHP-FPM 的运行方式:
static :表示在 `php-fpm` 运行时直接 `fork` 出 `pm.max_chindren` 个子进程,
dynamic:表示,运行时 `fork` 出 `start_servers` 个进程,随着负载的情况,动态的调整,最多不超过 `max_children` 个进程。
一般推荐用 static。
优点是不用动态的判断负载情况,提升性能;
缺点是多占用些系统内存资源。
PHP-FPM 子进程数量,是不是越多越好?
当然不是,pm.max_chindren,进程多了,增加进程管理的开销以及上下文切换的开销。
更核心的是,能并发执行的 php-fpm 进程不会超过 cpu 个数。
如何设置,取决于你的代码
如果代码是 CPU 计算密集型的,pm.max_chindren 不能超过 CPU 的内核数。
如果不是,那么将 pm.max_chindren 的值大于 CPU 的内核数,是非常明智的。
国外技术大拿给出这么个公式:
在 N + 20% 和 M / m 之间。
N 是 CPU 内核数量。
M 是 PHP 能利用的内存数量。
m 是每个 PHP 进程平均使用的内存数量。
适用于 dynamic 方式。
static方式:M / (m * 1.2)
当然,还有一种保险的方式,来配置 max_children。适用于 static 方式。
先把 max_childnren 设置成一个比较大的值。
稳定运行一段时间后,观察 php-fpm 的 status 里的 max active processes 是多少
然后把 max_children 配置比它大一些就可以了。
pm.max_requests:指的是每个子进程在处理了多少个请求数量之后就重启。
这个参数,理论上可以随便设置,但是为了预防内存泄漏的风险,还是设置一个合理的数比较好
来自:https://blog.csdn.net/jt521xlg/article/details/50992631
pm = dynamic 如何控制子进程,选项有static和dynamic
pm.max_children:静态方式下开启的php-fpm进程数量
自己实践如下:
/usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid
#docker 无service/systemctl,为2时两个进程,为1时一个进程,如下:
root 35308 1 0 16:12 ? 00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
www 35309 35308 0 16:12 ? 00:00:00 php-fpm: pool www
www 35310 35308 0 16:12 ? 00:00:00 php-fpm: pool www
pkill -9 php 可杀死,然后可修改pm.max_children = 1 ==》pm.max_children = 2,也就是上面的2个进程 。
来自:http://www.cnblogs.com/ahaii/p/5776809.html
背影:对于低配置机器,建议写死PHP-FPM进程数得了,而对于高配置机器,则如果写在动态的,因为根据流量进行fork了PHP-FPM进程运动量很大,应该是在高配置身体健康的时候去做,等你是一个低配置的机器,你再去做增加进程去做时就死了。
一)PHP-FPM子进程数量应该如何设置?
二)php-fpm.conf 配置说明:
php-fpm中pm.start_servers 多大合适?
{(cpu空闲时等待连接的php的最小子进程数) + (cpu空闲时等待连接的php的最大子进程数 - cpu空闲时等待连接的php的最小子进程数)/ 2};
用配置表示就是:min_spare_servers + (max_spare_servers - min_spare_servers) / 2;一般而言,设置成10-20之间的数据足够满足需求了。
英文表示@/usr/local/php/etc/php-fpm.conf:
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
1)XIYOU-API线上24G(24576M),24CPU生产机器配置:
2)目前RPMBUILD打包写死:
/home/test/rpmbuild/SOURCES/php-fpm.conf
/home/test/rpmbuild/SOURCES/www.conf
3)通过grep从/usr/local/php/etc/php-fpm.conf里陪陪出对应项的值:
附,php-fpm.conf 配置说明:
来自:https://blog.csdn.net/u013372487/article/details/80168979
HP-FPM子进程数量应该如何设置?摘录自:https://blog.csdn.net/jt521xlg/article/details/50992631 ,最前面参考计算最小PHP进程来源:
首先,我们关注下 PHP-FPM 的运行方式:
static :表示在 `php-fpm` 运行时直接 `fork` 出 `pm.max_chindren` 个子进程,
dynamic:表示,运行时 `fork` 出 `start_servers` 个进程,随着负载的情况,动态的调整,最多不超过 `max_children` 个进程。
一般推荐用 static。
优点是不用动态的判断负载情况,提升性能;
缺点是多占用些系统内存资源。
PHP-FPM 子进程数量,是不是越多越好?
当然不是,pm.max_chindren,进程多了,增加进程管理的开销以及上下文切换的开销。
更核心的是,能并发执行的 php-fpm 进程不会超过 cpu 个数。
如何设置,取决于你的代码
如果代码是 CPU 计算密集型的,pm.max_chindren 不能超过 CPU 的内核数。
如果不是,那么将 pm.max_chindren 的值大于 CPU 的内核数,是非常明智的。
国外技术大拿给出这么个公式:
在 N + 20% 和 M / m 之间。
N 是 CPU 内核数量。
M 是 PHP 能利用的内存数量。
m 是每个 PHP 进程平均使用的内存数量。
适用于 dynamic 方式。
static方式:M / (m * 1.2)
当然,还有一种保险的方式,来配置 max_children。适用于 static 方式。
先把 max_childnren 设置成一个比较大的值。
稳定运行一段时间后,观察 php-fpm 的 status 里的 max active processes 是多少
然后把 max_children 配置比它大一些就可以了。
pm.max_requests:指的是每个子进程在处理了多少个请求数量之后就重启。
这个参数,理论上可以随便设置,但是为了预防内存泄漏的风险,还是设置一个合理的数比较好
来自:https://blog.csdn.net/jt521xlg/article/details/50992631
[实践OK]Linux下的netstat查看所有端口/TCP/UDP端口常用参数总结。
Unix/LinuxC技术 jackxiang 2018-7-15 09:28
netstat -lntp #常用命令参数及解释如下:主要是看IP和TCP,以及程序的PID。
-l, --listening display listening server sockets
-n, --numeric don't resolve names
-t, tcp
-p, --program
Show the PID and name of the program to which each socket belongs.
一)netstat常用查看端口参数之查看所有tcp/udp端口:
netstat -atlunp|grep 80
二)netstat常用查看端口参数之单独查看tcp/udp端口命令:
netstat -uln
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:808 0.0.0.0:*
udp 0 0 127.0.0.1:837 0.0.0.0:*
udp 0 0 0.0.0.0:17617 0.0.0.0:*
udp 0 0 0.0.0.0:2392 0.0.0.0:*
假如没有n,直接用netstat -tl,显示的是一些端口的程序名,如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:5646 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:7824 *:* LISTEN
tcp 0 0 *:webcache *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:5881 *:* LISTEN
三)netstat常用查看端口参数之单独查看tcp端口命令:
netstat -tln
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:34945 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:32740 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:15770 0.0.0.0:* LISTEN
四)netstat本身也是通过读取系统中的/proc/net/tcp(6)文件来实现对当前网络状态的监控输出的
netstat本身也是通过读取系统中的/proc/net/tcp(6)文件来实现对当前网络状态的监控输出的。我们只要依样画葫芦对此文件进行 解析(主要是合并ipv4和ipv6的内容,然后从16进制转换成字符串形式的ip,端口),然后再比对一下,只要发现此socket的远程ip和端口和 php中的$_SERVER['REMOTE_ADDR'],$_SERVER['REMOTE_PORT']相匹配即可。具体实现如下:
摘录:http://www.4shell.org/archives/2064.html
参考:http://www.80sec.com/security-issue-on-linux-fd-inheritance.html
-l, --listening display listening server sockets
-n, --numeric don't resolve names
-t, tcp
-p, --program
Show the PID and name of the program to which each socket belongs.
一)netstat常用查看端口参数之查看所有tcp/udp端口:
netstat -atlunp|grep 80
二)netstat常用查看端口参数之单独查看tcp/udp端口命令:
netstat -uln
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:808 0.0.0.0:*
udp 0 0 127.0.0.1:837 0.0.0.0:*
udp 0 0 0.0.0.0:17617 0.0.0.0:*
udp 0 0 0.0.0.0:2392 0.0.0.0:*
假如没有n,直接用netstat -tl,显示的是一些端口的程序名,如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:5646 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:7824 *:* LISTEN
tcp 0 0 *:webcache *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:5881 *:* LISTEN
三)netstat常用查看端口参数之单独查看tcp端口命令:
netstat -tln
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:34945 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:32740 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:15770 0.0.0.0:* LISTEN
四)netstat本身也是通过读取系统中的/proc/net/tcp(6)文件来实现对当前网络状态的监控输出的
netstat本身也是通过读取系统中的/proc/net/tcp(6)文件来实现对当前网络状态的监控输出的。我们只要依样画葫芦对此文件进行 解析(主要是合并ipv4和ipv6的内容,然后从16进制转换成字符串形式的ip,端口),然后再比对一下,只要发现此socket的远程ip和端口和 php中的$_SERVER['REMOTE_ADDR'],$_SERVER['REMOTE_PORT']相匹配即可。具体实现如下:
摘录:http://www.4shell.org/archives/2064.html
参考:http://www.80sec.com/security-issue-on-linux-fd-inheritance.html
SecureCrt 设置在同一窗口下打开会话
Unix/LinuxC技术 jackxiang 2018-7-7 15:54
SecureCrt某个设置不合朕的心意,在打开一个新的连接时不是在同一个窗口下,它又新开了一个工作窗口,像下面这样,操作起来让人很不爽:
一个SSH打一一个SecureCRT,
解决方案:点击 File -> Connect In Tab/Tile 连接新的会话
来自:https://blog.csdn.net/u012135425/article/details/79487575
一个SSH打一一个SecureCRT,
解决方案:点击 File -> Connect In Tab/Tile 连接新的会话
来自:https://blog.csdn.net/u012135425/article/details/79487575
open /Users/jackXiang/Library/"Application Support"/VanDyke/SecureCRT/
UI界面解压Zip文件,直接在/Users/jackXiang/Downloads找到对应的解压文件点录,使用Ctrl+C后到上面目录再到 /Users/jackXiang/Library/"Application Support"/VanDyke/SecureCRT/点录的UI界面里后使用Ctrl+V,即可。
出错的原因应该是中文问题,来自:https://bbs.feng.com/read-htm-tid-6939481.html
UI界面解压Zip文件,直接在/Users/jackXiang/Downloads找到对应的解压文件点录,使用Ctrl+C后到上面目录再到 /Users/jackXiang/Library/"Application Support"/VanDyke/SecureCRT/点录的UI界面里后使用Ctrl+V,即可。
出错的原因应该是中文问题,来自:https://bbs.feng.com/read-htm-tid-6939481.html
越来越多的使用Macbook 或者 Macbook Pro,很多人反映使用一段时间之后苹果的Retina屏会出现雪花或者闪动的现象。经过龙朔的调研,我们发现绝大部分屏幕闪动不是硬件导致的,只要按照以下步骤操作,90%以上的屏闪会马上解决。
分析下原因,绝大部分屏闪会发生在通过笔记本电脑外接其他显示器之后发生,还有一部分是在陌生WIFI使用之后。外接显示器之后由于刷新率的不同导致Macbook默认显示设置变化是屏闪的主因。因此大家只要遵循以下步骤就可以解决困扰大家的问题。
第一步重置系统管理控制器(SMC)
1.将 Mac 关机。
2.将 MagSafe 或 USB-C 电源适配器连接到电源和 Mac。
3.在内建键盘上,按下键盘左侧的 Shift-Control-Option 键,然后同时按下电源按钮。
4.松开所有按键,然后再次按下电源按钮以开启 Mac。
第二步、重置非易失的随机访问存储器(NVRAM)
1.关闭 Mac。
2.在键盘上找到以下按键:Command (⌘)、Option、P 和 R。
3.打开 Mac。
4.听到启动声后立即按住 Command-Option-P-R 键。
5.按住这些按键直到电脑重新启动,然后您会再次听到启动声。
(如果使用 MacBook Pro 2016,您将不会听到启动声,请按住这些按键至少 20 秒钟,确保 Mac 正确完成该过程。)
6.松开这些按键。
第三步:关闭系统偏好设置->显示器->自动调节亮度(关闭)。
第四步:针对16款带有touch bar 的Macbook Pro闪屏的解决方法。
点击“系统偏好设置”,打开“安全与隐私”,关闭“FileVault”,然后重新开机。
分析下原因,绝大部分屏闪会发生在通过笔记本电脑外接其他显示器之后发生,还有一部分是在陌生WIFI使用之后。外接显示器之后由于刷新率的不同导致Macbook默认显示设置变化是屏闪的主因。因此大家只要遵循以下步骤就可以解决困扰大家的问题。
第一步重置系统管理控制器(SMC)
1.将 Mac 关机。
2.将 MagSafe 或 USB-C 电源适配器连接到电源和 Mac。
3.在内建键盘上,按下键盘左侧的 Shift-Control-Option 键,然后同时按下电源按钮。
4.松开所有按键,然后再次按下电源按钮以开启 Mac。
第二步、重置非易失的随机访问存储器(NVRAM)
1.关闭 Mac。
2.在键盘上找到以下按键:Command (⌘)、Option、P 和 R。
3.打开 Mac。
4.听到启动声后立即按住 Command-Option-P-R 键。
5.按住这些按键直到电脑重新启动,然后您会再次听到启动声。
(如果使用 MacBook Pro 2016,您将不会听到启动声,请按住这些按键至少 20 秒钟,确保 Mac 正确完成该过程。)
6.松开这些按键。
第三步:关闭系统偏好设置->显示器->自动调节亮度(关闭)。
第四步:针对16款带有touch bar 的Macbook Pro闪屏的解决方法。
点击“系统偏好设置”,打开“安全与隐私”,关闭“FileVault”,然后重新开机。
1.文件-》首选项-》设置
2.搜索设备 输入 git.path
下面显示 git.path:null (git可执行文件的路径)
3.右侧花括号内输入,在右方用户设置栏输入,注意是反斜杠:
{
"files.autoSave": "off",
"git.path": "D:/Program Files/Git/bin/git.exe",
}
注意:
不要使用 windows 的路径风格,例如 D:\\Git\\bin\\git.exe。
要使用 linux style 例如 D:/Git/bin/git.exe。
来自:https://www.cnblogs.com/ymyblog/p/8043555.html
https://blog.csdn.net/danicagogogo/article/details/79527013
同时选中所有匹配的:
用用Visual Studio的吗?Sublime有一个选择一个单词后按ctrl+F3,会把所有这个单词都会选中,在VS里怎么实现这样的?可有快捷键么。VS编辑器同时选中所有匹配的Ctrl+Shift+L。Shift+F12; 同时修改本文件中所有匹配的!
From:http://blog.poetries.top/2017/07/23/vs-keyboard-shortcuts/
2.搜索设备 输入 git.path
下面显示 git.path:null (git可执行文件的路径)
3.右侧花括号内输入,在右方用户设置栏输入,注意是反斜杠:
{
"files.autoSave": "off",
"git.path": "D:/Program Files/Git/bin/git.exe",
}
注意:
不要使用 windows 的路径风格,例如 D:\\Git\\bin\\git.exe。
要使用 linux style 例如 D:/Git/bin/git.exe。
来自:https://www.cnblogs.com/ymyblog/p/8043555.html
https://blog.csdn.net/danicagogogo/article/details/79527013
同时选中所有匹配的:
用用Visual Studio的吗?Sublime有一个选择一个单词后按ctrl+F3,会把所有这个单词都会选中,在VS里怎么实现这样的?可有快捷键么。VS编辑器同时选中所有匹配的Ctrl+Shift+L。Shift+F12; 同时修改本文件中所有匹配的!
From:http://blog.poetries.top/2017/07/23/vs-keyboard-shortcuts/
[实践OK]Ansible里的后向引用124进行替换,以及正则匹配shell下写在一行和写YAML文件的正则区别,结合正则猫RegexBuddy/Patterns的正确用法。PHP正则匹配反斜杠''和美元'$'的方法以及Ansible单行shell交互和写入yml文件的正则不同写法的原因和对比成功实践及理解。
Php/Js/Shell/Go jackxiang 2018-6-27 11:23
方便后面类似的需求,更快替换及测试,提高效率,如下:
ansible-playbook replace.yml -C -D
前置之1)Ansible的正则替换的模拟替换参数 -C -D,类似sed 的 -n 和 p结合只显示不真实替换,如下:
ansible-playbook aixiu_web.yml -e h=10.244.5.108 -C -D -t addhttpcdnsrcip
前置之2)正则被多重括号包起来的一个顺序和内容界定相当重要,它是从左到右数的一个\1\2\3的反向引用实践备忘:
上面1是最左边那个(,也就是所有的,第二个是匹配到的',它前面还有一些空行也被匹配上了的( '),所以上面显示有一些空的主要用来对新加的一行对齐,
第三个\3就是上一行去掉前和后的部分对于插入这行没有用(前无'后无,')(就是:"agent":"$http_user_agent"),第四个就是匹配到单独的一个(,'),
这个道理明白了也就对正则匹配出来的先后顺序有一个了解,再就是这个串特比有是\2里面的多个空格加一个单引号( '),
对于\n后面新加的一行对齐很重要,再就是\4也就是(,'),也是用来补充新加的一行少的部分,组成新一行起到了作用,见实践2:
') <=== \2
"http_cdn_src_ip":"$http_cdn_src_ip" <===新加的部分
,' <=== \4
上面三行构成了一个完整的和上面一样有N个空格打头的字符串:
'"http_cdn_src_ip":"$http_cdn_src_ip",'
backrefs参数:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。
原文:https://blog.csdn.net/dylloveyou/article/details/80698531
实践1)一行命令实现了正则替换,也就是Shell->Ansible的一个路径,它于直接定到yml里的正则写法不一样,看实践2作比较,原因:
写到文件里和一行的正则写法是不一样的,写一行涉及到终端传Shell的问题,而写到yaml的Ansible文件里则是python的交互,所以正则写法不大一样,如下:
shell交互: regexp='((.*)(\"agent\":\"\\\$http_user_agent\")(.*))'
yaml交互: regexp: '((.*)(\"agent\"\:\"\$http_user_agent\")(.*))'
比对发现:
一)\: 冒号在shell不需要转义,而在yaml文件里需要转义。
二)而shell里对$转义的右斜杠需要再加两个右斜杠一共三次,而yaml文件里轩一次也就行了,后面有描述这个$的问题。
三)有条件的替换,以防止出现替换时因为多次运行相同的Ansible脚本进而多次插入,注意when里面的变量加上单引号为字符串,否则会出现判断不准的问题:
实践2)实践发现假如要写到Yaml文件里,上面单独这一行放Shell里运行可以,但是放到yaml文件里是不行的,怎么办,重新修改调试Ok的文件版本如下所示:
TASK [将CDN透传过来的客户端访问出口IP写入Nginx日志] **********************************************************************************************************
--- before: /usr/local/nginx/conf/nginx.conf (content)
+++ after: /usr/local/nginx/conf/nginx.conf (content)
@@ -66,6 +66,7 @@
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
+ '"http_cdn_src_ip":"$http_cdn_src_ip",'
'"status":"$status"}';
access_log /data/logs/nginx/access.log main; #这一行显示冗余,并没有用,主要看+号。
changed: [10.244.25.77]
实践3)用ansible的insertafter实现:
如果用正则查到某行,在其后面写上也成用insertafter实现,但是这样据前面文章和实践就无法用这个\1\2这样的了,如果打开那个backrefs就需要regexp了,于是这样写实践是Ok的:
--- before: /usr/local/nginx/conf/nginx.conf (content)
+++ after: /usr/local/nginx/conf/nginx.conf (content)
@@ -66,6 +66,7 @@
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
+ '"http_cdn_src_ip":"$http_cdn_src_ip",'
'"status":"$status"}';
实践4)进一步实践发现正则和insertafter混用也是可以的,
也就是说insertafter之后,再加一个regexp正则匹配出\1\2可用在line里,同时加上backrefs: yes,可行的,
如下实践也是能实现的,去掉之前的\1和\n即可,就在它后面插入即可,实践发现并没在后面插入,而是直接替换了,也就是说insertafter失效了,还得按实践2走才Ok,要不就老老实实的按实践3在后在插入,不要引入正则也成,引入正则就失去了insertafter的本来功能了:
$ansible-playbook iweb_regexp.yml -C -D -t insertafter
PLAY [insertafter with regexp] **************************************************************************************************************
TASK [insert after] *************************************************************************************************************************
--- before: /usr/local/nginx/conf/nginx.conf (content)
+++ after: /usr/local/nginx/conf/nginx.conf (content)
@@ -65,7 +65,7 @@
'"request_uri":"$request_uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
- '"agent":"$http_user_agent",'
+ '"http_cdn_src_ip":"$http_cdn_src_ip",'
'"status":"$status"}';
access_log /data/logs/nginx/access.log main;
最后,基础研究,正则替换的基础知识:
对于斜杠来讲,在PHP里即使是单引号,它也是会和类似双引号里的$一样,有被转义:
'/\\\\/'
cat a.php
php a.php
\'
cat reg3.php
来自微信群:是因为双引号的原因,\#在双引号里,就是\#,\\#在双引号里,就是\#,\\\#在双引号里,就是\\#。
之前http://jackxiang.com/post/6466/研究过反斜杠,没有研究过$,这次主要研究$。
"^-? \\d+$":这个正则表达式为什么会有两个反斜杠
这要分两步看
首先字符串中的\\被编译器解释为\
然后作为正则表达式,\d又被正则表达式引擎解释为元字符只匹配数字
正则表达式中匹配一个反斜杠要用四个反斜杠,为什么呢?
分析一下“\\\\”,第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠是转义符,第四个斜杠是斜杠本身。
有2点要清楚:
1.字符串里面表示斜杠就需要两个斜杠如“\\”
2.正则表达式里的斜杠需要转意,是用“\\”标示。
这样就比较好解释:
我们先要表示正则表达式里面的斜杠“\\”,然后再用字符串表示出来。而这2个斜杠分别需要一个转义符,这样就成了4个斜杠在正则表达式里面表示一个斜杠。
From:https://my.oschina.net/airship/blog/411045
阅读全文
ansible-playbook replace.yml -C -D
前置之1)Ansible的正则替换的模拟替换参数 -C -D,类似sed 的 -n 和 p结合只显示不真实替换,如下:
ansible-playbook aixiu_web.yml -e h=10.244.5.108 -C -D -t addhttpcdnsrcip
前置之2)正则被多重括号包起来的一个顺序和内容界定相当重要,它是从左到右数的一个\1\2\3的反向引用实践备忘:
上面1是最左边那个(,也就是所有的,第二个是匹配到的',它前面还有一些空行也被匹配上了的( '),所以上面显示有一些空的主要用来对新加的一行对齐,
第三个\3就是上一行去掉前和后的部分对于插入这行没有用(前无'后无,')(就是:"agent":"$http_user_agent"),第四个就是匹配到单独的一个(,'),
这个道理明白了也就对正则匹配出来的先后顺序有一个了解,再就是这个串特比有是\2里面的多个空格加一个单引号( '),
对于\n后面新加的一行对齐很重要,再就是\4也就是(,'),也是用来补充新加的一行少的部分,组成新一行起到了作用,见实践2:
') <=== \2
"http_cdn_src_ip":"$http_cdn_src_ip" <===新加的部分
,' <=== \4
上面三行构成了一个完整的和上面一样有N个空格打头的字符串:
'"http_cdn_src_ip":"$http_cdn_src_ip",'
backrefs参数:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。
原文:https://blog.csdn.net/dylloveyou/article/details/80698531
实践1)一行命令实现了正则替换,也就是Shell->Ansible的一个路径,它于直接定到yml里的正则写法不一样,看实践2作比较,原因:
写到文件里和一行的正则写法是不一样的,写一行涉及到终端传Shell的问题,而写到yaml的Ansible文件里则是python的交互,所以正则写法不大一样,如下:
shell交互: regexp='((.*)(\"agent\":\"\\\$http_user_agent\")(.*))'
yaml交互: regexp: '((.*)(\"agent\"\:\"\$http_user_agent\")(.*))'
比对发现:
一)\: 冒号在shell不需要转义,而在yaml文件里需要转义。
二)而shell里对$转义的右斜杠需要再加两个右斜杠一共三次,而yaml文件里轩一次也就行了,后面有描述这个$的问题。
三)有条件的替换,以防止出现替换时因为多次运行相同的Ansible脚本进而多次插入,注意when里面的变量加上单引号为字符串,否则会出现判断不准的问题:
实践2)实践发现假如要写到Yaml文件里,上面单独这一行放Shell里运行可以,但是放到yaml文件里是不行的,怎么办,重新修改调试Ok的文件版本如下所示:
TASK [将CDN透传过来的客户端访问出口IP写入Nginx日志] **********************************************************************************************************
--- before: /usr/local/nginx/conf/nginx.conf (content)
+++ after: /usr/local/nginx/conf/nginx.conf (content)
@@ -66,6 +66,7 @@
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
+ '"http_cdn_src_ip":"$http_cdn_src_ip",'
'"status":"$status"}';
access_log /data/logs/nginx/access.log main; #这一行显示冗余,并没有用,主要看+号。
changed: [10.244.25.77]
实践3)用ansible的insertafter实现:
如果用正则查到某行,在其后面写上也成用insertafter实现,但是这样据前面文章和实践就无法用这个\1\2这样的了,如果打开那个backrefs就需要regexp了,于是这样写实践是Ok的:
--- before: /usr/local/nginx/conf/nginx.conf (content)
+++ after: /usr/local/nginx/conf/nginx.conf (content)
@@ -66,6 +66,7 @@
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
+ '"http_cdn_src_ip":"$http_cdn_src_ip",'
'"status":"$status"}';
实践4)进一步实践发现正则和insertafter混用也是可以的,
也就是说insertafter之后,再加一个regexp正则匹配出\1\2可用在line里,同时加上backrefs: yes,可行的,
如下实践也是能实现的,去掉之前的\1和\n即可,就在它后面插入即可,实践发现并没在后面插入,而是直接替换了,也就是说insertafter失效了,还得按实践2走才Ok,要不就老老实实的按实践3在后在插入,不要引入正则也成,引入正则就失去了insertafter的本来功能了:
$ansible-playbook iweb_regexp.yml -C -D -t insertafter
PLAY [insertafter with regexp] **************************************************************************************************************
TASK [insert after] *************************************************************************************************************************
--- before: /usr/local/nginx/conf/nginx.conf (content)
+++ after: /usr/local/nginx/conf/nginx.conf (content)
@@ -65,7 +65,7 @@
'"request_uri":"$request_uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
- '"agent":"$http_user_agent",'
+ '"http_cdn_src_ip":"$http_cdn_src_ip",'
'"status":"$status"}';
access_log /data/logs/nginx/access.log main;
最后,基础研究,正则替换的基础知识:
对于斜杠来讲,在PHP里即使是单引号,它也是会和类似双引号里的$一样,有被转义:
'/\\\\/'
cat a.php
php a.php
\'
cat reg3.php
来自微信群:是因为双引号的原因,\#在双引号里,就是\#,\\#在双引号里,就是\#,\\\#在双引号里,就是\\#。
之前http://jackxiang.com/post/6466/研究过反斜杠,没有研究过$,这次主要研究$。
"^-? \\d+$":这个正则表达式为什么会有两个反斜杠
这要分两步看
首先字符串中的\\被编译器解释为\
然后作为正则表达式,\d又被正则表达式引擎解释为元字符只匹配数字
正则表达式中匹配一个反斜杠要用四个反斜杠,为什么呢?
分析一下“\\\\”,第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠是转义符,第四个斜杠是斜杠本身。
有2点要清楚:
1.字符串里面表示斜杠就需要两个斜杠如“\\”
2.正则表达式里的斜杠需要转意,是用“\\”标示。
这样就比较好解释:
我们先要表示正则表达式里面的斜杠“\\”,然后再用字符串表示出来。而这2个斜杠分别需要一个转义符,这样就成了4个斜杠在正则表达式里面表示一个斜杠。
From:https://my.oschina.net/airship/blog/411045
阅读全文
背景:在Linux下习惯使用ll、la、l等ls别名的童鞋到mac os可就郁闷了,
whichi ll
-bash: whichi: command not found
[xiangdong@jenkins_server_bj_sjs_10_71_182_25 .ssh]$ which ll
alias ll='ls -l --color=auto'
/bin/ls
其实只要在用户目录下建立一个脚本“.bash_profile”,并输入以下内容即可:
ls -l --color=auto
1 2014-461deMacBook-Pro:~ root# cd ~
2 2014-461deMacBook-Pro:~ root#vim .bash_profile
加入:
保存后,执行
3 2014-461deMacBook-Pro:~ root#source .bash_profile
=============================================
.bash_profile
alias l='ls -alhF'
alias la='ls -AFh'
alias ll='ls -lhAF'
alias l='ls -alhF'
alias la='ls -AFh'
alias ll='ls -lhAF'
然后在终端窗口中输入下列命令后,别名即可立即生效:
source ~/.bash_profile
source ~/.bash_profile
如果不知道如何创建,可以直接在“终端”窗口中依次执行如下命令:
.bash_profile完整创建命令Shell
cd ~
touch .bash_profile
echo "alias l='ls -alhF'" >>.bash_profile
echo "alias la='ls -AFh'" >>.bash_profile
echo "alias ll='ls -lhAF'" >>.bash_profile
source ~/.bash_profile
cd ~
touch .bash_profile
echo "alias l='ls -alhF'" >>.bash_profile
echo "alias la='ls -AFh'" >>.bash_profile
echo "alias ll='ls -lhAF'" >>.bash_profile
source ~/.bash_profile
来自:https://clang.cn/blog/749.html
https://www.cnblogs.com/daly2008/p/4160066.html
whichi ll
-bash: whichi: command not found
[xiangdong@jenkins_server_bj_sjs_10_71_182_25 .ssh]$ which ll
alias ll='ls -l --color=auto'
/bin/ls
其实只要在用户目录下建立一个脚本“.bash_profile”,并输入以下内容即可:
ls -l --color=auto
1 2014-461deMacBook-Pro:~ root# cd ~
2 2014-461deMacBook-Pro:~ root#vim .bash_profile
加入:
保存后,执行
3 2014-461deMacBook-Pro:~ root#source .bash_profile
=============================================
.bash_profile
alias l='ls -alhF'
alias la='ls -AFh'
alias ll='ls -lhAF'
alias l='ls -alhF'
alias la='ls -AFh'
alias ll='ls -lhAF'
然后在终端窗口中输入下列命令后,别名即可立即生效:
source ~/.bash_profile
source ~/.bash_profile
如果不知道如何创建,可以直接在“终端”窗口中依次执行如下命令:
.bash_profile完整创建命令Shell
cd ~
touch .bash_profile
echo "alias l='ls -alhF'" >>.bash_profile
echo "alias la='ls -AFh'" >>.bash_profile
echo "alias ll='ls -lhAF'" >>.bash_profile
source ~/.bash_profile
cd ~
touch .bash_profile
echo "alias l='ls -alhF'" >>.bash_profile
echo "alias la='ls -AFh'" >>.bash_profile
echo "alias ll='ls -lhAF'" >>.bash_profile
source ~/.bash_profile
来自:https://clang.cn/blog/749.html
https://www.cnblogs.com/daly2008/p/4160066.html
[实践OK]在CentOS7上安装并配置Python3.8.1环境,新版本Python3.6.2支持Ansible的,和pip3 pip 安装 pdb调试程序如 python -m pdb mail.py,涉及到yum里的python本维持旧版本也需要修改其指向旧版本。
Unix/LinuxC技术 jackxiang 2018-6-21 10:20
背景:Python很火,且连一些如ESP8266的硬件都支持Python了。
目前Python存在两个版本Python2和Python3系列,且这两个版本同时在更新与维护。到底是选择Python2还是选择Python3,取决于当前要使用的库、框架支持哪个版本。因此一台电脑上可能需要同时安装Python2和Python3两个版本。本文主要讲述的是如何在centos7系统中存在python2系列的同时安装python3.8.1(目前python3系列的最新版本)
1.安装升级相应的软件包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
2.下载python 3.8.1 的源码包
wget http://mirrors.sohu.com/python/3.8.1/Python-3.8.1.tgz
3.安装python3.8.1
tar zxvf Python-3.8.1.tgz -C /opt/
cd /opt/Python-3.8.1/
./configure --prefix=/usr/local/python3
make && make install
若遇到编译问题:
zipimport.ZipImportError: can't decompress data; zlib not available #make && make install
yum install zlib zlib-devel -y
4.配置python,配置python3 pip3 软链接,设置软连接:目的是让我们直接在任何地方输入python3命令都可以得到python解释器的运行。
更改/usr/bin/python链接:
ln -s /usr/local/python3/bin/python3.8.1 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
mv /usr/bin/pip{,.backup}
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip #python2-pip没有,就没有这个pip.
查看是否安装成功
python3 -V
pip3 -V
更改/usr/bin/python默认链接,实现升级:
/usr/bin/python --version
Python 2.7.5
mv /usr/bin/python{,.old.backup}
ln -sf /usr/local/python3/bin/python3.8 /usr/bin/python
5.查看当python的版本,出现版本信息即为正确安装
python3 --version
安装python3.7出现ModuleNotFoundError: No module named '_ctypes'报错(重新编译一次就OK了)
来自:https://mhl.xyz/Python/python37_ctypes.html
6.更改yum脚本的python依赖
yum localinstall mysql-5.7.12-171123111505.el7.centos.x86_64.rpm
File "/usr/libexec/urlgrabber-ext-down", line 28
except OSError, e:
^
# ls /usr/bin/yum*
# ls yum*
yum yum-config-manager yum-debug-restore yum-groups-manager
yum-builddep yum-debug-dump yumdownloader
更改以上文件头为
#!/usr/bin/python 改为 #!/usr/bin/python2
用Sed 一行搞定,参考自[实践OK]经常用到之linux sed 批量替换字符串,及模糊替换和模糊拼接的例子。http://jackxiang.com/post/2324/:
/usr/bin/yum-groups-manager #!/usr/bin/python -tt
/usr/bin/yumdownloader #直接python后面有一个空格
/usr/bin/yum-debug-restore #!/usr/bin/python -tt
/usr/bin/yum-debug-dump #!/usr/bin/python -tt
/usr/bin/yum-config-manager #!/usr/bin/python -tt
/usr/bin/yum-builddep #!/usr/bin/python -tt
/usr/bin/yum #python后面无空格
势必要有两种替换:
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-builddep
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-config-manager
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-debug-dump
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-debug-restore
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yumdownloader
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-groups-manager
sed -i 's/#!\/usr\/bin\/python$/#!\/usr\/bin\/python2.7/' /usr/bin/yum
sed -i 's/#!\/usr\/bin\/python$/#!\/usr\/bin\/python2.7/' /usr/libexec/urlgrabber-ext-down
这个-tt的没有啥用,只是起到警告作用,完全在替换时不要:
-t Issue a warning when a source file mixes tabs and spaces for indentation in a way that makes it
depend on the worth of a tab expressed in spaces. Issue an error when the option is given twice.
-t 当源文件以制作缩进的方式混合制表符和空格时发出警告
取决于用空格表示的选项卡的价值。 当该选项被赋予两次时发出一个错误。
7.测试用Python的Pip3安装Python扩展:
rpm -qf /bin/pip
python2-pip-8.1.2-5.el7.noarch
/bin/pip --version
pip 9.0.1 from /usr/lib/python2.7/site-packages (python 2.7)
pip3 --version
pip 9.0.1 from /usr/local/python3/lib/python3.8.1/site-packages (python 3.8.1)
pip3 install PyEmail
Collecting PyEmail
Downloading https://files.pythonhosted.org/packages/ca/39/caf0436670b6fa9f072e322fab1a2b04d5631bdbdc8ea9857230aae02dd5/PyEmail-0.0.1.zip
Installing collected packages: PyEmail
Running setup.py install for PyEmail ... done
Successfully installed PyEmail-0.0.1
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
pip3 install ipdb
Collecting ipdb
Downloading https://files.pythonhosted.org/packages/80/fe/4564de08f174f3846364b3add8426d14cebee228f741c27e702b2877e85b/ipdb-0.11.tar.gz
Requirement already satisfied: setuptools in /usr/local/python3/lib/python3.8.1/site-packages (from ipdb)
Collecting ipython>=5.0.0 (from ipdb)
Downloading https://files.pythonhosted.org/packages/b1/7f/91d50f28af3e3a24342561983a7857e399ce24093876e6970b986a0b6677/ipython-6.4.0-py3-none-any.whl (750kB)
62% |████████████████████ | 471kB 54kB/s eta 0:00:06
好一会下载安装就能装上这个,但是提示:You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
pip install --upgrade pip
pip install ipdb #再一次安装这个Python的调试扩展
python -m pdb mail.py
最后,这些脚本总结起来放一块就这些,方便后期再安装之用:
来自:https://blog.csdn.net/hobohero/article/details/54381475
来自:https://blog.csdn.net/wjqwinn/article/details/75633714
目前Python存在两个版本Python2和Python3系列,且这两个版本同时在更新与维护。到底是选择Python2还是选择Python3,取决于当前要使用的库、框架支持哪个版本。因此一台电脑上可能需要同时安装Python2和Python3两个版本。本文主要讲述的是如何在centos7系统中存在python2系列的同时安装python3.8.1(目前python3系列的最新版本)
1.安装升级相应的软件包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
2.下载python 3.8.1 的源码包
wget http://mirrors.sohu.com/python/3.8.1/Python-3.8.1.tgz
3.安装python3.8.1
tar zxvf Python-3.8.1.tgz -C /opt/
cd /opt/Python-3.8.1/
./configure --prefix=/usr/local/python3
make && make install
若遇到编译问题:
zipimport.ZipImportError: can't decompress data; zlib not available #make && make install
yum install zlib zlib-devel -y
4.配置python,配置python3 pip3 软链接,设置软连接:目的是让我们直接在任何地方输入python3命令都可以得到python解释器的运行。
更改/usr/bin/python链接:
ln -s /usr/local/python3/bin/python3.8.1 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
mv /usr/bin/pip{,.backup}
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip #python2-pip没有,就没有这个pip.
查看是否安装成功
python3 -V
pip3 -V
更改/usr/bin/python默认链接,实现升级:
/usr/bin/python --version
Python 2.7.5
mv /usr/bin/python{,.old.backup}
ln -sf /usr/local/python3/bin/python3.8 /usr/bin/python
5.查看当python的版本,出现版本信息即为正确安装
python3 --version
安装python3.7出现ModuleNotFoundError: No module named '_ctypes'报错(重新编译一次就OK了)
来自:https://mhl.xyz/Python/python37_ctypes.html
6.更改yum脚本的python依赖
yum localinstall mysql-5.7.12-171123111505.el7.centos.x86_64.rpm
File "/usr/libexec/urlgrabber-ext-down", line 28
except OSError, e:
^
# ls /usr/bin/yum*
# ls yum*
yum yum-config-manager yum-debug-restore yum-groups-manager
yum-builddep yum-debug-dump yumdownloader
更改以上文件头为
#!/usr/bin/python 改为 #!/usr/bin/python2
用Sed 一行搞定,参考自[实践OK]经常用到之linux sed 批量替换字符串,及模糊替换和模糊拼接的例子。http://jackxiang.com/post/2324/:
/usr/bin/yum-groups-manager #!/usr/bin/python -tt
/usr/bin/yumdownloader #直接python后面有一个空格
/usr/bin/yum-debug-restore #!/usr/bin/python -tt
/usr/bin/yum-debug-dump #!/usr/bin/python -tt
/usr/bin/yum-config-manager #!/usr/bin/python -tt
/usr/bin/yum-builddep #!/usr/bin/python -tt
/usr/bin/yum #python后面无空格
势必要有两种替换:
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-builddep
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-config-manager
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-debug-dump
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-debug-restore
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yumdownloader
sed -i 's/#!\/usr\/bin\/python /#!\/usr\/bin\/python2.7 /' /usr/bin/yum-groups-manager
sed -i 's/#!\/usr\/bin\/python$/#!\/usr\/bin\/python2.7/' /usr/bin/yum
sed -i 's/#!\/usr\/bin\/python$/#!\/usr\/bin\/python2.7/' /usr/libexec/urlgrabber-ext-down
这个-tt的没有啥用,只是起到警告作用,完全在替换时不要:
-t Issue a warning when a source file mixes tabs and spaces for indentation in a way that makes it
depend on the worth of a tab expressed in spaces. Issue an error when the option is given twice.
-t 当源文件以制作缩进的方式混合制表符和空格时发出警告
取决于用空格表示的选项卡的价值。 当该选项被赋予两次时发出一个错误。
7.测试用Python的Pip3安装Python扩展:
rpm -qf /bin/pip
python2-pip-8.1.2-5.el7.noarch
/bin/pip --version
pip 9.0.1 from /usr/lib/python2.7/site-packages (python 2.7)
pip3 --version
pip 9.0.1 from /usr/local/python3/lib/python3.8.1/site-packages (python 3.8.1)
pip3 install PyEmail
Collecting PyEmail
Downloading https://files.pythonhosted.org/packages/ca/39/caf0436670b6fa9f072e322fab1a2b04d5631bdbdc8ea9857230aae02dd5/PyEmail-0.0.1.zip
Installing collected packages: PyEmail
Running setup.py install for PyEmail ... done
Successfully installed PyEmail-0.0.1
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
pip3 install ipdb
Collecting ipdb
Downloading https://files.pythonhosted.org/packages/80/fe/4564de08f174f3846364b3add8426d14cebee228f741c27e702b2877e85b/ipdb-0.11.tar.gz
Requirement already satisfied: setuptools in /usr/local/python3/lib/python3.8.1/site-packages (from ipdb)
Collecting ipython>=5.0.0 (from ipdb)
Downloading https://files.pythonhosted.org/packages/b1/7f/91d50f28af3e3a24342561983a7857e399ce24093876e6970b986a0b6677/ipython-6.4.0-py3-none-any.whl (750kB)
62% |████████████████████ | 471kB 54kB/s eta 0:00:06
好一会下载安装就能装上这个,但是提示:You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
pip install --upgrade pip
pip install ipdb #再一次安装这个Python的调试扩展
python -m pdb mail.py
最后,这些脚本总结起来放一块就这些,方便后期再安装之用:
来自:https://blog.csdn.net/hobohero/article/details/54381475
来自:https://blog.csdn.net/wjqwinn/article/details/75633714
[实践OK]awk之NF妙用之空格字符串重新连接、去除空行和显示中间列的方法。
Php/Js/Shell/Go jackxiang 2018-6-20 20:00
一)把空格连接改为|连接:
#cat b
a b c d
awk -vOFS="|" 'NF+=0' b
a|b|c|d
二)去空行:
cat a
1
2
3
awk NF a
1
2
3
三)
背景:鉴于安全的原因,如果你的电脑没有桌面锁密码,别人也能用,此时不安全,得把对应的自动填写的用户各、密码的Cookie清理掉,而对于那个Chrome记住并自动填写登录的用户名和密码也不安全,只需要输入验证码就进入了,于是查了下怎么给去掉这些的存在Chrome里,实践是可行的,很有必要记录下来,免得忘记了,无它。
一)如何在Chrome中删除特定于站点的Cookie:
chrome://settings/
高级-内容设置-Cookie-所有 Cookie 和网站数据[右侧有一个搜索Cookie:输入jackxiang.com]-点进去就有-XXXX.com 本地存储的数据:
PHPSESSID --> X
userid --> X
userpasswd --> X
来自:http://mos86.com/67173.html
二)如何删除chrome保存的密码,新版本的Chrome浏览器有单独删某个网站的Cookie,位置在开发者工具(Option+Command+i)->Application->Storage->Cookies->倒三角点开,就是当前网站的Cookie,在上面点右键,就有一个Clear,就能删掉了:
chrome://settings/
Ctrl+shift+del,里弹出一个清除浏览数据,里面有一个:密码项,再就是有一个选择是:过去七天、近四周、时间不限。
选一个时间,并勾选,其它给不勾选,执行即可。
如果你是当天数据的,选过去一天即可,依次类推。然后勾选<密码>项。最后选择清楚浏览数据。这样操作就完成啦。当你再次登录之前的网站时,你发现你就需要重新输入密码了。
来自:https://jingyan.baidu.com/article/f3ad7d0fe5e71309c3345baf.html
一)如何在Chrome中删除特定于站点的Cookie:
chrome://settings/
高级-内容设置-Cookie-所有 Cookie 和网站数据[右侧有一个搜索Cookie:输入jackxiang.com]-点进去就有-XXXX.com 本地存储的数据:
PHPSESSID --> X
userid --> X
userpasswd --> X
来自:http://mos86.com/67173.html
二)如何删除chrome保存的密码,新版本的Chrome浏览器有单独删某个网站的Cookie,位置在开发者工具(Option+Command+i)->Application->Storage->Cookies->倒三角点开,就是当前网站的Cookie,在上面点右键,就有一个Clear,就能删掉了:
chrome://settings/
Ctrl+shift+del,里弹出一个清除浏览数据,里面有一个:密码项,再就是有一个选择是:过去七天、近四周、时间不限。
选一个时间,并勾选,其它给不勾选,执行即可。
如果你是当天数据的,选过去一天即可,依次类推。然后勾选<密码>项。最后选择清楚浏览数据。这样操作就完成啦。当你再次登录之前的网站时,你发现你就需要重新输入密码了。
来自:https://jingyan.baidu.com/article/f3ad7d0fe5e71309c3345baf.html
Sublime编辑器里,用正则把一堆IP粘贴选取出来:
来自:https://www.jb51.net/article/101221.htm
来自:https://www.jb51.net/article/101221.htm
kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1
Unix/LinuxC技术 jackxiang 2018-6-11 17:51
用ssh登录阿里云centos7主机,过一会儿会自动出现以下信息,
Message from syslogd@docker_test_bj_sjs_10_71_159_108 at Jun 11 17:49:08 ...
kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1
在这个信息中,我这里按ctrl+c可以退回到, 有兄弟说是内核版本太低,升级内核:
起因:
安装了Docker容器,运行过程中报:kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1
相似问题描述:https://segmentfault.com/q/1010000007045424
解决办法:https://github.com/moby/moby/issues/5618
尝试升级到最新的4.19+内核。
1.查看操作系统版本
https://blog.csdn.net/lijing742180/article/details/80662062
2.查看内核版本
uname -sr
3.升级的三种方案
参考:
https://blog.csdn.net/breeze915/article/details/79243673
https://blog.csdn.net/qq_27281257/article/details/82049634
https://blog.csdn.net/RBPicsdn/article/details/79642932
4.删除旧内核
https://blog.csdn.net/RBPicsdn/article/details/79642932
rpm -qa | grep kernel
sudo yum remove -y 旧内核的名字就好了
术语解析:
术语解析
kernel-ml
kernel-ml 中的ml是英文【mainline stable】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本。
kernel-lt
kernel-lt 中的lt是英文【long term support】的缩写,elrepo-kernel中罗列出来的长期支持版本。
转载至链接:https://my.oschina.net/boreboluomiduo/blog/3035332。
摘自:https://www.liangzl.com/get-article-detail-123785.html
https://m.aliyun.com/yunqi/ask/2877/
Message from syslogd@docker_test_bj_sjs_10_71_159_108 at Jun 11 17:49:08 ...
kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1
在这个信息中,我这里按ctrl+c可以退回到, 有兄弟说是内核版本太低,升级内核:
起因:
安装了Docker容器,运行过程中报:kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1
相似问题描述:https://segmentfault.com/q/1010000007045424
解决办法:https://github.com/moby/moby/issues/5618
尝试升级到最新的4.19+内核。
1.查看操作系统版本
https://blog.csdn.net/lijing742180/article/details/80662062
2.查看内核版本
uname -sr
3.升级的三种方案
参考:
https://blog.csdn.net/breeze915/article/details/79243673
https://blog.csdn.net/qq_27281257/article/details/82049634
https://blog.csdn.net/RBPicsdn/article/details/79642932
4.删除旧内核
https://blog.csdn.net/RBPicsdn/article/details/79642932
rpm -qa | grep kernel
sudo yum remove -y 旧内核的名字就好了
术语解析:
术语解析
kernel-ml
kernel-ml 中的ml是英文【mainline stable】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本。
kernel-lt
kernel-lt 中的lt是英文【long term support】的缩写,elrepo-kernel中罗列出来的长期支持版本。
转载至链接:https://my.oschina.net/boreboluomiduo/blog/3035332。
摘自:https://www.liangzl.com/get-article-detail-123785.html
https://m.aliyun.com/yunqi/ask/2877/
[root@localhost ~]# mount -t xfs /dev/sdb /data
mount: mount /dev/sdb on /data failed: Structure needs cleaning
--------------------------
可以使用xfs_repair来修复,但是要注意 xfs_repair修复的分区中的文件都会丢失,即使是du能正常显示的文件也会丢失。
[root@yw-0-0 /]# mount -a
mount: Structure needs cleaning
[root@yw-0-0 /]# xfs_repair /dev/sdl
来自:http://blog.51cto.com/zwcmcm/1650764
mount: mount /dev/sdb on /data failed: Structure needs cleaning
--------------------------
可以使用xfs_repair来修复,但是要注意 xfs_repair修复的分区中的文件都会丢失,即使是du能正常显示的文件也会丢失。
[root@yw-0-0 /]# mount -a
mount: Structure needs cleaning
[root@yw-0-0 /]# xfs_repair /dev/sdl
来自:http://blog.51cto.com/zwcmcm/1650764
Linux中在终端打开图形界面的文件夹的方法
终端输入nautilus /home进入home
nautilus /etc 进入etc
一次类推吧,要是在以终端打开文件夹可以sudo apt-get install nautilus-open-terminal注销后登陆即可使用
一直在终端中用cd /目录 的方式进入字符界面的文件夹,有时你需要进入图形界面的文件夹,那么利用下面的方法从终端打开,替代或减少鼠标的点击次数,就能提高效率。 gnome-open /etc ubuntu中 nautilus /etc nautilus['nɔːtɪləs]这个命令就是以root权限打开一个窗口,来管理文件。比如你直接点击 计算机 里面有很多文件夹和文件是root用户才能操作, 所以你对该文件夹或文件不能进行粘贴,剪切,删除等操作,也不能建立新文件,而用nautilus命令后就可以了。 比如你要修改 /etc/apt/sources.list 不用终端的话,直接点文件夹进入该目录,你只有查看的权限,而用了nautilus命令后再进该目录,你就可以对里面的文件修改,删除,建新文件等。
终端输入nautilus /home进入home
nautilus /etc 进入etc
一次类推吧,要是在以终端打开文件夹可以sudo apt-get install nautilus-open-terminal注销后登陆即可使用
一直在终端中用cd /目录 的方式进入字符界面的文件夹,有时你需要进入图形界面的文件夹,那么利用下面的方法从终端打开,替代或减少鼠标的点击次数,就能提高效率。 gnome-open /etc ubuntu中 nautilus /etc nautilus['nɔːtɪləs]这个命令就是以root权限打开一个窗口,来管理文件。比如你直接点击 计算机 里面有很多文件夹和文件是root用户才能操作, 所以你对该文件夹或文件不能进行粘贴,剪切,删除等操作,也不能建立新文件,而用nautilus命令后就可以了。 比如你要修改 /etc/apt/sources.list 不用终端的话,直接点文件夹进入该目录,你只有查看的权限,而用了nautilus命令后再进该目录,你就可以对里面的文件修改,删除,建新文件等。
[实践发现]yum update -y 升级到centos7.5后mkfs.ext4突然没了,Raspberry Pi挂载NTFS磁盘。
Unix/LinuxC技术 jackxiang 2018-5-31 18:17
mkfs.ext4 经yum update的升级到CentOS7.5后没了mkfs.ext4,于是 得安装:
安装https://mirrors.aliyun.com/centos/7.5.1804/os/x86_64/Packages/e2fsprogs-1.42.9-11.el7.x86_64.rpm这个包
[root@iZ889v050nrZ:~]
#cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@iZ889v050nrZ:~]
#rpm -qf /sbin/mkfs.ext4
e2fsprogs-1.42.9-11.el7.x86_64
===========Raspberry挂载NTFS磁盘=====================
[root@mainboard_virtualbox_docker_10_10_0_106:~]
#ssh -l pi 10.10.0.38
fdisk -l
mkfs.ext4 -T largefile4 -n /dev/sda
mkfs.ext4 -T largefile4 -n /dev/sdb
root@raspberrypi:~# dmesg |tail
[ 2296.301317] sdb: sdb1 sdb2
[ 2334.288011] F2FS-fs (sda): Magic Mismatch, valid(0xf2f52010) - read(0xe3c9e316)
[ 2334.288031] F2FS-fs (sda): Can't find valid F2FS filesystem in 1th superblock
[ 2334.288912] F2FS-fs (sda): Magic Mismatch, valid(0xf2f52010) - read(0x0)
[ 2334.288926] F2FS-fs (sda): Can't find valid F2FS filesystem in 2th superblock
[ 2334.288980] F2FS-fs (sda): Magic Mismatch, valid(0xf2f52010) - read(0xe3c9e316)
[ 2334.288988] F2FS-fs (sda): Can't find valid F2FS filesystem in 1th superblock
[ 2334.288998] F2FS-fs (sda): Magic Mismatch, valid(0xf2f52010) - read(0x0)
[ 2334.289006] F2FS-fs (sda): Can't find valid F2FS filesystem in 2th superblock
[ 2512.016847] EXT4-fs (sda): VFS: Can't find ext4 filesystem
mkfs.ext3 -T largefile4 -n /dev/sda
mkfs.ext3 -T largefile4 -n /dev/sdb
mount -t ext3 /dev/sda /data0
mount -t ext3 /dev/sdb /data1
mount -t ntfs-3g /dev/sda /data0
mount: unknown filesystem type 'ntfs-3g'
sudo apt-get install ntfs-3g #From:https://www.cnblogs.com/-jimmy-/p/6986010.html
源不行,看末尾成功加清华源,且要注意版本(E: The repository 'http://archive.raspbian.org/raspbian wheezy Release' does no longer have a Release file.):
https://blog.csdn.net/qq_35586327/article/details/94597760?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-3-94597760.nonecase&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BE%E6%B2%A1%E6%9C%89release%E6%96%87%E4%BB%B6
mainboard_virtualbox_docker_10_10_0_106 (1) 跳板登录:
root@raspberrypi:~# sudo apt-get install ntfs-3g --fix-missing
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libntfs-3g871
The following NEW packages will be installed:
libntfs-3g871 ntfs-3g
0 upgraded, 2 newly installed, 0 to remove and 309 not upgraded.
Need to get 540 kB of archives.
After this operation, 1,665 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian stretch/main armhf libntfs-3g871 armhf 1:2016.2.22AR.1+dfsg-1+deb9u1 [165 kB]
Get:2 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian stretch/main armhf ntfs-3g armhf 1:2016.2.22AR.1+dfsg-1+deb9u1 [375 kB]
Fetched 540 kB in 0s (1,628 kB/s)
Selecting previously unselected package libntfs-3g871.
(Reading database ... 127338 files and directories currently installed.)
Preparing to unpack .../libntfs-3g871_1%3a2016.2.22AR.1+dfsg-1+deb9u1_armhf.deb ...
Unpacking libntfs-3g871 (1:2016.2.22AR.1+dfsg-1+deb9u1) ...
Selecting previously unselected package ntfs-3g.
Preparing to unpack .../ntfs-3g_1%3a2016.2.22AR.1+dfsg-1+deb9u1_armhf.deb ...
Unpacking ntfs-3g (1:2016.2.22AR.1+dfsg-1+deb9u1) ...
Processing triggers for initramfs-tools (0.130) ...
Processing triggers for libc-bin (2.24-11+deb9u3) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up libntfs-3g871 (1:2016.2.22AR.1+dfsg-1+deb9u1) ...
Setting up ntfs-3g (1:2016.2.22AR.1+dfsg-1+deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u3) ...
Processing triggers for initramfs-tools (0.130) ...
root@raspberrypi:~#
b
The value '\stable' is invalid for APT::Default-Release as such a release is not available in the sources
rm -rf /etc/apt/apt.conf.d/10defaultRelease
E: Unable to correct problems, you have held broken packages.
解决方案是先upgrade后update:
$ sudo apt-get upgrade
$ sudo apt-get update
源的问题:
安装https://mirrors.aliyun.com/centos/7.5.1804/os/x86_64/Packages/e2fsprogs-1.42.9-11.el7.x86_64.rpm这个包
[root@iZ889v050nrZ:~]
#cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@iZ889v050nrZ:~]
#rpm -qf /sbin/mkfs.ext4
e2fsprogs-1.42.9-11.el7.x86_64
===========Raspberry挂载NTFS磁盘=====================
[root@mainboard_virtualbox_docker_10_10_0_106:~]
#ssh -l pi 10.10.0.38
fdisk -l
mkfs.ext4 -T largefile4 -n /dev/sda
mkfs.ext4 -T largefile4 -n /dev/sdb
root@raspberrypi:~# dmesg |tail
[ 2296.301317] sdb: sdb1 sdb2
[ 2334.288011] F2FS-fs (sda): Magic Mismatch, valid(0xf2f52010) - read(0xe3c9e316)
[ 2334.288031] F2FS-fs (sda): Can't find valid F2FS filesystem in 1th superblock
[ 2334.288912] F2FS-fs (sda): Magic Mismatch, valid(0xf2f52010) - read(0x0)
[ 2334.288926] F2FS-fs (sda): Can't find valid F2FS filesystem in 2th superblock
[ 2334.288980] F2FS-fs (sda): Magic Mismatch, valid(0xf2f52010) - read(0xe3c9e316)
[ 2334.288988] F2FS-fs (sda): Can't find valid F2FS filesystem in 1th superblock
[ 2334.288998] F2FS-fs (sda): Magic Mismatch, valid(0xf2f52010) - read(0x0)
[ 2334.289006] F2FS-fs (sda): Can't find valid F2FS filesystem in 2th superblock
[ 2512.016847] EXT4-fs (sda): VFS: Can't find ext4 filesystem
mkfs.ext3 -T largefile4 -n /dev/sda
mkfs.ext3 -T largefile4 -n /dev/sdb
mount -t ext3 /dev/sda /data0
mount -t ext3 /dev/sdb /data1
mount -t ntfs-3g /dev/sda /data0
mount: unknown filesystem type 'ntfs-3g'
sudo apt-get install ntfs-3g #From:https://www.cnblogs.com/-jimmy-/p/6986010.html
源不行,看末尾成功加清华源,且要注意版本(E: The repository 'http://archive.raspbian.org/raspbian wheezy Release' does no longer have a Release file.):
https://blog.csdn.net/qq_35586327/article/details/94597760?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-3-94597760.nonecase&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BE%E6%B2%A1%E6%9C%89release%E6%96%87%E4%BB%B6
mainboard_virtualbox_docker_10_10_0_106 (1) 跳板登录:
root@raspberrypi:~# sudo apt-get install ntfs-3g --fix-missing
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libntfs-3g871
The following NEW packages will be installed:
libntfs-3g871 ntfs-3g
0 upgraded, 2 newly installed, 0 to remove and 309 not upgraded.
Need to get 540 kB of archives.
After this operation, 1,665 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian stretch/main armhf libntfs-3g871 armhf 1:2016.2.22AR.1+dfsg-1+deb9u1 [165 kB]
Get:2 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian stretch/main armhf ntfs-3g armhf 1:2016.2.22AR.1+dfsg-1+deb9u1 [375 kB]
Fetched 540 kB in 0s (1,628 kB/s)
Selecting previously unselected package libntfs-3g871.
(Reading database ... 127338 files and directories currently installed.)
Preparing to unpack .../libntfs-3g871_1%3a2016.2.22AR.1+dfsg-1+deb9u1_armhf.deb ...
Unpacking libntfs-3g871 (1:2016.2.22AR.1+dfsg-1+deb9u1) ...
Selecting previously unselected package ntfs-3g.
Preparing to unpack .../ntfs-3g_1%3a2016.2.22AR.1+dfsg-1+deb9u1_armhf.deb ...
Unpacking ntfs-3g (1:2016.2.22AR.1+dfsg-1+deb9u1) ...
Processing triggers for initramfs-tools (0.130) ...
Processing triggers for libc-bin (2.24-11+deb9u3) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up libntfs-3g871 (1:2016.2.22AR.1+dfsg-1+deb9u1) ...
Setting up ntfs-3g (1:2016.2.22AR.1+dfsg-1+deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u3) ...
Processing triggers for initramfs-tools (0.130) ...
root@raspberrypi:~#
b
The value '\stable' is invalid for APT::Default-Release as such a release is not available in the sources
rm -rf /etc/apt/apt.conf.d/10defaultRelease
E: Unable to correct problems, you have held broken packages.
解决方案是先upgrade后update:
$ sudo apt-get upgrade
$ sudo apt-get update
源的问题: