分类目录归档:tools

wine

一、安装

sudo yum -y install wine
很快安装完毕

二、启动配置工具

winecfg
但是弹出框没有文字.汉字都是点号

三、能够运行,但是问题多多

直接运行: wine axx.exe
竟然真能跑起来,还是没有汉字,都是点点。

四、按照网上说明,竟然成功搞定

www.360doc.com/content/12/0911/18/44521/235580987.shtml
---->>> 神操作,在PC浏览器无法复制,但是在手机浏览器竟然让我复制了!!!

wine中文乱码的解决方法

新装的wine中文全是乱码,需要修改一下几个配置文件,找到一篇比较详细的配置说明,分享一下:
” wine下中文的配置方案
步骤:

1. 初始设置

运行 winecfg,把模拟的 Windows 系统设置为 Windows XP 或者 Windows 2000。

2. 准备字体

为了让 Windows 应用程序看上去更美观,所以需要 Windows 下面的字体。
由于我已经将 simsun.ttc 复制到 /usr/share/fonts/windows/
目录中了。所以我只需要在 ~/.wine/drive_c/windows/fonts/ 目录中为
simsun.ttc 创建一个符号连接:
cd ~/.wine/drive_c/windows/fonts
ln -s /usr/share/fonts/windows/simsun.ttc simsun.ttc
ln -s /usr/share/fonts/windows/simsun.ttc simfang.ttc
创建一个 simfang.ttc 是许多 Windows 应用默认使用 simfang.ttc 字体。

3. 修改 ~/.wine/system.reg

装好字体后,还要修改一下 Wine 的注册表设置,指定与字体相关的设置:
gedit ~/.wine/system.reg
(一定要使用 gedit 或其他支持 gb2312/utf8
编码的编辑器修改这些文件,否则文件中的中文可能变乱码)
搜索: LogPixels
找到的行应该是:[System\\CurrentControlSet\\Hardware
Profiles\\Current\\Software\\Fonts]
将其中的:
"LogPixels"=dword:00000060
改为:
"LogPixels"=dword:00000070
搜索: FontSubstitutes
找到的行应该是:[Software\\Microsoft\\Windows
NT\\CurrentVersion\\FontSubstitutes]
将其中的:
"MS Shell Dlg"="Tahoma"
"MS Shell Dlg 2″="Tahoma"
改为:
"MS Shell Dlg"="SimSun"
"MS Shell Dlg 2″="SimSun"

4. 修改 ~/.wine/drive_c/windows/win.ini

gedit ~/.wine/drive_c/windows/win.ini
在文件末尾加入:
[Desktop]
menufontsize=13
messagefontsize=13
statusfontsize=13
IconTitleSize=13

5.最关键的一步

网上很多文章中没有提到的一步──把下面的代码保存为zh.reg,然后终端执行regedit
zh.reg。从Windows目录下的Fonts里的simsun.ttc复制到/home/user/.wine/drive_c/windows/fonts里面。
代码:
REGEDIT4
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
NT\CurrentVersion\FontSubstitutes]
"Arial"="simsun"
"Arial CE,238"="simsun"
"Arial CYR,204"="simsun"
"Arial Greek,161"="simsun"
"Arial TUR,162"="simsun"
"Courier New"="simsun"
"Courier New CE,238"="simsun"
"Courier New CYR,204"="simsun"
"Courier New Greek,161"="simsun"
"Courier New TUR,162"="simsun"
"FixedSys"="simsun"
"Helv"="simsun"
"Helvetica"="simsun"
"MS Sans Serif"="simsun"
"MS Shell Dlg"="simsun"
"MS Shell Dlg 2"="simsun"
"System"="simsun"
"Tahoma"="simsun"
"Times"="simsun"
"Times New Roman CE,238"="simsun"
"Times New Roman CYR,204"="simsun"
"Times New Roman Greek,161"="simsun"
"Times New Roman TUR,162"="simsun"
"Tms Rmn"="simsun"
之后,中文正常显示!

2、linux系统一键安装wine

A、准备好文件,从win7同步 simsun.ttc
B、因为需要分别在 root 和user下面安装,总脚本
# for root install
sudo yum -y install wine && sudo sh cfgFont.sh

# for user install
sh cfgFont.sh

C、核心代码

cfgFont.sh

prepare fonts

cp ./simsun.ttc ~/.wine/drive_c/windows/Fonts/simsun.ttc
cp ./simsun.ttc ~/.wine/drive_c/windows/Fonts/simfang.ttc

setup fonts : ~/.wine/system.reg

#"LogPixels"=dword:00000070
sed -i "/\"LogPixels\"\=dword:00000060/ s/00000060/00000070/" ~/.wine/system.reg

#搜索: FontSubstitutes 找到的行应该是:
#[Software\Microsoft\WindowsNT\CurrentVersion\FontSubstitutes]
#将其中的:
#"MS Shell Dlg"="Tahoma"
#"MS Shell Dlg 2″="Tahoma"
#改为:
#"MS Shell Dlg"="SimSun"
#"MS Shell Dlg 2″="SimSun"
sed -i "/\"MS\ Shell\ Dlg\"\=\"Tahoma\"/ s/Tahoma/SimSun/" ~/.wine/system.reg
sed -i "/\"MS\ Shell\ Dlg\ 2\"\=\"Tahoma\"/ s/Tahoma/SimSun/" ~/.wine/system.reg

