0%

有所依靠的chgrp

.. code::
鸿鹄志、向炎天。
宋 刘克庄《贺新郎·杜子昕凯歌》

Linux的chgrp命令用于变更文件或者目录所属的组group。

这里的变更不仅限于本人的组,只要用户属于的组,均可以使用chgrp更改相应的权限而不是必须使用管理员权限。

很多权限的操作可以与chmod来交叉。比如如果希望文件只有本组成员访问,可以通过chmod 770 file/directory,此时就涉及到组的概念了。

官方定义为:

chgrp - change group ownership

语法为:

1
2
$ chgrp [OPTION]... GROUP FILE...
$ chgrp [OPTION]... --reference=RFILE FILE...

常用的几个参数为:

  • --reference=RFILE : 参考指定文件进行所属组更换

  • -R, --recursive :递归处理,将某个目录的所有文件均更改用户组

默认用法

最简单的使用为将文件file归属到组group,使用方法为:

1
2
$ chgrp group file
$ chgrp group1 file1

此时的file数组组group,file1属于组group1。

更改文件夹的所属组

对于文件夹而言,就需要使用-R参数来递归实现了,不然会报错的。

1
2
$ chgrp -R group1 directory1
$ chgrp -R group2 directory2

根据指定文件来修改组

这个参数比较有趣,也比较高效,如果希望某个用户的组权限与另外一个文件一致,此时--reference强势出现

1
$ chgrp --reference=ref_file stage_file

该命令执行后,stage_file的权限将与ref_file的组权限一样。

TODO

设置SGID属性(确保NEWGROUP组拥有所有新建的文件),设置sticky(沾滞位)属性(以免文件被拥有者以外的其他人删除)

1
chmod g+s,o+t /home/groupdir

具体参考SGID/SUID/SBID以及sticky的详细含义。

linux设置只能特定的用户组用户访问文件夹

创建新组:

1
groupadd NEWGROUP

将现有的用户加入改组:

1
usermod -G NEWGROUP username 

改变新目录的组所有权

1
chgrp NEWGROUP directory

禁止非组成员的访问

1
chmod 770 /home/groupdir

设置SGID属性(确保NEWGROUP组拥有所有新建的文件),设置sticky(沾滞位)属性(以免文件被拥有者以外的其他人删除)

1
chmod g+s,o+t /home/groupdir

具体参考SGID/SUID/SBID以及sticky的详细含义。

极具归属感的 - chown

.. note::
常记溪亭日暮,沉醉不知归路。
李清照《如梦令》

Linux chown 命令用于设置文件所有者和文件关联组的命令。

官方的定义为:

chown - change file owner and group

Linux/Unix 的有个理念就是一切皆文件,而对于每个文件也是如chmod所述,均拥有所有者。

此时就可以利用 chown 指定文件的拥有者或者指定的用户或组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符

不过需要注意的是 chown 需要超级用户 root 的权限才能执行此命令,或者使用sudo也可以。

使用语法

使用语法如下:

1
2
3
$ chown [option] [user[:group]] file...
# 或者
$ chown [option] --reference=RFILE file...

其中user为新的文件拥有者的用户名或者IDgroup为新的文件拥有者的用户组名或ID****。

并且可以通过--referenc=RFILE选项来设定希望修改的文件和目录。

其他的选项可以为: :

  • -c : 与-v类似,不过只显示更改的信息
  • -R : 递归地处理指定的目录以及其子目录下的所有文件

通用实例

最简单的使用方式应该就是指定用户和用户组了,如下:

1
2
3
4
5
6
7
$ ll 
-rw-rw-r--. 1 user user 5 May 7 14:56 a

$ sudo chown user1:group1 a

$ ll
-rw-rw-r--. 1 user1 group1 5 May 7 14:56 a

上面的命令将把a指定为用户user1,组group1。注意user1group1必须存在,不然会提示无效的用户或者组。

更新组而不更新用户

这个选项一般用在,希望把某个用户的文件共享到一个组,此时的方法如下:

1
$ sudo chown :newgroup filename

此时的用户所有者不变,而仅仅更改了文件所属组。

提示更新

1
2
3
4
5
6
7
8
9
10
$ sudo chown -c user1 a b c d
changed ownership of "b" from user to user1
changed ownership of "c" from user to user1
changed ownership of "d" from user to user1

$ sudo chown -v user1 a b c d
changed ownership of "a" from user to user1
changed ownership of "b" from user to user1
changed ownership of "c" from user to user1
changed ownership of "d" from user to user1

