vim简体中文帮助手册下载和安装

liuliangsong 发表了文章 • 0 个评论 • 218 次浏览 • 2016-12-21 09:29 • 来自相关话题

一、下载目录介绍:1、pdf-manual目录:  pdf格式vim简体中文帮助手册。现在一般最新版本的浏览器都支持浏览pdf,所以下载后基本上能直接使用浏览器打开。如果无法使用浏览器打开,请安装一个pdf阅读器打开。
 2、win32-install目录:  这是vim中文帮助手册的windows安装版,只能安装在装有vim编辑器的windows的电脑上。下载后双击即可安装,安装程序会自动检测你的vim安装目录。
  3、vimcdoc目录:  这是vim中文帮助手册的Linux/unix安装版,下载后使用tar命令解压,然后进入解压目录,使用“./vimcdoc.sh -i”命令即可安装:tar -zxvf vimcdoc-1.9.0.tar.gz
cd vimcdoc-1.9.0
./vimcdoc.sh -i  安装好后,在vim中,输入:help命令,即显示vim的中文帮助文档,效果如下:


  进入帮助文档后,将关标移动到子文档名上,然后按CTRL+]可以进入子文档,在子文档按CTRL+T返回主帮助文档。按CTRL+W+方向键可以切换光标所在的窗口。
 二、vim help下载地址:1、vim中文文档下载地址:  本文提供vim简体中文帮助手册的两个下载地址,百度云下载和sourceforge.net下载:sourceforge.net下载:https://sourceforge.net/projects/vimcdoc/files/百度云下载:http://pan.baidu.com/s/1mhIPY1E
 2、vim版本与下载文件关系:vim 7.4下载:简体中文帮助收册的1.9.0版;vim 7.3下载:简体中文帮助收册的1.8.0版; 查看全部

一、下载目录介绍:

1、pdf-manual目录:

  pdf格式vim简体中文帮助手册。现在一般最新版本的浏览器都支持浏览pdf,所以下载后基本上能直接使用浏览器打开。如果无法使用浏览器打开,请安装一个pdf阅读器打开。
 

2、win32-install目录:

  这是vim中文帮助手册的windows安装版,只能安装在装有vim编辑器的windows的电脑上。下载后双击即可安装,安装程序会自动检测你的vim安装目录。
  

3、vimcdoc目录:

  这是vim中文帮助手册的Linux/unix安装版,下载后使用tar命令解压,然后进入解压目录,使用“./vimcdoc.sh -i”命令即可安装:
tar -zxvf vimcdoc-1.9.0.tar.gz
cd vimcdoc-1.9.0
./vimcdoc.sh -i
  安装好后,在vim中,输入:help命令,即显示vim的中文帮助文档,效果如下:
vimdoc_download_install.png
  进入帮助文档后,将关标移动到子文档名上,然后按CTRL+]可以进入子文档,在子文档按CTRL+T返回主帮助文档。按CTRL+W+方向键可以切换光标所在的窗口。
 

二、vim help下载地址:

1、vim中文文档下载地址:

  本文提供vim简体中文帮助手册的两个下载地址,百度云下载和sourceforge.net下载:
 

2、vim版本与下载文件关系:

  • vim 7.4下载:简体中文帮助收册的1.9.0版;
  • vim 7.3下载:简体中文帮助收册的1.8.0版;

Vim编辑器之《Vim常用选项合集》

liuliangsong 发表了文章 • 0 个评论 • 168 次浏览 • 2016-12-18 23:48 • 来自相关话题

  在vim编辑器中,有很多选项用于控制vim的运行。你可以在使用vim的时候在vim编辑器中临时设置,也可以将选项设置在"~/.vimrc"文件中,让vim命令每次启动时自动加载。
  你可以使用":set"命令查看当前vim的设置的选项,使用":set all"命令查看vim所有支持的选项。有很多选项是打开(on)/关闭(off)一个功能,如num行号显示/隐藏选项,你可以使用":set num"显示行号、":set nonum"隐藏行号:组选项描述用法:set all显示所有选项和设置; :set显示当前设置的所有选项; :set num?显示num选项的当前设置;num可以换成其他选项; :set num
:set nonum打开选项与关闭选项;
num可以换成其他选项; num/nonum是/否显示行号; wrap/nowrap是(默认)/否自动换行; wrapmargin=n设置右边界的值,当输入时到达右边界,并遇到空格时,会自动插入换行; aw/noaw 临时转入shell或使用":n"编辑其他文件时,是/否自动保存当前文件已做的修改; flash/noflash在出错处使用闪烁提醒/使用呜叫提醒;缩进ai/noaiautoindent是/否使用自动缩进方式,新行与前面的行保持—致的缩进; smartindentsmartindent/nosmartindent:是否使用能识别类C语法的智能缩进方式; cindentcindent/nocindent:是/否使用cindent缩进方式; indentexprindentexpr/noindentexpr:是/否使用indentexpr缩进方式; indenttype=缩进方式:autoindent、smartindent、cindent、indentexpr(同上); shiftwidth=n自动缩进字符数; tabstop=n 将TAB键的宽度设置为n个宁符宽度,默认为8;编码encoding=设置vim内部使用的编码字符集;如:prc; fileencoding=设置当前编辑的文件的字符编码方式;如:utf-8; fileencodings=设置vim自动探测fileencoding的顺序列表;如:"ucs-bom,utf-8,latin1"; termencoding=vim工作的终端的编码方式;如:utf-8; ambiwidth=设置汉字所占字符宽度;如:double;搜索ic/noic搜索时忽赂大小写/不忽略大小写(默认); wrapscan在搜索时到达文件尾后是/否跳文件头继续搜索; incsearchincsearch/noincsearch:输入搜索关键字时,是/否(默认)自动高亮匹配的字符; hlsearchhlsearch/nohlsearch:搜索后,是/否(默认)保留匹配字符的高亮显示编程syntax=on/off:是/否显示语法高亮;保存ro/noro是/否只读模式,只读模式写只能通过强制方式":w!"写入,否则无法写入; history=nhistory记录的行数,默认100个历史记录;filefiletype on侦测文件类型; filetype plugin on载入文件类型插件; filetype indent on为特定文件类型载入相关缩进文件; report=n复制或者删除了多少行时显示提示信息,默认为2; laststatus=0,1,2是否显示状态栏,0:不显示,1:需要时间显示,2:总是显示; list/nolist是/否将tab、换行符使用替代字符显示(^I、$); shell=path设置vim执行外部命令时使用的shell路径,如:/bin/bash; showmatch设置输入右半边括号时,是/否(默认)提示所对应的左半边括号; showmode设置是(默认)/否在窗口左下角显示当前的模式:插入、替换等模式; compatible除非.vimrc文件存在,默认vim会尝试采用vi兼容的模式; 相关文章:vim编辑器学习之《vim编辑命令快捷键》Vim编辑器之《Vim常用选项合集》Vim go语言基础IDE开发环境安装(Vundle/vim-go)vim go语言IDE环境Tagbar插件和NERDTree插件安装 查看全部
  在vim编辑器中,有很多选项用于控制vim的运行。你可以在使用vim的时候在vim编辑器中临时设置,也可以将选项设置在"~/.vimrc"文件中,让vim命令每次启动时自动加载。
  你可以使用":set"命令查看当前vim的设置的选项,使用":set all"命令查看vim所有支持的选项。有很多选项是打开(on)/关闭(off)一个功能,如num行号显示/隐藏选项,你可以使用":set num"显示行号、":set nonum"隐藏行号:
选项描述
用法:set all显示所有选项和设置;
 :set显示当前设置的所有选项;
 :set num?显示num选项的当前设置;num可以换成其他选项;
 :set num
:set nonum
打开选项与关闭选项;
num可以换成其他选项;
 num/nonum是/否显示行号;
 wrap/nowrap是(默认)/否自动换行;
 wrapmargin=n设置右边界的值,当输入时到达右边界,并遇到空格时,会自动插入换行;
 aw/noaw 临时转入shell或使用":n"编辑其他文件时,是/否自动保存当前文件已做的修改;
 flash/noflash在出错处使用闪烁提醒/使用呜叫提醒;
缩进ai/noaiautoindent是/否使用自动缩进方式,新行与前面的行保持—致的缩进;
 smartindentsmartindent/nosmartindent:是否使用能识别类C语法的智能缩进方式;
 cindentcindent/nocindent:是/否使用cindent缩进方式;
 indentexprindentexpr/noindentexpr:是/否使用indentexpr缩进方式;
 indenttype=缩进方式:autoindent、smartindent、cindent、indentexpr(同上);
 shiftwidth=n自动缩进字符数;
 tabstop=n 将TAB键的宽度设置为n个宁符宽度,默认为8;