#4. 修改 ~/.wine/drive_c/windows/win.ini
#gedit ~/.wine/drive_c/windows/win.ini
#在文件末尾加入:
#[Desktop]
#menufontsize=13
#messagefontsize=13
#statusfontsize=13
#IconTitleSize=13

iniFile=echo ~/.wine/drive_c/windows/win.ini
echo "iniFile is ${iniFile}"
oldStr=sed -n "/[Desktop\]/p" "${iniFile}"
if [[ -z "${oldStr}" ]]; then
sed -i ‘$a[Desktop]’ ${iniFile}
sed -i ‘$amenufontsize=13’ ${iniFile}
sed -i ‘$astatusfontsize=13’ ${iniFile}
sed -i ‘$aIconTitleSize=13’ ${iniFile}
else
echo "[Desktop] font has been set"
fi

#最关键的一步,终端执行regedit zh.reg
regedit zh.reg

### D、注册表文件
```reg
REGEDIT4
[HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\FontSubstitutes]
"Arial"="simsun"
"Arial CE,238"="simsun"
"Arial CYR,204"="simsun"
"Arial Greek,161"="simsun"
"Arial TUR,162"="simsun"
"Courier New"="simsun"
"Courier New CE,238"="simsun"
"Courier New CYR,204"="simsun"
"Courier New Greek,161"="simsun"
"Courier New TUR,162"="simsun"
"FixedSys"="simsun"
"Helv"="simsun"
"Helvetica"="simsun"
"MS Sans Serif"="simsun"
"MS Shell Dlg"="simsun"
"MS Shell Dlg 2"="simsun"
"System"="simsun"
"Tahoma"="simsun"
"Times"="simsun"
"Times New Roman CE,238"="simsun"

五、wine大显神威

最让人头疼的是,在linux下面用不了source insight。
只需三四不即可搞定:
wine sourceInsight_setup.exe
然后: wine keygen.exe,报错,用win7中生成的序列号,同样管用。
几分钟搞定

2、wine 运行bat脚本
执行bat脚本:
   wine cmd < ab.bat
进入dos环境:
   wine cmd

六、相关工具

CrossOver 基于 wine,功能更加好用

w3m

linux 命令行查看 html 文件

1、安装

yum -y install w3m w3m-img

假如终端不支持中文,需要安装 zhcon
   yum -y install zhcon

2、用法

1、访问网址
w3m www.baidu.com

2、输入文本,与网页交互

然后利用方向键或者 TAP 切换光标位置。
切换到输入框,按下a/i,与 vim 操作雷同,然后 tap 跳到后面的“搜索“框上
下面就会出现TEXT:`key-word`

3、其它常用操作

a、q退出

b、方向控制
与vim常用命令vim常用命令集相似,h,j,k,l 可以分别用来做移动键,分别是左,下,上,右。
如果你熟习vim操作的话这会是很方便的功能。
< 和 > 用来左右滚屏。

c、使用 U 来重新输入需要打开的网址
d、B 返回前一个页面
e、标签操作
多标签操作!
可以使用 T 按键来打开一个新标签。
在多个标签内切换呢? 使用 { 和 }就可以了!
使用 ESC-t 的话会打开标签的菜单让你选择,功能类似系统中的alt-tab功能。
C-q用于关于当前标签页。

f、书签
C-a 添加书签
C-b 查看书签

g、查找
/ 向后查找当前页面
? 向前查找当前页面
n 查找下一个已查找过的关键字
N 向前查找已查找过的关键字

vim

一、vim 操作技巧

1、vim中如何删除行?

dd:删除光标所在行,n dd删除指定的行数
删除命令:
x:删除光标后一个字符,相当于Del 
X:删除光标前一个字符,相当于Backspace 
dd:删除光标所在行,n dd删除指定的行数
D:删除光标后本行所有内容,包含光标所在字符
d0:删除光标前本行所有内容,不包含光标所在字符
dw.删除光标开始位置的字,包含光标所在字符</pre>

2、vim中命令如何撤销?

u:一步一步撤销
Ctr-r:反撤销

3、vim中如何选中多行(比如我想要多行缩进)

1、字母v,然后向下拖
2、文本行右移(shift+>)

4、vim中如何设置tab默认缩进四个空格?

1、vim ~/.vimrc
2、set ts=4

5、vim中文本如何左右移动(比如缩进)?

>>:文本行右移
<<:文本行左移

6、vim中复制粘贴命令?

yy复制当前行,nyy复制n行,yw复制单词
p:在光标所在位置向下新开除一行,粘贴

7、vim中的查找命令是什么?

1、比如要做world,直接末行模式下敲 /world 即可
2、n:下一个 N:上一个

8、vim中将整个文件中的abe替换为123(vim中的替换命令)?

1、末行模式下%s/abe/123/g
2、%表示整个文件,g是全局的意思,s是替换的意思

替换操作: r:替换当前字符 R:替换当前行光标后的字符查找命令::/:str查找 n:下一个 N:上一个 s.替换命令:把abc全部替换成123 末行模式下,将光标所在行的abc替换成123 :%s/abe/123/g

9、vim中,末行模式下,将第一行至第10行之间的abc替换成123?

1,10s/abc/123/g

10、vim中如何在vim中敲shell命令(比如我查看linux系统中是否存在某某文件)?

末行模式下,!感叹号加命令:!ls /etc

11、vim中重复上次命令的命令?

.:逗号,重复上一次操作的命令

替换操作:
r:替换当前字符
R:替换当前行光标后的字符查找命令::/:str查找
n:下一个 N:上一个
s.替换命令:把abc全部替换成123
末行模式下,将光标所在行的abc替换成123
:%s/abe/123/g
删除命令:
x:删除光标后一个字符,相当于Del
X:删除光标前一个字符,相当于Backspace
dd:删除光标所在行,n dd删除指定的行数
D:删除光标后本行所有内容,包含光标所在字符
d0:删除光标前本行所有内容,不包含光标所在字符
dw.删除光标开始位置的字,包含光标所在字符
撤销命令:
u:一步一步撤销
Ctr-r:反撤销:
重复命令:
.:重复上一次操作的命令

二、vim 修改光标效果

默认光标显示效果不好,想要修改,定制:
https://www.cnblogs.com/yzsatcnblogs/p/4277891.html

三、正则表达式

1、来源

https://blog.csdn.net/u014015972/article/details/50688837

2、替换

:1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换
:10s/from/to/ 表示只在第10行搜索替换
:%s/from/to/ 表示在所有行中搜索替换     :1,$s/from/to/g 同上,从第一行到最后一行,加上g表示全局

3、替换中的flag关键字

flags 有如下四个选项:
c confirm,每次替换前询问;
e error, 不显示错误;
g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
i ignore,忽略大小写
这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问

4、正则表达式的元字符

. 匹配任意字符
[abc] 匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc] 匹配除方括号中字符之外的任意字符
\d 匹配阿拉伯数字,等同于[0-9]
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x 匹配十六进制数字,等同于[0-9A-Fa-f]
\X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\l 匹配[a-z]
\L 匹配[^a-z]
\u 匹配[A-Z]
\U 匹配[^A-Z]
\w 匹配单词字母,等同于[0-9A-Za-z_]
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t 匹配<TAB>字符
\s 匹配空白字符,等同于[\t]
\S 匹配非空白字符,等同于[^\t]

5、一些普通字符需转意

* 匹配* 字符
.  匹配. 字符
\/ 匹配 / 字符
\  匹配 \ 字符
\[ 匹配 [ 字符
\] 匹配 ] 字符

6、表示数量的元字符

*  匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n}   匹配n个
\{n,}  匹配n-任意个
\{,m}  匹配0-m个

7、表示位置的元字符

$  匹配行尾
^  匹配行首
\< 匹配单词词首
\> 匹配单词词尾

8、替换变量

在正则式中以\(和\)括起来的正则表达式,在后面使用的时候可以用\1、\2等变量来访问\(和\)中的内容

9、几个例子

删除行尾空格::%s/\s+$//g
删除行首多余空格:%s/^\s*// 或者 %s/^ *//
删除沒有內容的空行:%s/^$// 或者 g/^$/d
删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法

将行中开头数字删除:
110:/home/user/a.c:194: first defined here
:%/^\d\+://g

替换命令可以在全文中用一个单词替换另一个单词:
:%s/four/4/g  "%" 范围前缀表示在所有行中执行替换。
最后的 "g" 标记表示替换行中的所有匹配点。
如果仅仅对当前行进行操作,那么只要去掉%即可

如果你有一个象 "thirtyfour" 这样的单词,上面的命令会出错。
这种情况下,这个单词会被替换成"thirty4"。要解决这个问题,用 "\<" 来指定匹配单词开头:
:%s/\<four/4/g 显然,这样在处理 "fourty" 的时候还是会出错。
用 "\>" 来解决这个问题:
:%s/\<four\>/4/g

如果你在编码,你可能只想替换注释中的 "four",而保留代码中的。
由于这很难指定,可以在替换命令中加一个 "c" 标记,这样,Vim 会在每次替换前提示你:
:%s/\<four\>/4/gc

删除多余的空格:
要删除这些每行后面多余的空格,可以执行如下命令:
:%s/\s\+$//
命令前面指明范围是 "%",所以这会作用于整个文件。
"substitute" 命令的匹配模式是 "\s\+$"。这表示行末($)前的一个或者多个(\+)空格(\s).
替换命令的 "to" 部分是空的:"//"。这样就会删除那些匹配的空白字符。

匹配重复性模式:
星号项 "*" 规定在它前面的项可以重复任意次。因此:
/a*  匹配 "a","aa","aaa",等等。
但也匹配 "" (空字串),因为零次也包含在内。星号 "*" 仅仅应用于那个紧邻在它前面的项。
因此 "ab*" 匹配 "a","ab","abb","abbb",等等。
如要多次重复整个字符串,那么该字符串必须被组成一个项。
组成一项的方法就是在它前面加 "\(",后面加 "\)"。
因此这个命令:
/\(ab\)*  匹配: "ab","abab","ababab",等等。
而且也匹配 ""。要避免匹配空字串,使用 "\+"。
这表示前面一项可以被匹配一次或多次。
/ab\+ 匹配 "ab","abb","abbb",等等。它不匹配 后面没有跟随 "b" 的 "a"。
要匹配一个可选项,用 "\="。
例如:
/folders\=  匹配 "folder" 和 "folders"。

指定重复次数
要匹配某一项的特定次数重复,使用 "\{n,m}" 这样的形式。
其中 "n" 和 "m" 都是数字。
在它前面的那个项将被重复 "n" 到 "m" 次 (|inclusive| 包含 "n" 和 "m")。
例如:
/ab\{3,5} 匹配 "abbb","abbbb" 以及 "abbbbb"。
当 "n" 省略时,被默认为零。
当 "m" 省略时,被默认为无限大。
当 ",m" 省略时,就表示重复正好 "n" 次。
例如:
  模式           匹配次数
\{,4}           0,1,2,3 或 4
\{3,}           3,4,5,等等
\{0,1}          0 或 1,同 \=
\{0,}           0 或 更多,同 *
\{1,}           1 或 更多,同 \+
\{3}            3

多选一匹配
在一个查找模式中,"或" 运算符是 "\|"。
例如:
/foo\|bar 这个命令匹配了 "foo" 或 "bar"。
更多的抉择可以连在后面:
/one\|two\|three 匹配 "one","two" 或 "three"。
如要匹配其多次重复,那么整个抉择结构须置于 "\(" 和 "\)" 之间:
/\(foo\|bar\)\+  这个命令匹配 "foo","foobar","foofoo","barfoobar",等等。
再举个例子:
/end\(if\|while\|for\)
这个命令匹配 "endif","endwhile" 和 "endfor"。

四、shell脚本操作vim

1、开胃小菜(为啥不行,怎样调用?)

#! /bin/bash
vi abc.txt < EOF
i                    # 进入 insert 模式
Here is a document!  # 输入文本内容
^[                   # 意为按下ESC退出编辑模式
:wq                  # 保存退出
EOF

五、不区分大小写搜索

忽略大小写搜索:
  :set ignorecase
恢复大小写敏感:
  :set noignorecase

六、分屏操作

1、分屏启动

垂直大O:vim -On file_1 file_2 ...
水平小o:vim -on file_1  file_2 ...
n 表示数字:分几屏

2、关闭分屏

关闭当前窗口: ctrl+W c
ctrl+W q

3、分屏

上下:ctrl+W s
上下分屏,并打开新文件 :sp fileName
左右分割:ctrl+W v
左右分割,并打开新文件 :vsp fileName

4.移动光标是hjkl,在各屏间切换,只需按Ctrl+W

1.把光标移到右边        Ctrl+W l
2.把光标移到左边的屏中   Ctrl+W h
3.把光标移动到上边的屏中 Ctrl+W k
4.把光标移动到下面的屏中 Ctrl+W j
5.把光标移动到下一个屏中 Ctrl+W w

5.下面是改变尺寸的操作,主要是高度,对于宽度你可以使用Ctrl+W <或是>,但这可能需要最新的版本才支持。

1.让所有的屏都有一样的高度 Ctrl+W =
2.增加高度    Ctrl+W +
3.减少高度    Ctrl+W -
4.移动分屏

6.这个功能还是使用了Vim的光标键,只不过都是大写。当然了,如果你的分屏很乱很复杂的话,这个功能可能会出现一些非常奇怪的症状

1.向右移动     Ctrl+W L
2.向左移动     Ctrl+W H
3.向上移动     Ctrl+W K
4.向下移动     Ctrl+W J

七、vim打开文件乱码问题

转1. http://blog.sina.com.cn/s/blog_40e1ba640102wm26.html 
2.http://www.cnblogs.com/joeyupdo/archive/2013/03/03/2941737.html
以下为copy链接2中的介绍
(1)encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在 .vimrc 中改变它的值才有意义
(2)fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此),网上是这样介绍的,但是我这样做在.vimrc中定义为utf-8似乎没有作用,只能在打开vim文件时手动设置才会起效,不知道什么原因。 
(3)fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
(4)termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。
系统locale是utf-8(很多linux系统默认的locale形式),编辑的文档是GB2312或GBK形式的(Windows记事本
默认保存形式,大部分编辑器也默认保存为这个形式,所以最常见),终端类型utf-8(也就是假定客户端是putty类的unicode软件)
则vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。
解决方案1:首先要修正fileencoding为cp936或者euc-cn(二者一样的,只不过叫法不同),注意修正的方法不是:set
fileencoding=cp936,这只是将文件保存为cp936,正确的方法是重新以cp936的编码方式加载文件为:edit
++enc=cp936,可以简写为:e ++enc=cp936。
但是这样做,文件关闭后重新打开又要重新设置一遍。出现乱码归根结底的原因是vim不能识别该文件的编码方式,导致不能正常解码(不知道是不是叫解码,我的理解)。所以,我在.vimrc中设置了fileencodings,相当于告诉vim当以utf-8解码文件不成功时以这么几种方式尝试,set fileencoding=utf-8 set fileencodings=ucs-bom,utf-8,cp936,latin1. 这样打开正常了

tigerVNC

一、来源

http://m.mamicode.com/info-detail-1661709.html
我曾经按照它的提示,操作成功

二、内容如下,操作成功

CentOS7下VNC服务器-tigervnc配置
将我的实际操作整理成文档供大家参考,也供自己以后查阅。正文如下:

1、如果第一次安装tigervnc,可以跳过第2步;

2、如果以前安装过

    需要通过以下几步删除tigervnc:
   卸载原安装的服务器软件:yum remove tigervnc-server
   删除/etc/systemd/system文件夹下的配置文件:vncserver@:1.service等
   删除可远程VNC连接的账户home目录下的.vnc文件夹:remove -rf ~\.vnc
   查看/tmp/.X11-unix目录,将X[1-9]的文件删掉,注意X0不能删除;
   最后重启OS

3、安装tigervnc:yum install tigervnc-server

--------------------------以上为root用户操作事项-------------------------
--------------------------以下分别以root账户和其它账户进行配置------------------
【root账户:操作均在root账户下执行】

4、在/etc/systemd/system文件下创建配置文件

cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
   这里需要注意的是上面这个1代表服务端口号,可取其它值,此处的1代表开放的服务5901端口,以此类推

5、编辑配置文件

vim /etc/systemd/system/vncserver@:1.service,更改如下两行(红色行),将<USER>改为root, 将PIDFile=后面的/home去掉
[...]
[Service]
Type=forking
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c ‘/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :‘
# ExecStart=/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"  
# PIDFile=/home/<USER>/.vnc/%H%i.pid
ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i"
PIDFile=/root/.vnc/%H%i.pid
ExecStop=/bin/sh -c ‘/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :‘

6、设置vnc远程连接密码:vncpasswd

7、添加防火墙规则

firewall-cmd --permanent --zone=public --add-service vnc-server
firewall-cmd --reload
如果提示firewalld没启动,请运行firewalld启动防火墙,再运行上面两条命令;

8、设置启动

systemctl daemon-reload 重启daemon使上述配置生效
systemctl enable vncserver@:1.service 使服务自动启动
systemctl start vncserver@:1.service 启动服务
【其它账户:以账户名为cs1为例】

回到4、在/etc/systemd/system文件下创建配置文件[root账号下操作]

cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:2.service
这里需要注意的是上面这个2代表服务端口号,可取其它值,此处的2代表开放的服务5902端口,以此类推

重复5~8、编辑配置文件[root账号下操作]

“`vim /etc/systemd/system/vncserver@:1.service,更改如下两行(红色行),将改为cs1
[…]
[Service]
Type=forking