从这个例子可以看出,对于-c和-v的区别,-v全部显示,而-c仅仅显示更新的部分。

递归处理文件或文件夹

1
$ sudo chown -R user:group file directory

此条命令将递归地将文件file和目录directory及其子目录的文件更新为user用户拥有,group组拥有。

Linux chown 命令

Linux chown 命令用于设置文件所有者和文件关联组的命令。

官方的定义为:

chown - change file owner and group

Linux/Unix 的有个理念就是一切皆文件,而对于每个文件也是如chmod所述,均拥有所有者。

此时就可以利用 chown 指定文件的拥有者或者指定的用户或组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符

不过需要注意的是 chown 需要超级用户 root 的权限才能执行此命令,或者使用sudo也可以。

使用语法

使用语法如下:

1
2
3
$ chown [option] [user[:group]] file...
# 或者
$ chown [option] --reference=RFILE file...

其中user为新的文件拥有者的用户名或者IDgroup为新的文件拥有者的用户组名或ID****。

并且可以通过--referenc=RFILE选项来设定希望修改的文件和目录。

其他的选项可以为: :

  • -c : 与-v类似,不过只显示更改的信息
  • -R : 递归地处理指定的目录以及其子目录下的所有文件

通用实例

最简单的使用方式应该就是指定用户和用户组了,如下:

1
2
3
4
5
6
7
$ ll 
-rw-rw-r--. 1 user user 5 May 7 14:56 a

$ sudo chown user1:group1 a

$ ll
-rw-rw-r--. 1 user1 group1 5 May 7 14:56 a

上面的命令将把a指定为用户user1,组group1。注意user1group1必须存在,不然会提示无效的用户或者组。

更新组而不更新用户

这个选项一般用在,希望把某个用户的文件共享到一个组,此时的方法如下:

1
$ sudo chown :newgroup filename

此时的用户所有者不变,而仅仅更改了文件所属组。

提示更新

1
2
3
4
5
6
7
8
9
10
$ sudo chown -c user1 a b c d
changed ownership of "b" from user to user1
changed ownership of "c" from user to user1
changed ownership of "d" from user to user1

$ sudo chown -v user1 a b c d
changed ownership of "a" from user to user1
changed ownership of "b" from user to user1
changed ownership of "c" from user to user1
changed ownership of "d" from user to user1

从这个例子可以看出,对于-c和-v的区别,-v全部显示,而-c仅仅显示更新的部分。

递归处理文件或文件夹

1
$ sudo chown -R user:group file directory

此条命令将递归地将文件file和目录directory及其子目录的文件更新为user用户拥有,group组拥有。

炫技 - 通过其他文件指定

如果有1个文件或文件夹的权限是你认为可以参考的,此时可以通过下面的命令直接指定,而不需要指定user:group这个参数了。如下两个命令效果一致:

1
2
3
4
5
6
7
8
9
$ ll 
-rw-rw-r--. 1 user1 group1 5 May 7 14:56 a
-rw-rw-r--. 1 user2 group2 5 May 7 14:56 b

# 将b的权限更改为与a一致
# Method1
$ sudo chown user1:group1 b
# Method 2
$ sudo chown --reference=a b

低调但大胆的 - dd 命令

除了入门介绍的基本功能,今天再加点干货。

测试写入速度

1
dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct

这个命令增加了一个选项叫做oflag=direct

  • oflag=direct:确保数据直接写入磁盘,跳过系统缓存。

这个命令将会输出写入速度。完成测试后,可以删除 testfile 文件。

测试读取速度

首先写一个测试文件(可以使用上面的写入命令),然后执行以下读取命令:

1
dd if=testfile of=/dev/null bs=1G count=1 iflag=direct

同样的增加了iflag=direct,可以加速:

  • iflag=direct:直接读取数据,跳过系统缓存。

这样可以得到硬盘的读取速度。

#######TODO

backup an entire copy of a hard disk to another hard disk