编码encoding=设置vim内部使用的编码字符集;如:prc
 fileencoding=设置当前编辑的文件的字符编码方式;如:utf-8;
 fileencodings=设置vim自动探测fileencoding的顺序列表;如:"ucs-bom,utf-8,latin1";
 termencoding=vim工作的终端的编码方式;如:utf-8;
 ambiwidth=设置汉字所占字符宽度;如:double;
搜索ic/noic搜索时忽赂大小写/不忽略大小写(默认);
 wrapscan在搜索时到达文件尾后是/否跳文件头继续搜索;
 incsearchincsearch/noincsearch:输入搜索关键字时,是/否(默认)自动高亮匹配的字符;
 hlsearchhlsearch/nohlsearch:搜索后,是/否(默认)保留匹配字符的高亮显示
编程syntax=on/off:是/否显示语法高亮;
保存ro/noro是/否只读模式,只读模式写只能通过强制方式":w!"写入,否则无法写入;
 history=nhistory记录的行数,默认100个历史记录;
filefiletype on侦测文件类型;
 filetype plugin on载入文件类型插件;
 filetype indent on为特定文件类型载入相关缩进文件;
 report=n复制或者删除了多少行时显示提示信息,默认为2;
 laststatus=0,1,2是否显示状态栏,0:不显示,1:需要时间显示,2:总是显示;
 list/nolist是/否将tab、换行符使用替代字符显示(^I、$);
 shell=path设置vim执行外部命令时使用的shell路径,如:/bin/bash;
 showmatch设置输入右半边括号时,是/否(默认)提示所对应的左半边括号;
 showmode设置是(默认)/否在窗口左下角显示当前的模式:插入、替换等模式;
 compatible除非.vimrc文件存在,默认vim会尝试采用vi兼容的模式;
 

相关文章:

vim编辑器学习之《vim编辑命令快捷键》

liuliangsong 发表了文章 • 0 个评论 • 214 次浏览 • 2016-12-17 13:00 • 来自相关话题

  Vim是Linux/Unix平台的一款使用复杂、功能十分强大、且又非常常用的文本编辑器。它有非常多的快捷键、熟练掌握它们,能极大的提高工作效率。下面是爱E族整理的vim中常用的命令,供大家参考。要系统的学习了解vim,大家可以前往:http://vimcdoc.sourceforge.net/doc/ 命令描述保
存:r读入;':r file'从file文件读入;':5 r !command':从命令中读入到第5行后;:w保存;':w':强制保存;':w! file'强制保存到file文件;:q退出;q!:强制退出;:wq,:x保存退出;':x!'、':wq!':强制保存退出;ZQ,ZZ无论如何退出当前编辑;ZQ:放弃未保存内容;ZZ:自动保存修改的内容;:sh进入到shell终端,退出shell后可回到vim当前的编辑;CTRL+Z将vim压人后台运行回到shell,在shell中使用fg命令可恢复vim编辑,jobs查看任务;:!command临时执行shell命令;光


动←↓↑→ 按字符移动,使用方向键,或者用h: ←、 j: ↓、 k:↑、 l:→ 退格,空格退格(命令模式):左移一格;空格(命令模式):右移一格;w移动到下个单词开始处;3w:移动到后面第3个单词开始处;b移动到上个单词开始处;2b:移动到前面第2个单词开始处;e移动到下个单词结尾处;2e:移动到后面第2个单词结尾处;ge移动到上个单词结尾处;2ge:移动到前面第2个单词结尾处;W,B,E,gE同w,b,ge,但对单词的判断更宽松;^,0移动到行首;$移动到行尾;5$:移动到第5行结尾;(,)(:把光标移到完整句子的句首;):把光标移到完整句子的句尾;{,}{:把光标移到完整段落的段首;}:把光标移到完整段落的段尾;f向后移动到指定字符位置;fa:移动到'a'处;4f1:移动到第4个'1'处;F向前移动到指定字符位置;Fb:前移到'b'处;4f8:前移到第4个'8'处;t同f,只是移动到查找字符的前一个字符;T同F,只是移动到查找字符的后一个字符;%移动到与当前位置括弧成对的另一个括弧位置:{..},(..),[..];按

移-,+,Enter-:下移一行;+,回车:下移一行;j,k按行下、上移动;4j:下移4行;5k:上移5行;gg移动到文件首行;5gg:移动到第5行;G移动到文件末行;8G:移动到第8行;%移动到文件百分比位置;10%:移动到文件10%位置;历

&

签``跳回到光标的上一次的位置;CTRL+O无限跳回光标的上一个位置;":jumps"能显示调往的位置列表;CTRL+I无限跳往光标的下一个位置;:makrs显示所有书签;m创建一个书签;mo:创建一个名称为'o'的书签;`跳转到书签位置;`a:调整到书签'a'的位置;宏qqa:开始录制宏,宏名为'a';@@a,5@a:执行宏'a'1次、5次;滚
屏H,M,L移动到屏首、中、尾;zt,zz,zb滚屏使光标位于屏幕首、中、尾部;CTRL+..B、F向上、下滚一屏;U、D向上、下滚半屏;Y、E向上、下滚一行;查

&