<h1>Clean any existing files in /tmp/.X11-unix environment</h1>

ExecStartPre=/bin/sh -c ‘/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :‘

<h1>ExecStart=/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"</h1>

<h1>PIDFile=/home/<USER>/.vnc/%H%i.pid</h1>

ExecStart=/sbin/runuser -l cs1 -c "/usr/bin/vncserver %i"
PIDFile=/home/cs1/.vnc/%H%i.pid
ExecStop=/bin/sh -c ‘/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :‘
6、设置vnc远程连接密码[cs1账号下操作]:vncpasswd
7、添加防火墙规则<a href="如果以前已添加,此步骤可省略">root账号下操作</a> firewall-cmd –permanent –zone=public –add-service vnc-server firewall-cmd –reload 如果提示firewalld没启动,请运行firewalld启动防火墙,再运行上面两条命令;
8、设置启动[root账号下操作]
systemctl daemon-reload 重启daemon使上述配置生效
systemctl enable vncserver@:2.service 使服务自动启动
systemctl start vncserver@:2.service 启动服务

参考:http://www.centoscn.com/image-text/install/2016/0407/7008.html http://www.cnblogs.com/h2zZhou/p/5209948.html
本文出自 “韩伟” 博客,请务必保留此出处http://davidhan.blog.51cto.com/511334/1886761
“`

tee

tee用途说明

把linux命令输出重定向到文件中:
ls >a.txt,
但不能看到输出,如果我们既想把输出保存到文件中,
又想在屏幕上看到输出内容,就可以使用tee命令了。
tee命令读取标准输入,把这些内容同时输出到标准输出和(多个)文件中,
tee命令可以重定向标准输出到多个文件。
要注意的是:
   在使用管道线时,前一个命令的标准错误输出不会被tee读取。

常用参数

1、语法

1、只输出到标准输出,格式:tee

2、输出到标准输出的同时,保存到文件file中。

如果文件不存在,则创建;如果已经存在,则覆盖之。
格式:tee file

3、输出到标准输出的同时,追加到文件file中。如果文件不存在,则创建;如果已经存在,就在末尾追加内容,而不是覆盖。

格式:tee -a file

4、多次输出到标准设备,如

两次: tee - ,三次: tee -- 四次:tee ---

5、输出到标准设备多次,同时保存到file1/file2中。

格式:tee file1 file2 -
     tee file1 file2 --

2、示例

示例一 tee命令与重定向的对比

[root@web ~]# seq 5 >1.txt 
[root@web ~]# cat 1.txt 
1
2
3
4
5
[root@web ~]# cat 1.txt >2.txt 
[root@web ~]# cat 1.txt | tee 3.txt 
1
2
3
4
5
[root@web ~]# cat 2.txt
1
2
3
4
5
[root@web ~]# cat 3.txt
1
2
3
4
5
[root@web ~]# cat 1.txt >>2.txt
[root@web ~]# cat 1.txt | tee -a 3.txt
1
2
3
4
5
[root@web ~]# cat 2.txt
1
2
3
4
5
1
2
3
4
5
[root@web ~]# cat 3.txt
1
2
3
4
5
1
2
3
4
5
[root@web ~]#

示例二 使用tee命令重复输出字符串

[root@web ~]# echo 12345 | tee
12345
[root@web ~]# echo 12345 | tee -
12345
12345
[root@web ~]# echo 12345 | tee - -
12345
12345
12345
[root@web ~]# echo 12345 | tee - - -
12345
12345
12345
12345
[root@web ~]# echo 12345 | tee - - - -
12345
12345
12345
12345
12345
[root@web ~]#
[root@web ~]# echo -n 12345 | tee
12345[root@web ~]# echo -n 12345 | tee -
1234512345[root@web ~]# echo -n 12345 | tee - -
123451234512345[root@web ~]# echo -n 12345 | tee - - -
12345123451234512345[root@web ~]# echo -n 12345 | tee - - - -
1234512345123451234512345[root@web ~]#
示例三 使用tee命令把标准错误输出也保存到文件
[root@web ~]# ls "*"
ls: *: 没有那个文件或目录
[root@web ~]# ls "*" | tee -
ls: *: 没有那个文件或目录
[root@web ~]# ls "*" | tee ls.txt
ls: *: 没有那个文件或目录
[root@web ~]# cat ls.txt
[root@web ~]# ls "*" 2>&1 | tee ls.txt
ls: *: 没有那个文件或目录
[root@web ~]# cat ls.txt
ls: *: 没有那个文件或目录
[root@web ~]#

SSH

一、openssh升级

0、别人的笔记,本文参考来源

https://www.cnblogs.com/pengyong1211/p/10308658.html

1、下载最新版本 OpenSSH

wget https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-7.8p1.tar.gz
目前最新版本是7.8,已经有openssh8.02

2、编译安装 OpenSSH

tar xzvf openssh-7.8p1.tar.gz
cd openssh-7.8p1
./configure --prefix=/usr --sysconfdir=/etc/ssh 

3、把老版本的ssh放到另外一个目录,这步是关键,这样就不用卸载旧版本

mkdir /etc/sshbak
mv  /etc/ssh/* /etc/sshbak/

4、编译源码包

make && make install

5、编译安装成功后,进行配置

cp  ./contrib/redhat/sshd.init  /etc/init.d/sshd ---启动文件
chkconfig --add sshd
chkconfig sshd on
修改配置文件  /etc/ssh/sshd_config
Port 22
PermitRootLogin yes
去掉这2行的注释 ,最后一个是允许root用户直接使用sshd服务登录服务器的!

6、启动

service  sshd  restart
使用ssh -V 命令查看一下,如果上面都没有报错的话,这里ssh的版本就是7.8了。
最关键的一步就是把老的ssh文件夹移到其他地方,然后新的ssh的目录仍然放在/etc/ssh下面,这样的升级过程中ssh就不会断开了,我这后面都是用这种方式升级openssh。

二、ssh 端口转发

http://wishcell.top/blog/2020/07/10/ssh端口转发

三、免密码登录

0、大致描述

对于自己名下的多台linux机器,每次登录输入密码十分烦琐。
如果想要不输入密码直接登录:
如A:192.168.1.2 作为一台编译服务器,需要在很多机器上登录

此时将其它机器的 ~/.ssh/id_rsa.pub 内容,copy到服务器的 authorized_keys 文件即可。
具体操作如下

1、找到配置服务器端配置文件 sshd_config

系统安装路径:
  /etc/ssh/sshd_config
自己采用默认配置安装:
  cd openssh-8.02 && ./configure && make -j4 && make install
  此时配置文件路径 /usr/local/etc/ssh/sshd_config

2、查看服务器 authorized_keys 配置

打开 sshd_config,找到 AuthorizedKeysFile,
它的默认配置是 .ssh/authorized_keys ,如果不确定 .ssh 的具体位置,可以直接将其写死:
/home/user/.ssh/authorized_keys

3、客户机生成密钥文件和私钥文件id_rsa,id_rsa.pub或id_dsa,id_dsa.pub

具体方法:到客户即上执行命令
ssh-keygen -t [rsa|dsa]
将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或
id_dsa,id_dsa.pub

如果采用 ssh-keygen -t rsa -f rsa_xxx 则可以指定输出文件名

4、同步.pub文件

A、手工,人肉同步

将 .pub 文件复制到服务器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys

B、自动同步

$ ssh-copy-id -i ~/.ssh/id_rsa.pub username@server -p 22
$ ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 10022 user@server"

5、重启 sshd 服务

有些服务器,可以使用命令:
   systemctl restart sshd
但是有些不行,直接手工重启,但必须在本机操作,不能远程:
  ps -ef | grep sshd  首先找到原来 sshd 课执行文件位置
  /usr/sbin/sshd -D
  然后将其kill掉,重新启动: /usr/sbin/sshd -D &

6、某些情况下,可能免密失败,仍需要密码,解决办法

A、常规方法,默认文件名

有时,登录服务器时,报错:
   `sign_and_send_pubkey: signing failed: agent refused operation`
然后还是要求输入账号密码。
此时,在客户端输入:
[user-dir] # eval  "$(ssh-agent -s)"
Agent pid 20392
[user-dir] # ssh-add
Identity added:/home/user/.ssh/id_rsa (user)
[user-dir] # ssh 192.168.1.2 -luser
login: Sat Oct 17 18:28:00 2020 from 192.168.1.3

B、特殊情况,指定文件名

ssh-keygen -f ~/.ssh/myname  
ssh-keygen -f ~/.ssh/myname  

提示:Your identification has been saved in /home/zorro/.ssh/myname  
Your public key has been saved in /home/zorro/.ssh/myname.pub  ---注1  (我这个命令生成的就是这个文件名)
之后  ssh-add ~/.ssh/myname (正常情况下 做到这里 再在web上upload就ok了)

好了 重点来了 这时候你需要看一下ssh_config 这个文件里的
IdentityFile ~/.ssh/identity
IdentityFile ~/.ssh/id_rsa ---这个是不是和注1 不一样?
IdentityFile ~/.ssh/id_dsa 

如果是, 当然我们最好不要改配置文件,那么
1.把你~/.ssh/下面生成的那俩文件 myname改成id_rsa
mv myname id_rsa
mv myname.pub id_rsa.pub
2.ssh-add  id_rsa.pub

7、别名登录

添加的位置:vim /etc/ssh/ssh_config
也可能,它包含了其它配置文件,在其它的配置文件中:
   include /etc/ssh/ssh_config.d/*.conf

# 其模板如下
Host <any name here>
  HostName <your server address>
  Port <22>
  User <username>
  IdentitiesOnly yes
# 一个具体的例子
Host aliyun
  HostName 192.168.21.43
  Port 22
  User vkso
  IdentitiesOnly yes

登录方式:
ssh aliyun
而且可以自动列出所有别名,相当方便

四、本人系统升级遇到的ssh连接诡异问题

原本是OK的,可以远程 ssh ip -luser 登录
将系统升了下级:
    yum -y install upgrade && yum -y install update
然后登录失败,输入用户名密码后,直接提示:
  permission denied
为此花了好多时间,22端口没有被 firewall 屏蔽,而且 sshd 也正常运行中

  最后尝试修改 sshd_config, 将默认端口22改成2222,再登录,竟然成功了

sed

特殊字符反斜杠的问题

#sed -i '4 s/^/good baby\n/' test.txt 
执行成功,符合预期,但是
#sed -i '4 s/^/<center>查询结果:6个  <a href="./">继续</a>/' test.txt
却运行失败,经多次尝试排查,终于发现原因。
因为正则表达式中有'/'这个特殊字符,应该进行转义。
改成'\/'即可,但是实际在C代码中,采用system(cmd)的方式,并未成功

由于时间紧张,未能深入排查。
但是在排查的时候,意外发现把's'换成‘a’,即进行追加而不是替换的话,可以完美工作。
不需要考虑特殊字符的转义问题,在'a'后面,反斜杠'/'成了普通字符。

#sed -i '8 a<center>查询结果:6个  <a href="./">继续</a>' test.txt

一个常用技巧,查询数据类型在哪个头文件中定义
grep -rn keyWords ../../ | sed -n "/\.h:\w\+/"p

find ../ -name '*.c' | xargs grep -rni keyWords
--->>输出中带有路径

find ../ -type f | grep '\.c' | xargs grep -rni keyWords
-->>这种情况下,输出带有路径,行数,内容

find ../ -name '*.c' | xargs -i grep -rni keyWords {}
==>>这种情况下,输出结果中,没有文件名

grep 执行条目过多时,会报错
# grep -rni keyWords `find ../../ -name *.c`

找到关键字所在的行,将其替换为别的内容
如:void function(int a, int b) 修改为:
static void function(int a, int b)

fileName=/home/user/a.c
lineNum=`sed -n '/void function/=' a.c` ; \
echo ${lineNum}; \
sed -i "${lineNum}d" a.c; \
sed -i "${lineNum}iStatic void function(int a, int b)" a.c

说明: sed -i "${lineNum}d" 删除指定行
      sed -i "${lineNum}iXXX" 在指定行插入XXX
      sed -n "/key/=" 查找关键字所在行,如果是多个,
则返回 3 5 7 这样的字符串,可以用数组接收

找到关键字,并在其后追加一行
第一步,制作准备原始文件
# cat pps
aaaa
bbbb
cccc
dddd

第二步,命令行实验,尝试先查找"cccc"所在的行,并在其后追加"zzzz"
# sed -e "/cccc azzzz"
aaaa
bbbb
cccc
zzzz
dddd

第三步,因为第二步实验成功,将其写入文件
# sed -i "/cccc azzzz" pps
# cat pps
aaaa
bbbb
cccc
zzzz
dddd

一个高难度应用
1、问题描述
源文本如下:
<test> blah blah   blah blah blah   widget   blah blah blah
</test>
<formula>   blah   <details>      widget   </details>
</formula>

希望从文本中,提取出如下内容:
<test>widget</test> 
<formula>widget</formula>

2、实现脚本
sed -ne '/[Ww][Ii][Dd][Gg][Ee][Tt]/,/^<\// {//p}' file.txt | awk 'NR%2==1 { sub(/^[ \t]+/, ""); search = $0 }

效果:
<test>widget</test>
<formula>widget</formula>

3、脚本讲解
## The sed pipe: 
sed -ne '/[Ww][Ii][Dd][Gg][Ee][Tt]/,/^<\// {//p}'
## This finds the widget pattern, ignoring case, then finds the last, 
## highest level markup tag (these must match the start of the line)
## Ultimately, this prints two lines for each pattern match 
## Now the awk pipe: 
NR%2==1 { sub(/^[ \t]+/, ""); search = $0 }
## This takes the first line (the widget pattern) and removes leading
## whitespace, saving the pattern in 'search' 
NR%2==0 { end = $0; sub(/^<\//, "<"); printf "%s%s%s\n", $0, search, end }
## This finds the next line (which is even), and stores the markup tag in 'end'
## We then remove the slash from this tag and print it, the widget pattern, and
## the saved markup tag

对包含特殊关键字的行进行操作
1、在包含关键字的行中,删除另外一个关键字
# cat ass.txt
good boy
good man
good girl
# 将包含 man 的行中,对应的关键字 good 删除
# sed -i /man/{s/good//} ass.txt
# cat ass.txt
good boy
 man
good girl

2、将同时包含关键字A和关键字B的行删除
# cat ass.txt
good boy
good man
good girl
# 将包含 man 的行中,对应的关键字 good 删除
# sed -i /man/{/good/d} ass.txt
# cat ass.txt
good boy
good girl

sed 的一个大 bug
1、诡异现象
写入文件,出现故障。
一段脚本之中,前面写入表现都很正常。
但是执行到某一段代码时,出现莫名其妙的故障,代码如下:

#==>>这是前面一段代码,表现正常,能成功写入,符合预期
for fileName in ${file_1} ${file_2}
do
    lineNum=`sed -n /keyword_1/= ${fileName}`
    startLine=$((lineNum - 5))
    endLine=$((lineNum + 2))
    # 删除这一段内容
    sed -i "${startLine},${endLine} d"
    # 下面用 sed 重新插入代码
    sed -i "${startLine}a #ifndef OK" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    sed -i "${startLine}a #define OK 0" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    sed -i "${startLine}a #define ERRPR 1" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    ...
    sed -i "${startLine}a #endif" ${fileName} ; startLine=$((${startLine} + 1))
done

#==>>第二段代码,与第一段雷同,只是行数略多,20行而已,但是后来发现跟行数无关
for fileName in ${file_3} ${file_4}
do
    lineNum=`sed -n /keyword_2/= ${fileName}`
    startLine=$((lineNum - 19))
    endLine=$((lineNum + 2))
    # 删除这一段内容
    sed -i "${startLine},${endLine} d"
    # 下面用 sed 重新插入代码
    sed -i "${startLine}a #ifndef OK" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    sed -i "${startLine}a #define OK 0" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    sed -i "${startLine}a #define ERRPR 1" ${fileName} ; startLine=$((${startLine} + 1))
    sleep 0.01 # 为了防止写文件太耗时,加一个延时10ms
    ...
    sed -i "${startLine}a #endif" ${fileName} ; startLine=$((${startLine} + 1))
done
# 此时,执行到第二段代码时,实际上成了死循环。如果只有一两行写入语句
# 还能跳出死循环,但目标文件已被写乱掉
# 如果行数多,直接就是死循环,及时中止,txt 文件已经达到37M
# 此问题百思不得其解,实在诡异

2、发现一点不同
在出故障的代码段中,发现最后一行行为正常:
    sed -i "${startLine}a #endif" ${fileName} ; startLine=$((${startLine} + 1))
它能正常写入,然后用它替换其它的行:
sed -i "${startLine}a #ifndef OK" ${fileName} ; startLine=$((${startLine} + 1))
改为 `#endif`之后,就能正常写入,其它字符串就不行,将中间空格去掉也不行:
sed -i "${startLine}a #ifndefOK" ${fileName} ; startLine=$((${startLine} + 1))