1
# dd if=/dev/sda of=/dev/sdb conv=sync,noerror
   cbs=BYTES
          convert BYTES bytes at a time

   conv=CONVS
          convert the file as per the comma separated symbol list


   ibs=BYTES
          read up to BYTES bytes at a time (default: 512)


   iflag=FLAGS
          read as per the comma separated symbol list

   obs=BYTES
          write BYTES bytes at a time (default: 512)

   oflag=FLAGS
          write as per the comma separated symbol list

   seek=N skip N obs-sized blocks at start of output

   skip=N skip N ibs-sized blocks at start of input

   status=LEVEL
          The  LEVEL of information to print to stderr; 'none' suppresses everything but error messages, 'noxfer'
          suppresses the final transfer statistics, 'progress' shows periodic transfer statistics

   N and BYTES may be followed by the following multiplicative suffixes: c =1, w =2, b =512, kB =1000,  K  =1024,
   MB =1000*1000, M =1024*1024, xM =M, GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.

   Each CONV symbol may be:

   ascii  from EBCDIC to ASCII

   ebcdic from ASCII to EBCDIC

   ibm    from ASCII to alternate EBCDIC

   block  pad newline-terminated records with spaces to cbs-size

   unblock
          replace trailing spaces in cbs-size records with newline

   lcase  change upper case to lower case

   ucase  change lower case to upper case

   sparse try to seek rather than write the output for NUL input blocks

   swab   swap every pair of input bytes

   sync   pad  every  input  block with NULs to ibs-size; when used with block or unblock, pad with spaces rather
          than NULs

   excl   fail if the output file already exists

   nocreat
          do not create the output file

   notrunc
          do not truncate the output file

   noerror
          continue after read errors

   fdatasync
          physically write output file data before finishing

   fsync  likewise, but also write metadata

   Each FLAG symbol may be:

   append append mode (makes sense only for output; conv=notrunc suggested)

   direct use direct I/O for data

   directory
          fail unless a directory

   dsync  use synchronized I/O for data

   sync   likewise, but also for metadata

   fullblock
          accumulate full blocks of input (iflag only)

   nonblock
          use non-blocking I/O

   noatime
          do not update access time

   nocache
          Request to drop cache.  See also oflag=sync

   noctty do not assign controlling terminal from file

   nofollow
          do not follow symlinks

   count_bytes
          treat 'count=N' as a byte count (iflag only)

   skip_bytes
          treat 'skip=N' as a byte count (iflag only)

   seek_bytes
          treat 'seek=N' as a byte count (oflag only)

   Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and  then  re‐
   sume copying.

使用dd命令克隆整个系统

进入Linux操作系统,打开命令行,执行如下命令:

1
sudo  fdisk -u -l

可以查看所有磁盘上的所有分区的尺寸和布局情况。

-u,让start和end中数字的单位是512字节,也就是一个sector扇区的大小。

具体步骤

找一个U盘,安装UbuntuLive Cd系统。

U盘启动,进入盘上的Ubuntu系统,打开命令行,执行:

1
sudo  fdisk -u -l /dev/sda

查看硬件的分区情况。

然后执行:

1
dd   bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda of=/ghost.img

这样,就可以把我需要的分区数据全部copy到ghost.img文件中。镜像制作完成了!

然后,我们就可以把U盘插到其他系统上,用U盘启动,进入UbuntuLiveCD,打开命令行,执行如下命令:

1
dd if=/ghost.img of=/dev/sda

完成后,拔掉U盘,启动计算机,就可以看到我们的Linux系统已经安装完毕了!

注意:不要直接在计算机上用本地磁盘启动系统后执行dd命令生成本地磁盘的镜像。而应该使用livecd启动计算机。因此计算机运行时会对系统盘产生大量写操作。 直接对运行中的系统盘生成的镜像,在恢复到其他硬盘上时,很可能会无法启动!

一样适用于非Linux操作系统, 在linux上用dd命令实现系统镜像备份和恢复,是不是很简单呢?

对于Windows系统,甚至Mac等等任意系统,其实都可以用dd命令实现系统镜像的备份和恢复。
因为,Linux的fdisk命令能够识别任意系统下的分区格式。fdisk并不关系分区上的文件系统,甚至有无文件系统都不关心。fdisk总是可以报告分区占用了哪些扇区。
dd命令也不关心磁盘的文件系统格式,它只是简单地按照要求从指定的位置,复制多少字节数据而已。
dd命令实现镜像备份和恢复,比Ghost软件简单和强大多了。使用ghost软件,依然需要用户进行复杂而危险的磁盘分区操作。
而使用fdisk和dd这两条命令,一切都免了!

压缩和解压缩

可能我们需要备份的分区很大,使用dd命令生成的镜像文件也就很大。存储和传输这些镜像不太方便。 我们也可以使用压缩程序压缩生成的镜像文件。 这里,我选择使用gzip程序,配合dd命令一起使用。