换/String搜索字符串Str,Str可以是普通字符串或者正则表达式;
.*[]^%/\?~$在有特殊含义,如要查找它们,需要在前面加上一个"\"字符;
/str/-num,/str/+num:查找后跳转到匹配行的前num行、后num行;
查找时,可以使用'n'查找下一个,使用'N'查找上一个;?String同'/'; 只是"?"是向前查找;
?str?-num,?str?+num:查找后跳转到匹配行的前num行、后num行;:%s/././%s/a/b/:将a替换成b,替换一次;%s/a/b/g:将全部a替换成b;
%s/a/b/gc:查找所有a并询问是否替换为b;
20,30s#a#b#g:将20-30行的a全部替换成b;插
入i,Ii:在当前位置前插入;I:在当前行首个非不可见字符前插入;a,Aa:在当前位置后插入;A:在行尾插入;o,Oo:在当前行下面插入文本;O:在当前行上面插入文本;删
除x,Xx、4x:删右1个、4个字符;X、5X:删左边1个、5个字符;D删除光标到行尾;4D:删除光标到行尾、和光标下面3行;dwdw:删除单词和单词后的空格;d4w:删除4个单词和最后的空格;dede:删除单词,保留单词后空格;d4e:删除4个单词,但保留最后的空格;di删除标记内的内容;di(、di[、di{:删除一对()、[]、{}中的内容;dt删除光标到指定标记之间的内容;dt.:删除光标到'.'间的内容;dT删除指定标记到光标之间的内容;dTs:删除字符's'到光标间的内容;d^,d$d^:删除当前到行首字符;d$:删除当前位置到行尾字符;dddd:删除整行;4dd、d4d:删除4行;:n1,n2 d删除n1-n2的所有行;JJ、5J:将2行、5行连成一行(删除首尾缩进、换行符、空格,使用空格连接多行);gJgJ、5gJ:将2行、5行连成一行(删除尾部换行符,保留空格、缩进);删



入C同D,不过删除后进入插入模式;cw,ce同dw,de,不过删除后进入插入模式;ci,ct,cT同ci,ct,CT,不过删除后进入插入模式;c^,c$同d^,d$,不过删除后进入插入模式;cc同dd,不过删除后进入插入模式;ss、4s:删除1、4个字符后进入插入模式;SS、4S:删除1、4行后进入插入模式;xp交换光标当前位置开始的两个字符的位置;覆
写r,grr、4r使用输入字符替换1个、4个字符;gr:按字符宽度替换;R,gR进入替换输入模式,输入一个字符替换一个字符;gR:按字符宽度替换;复
制yyw、ye、y^、y$、yy、5yy:复制单词、单词、到行首、到行尾、整行、5行;Y同yy,按整行复制;pp:粘贴;5p粘贴5次;注:最后删除的内容会寄存在粘贴板,可以用来粘贴;P同p,不过如果是粘贴整行内容时,p粘贴到当前行下,而P粘贴在当前行上面;大

写~修改光标下字符的大小写,并移动到下一个字符;g~g~4,g~5w,6g~~:转换4个字符、5个单词、6行字符的大小写;gUgU4<空格>,gU5e,6gUU:转换4个字符、5个单词、6行为大写;gugu4<空格>,gu5e,6guu:转换4个字符、5个单词、6行为小写;撤
销u,Uu: 撤销上一个操作;U:撤销当前行所有的操作;CTRL-R恢复被撤销的操作;.重复上一个修改,由爱E族整理,未授权不得转载;Exd删除行(del),':.,100 d':删除当前行到100行的所有行;co拷贝行(copy),':2,5 co 8':将2-5行复制到第8行;m移动行(move),':20,. $':当20行到当前行移动到文件尾;可


式v进入可视模式,然后可按方向键选取文本后进行复制、删除等操作;V进入可视模式,按行选取;CTRL+V进入可视模式,按列选取;o,O可视模式下,o:调到对角去选取;O:跳到对面去选取;移
动>右移一个tab宽度;>5gg、>G、>gg:第5行、文件尾、文件头到当前行右移;>>右移一个tab宽度;3>>:3行右移一个tab宽度;<同'>',不过<为左移;<<同'>>',不过<<为左移;对
齐:%le':%le':全部左对齐;':10,20le':10-20行左对齐;:%ce':%ce':全部居中对齐;':10,20ce':10-20行居中对齐;:%ri':%ri':全部右对齐;':10,20ri':10-20行右对齐;其
他CTRL+G显示当前文件名和位置;CTRL+L清除其他进程对vim窗口的干扰信息;CTRL+V输入控制字符;如:按CTRL+V,后按CTRL+M可输入'^M'字符;K根据当前位置的关键词去查找帮助手册;Q进入“Ex”模式;ga打印光标所在处的字符的 ascii 值:%!xxd进入十六进制编辑模式;:%!xxd -r恢复文本编辑模式;:ab定义缩写,如':ab aiezu aiezu.com',这样输入aiezu时间自动变为aiezu.com。其他:要替换特殊字符,如'^M',可以不能直接输入^M,要使用CTRL+V后,再按CTRL+M输入。vim -r file:恢复由意外退出未保存的vim编辑;view file:以只读的方式打开vim文件编辑;
 相关文章:vim编辑器学习之《vim编辑命令快捷键》Vim编辑器之《Vim常用选项合集》Vim go语言基础IDE开发环境安装(Vundle/vim-go)vim go语言IDE环境Tagbar插件和NERDTree插件安装 查看全部
  Vim是Linux/Unix平台的一款使用复杂、功能十分强大、且又非常常用的文本编辑器。它有非常多的快捷键、熟练掌握它们,能极大的提高工作效率。下面是爱E族整理的vim中常用的命令,供大家参考。要系统的学习了解vim,大家可以前往:http://vimcdoc.sourceforge.net/doc/
 命令描述

:r读入;':r file'从file文件读入;':5 r !command':从命令中读入到第5行后;
:w保存;':w':强制保存;':w! file'强制保存到file文件;
:q退出;q!:强制退出;
:wq,:x保存退出;':x!'、':wq!':强制保存退出;
ZQ,ZZ无论如何退出当前编辑;ZQ:放弃未保存内容;ZZ:自动保存修改的内容;
:sh进入到shell终端,退出shell后可回到vim当前的编辑;
CTRL+Z将vim压人后台运行回到shell,在shell中使用fg命令可恢复vim编辑,jobs查看任务;
:!command临时执行shell命令;



←↓↑→ 按字符移动,使用方向键,或者用h: ←、 j: ↓、 k:↑、 l:→ 
退格,空格退格(命令模式):左移一格;空格(命令模式):右移一格;
w移动到下个单词开始处;3w:移动到后面第3个单词开始处;
b移动到上个单词开始处;2b:移动到前面第2个单词开始处;
e移动到下个单词结尾处;2e:移动到后面第2个单词结尾处;
ge移动到上个单词结尾处;2ge:移动到前面第2个单词结尾处;
W,B,E,gE同w,b,ge,但对单词的判断更宽松;
^,0移动到行首;
$移动到行尾;5$:移动到第5行结尾;
(,)(:把光标移到完整句子的句首;):把光标移到完整句子的句尾;
{,}{:把光标移到完整段落的段首;}:把光标移到完整段落的段尾;
f向后移动到指定字符位置;fa:移动到'a'处;4f1:移动到第4个'1'处;
F向前移动到指定字符位置;Fb:前移到'b'处;4f8:前移到第4个'8'处;
t同f,只是移动到查找字符的前一个字符;
T同F,只是移动到查找字符的后一个字符;
%移动到与当前位置括弧成对的另一个括弧位置:{..},(..),[..];


-,+,Enter-:下移一行;+,回车:下移一行;
j,k按行下、上移动;4j:下移4行;5k:上移5行;
gg移动到文件首行;5gg:移动到第5行;
G移动到文件末行;8G:移动到第8行;
%移动到文件百分比位置;10%:移动到文件10%位置;


&

``跳回到光标的上一次的位置;
CTRL+O无限跳回光标的上一个位置;":jumps"能显示调往的位置列表;
CTRL+I无限跳往光标的下一个位置;
:makrs显示所有书签;
m创建一个书签;mo:创建一个名称为'o'的书签;
`跳转到书签位置;`a:调整到书签'a'的位置;
qqa:开始录制宏,宏名为'a';
@@a,5@a:执行宏'a'1次、5次;

H,M,L移动到屏首、中、尾;
zt,zz,zb滚屏使光标位于屏幕首、中、尾部;
CTRL+..B、F向上、下滚一屏;U、D向上、下滚半屏;Y、E向上、下滚一行;


&

/String搜索字符串Str,Str可以是普通字符串或者正则表达式;
.*[]^%/\?~$在有特殊含义,如要查找它们,需要在前面加上一个"\"字符;
/str/-num,/str/+num:查找后跳转到匹配行的前num行、后num行;
查找时,可以使用'n'查找下一个,使用'N'查找上一个;
?String同'/'; 只是"?"是向前查找;
?str?-num,?str?+num:查找后跳转到匹配行的前num行、后num行;
:%s/././%s/a/b/:将a替换成b,替换一次;%s/a/b/g:将全部a替换成b;
%s/a/b/gc:查找所有a并询问是否替换为b;
20,30s#a#b#g:将20-30行的a全部替换成b;

i,Ii:在当前位置前插入;I:在当前行首个非不可见字符前插入;
a,Aa:在当前位置后插入;A:在行尾插入;
o,Oo:在当前行下面插入文本;O:在当前行上面插入文本;

x,Xx、4x:删右1个、4个字符;X、5X:删左边1个、5个字符;
D删除光标到行尾;4D:删除光标到行尾、和光标下面3行;
dwdw:删除单词和单词后的空格;d4w:删除4个单词和最后的空格;
dede:删除单词,保留单词后空格;d4e:删除4个单词,但保留最后的空格;
di删除标记内的内容;di(、di[、di{:删除一对()、[]、{}中的内容;
dt删除光标到指定标记之间的内容;dt.:删除光标到'.'间的内容;
dT删除指定标记到光标之间的内容;dTs:删除字符's'到光标间的内容;
d^,d$d^:删除当前到行首字符;d$:删除当前位置到行尾字符;
dddd:删除整行;4dd、d4d:删除4行;
:n1,n2 d删除n1-n2的所有行;
JJ、5J:将2行、5行连成一行(删除首尾缩进、换行符、空格,使用空格连接多行);
gJgJ、5gJ:将2行、5行连成一行(删除尾部换行符,保留空格、缩进);




C同D,不过删除后进入插入模式;
cw,ce同dw,de,不过删除后进入插入模式;
ci,ct,cT同ci,ct,CT,不过删除后进入插入模式;
c^,c$同d^,d$,不过删除后进入插入模式;
cc同dd,不过删除后进入插入模式;
ss、4s:删除1、4个字符后进入插入模式;
SS、4S:删除1、4行后进入插入模式;
xp交换光标当前位置开始的两个字符的位置;

r,grr、4r使用输入字符替换1个、4个字符;gr:按字符宽度替换;
R,gR进入替换输入模式,输入一个字符替换一个字符;gR:按字符宽度替换;

yyw、ye、y^、y$、yy、5yy:复制单词、单词、到行首、到行尾、整行、5行;
Y同yy,按整行复制;
pp:粘贴;5p粘贴5次;注:最后删除的内容会寄存在粘贴板,可以用来粘贴;
P同p,不过如果是粘贴整行内容时,p粘贴到当前行下,而P粘贴在当前行上面;


~修改光标下字符的大小写,并移动到下一个字符;
g~g~4,g~5w,6g~~:转换4个字符、5个单词、6行字符的大小写;
gUgU4<空格>,gU5e,6gUU:转换4个字符、5个单词、6行为大写;
gugu4<空格>,gu5e,6guu:转换4个字符、5个单词、6行为小写;

u,Uu: 撤销上一个操作;U:撤销当前行所有的操作;
CTRL-R恢复被撤销的操作;
.重复上一个修改,由爱E族整理,未授权不得转载;
Exd删除行(del),':.,100 d':删除当前行到100行的所有行;
co拷贝行(copy),':2,5 co 8':将2-5行复制到第8行;
m移动行(move),':20,. $':当20行到当前行移动到文件尾;



v进入可视模式,然后可按方向键选取文本后进行复制、删除等操作;
V进入可视模式,按行选取;
CTRL+V进入可视模式,按列选取;
o,O可视模式下,o:调到对角去选取;O:跳到对面去选取;

>右移一个tab宽度;>5gg、>G、>gg:第5行、文件尾、文件头到当前行右移;
>>右移一个tab宽度;3>>:3行右移一个tab宽度;
<同'>',不过<为左移;
<<同'>>',不过<<为左移;

:%le':%le':全部左对齐;':10,20le':10-20行左对齐;
:%ce':%ce':全部居中对齐;':10,20ce':10-20行居中对齐;
:%ri':%ri':全部右对齐;':10,20ri':10-20行右对齐;

CTRL+G显示当前文件名和位置;
CTRL+L清除其他进程对vim窗口的干扰信息;
CTRL+V输入控制字符;如:按CTRL+V,后按CTRL+M可输入'^M'字符;
K根据当前位置的关键词去查找帮助手册;
Q进入“Ex”模式;
ga打印光标所在处的字符的 ascii 值
:%!xxd进入十六进制编辑模式;
:%!xxd -r恢复文本编辑模式;
:ab定义缩写,如':ab aiezu aiezu.com',这样输入aiezu时间自动变为aiezu.com。

其他:

  1. 要替换特殊字符,如'^M',可以不能直接输入^M,要使用CTRL+V后,再按CTRL+M输入。
  2. vim -r file:恢复由意外退出未保存的vim编辑;
  3. view file:以只读的方式打开vim文件编辑;

 

相关文章:

Linux git服务端搭建和公钥免密码登录

liuliangsong 发表了文章 • 0 个评论 • 209 次浏览 • 2016-12-16 15:54 • 来自相关话题

一、实验环境:git服务端:操作系统:Red Hat Enterprise Linux 7.1 64位服务端ip:10.0.0.101git软件:git version 1.8.3.1(yum方式安装)git客户端:操作系统:Windows 10 64位git软件: 二、Linux git服务端安装:1、安装git命令:  为了方便和稳定性,能使用yum安装的我们尽量使用yum安装,没必要去编译安装:yum -y install git 2、添加用户git用于访问数据仓库:  这里我们创建一个"/storage"目录,用来存储数据。添加一个用户git,git的用户目录为“/storage/gitroot”,同时以后此目录也是我们的数据仓库根目录,以后所有的数据仓库存放在此目录下。将创建的git用户的shell设置为 “/usr/bin/git-shell”的目的是禁止git用户通过shell登录,保证安全:mkdir -p /storage
useradd -d /storage/gitroot/ -s /usr/bin/git-shell git
# 设一个密码
passwd git 3、创建第一个数据仓库aiezu.com:  这里我们创建第一个数据仓库“aiezu.com”,用来存放我们正在开发的网站aiezu.com。同时设置权限为归git用户和组所有:cd /storage/gitroot
git init --bare aiezu.com
chown -R git.git /storage/gitroot/
 4、git服务端安装完成:
  按上面配置好后,一个数据仓库已经配置好了,数据仓库的URL为:"git@10.0.0.101:aiezu.com",用户名名为"git",密码为上面创建的“git”用户的密码。
 三、git免密码登录:  上面在Linux配置好了git服务端,但是是需要密码登录的。如果希望实现免密码登录,需要在客户机的用户目录下".ssh"文件夹生成一对"公钥/私钥",并将"公钥"内容添加到git服务端的git用户根目录下的".ssh/authorized_keys"文件中,这里是“/storage/gitroot/.ssh/authorized_keys”文件,这样就可以通过“公钥/私钥”认证,达到免密码登录的目的。
  简单的说"B服务器"的“git”用户目录下“.ssh/authorized_keys”文件中如果有公钥,与"A主机"当前登录用户的根目录下私钥文件“.ssh/id_dsa”是成对关系,那么B就能以“git”用户无需密码登录到A。
 1、git免密码登录windows客户端配置:  windows的git客户端,在安装目录下,一般有"git-bash.exe"文件,可以用来生成"公钥/私钥"对。打开“git-bash.exe”文件,进入bash命令行。运行下面命令,生成"公钥/私钥"对:mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa
ls  直接回车就可以看到在目录下生成了两个文件:id_rsa(私钥)、id_rsa.pub(公钥)。
 2、git免密码登录linux客户端配置:  Linux客户端直接在bash使用"ssh-keygen"命令生成公钥/私钥对即可,如果没有"ssh-keygen"命令,需要安装"openssh"包,运行"yum -y install openssh"即可:mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa
ls  3、git免密码登录服务端配置:  在git服务端,在git用户目录下创建一个“.ssh”目录,并在".ssh"命令下添加一个“authorized_keys”文件。记住,每次使用root账户添加文件后,要将文件的所有者变更为git用户,否则会出现文件权限问题:mkdir /storage/gitroot/.ssh
touch /storage/gitroot/.ssh/authorized_keys
chown -R git.git /storage/gitroot/.ssh/  然后将上面在git客户端生成的公钥"id_rsa.pub"的内容追加到authorized_keys文件中去,authorized_keys文件可以放多台客户机的公钥,一条公钥一行即可。这样,authorized_keys文件中有公钥的客户机,即可免密码登录到服务器了。
 4、免密码登录测试:  按上面方法配置好后, 使用git命令“git clone git@10.0.0.101:aiezu.com aiezu.com”,在客户端成功将git服务端的数据仓库克隆到本地的aiezu.com目录: 查看全部

一、实验环境:

git服务端:

  • 操作系统:Red Hat Enterprise Linux 7.1 64位
  • 服务端ip:10.0.0.101
  • git软件:git version 1.8.3.1(yum方式安装)

git客户端:

  • 操作系统:Windows 10 64位
  • git软件:
 

二、Linux git服务端安装:

1、安装git命令:

  为了方便和稳定性,能使用yum安装的我们尽量使用yum安装,没必要去编译安装:
yum -y install git

 

2、添加用户git用于访问数据仓库:

  这里我们创建一个"/storage"目录,用来存储数据。添加一个用户git,git的用户目录为“/storage/gitroot”,同时以后此目录也是我们的数据仓库根目录,以后所有的数据仓库存放在此目录下。将创建的git用户的shell设置为 “/usr/bin/git-shell”的目的是禁止git用户通过shell登录,保证安全:
mkdir -p /storage
useradd -d /storage/gitroot/ -s /usr/bin/git-shell git
# 设一个密码
passwd git

 

3、创建第一个数据仓库aiezu.com:

  这里我们创建第一个数据仓库“aiezu.com”,用来存放我们正在开发的网站aiezu.com。同时设置权限为归git用户和组所有:
cd /storage/gitroot
git init --bare aiezu.com
chown -R git.git /storage/gitroot/

 4、git服务端安装完成:
  按上面配置好后,一个数据仓库已经配置好了,数据仓库的URL为:"git@10.0.0.101:aiezu.com",用户名名为"git",密码为上面创建的“git”用户的密码。
 

三、git免密码登录:

  上面在Linux配置好了git服务端,但是是需要密码登录的。如果希望实现免密码登录,需要在客户机的用户目录下".ssh"文件夹生成一对"公钥/私钥",并将"公钥"内容添加到git服务端的git用户根目录下的".ssh/authorized_keys"文件中,这里是“/storage/gitroot/.ssh/authorized_keys”文件,这样就可以通过“公钥/私钥”认证,达到免密码登录的目的。
  简单的说"B服务器"的“git”用户目录下“.ssh/authorized_keys”文件中如果有公钥,与"A主机"当前登录用户的根目录下私钥文件“.ssh/id_dsa”是成对关系,那么B就能以“git”用户无需密码登录到A。
 

1、git免密码登录windows客户端配置:

  windows的git客户端,在安装目录下,一般有"git-bash.exe"文件,可以用来生成"公钥/私钥"对。打开“git-bash.exe”文件,进入bash命令行。运行下面命令,生成"公钥/私钥"对:
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa
ls
  直接回车就可以看到在目录下生成了两个文件:id_rsa(私钥)、id_rsa.pub(公钥)。
 

2、git免密码登录linux客户端配置:

  Linux客户端直接在bash使用"ssh-keygen"命令生成公钥/私钥对即可,如果没有"ssh-keygen"命令,需要安装"openssh"包,运行"yum -y install openssh"即可:
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa
ls
  

3、git免密码登录服务端配置:

  在git服务端,在git用户目录下创建一个“.ssh”目录,并在".ssh"命令下添加一个“authorized_keys”文件。记住,每次使用root账户添加文件后,要将文件的所有者变更为git用户,否则会出现文件权限问题:
mkdir /storage/gitroot/.ssh
touch /storage/gitroot/.ssh/authorized_keys
chown -R git.git /storage/gitroot/.ssh/
  然后将上面在git客户端生成的公钥"id_rsa.pub"的内容追加到authorized_keys文件中去,authorized_keys文件可以放多台客户机的公钥,一条公钥一行即可。这样,authorized_keys文件中有公钥的客户机,即可免密码登录到服务器了。
 

4、免密码登录测试:

  按上面方法配置好后, 使用git命令“git clone git@10.0.0.101:aiezu.com aiezu.com”,在客户端成功将git服务端的数据仓库克隆到本地的aiezu.com目录:
linux_git_server_nopasswdlogin.png

vim go语言IDE环境Tagbar插件和NERDTree插件安装

liuliangsong 发表了文章 • 0 个评论 • 481 次浏览 • 2016-12-14 15:49 • 来自相关话题

  Tagbar插件和NERDTree插件是vim搭建go语言IDE环境必不可少的两个插件。下面是vim编辑go语言源码时,启动Tagbar插件和NERDTree插件后的效果图:


 
 一、安装前准备:  在执行本文的vim安装Tagbar和NERDTree前,需要先安装好go语言环境、以及安装好vim的插件管理器Vundle插件和go语言基础插件“vim-go”,这些操作都在另外一篇文章《Vim go语言基础IDE开发环境安装(Vundle/vim-go)》里面介绍,这里就不再做介绍,下面介绍Tagbar和NERDTree插件的安装。
 二、安装vim Tagbar插件:  Tagbar插件能在侧边栏展示当前go源码中的所有定义的常量、变量、函数等,并能从侧边栏快速跳转到它们的定义处 。安装好后可以使用":help Tagbar"命令获得使用帮助,也可以去官网查看相关文档:http://majutsushi.github.io/tagbar/。
 1、安装gotags:  gotags是go语言编写的,直接使用go get命令安装:go get -u github.com/jstemmer/gotags 2、安装ctags:yum -y install ctags 3、安装vim Tagbar插件:  在"~/.vimrc"插件填写处添加下面几行,保存后重新启动vim(这里我们将Tagbar插件的启动命令注册为“F8键”)。再在命令模式运行“:PluginInstall”命令安装插件,直到"Tagbar"插件安装完成:Plugin 'Tagbar'
" 设置tagbar的窗口宽度
let g:tagbar_width=30
" 映射Tagbar的快捷键,按F8自动打开
map <F8> :TagbarToggle<CR> 4、Tagbar插件启动测试:  安装好Tagbar插件后,用vim打开go文件,输入“:Tagbar”或者按"F8"就可以打开Tagbar。可以使用"CTRL+W+方向键"实现窗口切换,可以使用“Ctrl + ]”跳至函数定义处,然后再使用“Ctrl + t”返回。下面是Tagbar的常用的快捷键和命令:命令描述F1关闭/显示帮助信息;q关闭Tagbar窗口;x放大/缩小Tagbar窗口;s项目排序切换;+, <kPlus>, zo展开折叠;-, <kMinus>, zc收起折叠;o, za折叠收起\展开切换;*, <kMultiply>, zR展开所有折叠;=, zM收起所有折叠;回车转到标签定义处,并且光标跳转到标签定义处;p转到标签定义处,但光标停留在Tagbar的窗口;P在预览窗口显示标签;<C-N>跳到下一个上级标签;<C-P>跳到上一个上级标签;<Space>显示标签定义;
 三、vim安装NERDTree插件:  NERDTree插件能以树型结构在侧边栏展示当前工作目录下所有文件夹和源文件,并支持快速打开指定的源文件。安装好后可以使用":help NERDTree"命令获得使用帮助,也可以去官网查看相关文档:https://github.com/scrooloose/nerdtree​。
 1、安装NERDTree插件:  在"~/.vimrc"插件填写处的继续添加下面两行,保存并重新启动vim(这里我们将NERDTree插件的启动命令注册为“F7键”)。然后再在命令模式运行“:PluginInstall”命令安装插件,直到"NERDTree"插件安装完成:Plugin 'scrooloose/nerdtree'
map <F7> :NERDTreeToggle<CR> 2、NERDTree插件启动测试:  安装好Tagbar插件后,用vim打开go文件,输入“:NERDTree”或者按"F7键"就可以启动NERDTree。下面是NERDTree的常用的快捷键和命令: 命令描述 ?显示帮助信息;打



树F7打开或关闭NERDTree,此键可以根据自己需求定义。:NERDTreeToggle同F7:NERDTree打开NERDTree:NERDTreeClose关闭NERDTreeq关闭这个NERDTree窗口;A调整NERDTree窗口大小(最大化、最小化)书
签:Bookmark <name>将目录树保存为指定名字的书签;:NERDTreeFromBookmark <name>打开指定书签名的目录树;:ClearBookmarks <name>删除指定书签;:ClearAllBookmarks删除所有书签;过
滤I大写"i",显示或者隐藏"."号开头的文件和目录;f切换是否使用文件筛选;F切换是否显示文件;B切换是否显示书签表;根

录:NERDTreeCWD将CWD设为目录树根目录;CD将CWD目录作为目录树的根目录;C将当前目录作为目录树的根目录;u将当前根目录的上级目录作为根目录;U同u;cd将选定的目录作为CWD目录;刷
新R刷新当前根目录r刷新当前目录 目
录o打开\关闭文件或目录,打开文件时光标会跳到编辑区域;O递归打开当前目录下的所有目录x关闭父目录;X关闭所有子目录;定
位:NERDTreeFind在目录树中定位到当前打开的文件;P跳转到根目录p跳转到上层目录K到同级第一个节点J到同级最后一个节点k跳转到上一个节点;j跳转到下一个节点;<C-K>跳转到同级上一个节点;<C-J>跳转到同级下一个节点;文
件m显示文件系统管理菜单
(添加、删除、移动、复制、现在属性等操作)o打开\关闭文件或目录,打开文件时光标会跳到编辑区域;go打开目录树光标所在文件,但光标依然保留在目录树中;i在水平分割割的窗口中打开选定文件;gi同i,但光标依然保留在目录树中;s在垂直分割割的窗口中打开选定文件;gs同s,但光标依然保留在目录树中;t在新标签页中打开文件,并使新的标签到focus状态;T在新标签页中打开文件,保留原标签的focus状态; 查看全部
  Tagbar插件和NERDTree插件是vim搭建go语言IDE环境必不可少的两个插件。下面是vim编辑go语言源码时,启动Tagbar插件和NERDTree插件后的效果图:
linux_vim_golang_tagbar_nerdtree.png
 
 

一、安装前准备:

  在执行本文的vim安装Tagbar和NERDTree前,需要先安装好go语言环境、以及安装好vim的插件管理器Vundle插件和go语言基础插件“vim-go”,这些操作都在另外一篇文章《Vim go语言基础IDE开发环境安装(Vundle/vim-go)》里面介绍,这里就不再做介绍,下面介绍Tagbar和NERDTree插件的安装。
 

二、安装vim Tagbar插件:

  Tagbar插件能在侧边栏展示当前go源码中的所有定义的常量、变量、函数等,并能从侧边栏快速跳转到它们的定义处 。安装好后可以使用":help Tagbar"命令获得使用帮助,也可以去官网查看相关文档:http://majutsushi.github.io/tagbar/
 

1、安装gotags:

  gotags是go语言编写的,直接使用go get命令安装:
go get -u github.com/jstemmer/gotags
 

2、安装ctags:

yum -y install ctags
 

3、安装vim Tagbar插件:

  在"~/.vimrc"插件填写处添加下面几行,保存后重新启动vim(这里我们将Tagbar插件的启动命令注册为“F8键”)。再在命令模式运行“:PluginInstall”命令安装插件,直到"Tagbar"插件安装完成:
Plugin 'Tagbar'
" 设置tagbar的窗口宽度
let g:tagbar_width=30
" 映射Tagbar的快捷键,按F8自动打开
map <F8> :TagbarToggle<CR>
 

4、Tagbar插件启动测试:

  安装好Tagbar插件后,用vim打开go文件,输入“:Tagbar”或者按"F8"就可以打开Tagbar。可以使用"CTRL+W+方向键"实现窗口切换,可以使用“Ctrl + ]”跳至函数定义处,然后再使用“Ctrl + t”返回。下面是Tagbar的常用的快捷键和命令:
命令描述
F1关闭/显示帮助信息;
q关闭Tagbar窗口;
x放大/缩小Tagbar窗口;
s项目排序切换;
+, <kPlus>, zo展开折叠;
-, <kMinus>, zc收起折叠;
o, za折叠收起\展开切换;
*, <kMultiply>, zR展开所有折叠;
=, zM收起所有折叠;
回车转到标签定义处,并且光标跳转到标签定义处;
p转到标签定义处,但光标停留在Tagbar的窗口;
P在预览窗口显示标签;
<C-N>跳到下一个上级标签;
<C-P>跳到上一个上级标签;
<Space>显示标签定义;

 

三、vim安装NERDTree插件:

  NERDTree插件能以树型结构在侧边栏展示当前工作目录下所有文件夹和源文件,并支持快速打开指定的源文件。安装好后可以使用":help NERDTree"命令获得使用帮助,也可以去官网查看相关文档:https://github.com/scrooloose/nerdtree​。
 

1、安装NERDTree插件:

  在"~/.vimrc"插件填写处的继续添加下面两行,保存并重新启动vim(这里我们将NERDTree插件的启动命令注册为“F7键”)。然后再在命令模式运行“:PluginInstall”命令安装插件,直到"NERDTree"插件安装完成:
Plugin 'scrooloose/nerdtree'
map <F7> :NERDTreeToggle<CR>
 

2、NERDTree插件启动测试:

  安装好Tagbar插件后,用vim打开go文件,输入“:NERDTree”或者按"F7键"就可以启动NERDTree。下面是NERDTree的常用的快捷键和命令:
 命令描述
 ?显示帮助信息;




F7打开或关闭NERDTree,此键可以根据自己需求定义。
:NERDTreeToggle同F7
:NERDTree打开NERDTree
:NERDTreeClose关闭NERDTree
q关闭这个NERDTree窗口;
A调整NERDTree窗口大小(最大化、最小化)

:Bookmark <name>将目录树保存为指定名字的书签;
:NERDTreeFromBookmark <name>打开指定书签名的目录树;
:ClearBookmarks <name>删除指定书签;
:ClearAllBookmarks删除所有书签;

I大写"i",显示或者隐藏"."号开头的文件和目录;
f切换是否使用文件筛选;
F切换是否显示文件;
B切换是否显示书签表;


:NERDTreeCWD将CWD设为目录树根目录;
CD将CWD目录作为目录树的根目录;
C将当前目录作为目录树的根目录;
u将当前根目录的上级目录作为根目录;
U同u;
cd将选定的目录作为CWD目录;

R刷新当前根目录
r刷新当前目录 

o打开\关闭文件或目录,打开文件时光标会跳到编辑区域;
O递归打开当前目录下的所有目录
x关闭父目录;
X关闭所有子目录;

:NERDTreeFind在目录树中定位到当前打开的文件;
P跳转到根目录
p跳转到上层目录
K到同级第一个节点
J到同级最后一个节点
k跳转到上一个节点;
j跳转到下一个节点;
<C-K>跳转到同级上一个节点;
<C-J>跳转到同级下一个节点;

m显示文件系统管理菜单
(添加、删除、移动、复制、现在属性等操作)
o打开\关闭文件或目录,打开文件时光标会跳到编辑区域;
go打开目录树光标所在文件,但光标依然保留在目录树中;
i在水平分割割的窗口中打开选定文件;
gi同i,但光标依然保留在目录树中;
s在垂直分割割的窗口中打开选定文件;
gs同s,但光标依然保留在目录树中;
t在新标签页中打开文件,并使新的标签到focus状态;
T在新标签页中打开文件,保留原标签的focus状态;

Vim go语言基础IDE开发环境安装(Vundle/vim-go)

liuliangsong 发表了文章 • 0 个评论 • 261 次浏览 • 2016-12-12 21:03 • 来自相关话题

一、linux安装go语言环境:1、下载go安装包:  打开golang官网下载地址https://golang.org/dl/,根据你的服务器CPU构架,下载对应的最新安装包,并解压。我的CPU构架是X86_64位的,所以下载的是“amd64.tar.gz”结尾的:[root@aiezu.com local]# cd /usr/local/
[root@aiezu.com local]# uname -m
x86_64
[root@aiezu.com local]# wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz
[root@aiezu.com local]# tar -zxvf go1.7.4.linux-amd64.tar.gz  golang语言安装包是绿色安装包,无需编译,解压后设置好环境变量既可用。如果打不开官方网站,也可以从国内的网站上面下载:http://www.golangtc.com/download
 2、设置环境变量:  编辑“~/.bashrc”,在文件末尾添加下面四行,这样每次打开新的bash时,会自动读入下面四条环境变量:export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=~/go # 指定工作目录,你将来的开发代码放在$GOPATH/src/目录下  使用“. ~/.bashrc”命令将载入脚本:[root@aiezu.com ~]# echo $GOROOT

[root@aiezu.com ~]# . ~/.bashrc
[root@aiezu.com ~]# echo $GOROOT
/usr/local/go
[root@aiezu.com ~]# echo $GOBIN
/usr/local/go/bin 二、安装linux vim插件管理器Vundle:1、下载Vundle插件:  Vundle是vim的一个插件管理器, 它本身也是vim的一个插件。Vundle需要使用git命令来安装,如果无git命令,需要使用"yum -y install git"安装git命令。有git命令的,直接安装Vundle:mkdir -p ~/.vim/bundle
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim 2、编辑~/.vimrc文件设置插件:   然后运行“vim ~/.vimrc”命令创建".vimrc"文件,并在文件中添加如下内容,并保存退出:syntax on
" tab宽度和缩进同样设置为4
set tabstop=4
set softtabstop=4
set shiftwidth=4

set nocompatible

" 你在此设置运行时路径
set rtp+=~/.vim/bundle/Vundle.vim

call vundle#begin()

" Vundle 本身就是一个插件
Plugin 'gmarik/Vundle.vim'


"所有插件都应该在这一行之前
call vundle#end()

" filetype off
filetype plugin indent on 3、安装Vundle插件:  ".vimrc"文件配置好后,打开vim,在命令模式输入插件安装命令“:PluginInstall”命令,vim就会自动安装“.vimrc”中配置的所有插件,直到vim底部出现“Done”安装完成。



 三、安装vim go语言插件"vim-go":  vim-go插件go语言IDE环境的一个基础插件,本身就是十分强大的插件,它自带了go语言的语法高亮、语法检测等。同时还有一个十分好用的功能,可以使用“Ctrl + ]”跳至函数定义处,然后再使用“Ctrl + t”返回。安装好后,可以使用“:help vim-go”获得使用帮助,更多介绍请参考:https://github.com/fatih/vim-go。
 1、安装"vim-go"插件:  编辑"~/.vimrc"文件,在其中插件填写处(Plugin 'gmarik/Vundle.vim'下面)添加下面一行并保存退出:Plugin 'fatih/vim-go'  再次打开vim命令,在命令模式下运行“:PluginInstall”,提示“Processing 'fatih/vim-go'”,然后等待。直到提示“Done”插件安装完成。
  然后再将“~/.vimrc”中的“filetype off”前的双引号(双引号用与注释)去掉并保存文件。这时再编辑".go"文件,就有语法高亮功能了:



 2、安装vim-go必要的相关工具:  重新打开vim,输入“:GoInstallBinaries”命令,所有必要的二进制文件(gocode、godef、goimports...)将是自动下载并安装到"$GOBIN"目录或者"$GOPATH/bin"命令 。由于都是从国外托管的网站上下载,这个过程可能有比较长的时间。 安装完成后,你就可以使用vim-go插件的所有功能了。
  3、gocode函数提示功能配置:  vim本身就有代码提示功能,在vim的“/usr/share/vim/vim74/autoload/”目录下“*complete.vim”的文件就是各个语言的代码提示支持文件,如“phpcomplete.vim”是php的代码提示支持文件。但是vim本身是不带go语言的代码提示支持文件的,不过安装好gocode后,会生成一个“gocomplete.vim”到“~/.vim/autoload/”命令,再到"~/.vimrc"文件中配置一下,go语言也支持代码提示了。
  关于代码提示功能需要在"~/.vimrc"要加入的内容如下:filetype plugin indent on

autocmd FileType ruby,eruby set omnifunc=rubycomplete#Complete
autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType java set omnifunc=javacomplete#Complete
autocmd FileType go set omnifunc=gocomplete#Complete  其中第一行我们在前面已经加入过,后面几行就是各个语言的后缀文件自动补全调用的函数,这些函数都在各自语言的“*complete.vim”文件中定义。最后一行就是go语言的自定补全功能定义了。配置好后,连续按下<C-x><C-o>就会有代码提示了。
 四、Tagbar和NERDTree插件安装:  Tagbar插件提供源码函数结构导航,NERDTree插件提供目录源文件树型结构导航,它们的安装方法请参考:vim go语言IDE环境Tagbar插件和NERDTree插件安装页面。 查看全部

一、linux安装go语言环境:

1、下载go安装包:

  打开golang官网下载地址https://golang.org/dl/,根据你的服务器CPU构架,下载对应的最新安装包,并解压。我的CPU构架是X86_64位的,所以下载的是“amd64.tar.gz”结尾的:
[root@aiezu.com local]# cd /usr/local/
[root@aiezu.com local]# uname -m
x86_64
[root@aiezu.com local]# wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz
[root@aiezu.com local]# tar -zxvf go1.7.4.linux-amd64.tar.gz
  golang语言安装包是绿色安装包,无需编译,解压后设置好环境变量既可用。如果打不开官方网站,也可以从国内的网站上面下载:http://www.golangtc.com/download
 

2、设置环境变量:

  编辑“~/.bashrc”,在文件末尾添加下面四行,这样每次打开新的bash时,会自动读入下面四条环境变量:
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=~/go # 指定工作目录,你将来的开发代码放在$GOPATH/src/目录下
  使用“. ~/.bashrc”命令将载入脚本:
[root@aiezu.com ~]# echo $GOROOT

[root@aiezu.com ~]# . ~/.bashrc
[root@aiezu.com ~]# echo $GOROOT
/usr/local/go
[root@aiezu.com ~]# echo $GOBIN
/usr/local/go/bin
 

二、安装linux vim插件管理器Vundle:

1、下载Vundle插件:

  Vundle是vim的一个插件管理器, 它本身也是vim的一个插件。Vundle需要使用git命令来安装,如果无git命令,需要使用"yum -y install git"安装git命令。有git命令的,直接安装Vundle:
mkdir -p ~/.vim/bundle
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
 

2、编辑~/.vimrc文件设置插件: 

  然后运行“vim ~/.vimrc”命令创建".vimrc"文件,并在文件中添加如下内容,并保存退出:
syntax on
" tab宽度和缩进同样设置为4
set tabstop=4
set softtabstop=4
set shiftwidth=4

set nocompatible

" 你在此设置运行时路径
set rtp+=~/.vim/bundle/Vundle.vim

call vundle#begin()

" Vundle 本身就是一个插件
Plugin 'gmarik/Vundle.vim'


"所有插件都应该在这一行之前
call vundle#end()

" filetype off
filetype plugin indent on
 

3、安装Vundle插件:

  ".vimrc"文件配置好后,打开vim,在命令模式输入插件安装命令“:PluginInstall”命令,vim就会自动安装“.vimrc”中配置的所有插件,直到vim底部出现“Done”安装完成。
linux_vim_golang_vundle_install_01.png

 

三、安装vim go语言插件"vim-go":

  vim-go插件go语言IDE环境的一个基础插件,本身就是十分强大的插件,它自带了go语言的语法高亮、语法检测等。同时还有一个十分好用的功能,可以使用“Ctrl + ]”跳至函数定义处,然后再使用“Ctrl + t”返回。安装好后,可以使用“:help vim-go”获得使用帮助,更多介绍请参考:https://github.com/fatih/vim-go
 

1、安装"vim-go"插件:

  编辑"~/.vimrc"文件,在其中插件填写处(Plugin 'gmarik/Vundle.vim'下面)添加下面一行并保存退出:
Plugin 'fatih/vim-go'
  再次打开vim命令,在命令模式下运行“:PluginInstall”,提示“Processing 'fatih/vim-go'”,然后等待。直到提示“Done”插件安装完成。
  然后再将“~/.vimrc”中的“filetype off”前的双引号(双引号用与注释)去掉并保存文件。这时再编辑".go"文件,就有语法高亮功能了:
linux_vim_golang_vundle_install_02.png

 

2、安装vim-go必要的相关工具:

  重新打开vim,输入“:GoInstallBinaries”命令,所有必要的二进制文件(gocode、godef、goimports...)将是自动下载并安装到"$GOBIN"目录或者"$GOPATH/bin"命令 。由于都是从国外托管的网站上下载,这个过程可能有比较长的时间。 安装完成后,你就可以使用vim-go插件的所有功能了。
  

3、gocode函数提示功能配置:

  vim本身就有代码提示功能,在vim的“/usr/share/vim/vim74/autoload/”目录下“*complete.vim”的文件就是各个语言的代码提示支持文件,如“phpcomplete.vim”是php的代码提示支持文件。但是vim本身是不带go语言的代码提示支持文件的,不过安装好gocode后,会生成一个“gocomplete.vim”到“~/.vim/autoload/”命令,再到"~/.vimrc"文件中配置一下,go语言也支持代码提示了。
  关于代码提示功能需要在"~/.vimrc"要加入的内容如下:
filetype plugin indent on

autocmd FileType ruby,eruby set omnifunc=rubycomplete#Complete
autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType java set omnifunc=javacomplete#Complete
autocmd FileType go set omnifunc=gocomplete#Complete
  其中第一行我们在前面已经加入过,后面几行就是各个语言的后缀文件自动补全调用的函数,这些函数都在各自语言的“*complete.vim”文件中定义。最后一行就是go语言的自定补全功能定义了。配置好后,连续按下<C-x><C-o>就会有代码提示了。
 

四、Tagbar和NERDTree插件安装:

  Tagbar插件提供源码函数结构导航,NERDTree插件提供目录源文件树型结构导航,它们的安装方法请参考:vim go语言IDE环境Tagbar插件和NERDTree插件安装页面。

Linux bash终端设置代理(proxy)访问

liuliangsong 发表了文章 • 0 个评论 • 375 次浏览 • 2016-12-11 19:40 • 来自相关话题

  Linux是开源操作系统,有很多软件包需要从国外网站上下载,而其中大部分国外网站是被墙的,这时我们需要通过代理来访问这些网站。下面我们介绍Linux bash shell终端代理设置方法,包括socks代理,http代理。
 一、linux shell终端代理设置方法:  linux要在shell终端为http、https、ftp协议设置代理,值需要设置对应的环境变量即可。下面是一些关于代理的环境变量:环境变量描述值示例http_proxy为http网站设置代理;10.0.0.51:8080;
user:pass@10.0.0.10:8080
socks4://10.0.0.51:1080
socks5://192.168.1.1:1080https_proxy为https网站设置代理;同上ftp_proxy为ftp协议设置代理;socks5://192.168.1.1:1080no_proxy无需代理的主机或域名;
可以使用通配符;
多个时使用“,”号分隔;*.aiezu.com,10.*.*.*,192.168.*.*,
*.local,localhost,127.0.0.1   可以将上面4个环境变量设置项放于~/.bashrc文件尾部,这样用户打开bash shell终端时会自动调用此脚本,读入它们。
  二、linux bash为http站点设置代理:  根据代理类型,将下面对应的设置项添加到~/.bashrc文件末尾,然后运行". ~/.bashrc"(前面是一个“.”号)命令使用之在当前环境生效。
1、为http站点设置http代理(默认):export http_proxy=10.0.0.52:80802、为http站点设置sock4、sock5代理:# 设置 socks 代理,自动识别socks版本
export http_proxy=socks://10.0.0.52:1080
# 设置 socks4 代理
export http_proxy=socks4://10.0.0.52:1080
# 设置 socks5 代理
export http_proxy=socks5://10.0.0.52:10803、代理使用用户名密码认证:export http_proxy=user:pass@192.158.8.8:8080    三、linux bash为https站点设置代理:  如果需要为https网站设置代理,设置https_proxy环境变量即可;设置方法完全与http_proxy环境变量相同:# 任意使用一项
export https_proxy=10.0.0.52:8080
export https_proxy=user:pass@192.158.8.8:8080
export https_proxy=socks://10.0.0.52:1080
export https_proxy=socks4://10.0.0.52:1080
export https_proxy=socks5://10.0.0.52:1080  四、举例:  现在我们要设置http、https网站都使用socks5代理10.0.0.52:1080,下面为完整设置方法:
1、vim ~/.bashrc,在文件尾部添加下面内容:export http_proxy=socks5://10.0.0.52:1080
export https_proxy=socks5://10.0.0.52:1080
export no_proxy="*.aiezu.com,10.*.*.*,192.168.*.*,*.local,localhost,127.0.0.1"2、加载设置:[root@aiezu.com ~]# . ~/.bashrc
[root@aiezu.com ~]# echo $http_proxy
socks5://10.0.0.52:1080
[root@aiezu.com ~]# echo $https_proxy
socks5://10.0.0.52:10803、测试代理:[root@aiezu.com ~]# curl -I http://www.fackbook.com
HTTP/1.1 200 OK
Content-Length: 2423
Content-Type: text/html
Last-Modified: Mon, 14 Nov 2016 22:03:32 GMT
Accept-Ranges: bytes
ETag: "0521af0c23ed21:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sun, 11 Dec 2016 13:21:33 GMT 查看全部
  Linux是开源操作系统,有很多软件包需要从国外网站上下载,而其中大部分国外网站是被墙的,这时我们需要通过代理来访问这些网站。下面我们介绍Linux bash shell终端代理设置方法,包括socks代理,http代理。
 

一、linux shell终端代理设置方法:

  linux要在shell终端为http、https、ftp协议设置代理,值需要设置对应的环境变量即可。下面是一些关于代理的环境变量:
环境变量描述值示例
http_proxy为http网站设置代理;10.0.0.51:8080;
user:pass@10.0.0.10:8080
socks4://10.0.0.51:1080
socks5://192.168.1.1:1080
https_proxy为https网站设置代理;同上
ftp_proxy为ftp协议设置代理;socks5://192.168.1.1:1080
no_proxy无需代理的主机或域名;
可以使用通配符;
多个时使用“,”号分隔;
*.aiezu.com,10.*.*.*,192.168.*.*,
*.local,localhost,127.0.0.1 
  可以将上面4个环境变量设置项放于~/.bashrc文件尾部,这样用户打开bash shell终端时会自动调用此脚本,读入它们。
  

二、linux bash为http站点设置代理:

  根据代理类型,将下面对应的设置项添加到~/.bashrc文件末尾,然后运行". ~/.bashrc"(前面是一个“.”号)命令使用之在当前环境生效。
1、为http站点设置http代理(默认):
export http_proxy=10.0.0.52:8080
2、为http站点设置sock4、sock5代理:
# 设置 socks 代理,自动识别socks版本
export http_proxy=socks://10.0.0.52:1080
# 设置 socks4 代理
export http_proxy=socks4://10.0.0.52:1080
# 设置 socks5 代理
export http_proxy=socks5://10.0.0.52:1080
3、代理使用用户名密码认证:
export http_proxy=user:pass@192.158.8.8:8080
    

三、linux bash为https站点设置代理:

  如果需要为https网站设置代理,设置https_proxy环境变量即可;设置方法完全与http_proxy环境变量相同:
# 任意使用一项
export https_proxy=10.0.0.52:8080
export https_proxy=user:pass@192.158.8.8:8080
export https_proxy=socks://10.0.0.52:1080
export https_proxy=socks4://10.0.0.52:1080
export https_proxy=socks5://10.0.0.52:1080
  

四、举例:

  现在我们要设置http、https网站都使用socks5代理10.0.0.52:1080,下面为完整设置方法:
1、vim ~/.bashrc,在文件尾部添加下面内容:
export http_proxy=socks5://10.0.0.52:1080
export https_proxy=socks5://10.0.0.52:1080
export no_proxy="*.aiezu.com,10.*.*.*,192.168.*.*,*.local,localhost,127.0.0.1"
2、加载设置:
[root@aiezu.com ~]# . ~/.bashrc
[root@aiezu.com ~]# echo $http_proxy
socks5://10.0.0.52:1080
[root@aiezu.com ~]# echo $https_proxy
socks5://10.0.0.52:1080
3、测试代理:
[root@aiezu.com ~]# curl -I http://www.fackbook.com
HTTP/1.1 200 OK
Content-Length: 2423
Content-Type: text/html
Last-Modified: Mon, 14 Nov 2016 22:03:32 GMT
Accept-Ranges: bytes
ETag: "0521af0c23ed21:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sun, 11 Dec 2016 13:21:33 GMT

Linux curl命令使用代理、以及代理种类介绍

liuliangsong 发表了文章 • 0 个评论 • 1199 次浏览 • 2016-12-07 11:40 • 来自相关话题

  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  一、代理服务器分类:  我们比较常用、支持http(s)协议代理主要分为两大类:http代理和socks代理,见下表:大类小类子类描述http代理http代理
https代理透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议只支持TCP应用;SOCKS4A支持TCP应用;支持服务器端域名解析;SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6; 二、Linux curl命令代理设置参数:  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:参数用法-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;
 三、Linux curl命令设置代理举例:1、linux curl命令设置http代理:# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php 2、Linux curl命令设置socks代理:#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php 四、测试代理的隐匿度:1、测试前准备:  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  2、测试使用不同代理输出结果:  ①.  通过linux curl不使用代理访问:[root@aiezu.com ~]# curl http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.112.104.126
)  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理。

  ④. 通过linux curl命令使用http高匿名代理访问:[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.232.1.13
)  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理。
  
  ④. 通过linux curl命令使用socks5代理访问:[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 180.96.54.198
)  可以看出此SOCKS5代理也是高匿名代理。
  五、附录:Linux curl命令详解 查看全部
  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  

一、代理服务器分类:

  我们比较常用、支持http(s)协议代理主要分为两大类:http代理socks代理,见下表:
大类小类子类描述
http代理http代理
https代理
透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;
匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;
高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;
SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议
只支持TCP应用;
SOCKS4A支持TCP应用;支持服务器端域名解析;
SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6;
 

二、Linux curl命令代理设置参数:

  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:
参数用法
-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;

 

三、Linux curl命令设置代理举例:

1、linux curl命令设置http代理:

# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
 

2、Linux curl命令设置socks代理:

#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php
 

四、测试代理的隐匿度:

1、测试前准备:

  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:
<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);
  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  

