Monthly Archives: 四月 2016

四月 25th, 2016

unexpand 命令用于将给定文件中的空白字符(space)转换为制表符(TAB),并把转换结果显示在标准输出设备(显示终端).功能与expand相反.

语法:

unexpand [options]

参数:

-a/-all : 转换文件中所有空白字符;

–first-only : 仅转换开头的空白字符;

-t<n> : 指定TAB所代表的n个字符数,默认n值为8;

 

这里我想通过将expand 将tab键转换为空格,保存到03.txt文件中,如下:

#grep “^MANPATH” /etc/man.config | head -n 3 |expand -t 6  > 03.txt

# cat -A 03.txt

MANPATH     /usr/man$

MANPATH     /usr/share/man$

MANPATH     /usr/local/man$

接下来,我以2个空格为一个单位转换为一个tab键,如下:

# cat  03.txt | unexpand -t 2 | cat -A

MANPATH^I^I^I/usr/man$

MANPATH^I^I^I/usr/share/man$

MANPATH^I^I^I/usr/local/man$

原来有6个空格,所以这里显示出三个^I.

四月 25th, 2016

expand 就是将[tab]按键转成空格键.

语法:

expand [-t] file

参数:

-t : 后面可以接数字.一般来说tab按键可以用8个空格键替换,我们也可以自定义一个tab键代表多少个字符.

 

<1>我们将/etc/man.config 内行首为MANPATH的字样取出,仅取前三行,如下:

# grep “^MANPATH” /etc/man.config | head -n 3

MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

 

<2>承上,如果我想要将所有的符号都列出来呢?用cat -A,如下:

# grep “^MANPATH” /etc/man.config | head -n 3 |cat -A

MANPATH^I/usr/man$

MANPATH^I/usr/share/man$

MANPATH^I/usr/local/man$

这里发现tab键可以被cat -A显示成^I.

 

<3>承上,我们将tab按键设置成6个字符的话?,如下:

# grep “^MANPATH” /etc/man.config | head -n 3 |expand -t 6 – | cat -A

MANPATH     /usr/man$

MANPATH     /usr/share/man$

MANPATH     /usr/local/man$

仔细看上面的数字说明,因为我以6个字符来代表一个tab的长度,所以MANPATH 到/usr之间隔6个字符.但如果设置为9个字符呢,结果又不同了.

 

四月 25th, 2016

paste单词的意思就是粘贴,该命令主要用来将多个文件的内容合并,与cut命令完成的功能刚好相反.

语法:

paste [-ds] -file1 file2

参数:

-d : 指定不同于空格或tab键的域分隔符,例如@分隔域,使用-d @;

-s : 将每个文件合并成行而不是按行粘贴;

– : 如果file部分写成-,表示来自standard input 的数据的意思;

 

<1>合并文件

指定先后顺序合并文件,如下:

# paste 01.txt 02.txt

1 aa    1 11

2 bb    2 22

3 cc    4 33

# paste 02.txt 01.txt

1 11    1 aa

2 22    2 bb

4 33    3 cc

指定分隔符,合并文件,默认以[tab]来分隔的,如下:

# paste -d @ 01.txt 02.txt

1 aa@1 11

2 bb@2 22

3 cc@4 33

 

<2>将每个文件合并成行,而不是按行粘贴

paste -s 01.txt 02.txt

1 aa    2 bb    3 cc

1 11    2 22    4 33

 

<3>(-)选项的妙用

使用空格作域分隔符,以一个2列格式显示文件,如下:

# cat /etc/passwd | paste -d ” ”  – – | head -n 3

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync

(-)意即对每一个-,表示从标准输入中读入一次数据.

TAGS: , ,
四月 25th, 2016

join 用于找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备.

语法:

join [options] [file1] [file2]

参数:

-a<1/2> : 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行;

-e<字符串> : 若file1与file2中找不到指定的栏位,则在输出中填入选项中的字符串;

-i/–igore-case : 比较栏位内容时,忽略大小写的差异;

-o<格式> : 按照指定的格式来显示结果;

-t<字符> : 使用栏位的分隔字符;

-v<1/2> : 跟-a相同,但是只显示文件中没有相同栏位的行;

-1<栏位> : 连接file1指定的栏位;

-2<栏位> : 连接file2指定的栏位;

 

<1>用root身份将/etc/passwd /etc/shadow 相关数据整合成一列

# join -t ‘:’ /etc/passwd /etc/shadow | head -3

root:x:0:0:root:/root:/bin/bash:$6$hOA3C.gi$hmyBAktEkjBhL7jNLj1p5ifJwysguv7YBd1eAKialhjnj/KWOwQL/RdJWGti3FGrNu0.G0GAMRuxj5pxU/anR.:16881:0:99999:7:::

bin:x:1:1:bin:/bin:/sbin/nologin:*:15628:0:99999:7:::

daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:15628:0:99999:7:::

由输出的数据可以发现两个文件的最左边字段都是账号,且以”:”分隔.

通过上面的这个操作,可以将两个文件中的第一个字段相同者整合成一行.

第二个文件对的相同字段并不会显示(因为在第一行了).

 

<2> /etc/passwd 的第四段是GID,而在/etc/group当中是第三段,那我们又如何能将这两个文件整合成一行呢?

# join -t ‘:’ -1 4 /etc/passwd -2 3 /etc/group | head -3

0:root:x:0:root:/root:/bin/bash:root:x:

1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:bin,daemon

2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:bin,daemon

同样,相同的字段部分被移动到最前面了,所以第二个文件的内容就不显示了.

 

<3>使用-a/-v显示不匹配行

# cat 01.txt

1 aa

2 bb

3 cc

# cat 02.txt

1 11

2 22

4 33

使用-a选项,显示01.txt/02.txt中不匹配的行,

# join -a 1 01.txt 02.txt

1 aa 11

2 bb 22

3 cc

# join -a 2 01.txt 02.txt

1 aa 11

2 bb 22

4 33

而使用-v选项,只显示01.txt/02.txt中不匹配的行,

# join -v 1 01.txt 02.txt

3 cc

# join -v 2 01.txt 02.txt

4 33

 

<4>使用-o,指定格式来显示文件

# join -o 1.2 2.2 01.txt 02.txt

aa 11

bb 22

通过上面操作,来显示第一个文件的第二个域,第二个文件的第二个域.

TAGS: , ,
四月 25th, 2016

col 命令是一个标准输入文本过滤器,它从标准输入设备读取文本内容,并把内容显示到标准输出设备.在很多linux说明文件里,都有RLF控制字符.当我们运用shell特殊字符> 和>>,把说明文件的内容输出成纯文本文件时,控制字符会变成乱码,col命令则能有效的过滤这些控制字符.

语法:

col [-bfx] [-l<缓冲区列数>]

参数:

-b : 过滤所有的控制字符,包括RLF(Reverse Line Feed) 和HRLF(Halt RLF);

-f : 过滤RLF字符,但允许HRLF字符呈现出来;

-x : 以多个空格字符来表示跳格字符;

-l<缓冲区列数> : 该参数2用于自定义缓冲区的大小,默认的内存缓冲区有128列;

 

典型案例:

将col命令的帮助文档保存为col.help ,使用-b参数过滤所有控制字符,如下:

#man col | col -b > col.help

这里,若不使用col命令,直接使用vi命令查看col.help文件,则会出现许多控制字符的乱码.

TAGS: , ,
四月 25th, 2016

tr 用来从标准输入中通过替换或删除操作进行字符转换.tr主要用于删除文件中控制字符或进行字符在转换.使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换.tr刚执行时,字符串1中字符被映射到字符串2中的字符,然后转换操作开始.

语法:

tr  [-cdst] [SET1] [SET2] [>newfile] [<file]

参数:

-c : complement 用SET2替换SET1中没有包含的字符;

-d : delete 删除信息当中的SET1这个字符串;

-s : 替换掉重复的字符,只保留第一个,即将重复出现的字符串压缩为一个字符串;

-t : truncate-set1,将SET1用SET2转换,一般缺省值为-t;

SET1/2 : 字符集;

>newfile :我们可以将结果导入新的文件保存;

<file : 我们可以通过<来读入file;

字符范围:

[a-z]/[A-Z] : a-z/A-Z内的字符组成的字符串;

[0-9] : 数字串;

\octal : 一个三位数的八进制数,对应有效的ASCII字符;

[0*n] : 表示字符0重复出现指定次数n,如[0*2]匹配00的字符串;

 

范例1:  将/etc/passwd 中的小写字符变成大写字符

# cat /etc/passwd | tr [a-z] [A-Z]

同样我们可以通过<读入/etc/passwd,如下

#tr [a-z] [A-Z] < /etc/passwd

 

范例2: 将/etc/passwd 转存成dos断行到/root/passwd中,再将^M符号删除

# cp /etc/passwd /root/passwd && unix2dos /root/passwd

cp: overwrite `/root/passwd’? y

unix2dos: converting file /root/passwd to DOS format …

# file /etc/passwd /root/passwd

/etc/passwd:  ASCII text

/root/passwd: ASCII text, with CRLF line terminators

这里牵扯到unix2dos 命令,可以通过yum -y install unix2dos直接安装.

# cat /root/passwd | tr -d ‘\r’ > /root/passwd.linux

这里的”\r”指的是dos的断行字符

# ll /etc/passwd /root/passwd*

-rw-r–r–. 1 root root 891 Apr  2 06:01 /etc/passwd

-rw-r–r–. 1 root root 911 Apr 17 10:46 /root/passwd

-rw-r–r–. 1 root root 891 Apr 17 10:47 /root/passwd.linux

处理过后,发现文件大小与原来的/etc/passwd就一致了.

 

范例3: 删除空白行

删除空白行就是删除换行符/n

注意:这些空白行上只有回车符,没有空格符

# cat test.txt

I lovve linux!

 

Hello World!

 

Shell is worthy to been studied!

这里使用换行符的转义字符\n

注意:若用-d,则会删除所有的换行符,如下:

# cat test.txt | tr -d [“\n”]

I lovve linux!Hello World!Shell is worthy to been studied!

而此处用-s删除多余的换行符呢,如下:

[root@sqj2015 ~]# cat test.txt | tr -s [“\n”]

I lovve linux!

Hello World!

Shell is worthy to been studied!

 

范例4:删除指定的字符

# cat test.txt

Monday 1:00

Tuessday 2:00

Wednesday 3:00

现在要删除处理星期之外的所有字符

-d代表删除,[0-9]代表所有的数字,[: ]代表冒号和空格

# cat test.txt | tr -d “[0-9][: ]”

Monday

Tuessday

Wednesday

 

范例5: 利用-c进行补集的替换

有时候在文本中我们只知道要保留一些字符,其他字符种类繁多,就可以使用补集的替换

# cat test.txt

Monday 1:00

Tuessday 2:00

Wednesday 3:00

我们只需要星期,则思路就是除了字母,其他统统替换掉

这里,-c用换行符替换掉除了字符外的所有字符,-s删除多余的换行符

# cat test.txt | tr -cs “[a-z][A-Z]” “\n”

Monday

Tuessday

Wednesday

TAGS: , ,
四月 24th, 2016

1、禁止root用户登录ssh

代码如下:
#vi /etc/ssh/sshd_config


代码如下:

PermitRootLogin yes

改为

代码如下:
PermitRootLogin no

重启sshd服务
代码如下:

#service sshd restart

此时再使用root登录就会被提示拒绝:
代码如下:

login as: root
root@192.168.8.100’s password:
Access denied

2、修改ssh默认端口

代码如下:
vi /etc/ssh/sshd_config

找到#Port 22一段,这里是标识默认使用22端口,修改为如下:
代码如下:

Port 22
Port 7000

然后保存退出
重启sshd服务
代码如下:

#service sshd restart

注意:此时使用22端口和7000应该都可以登录,这样就避免了在调试时失误(如调整端口后没有调整相应的防火墙策略)导致不能使用ssh登录服务器的情况。
使用ssh客户端并用7000端口登录测试,无误后再将/etc/ssh/sshd_config配置文件下的Port 22一句注释并重启sshd服务即可。

TAGS: ,
四月 24th, 2016

linux 文件结构中,有一个很神奇的目录 —— /usr。之前一直没有怎么关注过它,反正程序都是安装在里边的,也没有什么值得追根溯源的东西。直到有一天 fedora 要简化整个文件系统体系,看到讨论才想到,usr 到底是什么的缩写呢,它又是怎么来的呢?讨论中,大部分观点认为:
1.usr 是 unix system resources 的缩写;
2.usr 是 user 的缩写;
3.usr 是 unix software resources 的缩写。

根据常识判断,是 user 缩写的可能性不大,因为和 /home 冲突了嘛。不过是 system resources 还是 software resources 的缩写还真不好说。特此查了好多东西,却发现竟然连 wikipedia 也模棱两可。/usr 是linux系统核心所在,包含了所有的共享文件。

它是 unix 系统中最重要的目录之一,涵盖了二进制文件,各种文档,各种头文件,x,还有各种库文件;还有诸多程序,例如 ftp,telnet 等等。

曾经的 /usr 还是用户的家目录,存放着各种用户文件 —— 现在已经被 /home 取代了(例如 /usr/someone 已经改为 /home/someone)。

现代的 /usr 只专门存放各种程序和数据,用户目录已经转移。虽然  /usr 名称未改,不过其含义已经从“用户目录”变成了“unix 系统资源”目录。值得注意的是,在一些 unix 系统上,仍然把 /usr/someone 当做用户家目录,如 Minix。

/usr 文件系统经常很大,因为所有程序安装在这里. /usr 里的所有文件一般来自Linux distribution;本地安装的程序和其他东西在/usr/local 下.这样可能在升级新版系统或新distribution时无须重新安装全部程序.

由于/usr中的文件不和特定的计算机相关,也不会在通常使用中修改,因此可以通过网络共享这个目录(文件系统),这样,当管理员安装了新的软件之后,所有共享这一文件系统的计算机均可以使用新的软件。

至此,真相大白。看来就像前一阵子的 /var/run 移到 /run 一样。

真的是不看不知道,一看吓一跳呀。原来 linux 几经进化,好多目录的诞生和用途已经产生了根本的变化。

/usr 目录结构

/usr/bin : 所有可执行文件,如 gcc,firefox 等(指不包含在 /sbin 和 /bin 内的);

/usr/include : 各种头文件,编译文件等时需要使用;

/usr/include/’package-name’ : 程序特定的头文件;

/usr/lib : 所以可执行文件所需要的库文件;

/usr/local : 这里主要存放那些手动安装的软件,即 不是通过“新立得”或apt-get安装的软件 。 它和/usr目录具有相类似的目录结构 。让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面,我想这应该是个不错的主意。

/usr/X11R6 : x 系统的二进制文件,库文件,文档,字体等。它不等同于 /usr 的作用,只有 x 才能调用这些库文件等,其他程序不读取或者使用。因为 linux 没有原生图形界面,而且 linux 大部分情况下是 for server 的,所以图形界面没有意义;其中 X11R6 代表 version 11 release 6;

/usr/X11R6/bin : x 的二进制文件,包含运行 x 的必须文件;

/usr/X11R6/include : x 相关的头文件;

/usr/X11R6/lib : x 库文件;

/usr/X11R6/lib/modules : x 的模块,启动时加载。缺少 video4linux, DRI and GLX 和 输入输出设备 模块,将工作不正常;

/usr/X11R6/lib/X11/fonts : x font server 的字体文件;

/usr/doc : 文档。实际是 /usr/share/doc 的软链接;

/usr/etc : 一个极少用到的配置文件存放地;

/usr/games : 曾经包含游戏等文件,现在很少用到;

/usr/info : 系统相关信息,是 /usr/share/info 的软链接;

/usr/man : man 手册,已经移至 /usr/share/man;

/usr/sbin : 类似 /sbin,root 可以执行。但此目录不包含在环境变量 $PATH 中,它包含的程序类似于 chroot, useradd, in.tftpd and pppconfig;

/usr/share : 它包含了各种程序间的共享文件,如字体,图标,文档等。(/usr/local 对应的目录是  /usr/loca/share);

/usr/share/doc : 类似应用程序的 man 手册。它包含程序的说明文件,默认配置文件等;

/usr/share/info : 不常用,已经被 man 代替;

/usr/share/man : app 的 manual;

/usr/share/icons : 应用程序的图标等文件,分为 png,svg 等多种格式;

/usr/share/fonts : 字体文件,系统范围内可使用,~/.fonts 仅当前用户可用;

/usr/src : linux 内核的源码和说明文档等;

/usr/src/linux : linux 源代码;

/usr/src/linux/.config : 内核编译过程产生的文件;通常由命令 ‘make config’ , ‘make menuconfig’ 或 ‘make xconfig’ 执行后产生;

/usr/src/linux/.depend, /usr/src/linux/.hdepend : ‘make dep’ 检测编译依赖时需要的文件,由 /usr/src/linux/.config 产生;

/usr/src/linux/COPYING : GNU license;

/usr/src/linux/Makefile : 编译内核所需的 Makefile;

/usr/src/linux/Rules.make : 当有多个 Makefile 时,根据它的规则执行 make;

/usr/tmp : 已经被众多发行版抛弃的临时文件夹。

TAGS: ,
四月 24th, 2016

需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts

修改完两个文件后执行命令

hostname XX.COM

然后重启输入命令

uname -n

完成!

TAGS: ,
四月 24th, 2016

由于vsftp采用明文传输,用户名密码可通过抓包得到,为了安全性,需使用sftp,锁定目录且不允许sftp用户登到服务器。由于sftp使用的是ssh协议,需保证用户只能使用sftp,不能ssh到机器进行操作,且使用密钥登陆、不是22端口。

1. 创建sftp服务用户组,创建sftp服务根目录

  1. groupadd sftp

#此目录及上级目录的所有者必须为root,权限不高于755,此目录的组最好设定为sftp

  1. mkdir /data/sftp
  2. chown -R root:sftp /data/sftp
  3. chmod -R 0755 /data/sftp

2. 修改sshd配置文件

  1. cp /etc/ssh/sshd_config,_bk}  #备份配置文件
  2. sed -i ‘s@#Port 22@Port 22@’ /etc/ssh/sshd_config  #保证原来22端口可以
  1. vi /etc/ssh/sshd_config

注释掉/etc/ssh/sshd_config文件中的此行代码:

  1. Subsystem      sftp    /usr/libexec/openssh/sftp-server

添加如下代码:

  1. Port 2222
  2. Subsystem sftp internal-sftp -l INFO -f AUTH
  3. Match Group sftp
  4. ChrootDirectory /data/sftp/%u
  5. X11Forwarding no
  6. AllowTcpForwarding no
  7. ForceCommand internal-sftp -l INFO -f AUTH

凡是在用户组sftp里的用户,都可以使用sftp服务;使用sftp服务连接上之后,可访问目录为/data/sftp/username

举个例子:

test是一个sftp组的用户,它通过sftp连接服务器上之后,只能看到/data/sftp/test目录下的内容

test2也是一个sftp组的用户,它通过sftp连接服务器之后,只能看到/data/sftp/test2目录下的内容

3. 创建sftp用户

#此例将创建一个名称为test的sftp帐号

#创建test sftp家目录:test目录的所有者必须是root,组最好设定为sftp,权限不高于755

  1. mkdir /data/sftp/test
  2. chmod 0755 /data/sftp/test
  3. chown root:sftp /data/sftp/test
  4. useradd -g sftp -s /sbin/nologin test  #添加用户,参数-s /sbin/nologin禁止用户通过命令行登录

创建test用户密钥对:

  1. # mkdir /home/test/.ssh
  2. # ssh-keygen -t rsa
  3. # cp /root/.ssh/id_rsa.pub /home/test/.ssh/authorized_keys
  4. # chown -R test.sftp /home/test

在test目录下创建一个可以写的upload目录

  1. mkdir /data/sftp/test/upload
  2. chown -R test:sftp /data/sftp/test/upload

注:sftp服务的根目录的所有者必须是root,权限不能超过755(上级目录也必须遵循此规则),sftp的用户目录所有者也必须是root,且最高权限不能超过755。

4. 测试sftp

  1. service sshd restart

test用户密钥登陆如下图:

TAGS: ,