gzip参数:

  • -c 表示输出到stdout
  • -d 表示解压缩
  • -1 表示最快压缩
  • -9 表示最好压缩

默认使用的是-6压缩级别。

要使用 dd 和 gzip 生成压缩的镜像文件,可以执行命令:

1
# dd bs=512 count=[fdisk命令中最大的end数+1] if=/dev/sda | gzip -6 > /ghost.img.gz

还原时,可以执行下列命令: # gzip -dc /ghost.img.gz.gz | dd of=/dev/sda

提醒:
如果你把镜像恢复到另一台计算机上,你可能会发现你的网卡是eth1,而不是eth0。这是因为
/etc/udev/rules.d/70-persistent-net.rules 文件把你做镜像的计算机的网卡作为eth0登记了。
如果你的网络脚本对eth0进行了处理,而没有对eth1进行处理,那么不修改网络脚本,你可能就无法上网了。

也许你会希望在做镜像之前,先删除 /etc/udev/rules.d/70-persistent-net.rules 文件。这样你恢复镜像时,网卡的名字就是eth0。 就不会造成你在恢复后的计算机上无法上网的问题了。

输入!和你要重新执行的命令的前几个字母。

例如!ps,回车,就会执行最近历史命令中以“ps”开头的比如“ps aux | grep kernel”的命令。

1
# !ps

CentOS 6安装和配置VNC

VNC是Linux上的一款非常优秀的远程控制工具软件,通常我们在Windows上面安装vnc客户端软件来远程访问Linux机器(Windows上常用的客户端RealVNC),要远程连接到Linux首先要确保Linux上面已经安装了VNC server,下面以CentOS 6为例来说明:

1. 检查是否已经安装了VNC server

1
2
3
4
5
6
7
8
9
[root@centos6 ~]# rpm -qa | grep vnc

tigervnc-1.0.900.17.20110314svn4359.el6.i686

gtk-vnc-0.3.103.el6.i686

tigervnc-server-1.0.900.17.20110314svn4359.el6.i686

gtk-vnc-python-0.3.103.el6.i686

如果上面的几个rpm包已经存在,说明VNC server已经安装好了,接下来跳转步骤3启动vncserver就可以了,否则执行步骤2

2. 安装VNC server

1
2
3
# yum install tigervnc

# yum install tigervnc-server

3. 启动vncserver

第一次启动vncserver需要输入密码两次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@centos6 mnt]# vncserver

You will require a password to access your desktops.

Password:

Verify:

New ‘centos6.xman.org:1 (root)’ desktop is centos6.xman.org:1

Creating default startup script /root/.vnc/xstartup

Starting applications specified in /root/.vnc/xstartup

Log file is /root/.vnc/centos6.xman.org:1.log

可以看到已经生成了一个desktop:centos6.xman.org:1

为了方便,可见将vncserver添加到开机启动的服务中,使用setup->System services, 选择vncserver保存即可

接下来在VNC客户端输入上面的desktop就可以连接上Linux的desktop,如果发现连接不上,有可能是下面两个原因导致的:

(1) 本地windows的hosts文件中没有配置远程Linux的hostname,解决方案也很简单,只需要将desktop的hostname替换为IP地址或者在本地windows的hosts文件中添加相应的hostname与IP的映射关系即可

(2) 是由于Linux的防火墙阻止了,这时我们可以选择关闭防火墙或者将VNC的服务端口加入到Linux防火墙的信任列表

关闭防火墙

1
# /sbin/service iptables stop

关于EPEL源

以前在fedora上都是使用163或者sohu的源,感觉速度很快,包也挺全的,但是在CentOS上就不能这么用了,忽然就碰到了EPEL,简直是柳暗花明又一村呀,以前一直为CentOS的稳定而庆幸,为N多包要自己rpm而小失望,现在加上这个源一切都是向fedora的yum体验靠拢呀,赞(≧▽≦)/

企业版 Linux 附加软件包(以下简称 EPEL)是一个由特别兴趣小组创建、维护并管理的,针对 红帽企业版 Linux(RHEL)及其衍生发行版(比如 CentOS、Scientific Linux、Oracle Enterprise Linux)的一个高质量附加软件包项目。

EPEL 的软件包通常不会与企业版 Linux 官方源中的软件包发生冲突,或者互相替换文件。EPEL 项目与 Fedora 基本一致,包含完整的构建系统、升级管理器、镜像管理器等等。

使用方法:

添加源

创建一个文件/etc/yum.repos.d:

1
2

# touch /etc/yum.repos.d/epel.repo

添加以下内容

1
2
3
4
5
[epel]
name=epel repo
baseurl=http://dl.fedoraproject.org/pub/epel/6/$basearch/
gpgcheck=0
enabled=1

当然,如果你的CentOS是5.X版本的就把上面的6改成5即可了。

使用yum更新

1
2
# yum update
# yum install ipython.noarch

现在再试试以前不能安装的诸如ntfs-3g,ipython等等,赞

split - 精准划分

Linux split命令用于将一个文件切分开,一般用于将大文件切分为多个小文件,方便数据传输、保持和校验等。

默认情况下将按照每1000行切割成一个小文件。

官方定义为:

split - split a file into pieces

使用方法为:

1
$ split [OPTION]... [INPUT [PREFIX]]

常用的参数为:

  • -b, --bytes=SIZE : 指定每多少字节切成一个小文件

默认无参数

默认情况下,split 会将原来的大文件aa 切割成多个以x开头的小文件,可以看到其实为xaa,xab,一致到xaz,递增为xba以此类推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ split aa
$ ls
-rw-rw-r-- 1 user user 611037792 Jan 15 22:09 aa
-rw-rw-r-- 1 user user 356533 Jan 15 22:10 xaa
-rw-rw-r-- 1 user user 377414 Jan 15 22:10 xab
-rw-rw-r-- 1 user user 346342 Jan 15 22:10 xac
-rw-rw-r-- 1 user user 358728 Jan 15 22:10 xad
-rw-rw-r-- 1 user user 391466 Jan 15 22:10 xae
-rw-rw-r-- 1 user user 368786 Jan 15 22:10 xaf
-rw-rw-r-- 1 user user 377274 Jan 15 22:10 xag
-rw-rw-r-- 1 user user 393500 Jan 15 22:10 xah
-rw-rw-r-- 1 user user 362512 Jan 15 22:10 xai
-rw-rw-r-- 1 user user 365170 Jan 15 22:10 xaj
-rw-rw-r-- 1 user user 362878 Jan 15 22:10 xak
-rw-rw-r-- 1 user user 387394 Jan 15 22:10 xal
-rw-rw-r-- 1 user user 355614 Jan 15 22:10 xam
-rw-rw-r-- 1 user user 366420 Jan 15 22:10 xan
-rw-rw-r-- 1 user user 368912 Jan 15 22:10 xao
-rw-rw-r-- 1 user user 350226 Jan 15 22:10 xap
-rw-rw-r-- 1 user user 386102 Jan 15 22:10 xaq
-rw-rw-r-- 1 user user 377292 Jan 15 22:10 xar
-rw-rw-r-- 1 user user 376416 Jan 15 22:10 xas
-rw-rw-r-- 1 user user 347584 Jan 15 22:10 xat
-rw-rw-r-- 1 user user 376586 Jan 15 22:10 xau
-rw-rw-r-- 1 user user 352778 Jan 15 22:10 xav
-rw-rw-r-- 1 user user 380608 Jan 15 22:10 xaw
-rw-rw-r-- 1 user user 356634 Jan 15 22:10 xax
-rw-rw-r-- 1 user user 377414 Jan 15 22:10 xay
-rw-rw-r-- 1 user user 346342 Jan 15 22:10 xaz

切分为1MB的文件

可以使用-b参数,切分为准确字节的文件,如下:

1
2
3
4
5
6
7
8
9
10
$ split aa -b 1024000
$ ll
-rw-rw-r-- 1 user user 611037792 Jan 15 22:09 aa
-rw-rw-r-- 1 user user 1024000 Jan 15 22:15 xaa
-rw-rw-r-- 1 user user 1024000 Jan 15 22:15 xab
-rw-rw-r-- 1 user user 1024000 Jan 15 22:15 xac
-rw-rw-r-- 1 user user 1024000 Jan 15 22:15 xad
-rw-rw-r-- 1 user user 1024000 Jan 15 22:15 xae
-rw-rw-r-- 1 user user 1024000 Jan 15 22:15 xaf

指定前缀

这个参数直接跟在输入的文件后面即可,如下:

1
2
3
4
5
6
7
8
9
10
$ split aa DAT
$ ls
aa
DATaa
DATab
DATac
DATad
DATae
DATaf