2、测试使用不同代理输出结果:

  ①.  通过linux curl不使用代理访问:
[root@aiezu.com ~]# curl http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.112.104.126
)
  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:
[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php 
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)
  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:
[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php 
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)
  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理

  ④. 通过linux curl命令使用http高匿名代理访问:
[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.232.1.13
)
  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理
  
  ④. 通过linux curl命令使用socks5代理访问:
[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 180.96.54.198
)
  可以看出此SOCKS5代理也是高匿名代理。
  

五、附录:

Linux curl命令http cookie详解

liuliangsong 发表了文章 • 0 个评论 • 211 次浏览 • 2016-12-07 08:35 • 来自相关话题

  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 一、Linux curl命令Cookie的接收:1、cookie接收原理:  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:


  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 2、linux curl命令接收cookie(-c):  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98 二、Linux curl命令发送Cookie:1、cookie发送原理和从cookie文件中发送:  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:<?php print_r($_COOKIE);  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 3、linux curl命令使用"-H"参数发送cookie:  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 三、附录:Linux curl命令详解
  查看全部
  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 

一、Linux curl命令Cookie的接收:

1、cookie接收原理:

  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:
<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');
  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:
linux_curl_http_header_cookie.png
  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 

2、linux curl命令接收cookie(-c):

  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。