到了这份上,其实不就是写一个普通字符串吗,`#ifndefOK` 和 `#endif`能有啥区别?

rsync

一、scp引出的麻烦

公司桌面迁移,从win7迁移到linux.
需要自行迁移数据,于是在windows上用 mobaxterm 开启了一个 sshd 服务。

在 linux 执行:
scp -r -P 2222 user@192.168.1.3:/cygdrive/d/escape ./

然后就静静的等,等它同步完成。

等了一天一夜,终于结束。但是很奇怪。
linux预留空间是290G,win7上的文件夹是160G,怎么现在Linux硬盘满了,显然同步还没有完成。

于是百度一番,原来 scp 确实存在这样的问题,主要是自己对各参数不精通。默认情况下它会给空目录分配空间,造成空间变大

然后改用人家推荐的 rsync 来同步:
rsync -avzP -e 'ssh -p 2222' --progress --delete  user@192.168.1.3:/cygdrive/d/escape ./

发现其同步速度比 scp 要快太多

rsync 多种参数配置
rsync -avvz --times --stats --checksum --human-readable --acls \
--itemize-changes --progress \
--out-format='[%t] [%i] (Last Modified: %M) (bytes: %-10l) %-100n' \
/usr/include/glib-2.0 my-glib-copy/

个参数意义解释如下:
> -avvz = archive,verbose x 2,compress
> –times =保留修改时间
> –stats =提供一些文件传输统计信息
> –checksum =基于校验和跳过,而非mod-time&尺寸
> –human-readable =以人类可读格式输出的数字
> –acls =保留ACL(隐含-p)
> –itemize-changes =输出所有更新的更改摘要
> –progress =显示转移期间的进度
> –out-format ='[%t] [%i](上次修改时间:%M)(字节:%-10l)%-100n’ 
>%t =当前日期时间
>%i =正在更新的内容的逐项清单
>%M =文件的上次修改时间
>%-10l =文件的长度(以字节为单位)(-10表示对齐和精度)
>%-100n =文件名(短格式;在目录上尾随“/”)( – 100表示对齐和精度) 
注意:有关上述开关的完整详细信息,请参见rsync和rsyncd.conf的手册页. 
上面的命令产生以下脚本: