Skip to content Skip to main navigation Skip to footer

Linux

Linux:如何挂载CD-ROM光盘驱动器

如何在linux操作系统的命令行下挂载光盘驱动器呢?你需要使用mount命令来挂载CD或者DVD光盘驱动器,首先,你需要先插入CD或者DVD到光盘驱动器里,然手输入下面的mount命令来挂载光盘。
获取CD/DVD的设备名
使用下面的命令来获取DVD/CD-ROM/Writer设备的名字:

#lsblk

或者

#dmesg | egrep -i --color 'cdrom|dvd|cd/rw|writer

命令输出:

ata2.00: ATAPI: VMware Virtual IDE CDROM Drive, 00000001, max UDMA/33
sr0: scsi3-mmc drive: 1x/1x writer dvd-ram cd/rw xa/form2 cdda tray

在linux系统里挂载DVD/CDROM的参数

#mount -t iso9660 -o ro /dev/设备名 /挂载目录名

创建挂载点,输入mkdir命令:

#mkdir -p /mnt/cdrom

挂载/dev/cdrom 或者/dev/sr0:

#mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom

或者

#mount -t iso9660 -o ro /dev/sr0 /mnt/cdrom

使用下面的两个命令来验证光驱是否挂载在/mnt/cdrom上,输入下面的命令:

#mount
#df

如何卸载已经挂载的光驱?
输入下面的命令:

#umount /cdrom

或者

#umount /dev/cdrom

或者

#umount /mnt/cdrom

Linux:如何查看DVD/CD-ROM驱动器的设备信息

在linux下,如何来查看系统里的CD-ROM或者DVD驱动器的设备名呢? 你可以输入下面的命令来查看当前系统下的光盘驱动器信息:
1.使用dmesg命令来查看当前的硬件是否被linux内核正确的识别
2.在/proc/sys/dev/cdrom/info文件里查看
3.使用lsblk命令来查看
dmesg 命令
dmesg命令主要用来检测linux内核的ring buffer里的信息,比如系统在系统时显示在屏幕上的信息。为了检测光盘驱动器cdrom是否被检测到,可以使用下面的命令:

#dmesg | egrep -i --color 'cdrom|dvd|cd/rw|writer'

命令输出如下:

[root@devops ~]# dmesg | egrep -i --color 'cdrom|dvd|cd/rw|writer'
ata2.00: ATAPI: VMware Virtual IDE CDROM Drive, 00000001, max UDMA/33
sr0: scsi3-mmc drive: 1x/1x writer dvd-ram cd/rw xa/form2 cdda tray
[root@devops ~]#

在上面的输出里,sr0是我的光盘驱动器,可以使用下面的命令获取更多的关于驱动器的信息:

#less /proc/sys/dev/cdrom/info

示例输出:

CD-ROM information, Id: cdrom.c 3.20 2003/12/17
drive name:             sr0
drive speed:            1
drive # of slots:       1
Can close tray:         1
Can open tray:          1
Can lock tray:          1
Can change speed:       1
Can select disk:        0
Can read multisession:  1
Can read MCN:           1
Reports media changed:  1
Can play audio:         1
Can write CD-R:         1
Can write CD-RW:        1
Can read DVD:           1
Can write DVD-R:        1
Can write DVD-RAM:      1
Can read MRW:           1
Can write MRW:          1
Can write RAM:          1

lsblk 命令
该命令可以列出所有的块设备:

#lsblk

命令输出如下:

[root@devops ~]# lsblk
NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0                           11:0    1     4G  0 rom
sda                            8:0    0    20G  0 disk
├─sda1                         8:1    0   500M  0 part /boot
└─sda2                         8:2    0  19.5G  0 part
├─vg_devops-lv_root (dm-0) 253:0    0  17.6G  0 lvm  /
└─vg_devops-lv_swap (dm-1) 253:1    0     2G  0 lvm  [SWAP]
[root@devops ~]#

搞定!。。

linux下sed命令的工作原理/过程

Sed编辑器逐行处理文件,并将输出结果发送到屏幕上。sed的命令就是在vi和ed/ex编辑器中见到的那些。sed命令在处理的时候会把当前正在处理的行保存在一个临时的缓存区中,这个缓存区称为模式空间或者临时缓冲。sed在处理完模式空间中的行后,就把该行发送到屏幕上。
sed每处理完一行就将其从模式空间中删除,然后将下一行读入空间,进行处理和显示输出。处理完输入文件的最后一行后,sed命令就结束了运行。sed命令会把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改或破换原来的文件。
sed工作原理图:

sed

linux下的流编辑器sed介绍

sed是一种新型的非交互式的编辑器,它能执行与编辑器vi相同的编辑任务。sed编辑没有提供交互式的使用方式,使用者只能在命令行输入编辑命令,指定文件名,然后再屏幕上查看输出信息。
sed编辑器没有破环性,它不会修改文件, 除非使用shell重定向来保存输出的结果,默认情况下,所有的输出行都会被打印到屏幕上。
sed编辑器在shell脚本中很有用,因为在shell脚本中使用vi这种交互式编辑器,要求脚本用户精通该编辑器,而且还会导致用户对打开的文件作出不需要的修改。
在linux下,如何查看sed的不同版本号?
linux下使用的sed是GNU版本,版权归自由软件基金会所有。查看sed的版本号可以通过下面的命令:

sed -V
或者
sed --version

示例输出如下:

[root@devops ~]# sed --version
GNU sed 版本 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-gnu-utils@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
[root@devops ~]#
 

perl中grep的详细用法

最近一直在学习perl语言,下面介绍下如果和在perl编程中使用强大的grep函数。
1. Grep函数
grep有2种表达方式:

grep BLOCK LIST
grep EXPR, LIST

BLOCK表示一个code块,通常用{}表示;EXPR表示一个表达式,通常是正则表达式。原文说EXPR可是任何东西,包括一个或多个变量,操作符,文字,函数,或子函数调用。
LIST是要匹配的列表。
grep对列表里的每个元素进行BLOCK或EXPR匹配,它遍历列表,并临时设置元素为$_。在列表上下文里,grep返回匹配命中的所有元素,结果也是个列表。在标量上下文里,grep返回匹配命中的元素个数。
2. Grep 和 loops

open FILE "<myfile" or die "Can't open myfile: $!";
print grep /terrorism|nuclear/i, <FILE>;

这里打开一个文件myfile,然后查找包含terrorism或nuclear的行。<FILE>返回一个列表,它包含了文件的完整内容。可能你已发现,如果文件很大的话,这种方式很耗费内存,因为文件的所有内容都拷贝到内存里了。
当然你也可以使用loop(循环)来完成:

while ($line = <FILE>;) {
if ($line =~ /terrorism|nuclear/i) { print $line }
}

上述code显示,loop可以完成grep能做的任何事情。那为什么还要用grep呢?答案是grep更具perl风格,而loop是C风格的。
更好的解释是:(1)grep让读者更显然的知道,你在从列表里选择某元素;(2)grep比loop简洁。
一点建议:如果你是perl新手,那就规矩的使用loop比较好;等你熟悉perl了,就可使用grep这个有力的工具。
3.几个grep的示例

1. 统计匹配表达式的列表元素个数

$num_apple = grep /^apple$/i, @fruits;

在标量上下文里,grep返回匹配中的元素个数;在列表上下文里,grep返回匹配中的元素的一个列表。
所以,上述code返回apple单词在@fruits数组中存在的个数。因为$num_apple是个标量,它强迫grep结果位于标量上下文里。
2. 从列表里抽取唯一元素

@unique = grep { ++$count{$_} < 2 }
qw(a b a c d d e f g f h h);
print "@unique\n";

上述code运行后会返回:a b c d e f g h
即qw(a b a c d d e f g f h h)这个列表里的唯一元素被返回了。为什么会这样呀?让我们看看:
%count是个hash结构,它的key是遍历qw()列表时,逐个抽取的列表元素。++$count{$_}表示$_对应的hash值自增。在这个比较上下文里,++$count{$_}与$count{$_}++的意义是不一样的哦,前者表示在比较之前,就将自身值自增1;后者表示在比较之后,才将自身值自增1。所以,++$count{$_} < 2 表示将$count{$_}加1,然后与2进行比较。$count{$_}值默认是undef或0。所以当某个元素a第一次被当作hash的关键字时,它自增后对应的hash值就是1,当它第二次当作hash关键字时,对应的hash值就变成2了。变成2后,就不满足比较条件了,所以a不会第2次出现。
所以上述code就能从列表里唯一1次的抽取元素了。
2. 抽取列表里精确出现2次的元素

@crops = qw(wheat corn barley rice corn soybean hay
alfalfa rice hay beets corn hay);
@duplicates = grep { $count{$_} == 2 }
grep { ++$count{$_} >; 1 } @crops;
print "@duplicates\n";

运行结果是:rice
这里grep了2次哦,顺序是从右至左。首先grep { ++$count{$_} >; 1 } @crops;返回一个列表,列表的结果是@crops里出现次数大于1的元素。
然后再对产生的临时列表进行grep { $count{$_} == 2 }计算,这里的意思你也该明白了,就是临时列表里,元素出现次数等于2的被返回。
所以上述code就返回rice了,rice出现次数大于1,并且精确等于2,明白了吧? 🙂
3. 在当前目录里列出文本文件

@files = grep { -f and -T } glob '* .*';
print "@files\n";

glob返回一个列表,它的内容是当前目录里的任何文件,除了以’.’开头的。{}是个code块,它包含了匹配它后面的列表的条件。这只是grep的另一种用法,其实与 grep EXPR,LIST 这种用法差不多了。-f and -T 匹配列表里的元素,首先它必须是个普通文件,接着它必须是个文本文件。据说这样写效率高点哦,因为-T开销更大,所以在判断-T前,先判断-f了。
4. 选择数组元素并消除重复

@array = qw(To be or not to be that is the question);
@found_words =
grep { $_ =~ /b|o/i and ++$counts{$_} < 2; } @array;
print "@found_words\n";

运行结果是:To be or not to question
{}里的意思就是,对@array里的每个元素,先匹配它是否包含b或o字符(不分大小写),然后每个元素出现的次数,必须小于2(也就是1次啦)。
grep返回一个列表,包含了@array里满足上述2个条件的元素。
5. 从二维数组里选择元素,并且x<y

# An array of references to anonymous arrays
@data_points = ( [ 5, 12 ], [ 20, -3 ],
[ 2, 2 ], [ 13, 20 ] );
@y_gt_x = grep { $_->;[0] < $_->;[1] } @data_points;
foreach $xy (@y_gt_x) { print "$xy->;[0], $xy->;[1]\n" }

运行结果是:
5, 12
13, 20
这里,你应该理解匿名数组哦,[]是个匿名数组,它实际上是个数组的引用(类似于C里面的指针)。
@data_points的元素就是匿名数组。例如:

foreach (@data_points){
print $_->;[0];}

这样访问到匿名数组里的第1个元素,把0替换成1就是第2个元素了。
所以{ $_->;[0] < $_->;[1] }就很明白了哦,它表示每个匿名数组的第一个元素的值,小于第二个元素的值。
而grep { $_->;[0] < $_->;[1] } @data_points; 就会返回满足上述条件的匿名数组列表。

perl的unless控制结构的用法

在perl的if控制结构中,只有当条件表达式为真时才执行某块代码。如果想让程序块在条件为假时才执行,此时可以把if改成unless

unless ($fred =~ /^([A-Z_]\w*$/i) {
print "The value of \$fred doesn't look like a Perl identifier name. \n";
}

使用unless意味着,要么条件为真,要么执行某块代码。这就好像使用if控制结构来判断相反的条件。另一种说法是它类似于独立的else子句。也就是说,当看不懂某个unless语句时,可以用如下的if语句来代替:

if ($fred =~ /^([A-Z_]\w*$/i) {
//什么都不做
} else {
print "The value of \$fred doesn't look like a Perl identifier name. \n";
}

如此操作与运行效率高低无关,两种写法应该会被统译成相同的内部字节码。另外一个改写的方法,就是以取反操作符!来否定条件:

if ( ! ($fred =~ /^([A-Z_]\w*$/i) ) {
print "The value of \$fred doesn't look like a Perl identifier name. \n";
}

通常应该选择最容易理解的方法来写代码,因为这通常对于维护程序员来说也是最容易理解的。如果用if来表达最合适,那么就这么写也行。但是更多的情况下使用unless能使你的表达更加自然。
unless附带的else子句
其实哪怕是在unless结构中也可以使用else语句,虽然支持这样的语法,但是可能会导致困惑:

#!/usr/bin/perl -w
unless ($mon =~ /^Feb/) {
print "This month has at least thirty days.\n";
} else {
print "Do you see what's going on here?\n";
}
#如果用if语句我们可以写成这样:
if ($mon =~ /^Feb/) {
print "Do you see what's going on here?\n";
} else {
print "This month has at least thirty days.\n";
}

10个linux 作业控制的bash 脚本实例

linux和unix都是多任务的操作系统,也就是说系统可以同时运行多个任务或者进程。下面我们来说一下在linux或者unix下用来处理多任务的作业控制命令。
什么是作业控制(job control)?
作业控制就是可以停止或者暂停正在执行的程序,还可以使暂停的进程重新开始运行。这些都是可以通过我们的shell程序来实现。
1.创建一个linux/unix 作业(job)

[root@devops ~]# top &
[1] 26569
 

在这个例子中:

[1]:表明刚才的作业号是1
26569: 这个是进程的ID号

让我们来多创建几个作业:

gedit /tmp/test.c &
sleep 1000 & 

2.列出当初正在后台运行的作业
为了查看当前运行的作业的状态,可以输入下面的命令:

$jobs
$jobs -l

命令输出如下:

[root@devops ~]# jobs
[1]-  Stopped                 top
[2]+  Stopped                 vim /tmp/test.c
[3]   Running                 sleep 1000 &
[root@devops ~]# jobs -l
[1]- 26650 Stopped (tty output)    top
[2]+ 26651 Stopped (tty output)    vim /tmp/test.c
[3]  26653 Running                 sleep 1000 &
[root@devops ~]#
 

3. 停止或暂停正在运行的作业
当一个程序正在运行的时候,如果想让该程序在后台执行,可以使用[ctrl]+ [z]或者使用kill命令:

kill -s stop PID

下面举一个通过ctrl+z来暂停正在执行的ping命令:

[root@devops ~]# ping osetc.com
PING osetc.com (42.96.192.124) 56(84) bytes of data.
64 bytes from 42.96.192.124: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 42.96.192.124: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.033 ms
^Z
[4]+  Stopped                 ping osetc.com
[root@devops ~]#
 

4. 恢复暂停的作业到前台去运行
我们可以使用fg命令将暂停在后台的ping进程调到前台来运行,用法如下:

fg %5    #fg命令后跟百分号,再跟上作业号

如果想操作所有以“ping”开头的命令行作业,可以使用下面的格式:

fg %ping

示例输出:

root@devops ~]# fg %4
ping osetc.com
64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.033 ms
64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms
64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.030 ms
64 bytes from 42.96.192.124: icmp_seq=7 ttl=64 time=0.036 ms
^C
[root@devops ~]# fg %ping
ping osetc.com
64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.023 ms
64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.031 ms
64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms
64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.029 ms
^C
--- osetc.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 10964ms
rtt min/avg/max/mdev = .023/0.027/0.031/0.006 ms
 

5. 恢复后台已暂停的进程继续在后台运行
我们可以使用bg命令将后台挂起的进程重新开始执行,示例如下:

[root@devops ~]# jobs
[2]-  Stopped                 vim /tmp/test.c
[4]+  Stopped                 ping osetc.com
[5]   Running                 sleep 1000000 &
[root@devops ~]# kill -s stop %5
[root@devops ~]# jobs
[2]   Stopped                 vim /tmp/test.c
[4]-  Stopped                 ping osetc.com
[5]+  Stopped                 sleep 1000000
 

从上面示例可以看出,正在运行sleep进程被挂起了。

[root@devops ~]# bg %5
[5]+ sleep 1000000 &amp;
[root@devops ~]# jobs
[2]-  Stopped                 vim /tmp/test.c
[4]+  Stopped                 ping osetc.com
[5]   Running                 sleep 1000000 &
 

将挂起在后台的进程重新开始执行
6. 杀掉一个进程
为了杀掉一个linux命令的进程,我们可以输入kill命令加上该进程的作业ID号,用法如下:

#kill %4

示例输出如下:

[root@devops ~]# jobs
[2]-  Stopped                 vim /tmp/test.c
[4]+  Stopped                 ping osetc.com
[5]   Running                 sleep 1000000 &
[root@devops ~]# kill %4
[4]+  Stopped                 ping osetc.com
[root@devops ~]# jobs
[2]-  Stopped                 vim /tmp/test.c
[4]+  Terminated              ping osetc.com
[5]   Running                 sleep 1000000 &amp;
[root@devops ~]# jobs
[2]+  Stopped                 vim /tmp/test.c
[5]-  Running                 sleep 1000000 &amp;
[root@devops ~]#
 

7.为什么shell在退出后会杀掉所有的后台作业进程
默认情况下,当前shell在退出的时候会发送一个HUP信号,杀掉所有后台作业,如果想让作业在当前shell退出后任然能保持在后台运行,那么可以在输入disown命令,再退出shell程序。

[root@devops ~]# jobs
[1]+  Running                 tail -f /var/log/messages &
[root@devops ~]# disown
[root@devops ~]# exit
 

8.使用nohup命令来阻止后台的进程在退出shell后被杀掉

[root@devops ~]# nohup tail -f /var/log/messages &
[1] 26806
[root@devops ~]# exit
 

9. 查找最近一次执行的作业的进程号
为了查找最近一次执行的作业的进程ID号,可以使用下面的特殊符号:$!

[root@devops ~]# jobs -l
[1]+ 26832 Stopped (tty output)    top
[2]- 26833 Running                 sleep 100000 &
[root@devops ~]# echo $!
26833
 

10. wait命令等待作业的完成
wait命令用来等待给定进程ID运行完成,而后执行wait命令后的程序

sleep 100 &
wait $!
date

7个最常用的获取硬件设备信息的linux命令/工具

在linux系统下有很多linux命令或者linux工具可以用来查看系统硬件的信息,包括cpu,内存,有些命令可以查询多个硬件信息。本文将会介绍7个常用的查看硬件信息的linux命令,比如:lscpu命令hwinfo命令 lshw命令lspci命令lsblk 命令lsusb命令
1. lscpu-获取cpu命令的信息

[root@devops ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
Thread(s) per core: 1
Core(s) per socket: 1
CPU socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 45
Stepping: 7
CPU MHz: 2194.842
BogoMIPS: 4389.68
Hypervisor vendor: Xen
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 15360K
NUMA node0 CPU(s): 0
 

2.Lshw -显示硬件信息的列表
这个命令很常用,可以通过不同的选项来显示不同的硬件信息,包括:CPU, 内存,磁盘,USB控制器,硬件驱动器等,该命令主要从/proc目录下的不同文件中获取综合的硬件信息。
默认情况下,linux下是不安装这个工具的,所以你需要先安装,然后才能使用,安装方法如下:

wget http://ezix.org/software/files/lshw-B.02.14.tar.gz
tar -zxvf lshw-B.02.14.tar.gz
cd lshw-B.02.14
make &amp;&amp; make install
 
[root@devops lshw-B.02.14]# lshw -short
H/W path Device Class Description
=====================================================
system HVM domU
/0 bus Motherboard
/0/0 memory 96KiB BIOS
/0/1 processor Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz
/0/2 memory System Memory
/0/2/0 memory 512MiB DIMM RAM
/0/2/1 memory 512MiB DIMM RAM
/0/3 memory 96KiB BIOS
/0/4 processor CPU
/0/5 memory System Memory
/0/6 memory
/0/7 memory
/0/100 bridge 440FX - 82441FX PMC [Natoma]
/0/100/1 bridge 82371SB PIIX3 ISA [Natoma/Triton II]
/0/100/1.1 scsi1 storage 82371SB PIIX3 IDE [Natoma/Triton II]
/0/100/1.1/0.0.0 /dev/cdrom1 disk SCSI CD-ROM
/0/100/1.2 bus 82371SB PIIX3 USB [Natoma/Triton II]
/0/100/1.2/1 usb1 bus UHCI Host Controller
/0/100/1.2/1/2 input QEMU USB Tablet
/0/100/1.3 bridge 82371AB/EB/MB PIIX4 ACPI
/0/100/2 display GD 5446
/0/100/3 generic Xen Platform Device
/1 eth0 network Ethernet interface
/2 eth1 network Ethernet interface
[root@devops lshw-B.02.14]#
 

3. Hwinfo – 硬件信息
Hwinfo 命令也是一个用来查看硬件信息的工具,功能和lshw命令类似,但是能够获取到更多更详细的硬件信息。
按照下面的方法安装Hwinfo工具:
对于CentOS 6系统

#rpm -Uvh http://mirror.symnds.com/distributions/gf/el/6/gf/x86_64/gf-release-6-6.gf.el6.noarch.rpm
#yum list hwinfo
#yum install hwinfo
 

对于Centos5系统

#rpm -Uvh http://mirror.symnds.com/distributions/gf/el/5/gf/x86_64/gf-release-5-6.gf.el5.noarch.rpm
#yum list hwinfo
#yum install hwinfo
 
[root@devops tmp]# rpm -Uvh http://mirror.symnds.com/distributions/gf/el/6/gf/x86_64/gf-release-6-6.gf.el6.noarch.rpm
Retrieving http://mirror.symnds.com/distributions/gf/el/6/gf/x86_64/gf-release-6-6.gf.el6.noarch.rpm
warning: /var/tmp/rpm-tmp.m2mMAO: Header V4 RSA/SHA1 Signature, key ID 13a4d2a9: NOKEY
Preparing... ########################################### [100%]
1:gf-release ########################################### [100%]
[root@devops tmp]# yum list hwinfo
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
gf | 2.9 kB 00:00
gf/primary_db | 58 kB 00:00
Available Packages
hwinfo.x86_64
 
[root@devops tmp]# yum list hwinfo
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
gf | 2.9 kB 00:00
gf/primary_db | 58 kB 00:00
Available Packages
hwinfo.x86_64 20.2-1.gf.el6 gf
[root@devops tmp]# yum install hwinfo
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Setting up Install Process
Resolving Dependencies
--&gt; Running transaction check
---&gt; Package hwinfo.x86_64 0:20.2-1.gf.el6 will be installed
.....
 
[root@devops tmp]# hwinfo -short
oops: don't know what to do with "short"
[root@devops tmp]# hwinfo --short
cpu:
Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz, 2194 MHz
keyboard:
/dev/input/event3 AT Translated Set 2 keyboard
/dev/ttyS0 serial console
mouse:
/dev/input/mice Adomax QEMU USB Tablet
/dev/input/mice Macintosh mouse button emulation
/dev/input/mice ImExPS/2 Generic Explorer Mouse
graphics card:
Cirrus Logic GD 5446
storage:
Intel 82371SB PIIX3 IDE [Natoma/Triton II]
Xen Virtual Storage 0
Xen Virtual Storage 1
Xen Virtual Storage 2
network:
eth0 Xen Virtual Ethernet Card 0
eth1 Xen Virtual Ethernet Card 1
network interface:
lo Loopback network interface
eth0 Ethernet network interface
eth1 Ethernet network interface
disk:
/dev/xvda Disk
/dev/xvdb Disk
partition:
/dev/xvda1 Partition
/dev/xvdb1 Partition
cdrom:
/dev/sr0 QEMU DVD-ROM
usb controller:
Qumranet Qemu virtual machine
bios:
BIOS
bridge:
Qumranet Qemu virtual machine
Qumranet Qemu virtual machine
Qumranet Qemu virtual machine
hub:
Linux 2.6.32-279.el6.x86_64 uhci_hcd UHCI Host Controller
memory:
Main Memory
unknown:
FPU
DMA controller
PIC
Timer
Keyboard controller
XenSource Xen Platform Device
[root@devops tmp]#
 

4. lspci
lscpi 命令可以列出PCI总线的相关信息,以及连接在PCI总线上的其它硬件设备的信息,比如VGA适配器,USB端口信息, SATA控制器信息等。
lspic命令是pciutils工具包的一部分,所以需要先安装pciutils工具包。

#yum install pciutils
[root@devops tmp]# yum install pciutils
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Setting up Install Process
Resolving Dependencies
--&gt; Running transaction check
---&gt; Package pciutils.x86_64 0:3.1.10-2.el6 will be installed
--&gt; Processing Dependency: pciutils-libs = 3.1.10-2.el6 for package: pciutils-3.1.10-2.el6.x86_64
--&gt; Running transaction check
---&gt; Package pciutils-libs.x86_64 0:3.1.4-11.el6 will be updated
---&gt; Package pciutils-libs.x86_64 0:3.1.10-2.el6 will be an update
--&gt; Finished Dependency Resolution
Dependencies Resolved
==================================
Package Arch Version Repository Size
===================================
Installing:
pciutils x86_64 3.1.10-2.el6 base 85 k
Updating for dependencies:
pciutils-libs x86_64 3.1.10-2.el6 base 34 k
Transaction Summary
====================================
Install 1 Package(s)
Upgrade 1 Package(s)
Total download size: 119 k
Is this ok [y/N]: y
Downloading Packages:
(1/2): pciutils-3.1.10-2.el6.x86_64.rpm | 85 kB 00:00
(2/2): pciutils-libs-3.1.10-2.el6.x86_64.rpm | 34 kB 00:00
-------------------------------------------------------------------------------
Total 913 kB/s | 119 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : pciutils-libs-3.1.10-2.el6.x86_64 1/3
Installing : pciutils-3.1.10-2.el6.x86_64 2/3
Cleanup : pciutils-libs-3.1.4-11.el6.x86_64 3/3
Verifying : pciutils-libs-3.1.10-2.el6.x86_64 1/3
Verifying : pciutils-3.1.10-2.el6.x86_64 2/3
Verifying : pciutils-libs-3.1.4-11.el6.x86_64 3/3
Installed:
pciutils.x86_64 0:3.1.10-2.el6
Dependency Updated:
pciutils-libs.x86_64 0:3.1.10-2.el6
Complete!
 
[root@devops tmp]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 01)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Unassigned class [ff80]: XenSource, Inc. Xen Platform Device (rev 01)
[root@devops tmp]#
 

5. lsusb- 显示USB总线的信息
lsusb 是 usbutils 工具包的一部分,所以需要先安装usbutils工具包:

[root@devops tmp]# yum install usbutils
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Setting up Install Process
Resolving Dependencies
--&gt; Running transaction check
---&gt; Package usbutils.x86_64 0:003-4.el6 will be installed
--&gt; Processing Dependency: libusb-1.0.so.0()(64bit) for package: usbutils-003-4.el6.x86_64
--&gt; Running transaction check
---&gt; Package libusb1.x86_64 0:1.0.9-0.6.rc1.el6 will be installed
--&gt; Finished Dependency Resolution
Dependencies Resolved
============================================
Package Arch Version Repository Size
============================================
Installing:
usbutils x86_64 003-4.el6 base 71 k
Installing for dependencies:
libusb1 x86_64 1.0.9-0.6.rc1.el6 base 80 k
Transaction Summary
===========================================
Install 2 Package(s)
Total download size: 152 k
Installed size: 377 k
Is this ok [y/N]: y
Downloading Packages:
(1/2): libusb1-1.0.9-0.6.rc1.el6.x86_64.rpm | 80 kB 00:00
(2/2): usbutils-003-4.el6.x86_64.rpm | 71 kB 00:00
---------------------------------------------------------------------------
Total 3.0 MB/s | 152 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : libusb1-1.0.9-0.6.rc1.el6.x86_64 1/2
Installing : usbutils-003-4.el6.x86_64 2/2
Verifying : usbutils-003-4.el6.x86_64 1/2
Verifying : libusb1-1.0.9-0.6.rc1.el6.x86_64 2/2
Installed:
usbutils.x86_64 0:003-4.el6
Dependency Installed:
libusb1.x86_64 0:1.0.9-0.6.rc1.el6
Complete!
 
[root@devops tmp]# lsusb
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd
[root@devops tmp]#
 

6. lsblk- 显示block设备的信息

[root@devops tmp]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 20G 0 disk
└─xvda1 202:1 0 20G 0 part /
xvdb 202:16 0 10G 0 disk
└─xvdb1 202:17 0 10G 0 part /alidata
sr0 11:0 1 362K 0 rom  

7. lsscsi- List the SCSI device information
显示 scsi/sata设备信息,比如硬盘或者光磁盘信息。

[root@devops tmp]# lsscsi
[1:0:0:0] cd/dvd QEMU QEMU DVD-ROM 0.10 /dev/sr0
[root@devops tmp]#
 

Linux:如何在linux下编译/运行C/C++程序

对于一个linux新手来说,可能想知道如何才能在linux编译并执行自己写的C/C++语言程序?为了在各种不同的linux系统(redhat,ubuntu,fedora,debian)下编译C或者C++程序,还需要安装一些必要的包:
1. GNU C 和C++编译器
2.开发工具包
3. 开发库
4. 编辑器软件包
第一步,安装C/C++编译器
对于Redhat发布的几个linux发布版本,可以使用下面的命令安装GNU c/C++编译器:

[root@devops ~]# yum groupinstall 'Development Tools'
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.btte.net
* extras: mirrors.btte.net
* updates: mirrors.btte.net
base                                                                         | 3.7 kB     00:00
extras                                                                       | 3.4 kB     00:00
updates                                                                      | 3.4 kB     00:00
updates/primary_db                                                           | 2.6 MB     00:00
Setting up Group Process
Checking for new repos for mirrors
base/group_gz                                                                | 220 kB     00:00
Package gcc-4.4.7-4.el6.x86_64 already installed and latest version
Package 1:pkgconfig-0.23-9.1.el6.x86_64 already installed and latest version
Resolving Dependencies
--&gt; Running transaction check
---&gt; Package autoconf.noarch 0:2.63-5.1.el6 will be installed
---&gt; Package automake.noarch 0:1.11.1-4.el6 will be installed
---&gt; Package binutils.x86_64 0:2.20.51.0.2-5.34.el6 will be updated
...
 

对于ubuntu的系统,可以使用下面的命令来安装c/C++编译器

[root@devops ~]#sudo apt-get update
[root@devops ~]#sudo apt-get install build-essential manpages-dev
 

安装完之后,我们可以验证下是否安装成功

[root@devops ~]# gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
Copyright ? 2010 Free Software Foundation, Inc.
[root@devops ~]# whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz
[root@devops ~]#
 

下面来举个例子,编译并执行C/C++程序:

#include ;
int main(void) {
printf ("hello Wolrd!\n");
}

那么如何在linux下编译/运行C语言程序呢?
我们可以使用下面的命令cc或者gcc来编译c语言程序:

[root@devops ~]# gcc test.c -o test
[root@devops ~]# ./test
hello Wolrd!
[root@devops ~]#
 

如何在linux下编译/运行C++程序呢?

#include "iostream"
int main(void) {
std::cout << "hello world.\n";
}

使用g++命令编译c++程序:

[root@devops ~]# g++ test.C -o test
 

运行编译之后的可执行程序:

[root@devops ~]# ./test
hello world.
[root@devops ~]#
 

Ubuntu:如何从12.04 LTS/13.10升级到 Ubuntu 14.04 LTS

ubuntu 14.04LTs
最新版的Ubuntu 14.04LTS发布了,如何从之前的ubuntu 13.10或者12.04LTS升级到最新版本呢?
首先最重要的是要做好重要数据的备份工作,然后才能开始做升级操作。
从服务器版的ubuntu 13.10升级到14.04
先检测下是否安装了update-manager-core包,如果没有的话,可以先安装这个包。

$sudo apt-get update
$sudo apt-get install update-manager-core
 

下一步就可以通过下面的命令将服务器版的ubuntu升级到最新发布的版本:LTS14.04.

$sudo do-release-upgrade
 

如果在安装的过程中遇到下面类似的错误,那么可以在命令后面加-d选项,该选项可
以强制系统做升级操作。

$sudo do-release-upgrade -d
 

升级桌面版本的ubuntu 13.10到最新的Ubuntu 14.04 LTS
在命令行窗口输入下面的命令:

$sudo update-manager -d
 

ubuntu 系统会检测可用的更新,升级到最新的版本。

Grep正则表达式:如何查找某个特定的IP地址

下面会举几个在grep命令中使用正则表达式从一个文件中匹配到特定的IP地址。下面的正则表达式将会匹配IPV4的地址。
正则表达式匹配IP地址:
使用下面的正则表达式来匹配IPV4的地址,先来匹配从0.0.0.0到999.999.999.999的模式。

"([0-9]{1,3}[\.]){3}[0-9]{1,3}"
 

示例:使用grep命令来查找匹配特定的地址

$ grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" filename
[root@devops ~]# echo 000.333.222.444 &gt;test1
[root@devops ~]#
[root@devops ~]# grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" test1
000.333.222.444
 

上面的正则表达只是简单的匹配了特定的类似于ip地址的传,但它不能匹配真正的IPv4地址。可以通过下面的正则表达式来匹配.

"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
 

通过grep命令匹配文件中的IPv4地址

[root@devops ~]# grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-
4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" test1
[root@devops ~]# echo 192.168.1.234 &gt; test1
[root@devops ~]# grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-
4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" test1
192.168.1.234
[root@devops ~]
 

#
其中:-E选项表示使用grep扩展的正则表达式
-o选项是只显示匹配到的字符串
前面的文章里有更多的关于grep中正则表达式的用法。

python:如何转换一个字符型为整型

在python语言里,如何将一个字符型的串转换成整数型呢?你需要使用int()函数来转换一个字符型为整型,如果想将一个浮点型的数转换成整数,可以使用int(float()). 常用的函数使用方法如下:

int(s)
float(s)
int(float(s))

示例:

x='123456'
type(x)

示例输出:

<type 'int'="">

转换一个字符为整型:

i=int(x)
type(i)

示例输出:

 <type 'int'>

如果浮点型的数直接用int()函数转换的时候,编译器会报错。

x='123.356'
y=int(x)

示例输出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '123.356'

这个时候就需要使用另一个方式:int(float(x)),示例如下:

 type(x)

 type(y)

Python:如何删除整个目录树

当我们写python代码的时候,如果需要删除指定路径下的文件我们可以使用os.remove 或者os.unlink,那么python语言如何删除整个目录树的文件呢?

一个好的方法是可以使用shutil.rmtree(),该方法可以删除整个目录树,给定的参数为一个指向目录的路径,使用方法如下:

import shutil
shutil.rmtree("目录树路径“)

下面的来举个实际的例子,删除/ostmp/tdir/folder/目录和目录里的所有文件:

#coding=utf-8
#!/usr/bin/python
import os
import sys
import shutil
##获取要删除的目录树路径
rmdir=raw_input("请输入目录名:")
###下面使用try来检测异常,如果失败会抛出一个异常
try:
     shutil.rmtree(rmdir)
except OSError, e:
     print ("错误: %s-%s." % (e.filename,e.strerror))

程序输出如下:

[root@devops ~]# python rmdir.py
请输入目录名:test.txt
错误: test.txt-No such file or directory.
[root@devops ~]# python rmdir.py
请输入目录名:/root/test.txt
错误: /root/test.txt-No such file or directory.

python:如何删除指定的文件或目录

写python程序的时候,如果需要删除特定目录下的文件或目录,该如何来实现呢? 在linux平台或windows平台,python语言如何来删除特定的文件或目录呢?

你可以使用remove或者unlink方法来删除文件或者目录,接下来详细介绍一下如何使用:

import os
os.remove("/test.txt")

或者

import os
os.unlink("/test.txt")

下面来举个通过python语言删除文件或目录的例子:
在删除文件之前最好能对文件或目录做一个存在性检查,这对于程序员来说是一个好的编程习惯,可以使用os.path.isfile(“/路径/文件名“)来检测指定的文件是否存在。

#!/usr/bin/python
import os
rmfile="/text.txt"
if os.path.isfile(rmfile):
      os.remove(rmfile)
else:
    print ("Error: %s 文件没有找到” % rmfile)

程序输出如下:

[root@devops ~]# python rmfile.py
Error: /text.txt 文件没有找到

当然我们也可以通过异常处理来抛出错误信息,如下所示:

#! /usr/bin/python
import os
rmfile="/text.txt"
try:
    os.remove(rmfile)
except OSError, e:
    print("Error: %s-%s." % (e.filename,e.strerror))

程序输入如下:

[root@devops ~]# python rmfile.py
Error: /text.txt-No such file or directory.

Python:如何运行外部的linux/unix命令/程序

我们在写python程序的时候,有时候需要调用现成的外部命令或者已经编译好的外部程序, 那么在python里如何调用呢?

下面来介绍一个python的模块:subprocess. 这个模块可以创建一个新的进程,并可以获取到该进程的标准输入/输出以及标准的错误输出, 而且可以该进程最后的返回值。当然python里还有其它的模块可以实现这种需求,比如:os.system, os.spawn*, os.popen*.

python subprocess模块的用法

import subprocess
subprocess.call("命令“)
subprocess.call(["命令”,“参数”])

python程序中执行ifconfig命令去获取系统网卡的信息

#!/usr/bin/python
import subprocess
subprocess.call("ifconfig")

程序执行后输出如下:

eth0      Link encap:Ethernet  HWaddr
          inet addr:10.10.10.200  Bcast:10.10.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:62621520 errors:0 dropped:0 overruns:0 frame:0
          TX packets:43688 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2787090014 (2.5 GiB)  TX bytes:1835004 (1.7 MiB)
          Interrupt:164 

python程序调用netstat -l命令查看正在监听的端口

#!/usr/bin/python
import subprocess
subprocess.call(["netstat","-l"])

程序执行后输出如下:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 *:mysql                     *:*                         LISTEN
tcp        0      0 *:http                      *:*                         LISTEN
tcp        0      0 *:ftp                       *:*                         LISTEN
tcp        0      0 *:ssh                       *:*                         LISTEN
tcp        0      0 *:ssh                       *:*                         LISTEN

如何将外部命令的输出传给python的一个变量呢?我们可以使用subprocess中的Popen类来实现

#!/usr/bin/python
import subprocess
Temp=subprocess.Popen(["netstat","-l"], stdout=subprocess.PIPE, shell=True)
(output,errput)=Temp.communicate()
return_value=Temp.wait()
print "命令输出:“,output
print "命令退出状态:“, return_value

linux下如何查看系统内核版本号和系统版本号

我们使用linux系统的时候,肯定需要知道当前系统的内核版本号,那么如何才能查看到linux系统的内核版本号呢?如何才能查看到linux系统本身的版本号?如何查看redhat的系统版本号?

查看linux系统内核版本

我们可以通过下面的两个命令来查看系统内核版本号:

1. cat /proc/version

[root@devops ~]# cat /proc/version
Linux version 2.6.32-279.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org)
(gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1
SMP Fri Jun 22 12:19:21 UTC 2012
[root@devops ~]# 

2. uname -a

[root@devops ~]# uname -a
Linux devops 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21
UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@devops ~]# 

查看linux系统的版本号

我们可以通过下面的三个命令来查看linux系统的版本号:

1.lsb_release -a

[root@devops ~]# lsb_release -a

2 cat /etc/redhat-release

[root@devops ~]# cat /etc/redhat-release
CentOS release 6.3 (Final)
[root@devops ~]# 

这个命令主要用于查看redhat公司发布的linux.

3. cat /etc/issue

[root@devops ~]# cat /etc/issue
CentOS release 6.3 (Final)
Kernel \r on an \m

Grep:grep如何同时查找多个字符串匹配

何通过grep 命令去查找多个字符串模式呢?例如我想通过grep命令来同时查找user1,user2,user3,如何来实现呢?
grep命令可以使用正则表达式来做字符串的匹配,为了查找多个字符,我们可以使用下面的命令:

[root@devops ~]# grep 'user1\|user2\|user3' /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
user1add:x:503:503::/home/user1add:/bin/bash
user2:x:504:504::/home/user2:/bin/bash
user3:x:505:505::/home/user3:/bin/bash
[root@devops ~]#

如果想只匹配整个单词,可以使用-w 选项: 

[root@devops ~]# grep -w 'user1\|user2\|user3' /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
user2:x:504:504::/home/user2:/bin/bash
user3:x:505:505::/home/user3:/bin/bash

grep命令的扩展版本egrep,带有更复杂的正则表达式元字符,对于上面的例子,如果使用egrep,那么可以省略转义字符,如下:

[root@devops ~]# egrep -w 'user1|user2|user3' /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
user2:x:504:504::/home/user2:/bin/bash
user3:x:505:505::/home/user3:/bin/bash

如果想让查找到信息高亮显示,那么可以使用–color选项

[root@devops ~]# egrep -w --color 'user1|user2|user3' /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
user2:x:504:504::/home/user2:/bin/bash
user3:x:505:505::/home/user3:/bin/bash

Python: 如何查看python的当前版本号

于一个python新手来说,查看python语言的版本号可能是必须会做的操作,那么在linux/unix/windows系统下如何来查看系统安装的python的版本号呢?

当你在系统上安装了python后,(linux里是默认自带python的),你只需要输入下面的简单的命令来查看python的版本号:

python -v

或者是

python --version

例如下面的例子:

[root@devops osetc]# python -V
Python 2.6.6
[root@devops osetc]# python --version
Python 2.6.6

如果当前安装了多个版本的python,那么通过-V 和–version这两个选项就可以显示出当前正在使用的或者说是默认的python版本号。

Python: 通过sleep()函数延迟程序的执行

对于python新手来说,如果想延迟程序的执行,比如说延迟10秒钟后,程序再开始执行。那么在python中如何来实现这种时间的延迟呢?是否有类似于在unix/linux中可以暂停脚本执行的sleep工具呢?
在python中,你可以引入一个叫“time”的模块,这个模块可以提供各种跟time相关的函数。
Python sleep 用法:

import time
time.sleep(5)
time.sleep(N)
 

上面的time.sleep()可以暂停程序的执行,暂停的时间可以根据你给函数传的值来定。
示例:

#!/usr/bin/python
#下面的程序会每隔5秒显示当前的日期和时间
import time
print "*** 如果想停止该程序,可以“ctrl”+”C" 退出 ***"
while True:
### 显示当前的日期和时间 ##
print "当前的日期 &amp; 时间 " + time.strftime("%c")
#### 延迟5秒执行 ####
time.sleep(5)
 

运行结果如下:

[root@devops test]# python displaydate.py
*** 如果想停止该程序,可以\“ctrl\”+\”C 退出 ***
当前的日期 &amp; 时间 Tue Apr 22 17:37:00 2014
当前的日期 &amp; 时间 Tue Apr 22 17:37:05 2014
当前的日期 &amp; 时间 Tue Apr 22 17:37:10 2014
当前的日期 &amp; 时间 Tue Apr 22 17:37:15 2014
当前的日期 &amp; 时间 Tue Apr 22 17:37:20 2014
当前的日期 &amp; 时间 Tue Apr 22 17:37:25 2014
当前的日期 &amp; 时间 Tue Apr 22 17:37:30 2014
当前的日期 &amp; 时间 Tue Apr 22 17:37:35 2014
 

Grep:如何在linux下使用grep命令

在linux/unix下,我们是怎么使用grep命令的呢?什么是grep呢?我们能用grep命令来干些什么呢?下面我们来分析:
grep命令是在文件中全局查找指定的正则表达式,并且打印所有包含该表达式的行。egrep命令是扩展的grep,支持更多的正则表达式元字符。自由软件基金会提供了grep的免费版本,称作GNU grep,在linux系统上默认安装就是这个免费版本。
grep命令参数
[cc lang=”php”] grep ‘word’ 文件名
grep ‘word’ 文件1 文件2 文件3 …文件N
grep ‘字符串1 字符串2’ 文件名
cat 文件名| grep ”字符串“
命令 | grep “字符串”
grep –color “字符串” 文件名
[/code] 如何使用grep命令去搜索某个文件中的内容呢?
查找 /etc/passwd 文件中是否存在user1这个用户,可以使用下面的命令:

[root@devops ~]# grep user1 /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
[root@devops ~]#
 

如果想忽略大小写去查找比如:User1,USER1或者其它的组合,可以使用-i选项

[root@devops ~]# grep -i user1 /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
USER1:x:502:502::/home/USER1:/bin/bash
[root@devops ~]#
 

grep 命令递归查找
你可以递归去查找某个目录下各级子目录里的匹配查找模式的行,使用-r 选项

[root@devops ~]# grep -r user1 /etc | more
/etc/group-:user1:x:501:
/etc/shadow:user1:!!:16176:0:99999:7:::
/etc/group:user1:x:501:
/etc/passwd-:user1:x:501:501::/home/user1:/bin/bash
/etc/gshadow-:user1:!::
/etc/shadow-:user1:!!:16176:0:99999:7:::
/etc/passwd:user1:x:501:501::/home/user1:/bin/bash
/etc/gshadow:user1:!::
/etc/postfix/virtual:# user1@virtual-alias.domain address1
[root@devops ~]#
 

使用grep去匹配某一个单词
选项-w使grep命令只查找作为一个词,而不是词的一部分去做匹配
举例说明:

[root@devops ~]# grep user1 /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
user1add:x:503:503::/home/user1add:/bin/bash
[root@devops ~]# grep -w 'user1' /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
 

在本例中能够匹配“user1″的模式有两行,那么当你只想匹配一个完整的user1这个单词的时候,可以使用-w选项。
使用grep命令去查找2个不同的词

[root@devops ~]# egrep -w "user1|USER1" /etc/passwd
user1:x:501:501::/home/user1:/bin/bash
USER1:x:502:502::/home/USER1:/bin/bash
[root@devops ~]#
 

统计grep查找出来的行数
grep命令可以使用-c选项来显示出匹配到的行数

[root@devops ~]# grep -c 'user1' /etc/passwd
2
 

使用-n 选项可以显示出查找到的行在文件中的行号

[root@devops ~]# grep -n 'user1' /etc/passwd
23:user1:x:501:501::/home/user1:/bin/bash
25:user1add:x:503:503::/home/user1add:/bin/bash
 

grep反向查找只显示不匹配的行
你可以使用-v 选项来显示不匹配的行,例如:

[root@devops ~]# grep -v user1 /etc/passwd
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
 

linux 管道符和grep命令的搭配使用
grep命令经常会和linux或unix管道符搭配使用,如显示硬盘设备的名字:

[root@devops ~]# dmesg | egrep '(s|h)d[a-z]'
NMI watchdog disabled (cpu0): hardware events not enabled
sd 2:0:0:0: [sda] 41943040 512-byte logical blocks: (21.4 GB/20.0 GiB)
sd 2:0:0:0: [sda] Write Protect is off
sd 2:0:0:0: [sda] Mode Sense: 61 00 00 00
sd 2:0:0:0: [sda] Cache data unavailable
sd 2:0:0:0: [sda] Assuming drive cache: write through
sd 2:0:0:0: [sda] Cache data unavailable
sd 2:0:0:0: [sda] Assuming drive cache: write through
sda: sda1 sda2
sd 2:0:0:0: [sda] Cache data unavailable
sd 2:0:0:0: [sda] Assuming drive cache: write through
sd 2:0:0:0: [sda] Attached SCSI disk
dracut: Scanning devices sda2 for LVM logical volumes vg_devops/lv_root vg_devops/lv_swap
EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts:
SELinux: initialized (dev sda1, type ext4), uses xattr
 

显示cpu模块名字:

[root@devops ~]# cat /proc/cpuinfo | grep -i 'Model'
model : 42
model name : Intel(R) Core(TM) i3-2350M CPU @ 2.30GHz
[root@devops ~]#
 

如何只输出包含模式的文件名,而不是输出文本行

[root@devops ~]# grep -l 'user1' /etc/*
/etc/group
/etc/group-
/etc/gshadow
/etc/gshadow-
/etc/passwd
/etc/passwd-
/etc/shadow
/etc/shadow-
 

Grep命令中正则表达式(regular Expressions,RE)的用法

当你在使用grep命令的时候肯定会用到正则表达式,那么怎么在grep命令中使用正则表达式呢?
正则表达式元字符
grep命令支持很多正则表达式的元字符,以使用户能够更精准的定义要查找的模式。例如,可以通过制定的选项来关闭大小写敏感,要求显示行号等。

元字符 功能 示例 匹配对象
^ 行首定位符 ‘^user’ 匹配所有以user开头的行
$ 行尾定位符 ’user$’ 匹配所以以user结尾的行
匹配一个字符 ‘u.r’ 匹配包含一个u,后跟一个字符,再跟一个r的行
* 匹配两个或多个前导字符 ’u*ser’ 匹配包含零个或多个u后,跟ser模式的行
[] 匹配一组字符中的人一个 ‘[uU]ser’ 匹配包含user或者User的行
[^] 匹配不在指定字符组里的字符 ’[^A-S]ser‘ 匹配一个不在A到S之间的字符,并且该字符后紧跟着ser的行
\< 词首定位符 ’\<user‘ 匹配包含以user开头的词的行
\> 词尾定位符 ’user\>‘ 匹配包含以user结尾的词的行
\<..\> 标记匹配到的字符 ’\<user\>’ 匹配包含<user>的行
{M}{M,}{M,N} 匹配重复出现的次数M次匹配出现的次数至少M次
匹配出现的次数至少M次,但不超过N次
‘u\{4\}u\{5\}
u\{5,8\}’
匹配连续出现4个u的行匹配连续出现最少5个u的行
匹配连续出现最少5个,最多8个u的行

 
grep 正则表达式示例:
在/etc/passwd 里查找包含“user1“字符串的行

[root@devops ~]# grep user1 /etc/passwd
user1:x:502:503::/home/user1:/bin/bash

如果想忽略大小写的区做搜索可以使用-i选项

#grep  user1 /etc/passwd

你可以使用”.”元字符为一个单个的字符做匹配,例如我们可以使用下面的命令去匹配一个以”u”开头,以“r”结尾,中间是任意一个字符的行

[root@devops ~]# grep '\<u.r\>' /etc/passwd
game:x:12:100:games:/usr/games:/sbin/nologin

如何在grep正则表达式中准确的匹配所有包含两个字符的行?

[root@devops ~]# grep '^..$' /

Linux下查看yum命令历史记录的方法

linux_inner如何来查看yum在运行后的历史信息呢?比如安装,删除,更新包的过程记录信息。如何使用yum命令重新安装包呢?如何使用yum命令撤销上次的安装呢?
Yum 命令在Centos/Redhat 6.x+之后提供了一个新的选项:history. 可以通过该选项查看到yum命令的处理过程,回滚,撤销,重新执行历史操作。
Yum命令在3.2以上的版本或者是Centos/RHEL 6.x 提供了history选项,可以通过下面的命令来查看yum的版本号:

#yum info yum

yum history 命令形式如下:

yum history
yum history command
yum history [选项] #选项包括: info|list|packages-list|summary|addon-info|redo|undo|rollback|new

下面举几个例子:
1.显示yum 历史

[root@devops ~]# yum history list
Loaded plugins: fastestmirror
ID | Login user | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
2 | root <root> | 2013-12-12 05:34 | I, U | 15
1 | System <unset> | 2013-12-12 05:03 | Install | 332
history list

2.查看所有的处理过程

# yum history list all

查看其中的某个或某个范围的处理过程

#yum history list 1
#yum history list 1..5
[root@devops ~]# yum history list 2
Loaded plugins: fastestmirror
ID | Login user | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
2 | root <root> | 2013-12-12 05:34 | I, U | 15
history list

3.查看某个包的yum处理过程,比如firefox

[root@devops ~]# yum history list firefox
Loaded plugins: fastestmirror
ID | Login user | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
2 | root <root> | 2013-12-12 05:34 | I, U | 15
history list

还可以通过yum history package-list 查看firefox包的完整包列表信息

root@devops ~]# yum history package-list firefox
Loaded plugins: fastestmirror
ID | Action(s) | Package
-------------------------------------------------------------------------------
2 | Install | firefox-17.0.10-1.el6.centos.x86_64
history package-list

基于上面的包列表中的ID,可以查看那次安装的firefox包的完整处理信息:

[root@devops ~]# yum history info 2
Loaded plugins: fastestmirror
Transaction ID : 2
Begin time : Thu Dec 12 05:34:00 2013
Begin rpmdb : 332:0f20e18208bd2e665c18360a74c87da7278db75a
End time : 05:34:19 2013 (19 seconds)
End rpmdb : 340:a77df63b3e7e6db32a8700a8eb627c71f67d8eae
User : root <root>
Return-Code : Success
Command Line : install firefox
Transaction performed with:
Installed rpm-4.8.0-27.el6.x86_64 @anaconda-CentOS-201207061011.x86_64/6.3
Installed yum-3.2.29-30.el6.centos.noarch @anaconda-CentOS-201207061011.x86_64/6.3
Installed yum-plugin-fastestmirror-1.1.30-14.el6.noarch @anaconda-CentOS-201207061011.x86_64/6.3
Packages Altered:
Dep-Install centos-indexhtml-6-1.el6.centos.noarch @base
Install firefox-17.0.10-1.el6.centos.x86_64 @base
Dep-Install hunspell-1.2.8-16.el6.x86_64 @base
Dep-Install liberation-fonts-common-1.05.1.20090721-5.el6.noarch @base
Dep-Install liberation-sans-fonts-1.05.1.20090721-5.el6.noarch @base
...

4.撤销某一次的yum处理过程
我们先用yum把firefox包卸载,然后再撤销卸载,回复正常使用

[root@devops ~]# yum erase firefox
Loaded plugins: fastestmirror
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
...

现在我们来撤销上面的卸载处理,使用下面的命令:
首先查看下卸载操作的ID号

[root@devops ~]# yum history package-list firefox
Loaded plugins: fastestmirror
ID | Action(s) | Package
-------------------------------------------------------------------------------
3 | Erase | firefox-17.0.10-1.el6.centos.x86_64
2 | Install | firefox-17.0.10-1.el6.centos.x86_64
history package-list

从上面的输出我们可以看到卸载操作的ID是3,下面执行撤销操作

# yum history undo 3

5.重新执行某次yum处理过程
输入下面的命令:

#yum history redo id

RHEL Centos 6.x 下KVM虚拟化安装与配置详细步骤

在centos 或RHEL6下如何基于内核虚拟化技术来搭建和管理一个虚拟化环境呢?下面我们会详细的介绍:
首先,KVM是RHEL和Centos linux 系统的一部分。可以很容易的使用下面的命令来安装。需要注意的是安装的包名已经在RHEL/Centos6.x里做了更改。
安装必须的KVM RPMs包,输入下面的命令:

yum groupinstall "Virtualisation Tools" "Virtualization Platform"
yum install python-virtinst
 

或者

yum install kvm qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools
 

命令输出:
[cc lang=”php”] Loaded plugins: product-id, protectbase, rhnplugin
This system is receiving updates from RHN Classic or RHN Satellite.
0 packages excluded due to repository protections
Setting up Install Process
Package libvirt-0.10.2-18.el6_4.15.x86_64 already installed and latest version
Resolving Dependencies
–> Running transaction check
—> Package libguestfs-tools.x86_64 1:1.16.34-2.el6 will be installed
–> Processing Dependency: libguestfs-tools-c = 1:1.16.34-2.el6 for package: 1:libguestfs-tools-1.16.34-2.el6.x86_64
….
..
..
spice-glib.x86_64 0:0.14-7.el6_4.3
spice-gtk.x86_64 0:0.14-7.el6_4.3
spice-gtk-python.x86_64 0:0.14-7.el6_4.3
spice-server.x86_64 0:0.12.0-12.el6_4.5
vgabios.noarch 0:0.6b-3.7.el6
vte.x86_64 0:0.25.1-8.el6_4
Complete!
[/code] 启动libvirtd 服务进程
libvirtd 程序是libvirt虚拟化管理系统里的服务器段的进程,输入下面的命令来启动该服务:

chkconfig libvirtd on
service libvirtd start
 

命令输出:
Starting libvirtd daemon: [ OK ] 你可以通过下面的命令来验证libvirtd服务是否启动

service libvirtd status
libvirtd (pid 2332) is running...
 

实例:如何在linux系统里创建两个虚拟机器
安装和配置一个网桥
所有的虚机只能访问外面的host主机以及其他的在同一主机上的虚机。如果虚机想访问外面的局域网或者互联网,那么久需要创建一个网桥。输入下面的命令来
安装网桥相关的包:

yum install bridge-utils
 

设置一个默认网关
编辑/etc/sysconfig/network文件

#cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=osetc.com
GATEWAYDEV=br1
 

配置桥接
更新ifcfg-eth0的配置文件如下:

#cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
HWADDR=08:A0:4C:XX:XX:XX
BRIDGE=br0
 

创建网桥br0的配置文件ifcfg-br0,设置br0的ip地址,子网掩码

#cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
IPADDR=172.16.0.1 (和物理主机的ip在同一个网段)
NETMASK=255.255.255.192
DELAY=0
 

重启网络服务

service network restart
 

开始创建虚机
将linux系统盘放入光驱,输入下面的命令:

# virt-install \
--name Kvm1 \
--description "osetc.com RHEL 6.4 64 bit KVM1" \
--ram=2048 \
--vcpus=8 \
--disk path=/var/lib/libvirt/images/rhel-Kvm1-osetc.com.img,size=10 \
--cdrom /var/lib/libvirt/boot/RHEL.6.4.Server-DVD1.iso \
--network bridge:br0 \
--graphics vnc
 

Linux/unix:通过watch命令实时动态查看命令的运行结果

watch是一个非常强大的而且我会经常使用的命令,运行watch <命令>默认将会每2秒钟重复执行一次该命令。这 样的话我们就可以很好的去查看当前运行的命令的进度,实时查看内存或者磁盘的使用情况,可以监控/proc下的 各种不同的进程。
参数:
-n 指定时间间隔
-d 高亮显示变化的区域
下面是几个简单的例子:
内存使用情况:
$watch free
linux_watch_cmd
Raid 构建过程:
[cc lang=”php”] Every 2.0s: cat /proc/mdstat
Personalities : [raid1] md0 : active raid1 sda[2] sdb[1] 976758841 blocks super 1.2 [2/1] [_U] [==================>..] recovery = 92.4% (902988416/976758841) finish=102.3min
speed=12012K/sec
[/code] 监控磁盘使用情况:
$watch du -h
[cc lang=”php”] Every 2.0s: df -h 2013
Filesystem Size Used Avail Use% Mounted on
/dev/xvda 95G 29G 65G 31% /
none 202M 208K 202M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 1007M 0 1007M 0% /run/shm
[/code]

Linux ls 命令: 按文件大小显示各个文件

在linux或类unix系统下,如何使用ls命令并按文件的大小对特定目录下的文件排序呢?
首先我们来说一下“ls”命令,该命令是linux和类unix系统下的用来显示目录内容的。如果命令后面不跟任何的参数,当前目录的内容会直接显示在屏幕上。默认情况下,如果即没有的-cftuvSUX,也没有–sort参数传给ls命令,输出结果将会按字母的排列顺序来显示。
默认输出(按字母顺序排序)
输入下面的命令:
[cc lang=”php”] $ ls
$ ls *.log
$ ls *.cfg
[/code] 命令输出:
linux_ls1
按大小排序显示
需要传递-s 或–sort=size参数:
[cc lang=”php”] $ls -s
$ls –sort=size
$ls –sort=size *.log
$ls -s *.cfg
[/code] 命令输出:
linux_ls2
你将会看到最大的文件将会显示在最上面。 下面的命令将会以相反的顺序显示文件:
[cc lang=”php”] $ls -l -S | sort -k 5 -n

$ls -lSr
[/code] 命令输出:
linux_ls3

三种配置Linux iptables 防火墙的方法

最近在centos系统上搭建了一个Apache web服务器,就考虑如何通过防火墙配置访问限制,如何来做呢?在RHEL或Centos系统里,如何搭建防火墙呢?
默认情况下,centos系统里的iptables配置是不允许访问被Apache服务器使用的HTTP(端口号80)和HTTPS(端口443)端口。所以你需要通过下面的几种方法去更改配置:
1.编辑/etc/sysconfig/iptables配置文件,设置允许或禁止访问Apache web服务器。另外还需要编辑“/etc/sysconfig/ip6tables”配置文件,设置允许或禁止访问web服务。
2.通过”system-config-firewall-tui”命令 或 “system-config-firewall”(要在GUI界面上运行)。这是个基于图形界面来设置基本的防火墙规则的命令。这个工具将会一直重写“/etc/sysconfig/iptables”文件。
3.使用”/sbin/iptables” 命令:通过该命令可以直接的去更改/追加/添加防火墙规则。访问控制规则通过命令“/sbin/service iptables save”保存”/etc/sysconfig/iptables”文件里。
方法一:配置/etc/sysconfig/iptables 文件(推荐高级用户使用)
编辑IPv4的/etc/sysconfig/iptables配置文件:
[cc lang=”php”] #vi /etc/sysconfig/iptables
[/code] 添加下面的行,对于INPUT规则务必要添加到”LOG“,”FORWARD“和”DROP”行的前面:
##允许任何人访问80和443端口
[cc lang=”php”] -A INPUT -m state –state NEW -p tcp –dport 80 -j ACCET
-A INPUT -m state –state NEW -p tcp –dport 443 -j ACCET
[/code] 保存并退出编辑的文件,重新启动IPv4防火墙服务:
[cc lang=”php”] #service iptables start
[/code] 编辑IPv6的防火墙配置文件/etc/sysconfig/ip6tables:
[cc lang=”php”] #vi /etc/sysconfig/ip6tables
[/code] 添加下面的行,对于INPUT规则务必要添加到”LOG“,”FORWARD“和”DROP”行的前面:
[cc lang=”php”] ##允许任何人访问80和443端口
-A INPUT -m state –state NEW -p tcp –dport 80 -j ACCET
-A INPUT -m state –state NEW -p tcp –dport 443 -j ACCET
[/code] 保存并退出编辑的文件,重新启动IPv6防火墙服务:
[cc lang=”php”] #service ip6tables restart
[/code] 方法二:防火墙配置GUI工具(初学者使用)
system-config-firewall命令是一个设置基本的防火墙规则的图形化用户接口。系统必须安装了KDE或Gnome GUI程序。打开终端输入下面的命令:
[cc lang=”php”] #system-config-firewall
[/code] 命令输出界面如下:
选择启用WWW,SSH,HTTPS服务,然后点击“应用”按钮这个工具将会重写/etc/sysconfig/iptables 配置:
方法三:/sbin/iptables 命令行工具(高级用户使用)
在root用户输入下面的iptables命令打开80和443端口
[cc lang=”php”] ##打开80和443端口
/sbin/iptables -A INPUT -m state –state NEW -p tcp –dport 80 -j ACCEPT
/sbin/iptables -A INPUT -m state –state NEW -p tcp –dport 443 -j ACCEPT
##保存最新添加的防火墙规则
/sbin/service iptables save
##验证新的防火墙设置
/sbin/iptables -L -n -v
/sbin/iptables -L INPUT -n -v | grep :80
/sbin/iptables -L INPUT -n -v | grep :443
[/code] 防火墙示例:
1.只允许特定网段(172.16.1.0/24)访问80和443端口
[cc lang=”php”] ##开放80和443端口
/sbin/iptables -A INPUT -s 172.16.1.0/24 -m state –state NEW -p tcp –dport 80 -j ACCEPT
/sbin/iptables -A INPUT -s 172.16.1.0/24 -m state –state NEW -p tcp –dport 443 -j ACCEPT
##保存最新添加的防火墙规则
/sbin/service iptables save
##验证新的防火墙设置
/sbin/iptables -L -n -v
/sbin/iptables -L INPUT -n -v
/sbin/iptables -L INPUT -n -v | grep :80
/sbin/iptables -L INPUT -n -v | grep :443
[/code] 2.通过iptables设置禁止10.0.0.1访问80端口
[cc lang=”php”] ##禁止访问80端口
iptables -A INPUT -s 10.0.0.1 -p tcp –dport 80 -j DROP
##保存最新添加的防火墙规则
/sbin/service iptables save
[/code]

如何基于ssh的会话方式更改远程主机的密码?

何为SSH?
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓 “中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。
SSH的英文全称是Secure SHell。通过使用SSH,你可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。
参数:
[cc lang=”php”] ssh -t 用户名@主机名 passwd
ssh -t 用户名@ip地址 passwd
ssh -t 用户名@172.16.1.2 passwd
ssh -t 用户名@172.168.1.2 /bin/passwd
[/code] -t:该参数通过指定一个伪终端使SecureShell客户端以交互模式工作,即使在给定命令的情况下也是如此。它被用于执行在远地主机上的基于屏幕的程序。

linux:GPG更改密钥的命令

我们平时最常用的安全的远程控制协议是ssh,其开源实现为openssh.

OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程的中的数据,并由此来代替原来的类似服务。OpenSSH是使用SSH透过计算机网络加密通讯的实现。它是取代由SSH Communications Security所提供的商用版本的开放源代码方案。目前OpenSSH是OpenBSD的子计划。

对于openssh来说我们可以使用ssh-keygen来更改其密钥,但对于linux下的GPG加密密钥如何更改呢?如何通过gpg来更改密钥呢?
gpg是GNU里OpenPGP的一部分。它是一个提供数字加密和签名服务使用的OpenPGP标准。你可以使用GPG命令的完整的密钥管理包括更改密钥密码。
更改密钥的密码
参数:

gpg --edit-key id号
gpg > passwd
gpg >save
 

当输入passwd命令后,会要求输入旧的和新的密钥
示例:
首先,使用下面的命令显示key
[cc lang=”php”]gpg –list-keys
[/code] 示例输出:
[cc lang=”php”]/root/.gnupg/pubring.gpg
————————
pub   4096R/9AABBCD8 2013-10-04
uid                  Home Nas Server (Home Nas Server Backup)
sub   4096R/149D60C7 2013-10-04
[/code] 再输入下面的命令:
[cc lang=”php”]gpg –edit-key 9AABBCD8
[/code] 命令输出:
[cc lang=”php”]gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
pub  4096R/9AABBCD8  created: 2013-10-04  expires: never       usage: SC
trust: ultimate      validity: ultimate
sub  4096R/149D60C7  created: 2013-10-04  expires: never       usage: E
[ultimate] (1). Home Nas Server (Home Nas Server Backup)
gpg>
[/code] 输入passwd 命令在gpg>之后
[cc lang=”php”]gpg >passwd
[/code] 先输入旧的密钥
[cc lang=”php”]You need a passphrase to unlock the secret key for
user: “Home Nas Server (Home Nas Server Backup) ”
4096-bit RSA key, ID 9AABBCD8, created 2013-10-04
Enter passphrase: 在这里输入旧的密钥
[/code] 然后输入新的密钥:
[cc lang=”php”]Enter the new passphrase for this secret key.
Enter passphrase: 输入新密钥
Repeat passphrase: 再次输入新密钥
[/code] 为了保存所有的key设置,我们需要通过save命令来保存
[cc lang=”php”]gpg> save
[/code]

Python:如何获取当前的日期和时间

在python里如何获取当前的日期和时间呢?在Python语言里,我们可以通过调用什么模块或者类函数来得到当前的时间或日期呢?
当然你可以使用时间模块(time module),该模块提供了各种和时间相关的函数。但是这个模块里的一些函数在某些平台里不可用。那么怎么办呢?我们
可以使用一个更高级的面向对象的接口函数:datetime。它提供了操作日期和时间的多种简单或复杂的方法。
python里使用time模块来获取当前的时间

time.strftime(format)
time.strftime("%H:%M:%S") ##24小时格式
time.strftime("%I:%M:%S")## 12小时格式
 

示例
一个获取当天日期和时间的简单python程序

#!/usr/bin/python
import time
print (time.strftime("%H:%M:%S"))
## 12 hour format ##
print (time.strftime("%I:%M:%S"))
 

示例输出:
[cc lang=”php”] 18:11:30
6:11:30
[/code] 打印出当前的日期的python程序

#!/usr/bin/python
import time
## dd/mm/yyyy格式
print (time.strftime("%d/%m/%Y"))
 

示例输出:
11/10/2013
格式参数:
[cc lang=”php”] %a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号
[/code] 使用datetime模块来获取当前的日期和时间
参数如下:

cur=datetime.datetime.now()
cur.hour
cur.minute
cur.year
cur.day
cur.month
 

例子:

#!/usr/bin/python
import datetime
i = datetime.datetime.now()
print ("当前的日期和时间是 %s" % i)
print ("ISO格式的日期和时间是 %s" % i.isoformat() )
print ("当前的年份是 %s" %i.year)
print ("当前的月份是 %s" %i.month)
print ("当前的日期是  %s" %i.day)
print ("dd/mm/yyyy 格式是  %s/%s/%s" % (i.day, i.month, i.year) )
print ("当前小时是 %s" %i.hour)
print ("当前分钟是 %s" %i.minute)
print ("当前秒是  %s" %i.second)
 

示例输出:
[cc lang=”php”] 当前的日期和时间 = 2013-10-11 19:38:19.4545
ISO格式的日期和时间 = 2013-10-11T19:38:19.4545
当前的年份 2013
当前的月份 10
当前的日期  11
dd/mm/yyyy 格式是  11/10/2013
当前小时是 0
当前分钟是 38
当前秒是  19
[/code]

Bash shell:如何去掉字符串或变量里的空格

对于下面的bash变量,如何去掉变量值的前后空白呢?
out=”$(awk -F’,’ ‘/file/ {print $9}’ devops.file)”
你可以是用sed, awk, cut, tr 或者其他的工具来去除$out的空白字符。
示例:
定义一个out变量:

out= "  bash test"
 

使用echo 命令来显示$out:

echo "$out"
 

命令输出:

bash test
 

sed 例子

echo "$out" | sed -e 's/^[ \t]*//'
 

命令输出:

bash test
 

Awk 示例

out="     bash test     “
echo "=${out}="
##使用awk去除变量值前面和后面的空白字符
echo "${out}" | awk '{gsub(/^ +| +$/, "")} {print "=" $0 "="}'
 

示例输出:

=bash shell=