[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98
 

二、Linux curl命令发送Cookie:

1、cookie发送原理和从cookie文件中发送:

  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:
<?php print_r($_COOKIE);
  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:
[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact
  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 

2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:

  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:
[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

3、linux curl命令使用"-H"参数发送cookie:

  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:
[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

三、附录:


 

Linux curl命令get/post提交数据、json和文件全攻略

liuliangsong 发表了文章 • 0 个评论 • 1132 次浏览 • 2016-12-03 13:43 • 来自相关话题

  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。一、测试前准备:  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
} 二、GET请求方式:  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族

2、使用"-G"参数配合"-d"参数:[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php 
3、带特殊字符数据使用“--data-urlencode”:[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?

4、从文件中获取数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
) 三、POST基本类型请求方式(-d):  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded对、正是相当于html的如下表单:<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form> 
1、直接设置POST数据:[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?

2、从文件中获取POST数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
) 四、POST多类型表单数据请求方式(-F):  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722
相当于HTML的如下表单:<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form、-F):[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
2、使用"@"、"<"失去特殊意义的"--form-string":[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)
3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

) 五、POST上传文件(-F "@"字符的妙用):  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)


2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

) 六、POST提交JSON数据:  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)接收JSON的代码段:<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}  提示:除了Content-Type为multipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 七、附录:参考页面:Linux curl命令详解linux curl命令来路伪装(referer)和浏览器伪装(user-agent) 查看全部
  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。

一、测试前准备:

  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:
<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
 

二、GET请求方式:

  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:
[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 
2、使用"-G"参数配合"-d"参数:
[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:
curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php
 
3、带特殊字符数据使用“--data-urlencode”:
[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?
)
 
4、从文件中获取数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

三、POST基本类型请求方式(-d):

  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded
对、正是相当于html的如下表单:
<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form>
 
1、直接设置POST数据:
[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?
)
 
2、从文件中获取POST数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

四、POST多类型表单数据请求方式(-F):

  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722

相当于HTML的如下表单:
<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>
注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form-F):
[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)

2、使用"@"、"<"失去特殊意义的"--form-string":
[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)

3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

)
 

五、POST上传文件(-F "@"字符的妙用):

  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:
[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)

)
 
2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:
<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

)
 

六、POST提交JSON数据:

  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:
[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}'  http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
接收JSON的代码段:
<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
  提示:除了Content-Typemultipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 

七、附录:

参考页面: