标签为 "Linux" 的存档

linux shell下按ctrl+箭头出现5D, 5C

今天在Linux下使用shell的时候,发现当我想使用Ctrl+箭头进行快速跳跃的时候,并没有出现预期的 光标 移动,而是出现了 5D, 5C 的字样。
这个很奇怪,查下相关资料,可以这样避免:
把以下两行添加到 ~/.inputrc文件中:
"\e[1;5C": forward-word # ctrl + right
"\e[1;5D": backward-word # ctrl + left

退出shell再重新登录,就可以解决了。

go lang交叉编译,在linux下编译windows上可用的exe可执行文件

最近在看golang,看了《GO语言编程》,没看一段都会照葫芦画瓢搞个demo来玩玩。
在搞交叉编辑的时候,遇到了麻烦,按书上搞的,buildpkg 这个脚本里,需要在$GOROOT/src下执行go tool dist install -v pkg/runtime ,可是src下根本没有这个 pkg/runtime的目录啊,总是报错,怎么也编译不出来。

自己就不管那个脚本了,自己看错误提示琢磨。
自己直接 go build exe文件的时候,报错 go build runtime: windows/386 must be bootstrapped using make.bash
然后估摸着,需要先修改GOOS和GOARCH进行make.bash,试了下,果真可以。

所以,交叉编译,做一个windows下64位电脑可用的exe文件,这样搞:

cd $GOROOT/src
GOOS=windows GOARCH=amd64 ./make.bash #如果是32位,就GOARCH=386
cd word #回到自己想输出可执行文件的位置
GOOS=windows GOARCH=amd64 go build -o sorter.exe sorter #go build 依赖 $GOPATH,这个就不多说了。

效果图:

go-build-for-linux

linux下运行效果图

go-build-for-windows

windows下运行效果图

linux下查找包含utf8 BOM头的文件,并删除BOM头信息(FEEF)

今天收到用户反馈,用户在举报谈谈的谈主时会显示提交失败。
这个反馈页面入口在反馈平台,调用谈谈项目的后端接口。 这个服务相关的接口都好久没有动了,为什么会失败呢?
在线上找了一台机器进行debug,发现接口返回内容是“正常”的,一段可读的json字符串。把字符串拷贝下,在js下发现是可以解析的。
但是该项目下用的json_decode,却怎么都decode不成功。调试了半天都觉得甚是古怪,一直都找不到头绪,怕自己脑子是思维定势了,跑去看了会golang,再回来继续解决。
再怎么看, 都还是觉得很正常,不应该出问题。
再一次拷贝接口返回的字符串的时候,发现头部多了个标签。

feff-utf8_bom_remove_linux_vim

feff-utf8_bom_remove_linux_vim

查了下,发现这个FEFF就是BOM。 参考:字节顺序标记

找到问题所在了,解决问题就好说了。
windows下有各式各样的编辑器,都可以解决bom头问题,可是linux下该怎么解决呢?
google了下,问题都解决了。
1.找到哪些文件包含BOM头。

grep -rl $'xEFxBBxBF' .

通过hexdump可以看到bom头的存在。

hexdump-BOM-utf8-file

hexdump-BOM-utf8-file

2.删除BOM头信息。

sed '1s/^xEFxBBxBF//'  filename.php -i

删除后就不会再看到BOM头拉。

hexdump-NO-BOM-utf8-file

hexdump-NO-BOM-utf8-file

可以用一条命令查找并删除文件的BOM头信息:

find . -type f -exec sed '1s/^xEFxBBxBF//' -i.bak {} ; -exec rm {}.bak ;

总结:
在多人维护的项目下,很可能会有其他人上传一些不合适的文件或代码,需要对一些常规情况进行监控,及时发现、解决,避免影响线上问题。

linux服务器tcp默认分配端口范围设置

在启动自定义服务的时候,希望使用8370端口,却发现端口已经被nginx或node占用了,无法启动。但是lvs又已经申请了,改端口的话比较麻烦。所以可以修改下 /proc/sys/net/ipv4/ip_local_port_range 参数,使tcp协议分配的端口从一个比较大的范围开始启用,这样,node或nginx就不会占用较小的端口了。

echo '32768 61000' > /proc/sys/net/ipv4/ip_local_port_range

linux下vim实现php远程调试环境搭建:vim DBGp+xdebug+xdebug helper实现方便的远程开启Debugging, profiling & tracing

首先是必需组件的安装。
有三个,vim的DBGp插件,php的xdebug扩展,Chrome浏览器的xdebug helper扩展。

一: vim 安装 dbgp client 插件
下载 DBGp client

$ cd ~/.vim/
$ wget http://www.vim.org/scripts/download_script.php?src_id=7285 -O debugger.zip
$ unzip debugger.zip

二:PHP安装xdebug扩展
具体安装方法就不讲了,网上例子很多.官方安装说明.
我把我的配置信息贴出来:
sudo vim /home/s/apps/php-5.2.6/etc/include/xdebug.ini

[Xdebug]
zend_extension="/home/s/apps/php-5.2.6/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
xdebug.profiler_enable=0    ;开启profile
xdebug.profiler_enable_trigger=1    ;使用触发器开启profile
xdebug.profiler_output_dir="/home/s/logs/xdebugLog"
xdebug.auto_trace=0     ;开启trace
xdebug.trace_enable_trigger=1   ;使用触发器开启trace
xdebug.trace_output_dir="/home/s/logs/xdebugLog"
xdebug.cli_color=1
xdebug.collect_params=2
xdebug.collect_return=on

;remote debug   ;开启远程调试
xdebug.remote_enable=1
xdebug.remote_autostart=Off
xdebug.remote_port=9000	;远程端口,不是你web服务的端口,如果没有冲突,一般不用修改。

其中需要注意的是有注释的地方,不自动开启profile和trace,因为这样每次请求都会保存相应信息,会把磁盘爆掉的。把触发器打开,这样,只有在请求的时候带特定信息的时候,才会记录相应的性能信息。触发器的实现机制是:在请求时,如果GET/POST/COOKIE信息中包含特定的变量,会开启对应的debug,profile或trace,所以我们可以通过在web中访问页面时,添加对应的变量来开启相应的功能。如果每次都自己拼接这个,也挺麻烦,所以会介绍后边的xdebug helper的chrome扩展,想开启任何一个功能的时候,点击一下扩展就可以了。也就是说,这个扩展不是调试必须的,但是会让你感觉用起来很方便。

三:chrome扩展xdebug helper
地址:https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
如果在 chrome://apps里搜索xdebug helper搜索不到,记得把你的语言改为 English.

xdebug-helper-introduction20140226142342

xdebug-helper-introduction20140226142342


xdebug helper两处配置要注意,
IDE Key要注意选择Other, 值为1,然后保存。
第二个是domain白名单,如果不希望每个页面都出调试的debug icon,就把开发时的域名填进来,比如localhost神马的。其实icon很小,也不太碍事,可以不用设置。

开始使用
如果不要debug调试,只是需要记录profile和trace信息,看一下性能问题,那么很简单,直接在chrome访问对应的url,会在url右侧看到一个xdebg helper 的小icon,点击后,选择 profile或trace,再刷新,就可以在预先设置的目录见到对应的文件了。
cachegrind* 是profile的文件,trace* 是trace的文件。
在windows下使用WinCacheGrind可以方便的查看profile的信息。

xdebug_helper_debug_profile_trace

xdebug_helper_debug_profile_trace

xdebug_output_file_trace_profile

xdebug_output_file_trace_profile

winCacheGrind_output

winCacheGrind_output

最后,是如何开启远程调试.
用vim编辑程序文件,在需要中断的地方使用:Bp命令打上断点。然后按F5执行监听。

这个时候,vim会提示 waiting for a new connection on port 9000 for 5 seconds… ,所以这个时候你需要在5s内向服务端发起带中断的请求,在前边的url地址,我们把xdebug helper的debug选择上,刷新页面,vim就会进入中断了。右侧有相关提示,我们就可以按GDB的方式逐步调试啦。如果没有安装xdebug helper,也无所谓,自己手动在url上拼接一个参数: &XDEBUG_SESSION_START=1 也可以开启远程调试的。

xdebug_remote_debug_how

xdebug_remote_debug_how

sudo: unable to execute /bin/rm: Success

使用 sudo rm -rf *.sst 删除文件时,出现如下提示:
sudo: unable to execute /bin/rm: Success
出现这种错误时,是由于*匹配的文件太多导致的。
所以需要换个方式来删除

sudo sh -c 'find -name "*.sst"|xargs rm -rf '

使用sh -c 表示对整条命令使用sudo权限.

Linux 命令行下如何查看自己机器的外网ip

curl ifconfig.me

输入此条命令,就可以获取到本机的外网ip。

vim 更改折叠颜色

我的vim主题下,折叠的字体颜色都是亮度很大的,很难看清楚,于是需要改一下。

查找后发现,折叠是这样设置的。

颜 色 *fold-colors*

对关闭的折叠的颜色的设定由 Folded 高亮组 |hl-Folded| 决定。对折叠栏的颜色的设
定由 FolderColumn 高亮组 |hl-FoldColumn| 决定。
下面是设定颜色的例子:

:highlight Folded guibg=grey guifg=blue
:highlight FoldColumn guibg=darkgrey guifg=white

在我的vim里,执行:highlight Folded ,发现值为:ctermfg=4 ctermbg=7
于是修改进行执行:highlight Folded ctermfg=0 ctermbg=7进行修改尝试,发现ctermfg=0时效果最好,
最后编辑~/.vimrc,把:highlight Folded ctermfg=0 ctermbg=7粘贴到最后一行,以后再开vim,就可以直接使用这种效果了。

vim-fold-color-hightlight-ctermfg

vim-fold-color-hightlight-ctermfg

linux 压缩解压zip中文名文件,乱码解决

压缩解压缩的文件中的中文名乱码,是由于windows的文件名中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码不一致,所以导致了文件名乱码的问题,解决这个问题的做法就是对文件名进行转码。(仅仅是对文件名,不是对文件内容)

Linux中专门提供了一种工具convmv进行文件名编码的转换,可以将文件名从GBK转换成UTF-8编码,或者从UTF-8到GBK进行转码。

首先看一下系统上是否安装了convmv,如果没安装的话用:
yum install convmv
安装。
下面看一下convmv的具体用法:

convmv -f 源编码 -t 新编码 [选项] 文件名

常用参数:
-r 递归处理子文件夹
–notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
–list 显示所有支持的编码
–unescap 可以做一下转义,比如把%20变成空格
比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:

convmv -r -f UTF-8 -t GBK –notest utf8编码的文件名/或者文件夹

如果是-r递归处理的话,文件夹内不能有非源编码的文件,否则会转化失败。
this file was not validly encoded in UTF-8: “searchtoolsExport/��.txt”
To prevent damage to your files, we won’t continue.
First fix this or correct options!

转换以后”utf8编码的文件名”会被转换成GBK编码(只是文件名编码的转换,文件内容不会发生变化)。

然后在进行zip或者tar的打包/压缩,拷贝到windows下,就可以顺利打开,不乱码了。
Read more…

linux建立信任,已添加到authorized_keys,就是不成功;权限问题

Linux主机间建立信任关系
在主机A和主机B间建立信任关系,使主机A可以无密码ssh登陆主机B.

  1. A主机上执行 ssh-keygen -t rsa -b 1024 (也可以使用 ssh-keygen -t dsa -b 1024)
  2. 主目录下生成 .ssh目录
  3. 进入~/.ssh目录
  4. 执行 cat id_rsa.pub 将显示结果复制 (也可以使用cat id_dsa.pub,这个一般有现成的)
  5. B主机上进入主目录下的~/.ssh(如果没有,则执行ssh-keygen生成)
  6. 将复制的结果粘贴到B主机.ssh目录下的authorized_keys文件的最后一行
  7. ok,信任关系建立了,在主机A上执行 ssh user@B 第一次执行,会提示一个确认,选择yes回车,结果不用输入密码,登录成功!

其中有三点需要注意的地方,如果已经按照以上方法做了,还是不可以,那就比照下边三条对比一下:

  1. authorized_keys 文件必须是600权限(也就是-rw——-)或者644
  2. .ssh目录必须是700权限(也就是drwx——)
  3. /home/work目录 必须是 755权限 即drwxr-xr-x

第(3)条太坑了,就因为 /home/user 目录是777,不是755,怎么都不行,信任关系建不起来,最后把/home/user目录的权限由777改成755就立搞定了。。。>_<,好大的坑啊。。。
Read more…