基础级别命令汇总

今天想写个数据同步的cron命令,写完了却脑抽的忘了赋权的chmod命令了

看样子 短路的时候 总归是让人各种忧桑啊……

好吧 上网检索了一下 并将基础的一些命令给偷取过来吧^_^

1、显示日期的指令: date

2、显示日历的指令:cal



3、简单好用的计算器:bc


怎么10/100会变成0呢?这是因为bc预设仅输出整数,如果要输出小数点下位数,那么就必须要执行 scale=number ,那个number就是小数点位数,例如:

4、重要的几个热键[Tab],[ctrl]-c, [ctrl]-d

[Tab]按键—具有『命令补全』不『档案补齐』的功能

[Ctrl]-c按键—让当前的程序『停掉』

[Ctrl]-d按键—通常代表着:『键盘输入结束(End Of File, EOF 戒 End OfInput)』的意思;另外,他也可以用来取代exit

5、man

退出用q,

man -f man

6、数据同步写入磁盘:sync

输入sync,那举在内存中尚未被更新的数据,就会被写入硬盘中;所以,这个挃令在系统关机戒重新启劢乀前, 径重要喔!最好多执行几次!

7、惯用的关机指令:shutdown

此外,需要注意的是,时间参数请务必加入指令中,否则shutdown会自动跳到 run-level 1 (就是单人维护的登入情况),这样就伤脑筋了!底下提供几个时间参数的例子吧:

重启,关机: reboot, halt,poweroff

8、切换执行等级: init

Linux共有七种执行等级:

–run level 0 :关机
–run level 3 :纯文本模式
–run level 5 :含有图形接口模式
–run level 6 :重新启动

使用init这个指令来切换各模式:

如果你想要关机的话,除了上述的shutdown -h now以及poweroff之外,你也可以使用如下的指令来关机:

9、改变文件的所属群组:chgrp

10、改变文件拥有者:chown

他还可以顸便直接修改群组的名称

11、改变文件的权限:chmod

权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。

–数字类型改变档案权限:

–符号类型改变档案权限:

12、查看版本信息等

13、变换目录:cd

14、显示当前所在目录:pwd

15、建立新目录:mkdir


不建议常用-p这个选项,因为担心如果你打错字,那么目录名称就回变得乱七八糟的

16、删除『空』的目录:rmdir

17、档案与目录的显示:ls


18、复制档案或目录:cp







19、移除档案或目录:rm



20、移动档案与目录,或更名:mv


21、取得路径的文件名与目录名:basename,dirname


22、由第一行开始显示档案内容:cat


23、从最后一行开始显示:tac(可以看出 tac 是 cat 的倒着写)

24、显示的时候,顺道输出行号:nl



25、一页一页的显示档案内容:more

26、与 more 类似,但是比 more 更好的是,他可以往前翻页:less

27、只看头几行:head

28、只看尾几行:tail

29、以二进制的放置读取档案内容:od


30、修改档案时间或新建档案:touch



31、档案预设权限:umask

32、配置文件档案隐藏属性:chattr



33、显示档案隐藏属性:lsattr

34、观察文件类型:file

35、寻找【执行挡】:which


36、寻找特定档案:whereis

37、寻找特定档案:locate

38、寻找特定档案:find


39、压缩文件和读取压缩文件:gzip,zcat


40、压缩文件和读取压缩文件:bzip2,bzcat


41、压缩文件和读取压缩文件:tar






Vi中输入中文乱码

Vim 有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding

它们的意义如下:

encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。
fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。 用英文菜单和提示最好,可以免去下面对菜单和提示信息(B,C部分)的设置如果用英文菜单和提示在安装gvim的时候,将支持本地语言的选项去掉。

解决vim文件乱码,打开文件乱码,菜单,提示信息乱码:

有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding 在linux中修改.vimrc(在win中是_vimrc)

A:设置文件的代码形式: 

set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,chinese,cp936

B:vim的菜单乱码解决: 

同样在 _vimrc文件里以上的中文设置后加上下列命令

source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

C:vim提示信息乱码的解决:

language messages zh_CN.utf-8

Django对数据库的封装——QuerySet

Django对数据库的操作分用到三个类:Manager、QuerySet、Model。Manager的主要功能定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法;QuerySet是Manager的方法返回的,是一个可遍历结构,包含一个或多个元素,每个元素都是一个Model 实例,它里面的方法也是表级方法,前面说了,Django给我们提供了增加表级方法的途径,那就是自定义manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;Model是一条记录的类,它的功能很强大,里面包含外键实体等,它的方法都是记录级方法(都是实例方法,无类方法),不要在里面定义类方法,比如计算记录的总数,查看所有记录,这些应该放在自定义的manager类中。

1.QuerySet

1.1 简介

每个Model都有一个默认的manager类,名为objects,QuerySet有两种来源:通过manager的方法得到、通过QuerySet的方法得到。QuerySet的最初来源就是通过manager的方法。mananger的方法和QuerySet的方法大部分同名,同意思,如filter(),update()等,但也有些不同,如manager有create()、get_or_create(),而QuerySet有delete()等。一个QuerySet包含一个或多个model instance。QuerySet类似于Python中的list,list的一些方法QuerySet也有,比如切片,遍历。

>>> from gk_user.models import UserEx
>>> type(UserEx.objects)
<class 'django.db.models.manager.Manager'>
>>> a = UserEx.objects.all()
>>> type(a)
<class 'django.db.models.query.QuerySet'>

QuerySet是延迟获取的,只有当用到这个QuerySet时(有下面几种情况),才会求值,即查询数据库。另外,查询到的QuerySet又是缓存的,当再次使用同一个QuerySet时,并不会再查询数据库,而是直接从缓存获取(不过,有一些特殊情况)。一般而言,当对一个没有求值的QuerySet进行的运算返回的不是QuerySet、ValuesQuerySet、ValuesListQuerySet、Model实例时,一般的会立即查询数据库;反之,运算返回的是QuerySet、ValuesQuerySet、ValuesListQuerySet、Model实例时,一般不会查询数据库。下面介绍几种(并非全部)对QuerySet求值的场景。

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()
def __unicode__(self):
    return self.name
     
class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
def __unicode__(self):
    return self.name
    
class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()
def __unicode__(self):
    return self.headline

我们以上面的models为例。

I 遍历

a = Entry.objects.all()
for e in a:
    print (e.headline)

当遍历时,先从数据库执行查询select * from Entry得到a,然后再遍历a。注意:这里只是查询Entry表,返回的a的每条记录只包含Entry表的字段值。不管Entry的model中是否有onetoone、onetomany、manytomany字段,都不会关联查询。这遵循的是数据库最少读写原则。我们修改一下代码,如下,遍历一开始也是先执行查询得到a,但当执行print (e.blog.name)时,还需要再次查询数据库获取blog实体。

from django.db import connection

l = connection.queries #l是一个列表,记录SQL语句

a = Entry.objects.all()

for e in a:

print (e.blog.name)

len(l)

遍历时,每次都要查询数据库,l长度每次增1,Django提供了方法可以在查询时返回关联表实体,如果是onetoone或onetomany,那用select_related,不过对于onetomany,只能在主表(定义onetomany关系的那个表)的manager中使用select_related方法,即通过select_related获取的关联对象是model instance,而不能是QuerySet,如下,e.blog就是model instance。对于onetomany的反向和manytomany,要用prefetch_related,它返回的关联对象是QuerySet。

a = Entry.objects.select_related(‘blog’)

for e in a:

print (e.blog.name)

len(l)

可以看到从开始到结束,l的长度只增加1。另外,通过查询connection.queries[-1]可以看到Sql语句用了join。

II 切片

切片不会立即执行,除非显示指定了步长,如a= Entry.objects.all()[0:10:2],步长为2。

III 序列化,即Pickling

序列化QuerySet很少用

IV repr()

和str()功能相似,将对象转为字符串,很少用。

V len()

计算QuerySet元素的数量,并不推荐使用len(),除非QuerySet是求过值的(即evaluated),否则,用QuerySet.count()获取元素数量,这个效率要高。

VI list()

将QuerySet转为list

VII bool() ,判断是否为空

if Entry.objects.filter(headline="Test"):
    print("There is at least one Entry with the headline Test")

同样不建议这种方法判断是否为空,而应该使用QuerySet.exists(),查询效率高

1.2 QuerySet的方法

数据库的常用操作就四种:增、删、改、查,QuerySet的方法涉及删、改、查。后面还会讲model对象的方法,model方法主要是增、删、改、还有调用model实例的字段。

(1) 删delete()

原型:delete()

返回:None

相当于delete-from-where, delete-from-join-where。先filter,然后对得到的QuerySet执行delete()方法就行了,它会同时删除关联它的那些记录,比如我删除记录表1中的A记录,表2中的B记录中有A的外键,那同时也会删除B记录,那ManyToMany关系呢?不清楚。实际中,delete用的很少,对于没有用的记录,一般是update为不可用。由于有些数据库,如Sqlite不支持delete与limit连用,所以在这些数据库对QuerySet的切片执行delete()会出错。如

>>> a = UserEx.objects.filter(is_active=False)
>>> b = a[:3]
>>> b.delete() #执行时会报错

解决:UserEx.objects.filter(pk__in=b).delete()

in后面可以是一个QuerySet,见 https://docs.djangoproject.com/en/1.6/ref/models/querysets/#in

(2) 改 update()

批量修改,返回修改的记录数。不过update()中的键值对的键只能是主表中的字段,不能是关联表字段,如下:

Entry.objects.update(blog__name='foo') #这是错误的,无法修改关联表字段,只能修改Entry
#表中的字段
Entry.objects.filter(blog__name='foo').update(comments_on=False) #正确,filter中的字段可以
#是关联表

最好的方法是先filter,查询出QuerySet,然后再执行QuerySet.update()。

由于有些数据库,不支持update与limit连用,所以在这些数据库对QuerySet的切片执行update()会出错。

(3)查询 filter(**kwargs)、exclude(**kwargs)、get(**kwargs)

相当于select-from-where,select-from-join-where,很多网站读数据库操作最多。可以看到,filter()的参数是变个数的键值对,而不会出现>,<,!=等符号,这些符号分别用__gt,__lt,~Q或exclude(),不过对于!=,建议使用Q查询,更不容易出错。可以使用双下划线对OneToOne、OneToMany、ManyToMany进行关联查询和反向关联查询,而且方法都是一样的,如:

>>> Entry.objects.filter(blog__name='Beatles Blog') 
#限定外键表的字段下面是反向连接,不过要注意,这里不是entry_set,
#entry_set是Blog 实例的一个属性,代表某个Blog对象的关联的所有entry,
#而QuerySet的方法中反向连接是直接用model的小写,不要把两者搞混。
#反过来也是一样,如果想根据现有对象找原对象,将原类型对象小写即可。
>>> Blog.objects.filter(entry__headline__contains='Lennon')
>>> Blog.objects.filter(entry__authors__name='Lennon') #ManyToMany关系,反向连接
>>> myblog = Blog.objects.get(id=1)
>>> Entry.objects.filter(blog=myblog) 
#正向连接。与下面一句等价,既可以用实体,也可以用实体的主键。
#其实即使用实体,也是只用实体的主键而已。这两种方式对OneToOne、
#OneToMany、ManyToMany的正向、反向连接都适用。
>>> Entry.objects.filter(blog=1)
>>> myentry = Entry.objects.get(id=1)
>>> Blog.objects.filter(entry=myentry) #ManyToMany反向连接。与下面一句等价
>>> Blog.objects.filter(entry=1)

OneToOne的关系也是这样关联查询,可以看到,Django对OneToOne、OneToMany、ManyToMany关联查询及其反向关联查询提供了相同的方式,真是牛逼啊。对于OneToOne、OneToMany的主表,也可以使用下面的方式

Entry.objects.filter(blog_id=1),因为blog_id是数据库表Entry的一个字段, 这条语句与Entry.objects.filter(blog=1)生成的SQL是完全相同的,都是只在Entry表查询,没用join,django为我们封装了对数据库的操作,所以建议只用model中的字段,而blog_id不是model定义的字段,不建议用。

与filter类似的还有exclude(**kwargs)方法,这个方法是剔除,相当于select-from-where not,select-from-join-where not。可以使用双下划线对OneToOne、OneToMany、ManyToMany进行关联查询和反向关联查询,方法与filter()中的使用方法相同。

>>> Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline=’Hello’)

转为SQL为

SELECT *
FROM Entry
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')

Shell免密码使用SFTP

最近编程中用到sftp上传文件,且需要用crontab预设定时上传事件。而sftp不同于ftp,没有提供选项如 -i 可以将密码直接编码进程序。使用sftp指令,会自动请求用户输入密码。

总结一下可以避免sftp输入密码的三种方式:

1. lftp方式

LFTP是一款非常著名的字符界面的文件传输工具。支持FTP、HTTP、FISH、SFTP、HTTPS和FTPS协议。
例子:(本例为下载例子)

[codesyntax lang=”bash”]
#!/bin/sh
HOST=192.168.11.22
USER=test
PASS=iprayzTest
echo “Starting to sftp…”
lftp -u ${USER},${PASS} sftp://${HOST} <<EOF
cd /kagou/datafile
mget *.*
bye
EOF
echo “done”
[/codesyntax]

2. expect方式

Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

要使用expect需要预先安装tcl这个东西,然后再安装expect包。

tcl: http://prdownloads.sourceforge.net/tcl/tcl8.4.16-src.tar.gz
expect: http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download

例子:

[codesyntax lang=”bash”]
#!/usr/local/bin/expect -f
#<—insert here your expect program location
#procedure to attempt connecting; result 0 if OK, 1 elsewhere
proc connect {passw} {
expect {
“(yes/no)?” {send “yes/r”;exp_continue} #第一次使用SFTP时候会要求输入yes/no
“password:” {send “$passw/r” #自动输入密码
expect {
“sftp*” { #检测返回sftp>
return 0
}
}
}
}
# timed out
return 1
}

#read the input parameters
set user [lindex $argv 0]
set passw [lindex $argv 1]
set host [lindex $argv 2]
set location [lindex $argv 3]
set file1 [lindex $argv 4]

#puts “Am citit:/n”;
#puts “user: $user”;
#puts “passw: $passw”;
#puts “host: $host”;
#puts “location: $location”;
#puts “file1: $file1”;

#check if all were provided
if { $user == “” || $passw == “” || $host == “” || $location == “” || $file1 == “” } {
puts “Usage: <user> <passw> <host> <location> <file1 to send>/n”
exit 1
}

#sftp to specified host and send the files
spawn sftp $user@$host

set rez [connect $passw]
if { $rez == 0 } {
send “cd $location/r”
set timeout -1
send “put $file1/r”
#send “ls -l/r”
#send “quit/r”
#send “mkdir testsftp/r”
send “quit/r”
expect eof
exit 0
}
puts “/nCMD_ERR: connecting to server: $host!/n”
exit 1
0
[/codesyntax]
expect也可以用两种形式调用

1 ./my.exp $usr $pwd $host $local $file
2. 代码中直接插入:

expect<<!

!

 

3. (推荐)生成密钥对

因为这种方式不用把密钥卸载程序里,所以更安全

第一步:生成密匙对,我用的是rsa的密钥。使用命令 “ssh-keygen -t rsa”

[codesyntax lang=”bash”]
[user1@rh user1]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory ‘/home/user1/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
e0:f0:3b:d3:0a:3d:da:42:01:6a:61:2f:6c:a0:c6:e7user1@rh.test.com
[user1@rh user1]$
[/codesyntax]

生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。接着会提示输入一个不同于你的password的密码,直接回车,让它空着。
当然,也可以输入一个。(我比较懒,不想每次都要输入密码。) 这样,密钥对就生成完了。

其中公共密钥保存在 ~/.ssh/id_rsa.pub
私有密钥保存在 ~/.ssh/id_rsa
然后改一下 .ssh 目录的权限,使用命令 “chmod 755 ~/.ssh”
[user1@rh user1]$ chmod 755 ~/.ssh

之后把这个密钥对中的公共密钥复制到你要访问的机器上去,并保存为
~/.ssh/authorized_keys

[codesyntax lang=”bash”]
[user1@rh user1]$ scp ~/.ssh/id_rsa.pub rh1:/home/user1/.ssh/authorized_keys

user1@rh1’s password:
id_rsa.pub 100% 228 3.2MB/s 00:00
[user1@rh user1]$
[/codesyntax]

之这样就大功告成了。之后再用ssh scp sftp 之类的访问那台机器时,就不用输入密码
了,用在script上更是方便。

备份工具tar详细用法

tar是Linux环境下最常用的备份工具之一。tar(taparchive)原意为操作磁带文件,但基于Linux的文件操作机制,同样也可适用于普通的磁盘文件。
tar可用于建立、还原、查看、管理文件,也可方便的追加新文件到备份文件中,或仅更新部分的备份文件,以及解压、删除指定的文件。
熟悉其常用参数,能方便日常的系统管理工作。

一、版本

还是那句,不同的操作系统,tar的命令参数是有点区别的:
[codesyntax lang=”bash”]

# tar --version
tar (GNU tar) 1.14

[/codesyntax]

二、简单操作

命令格式:
[codesyntax lang=”bash”]

tar [options] [tarfile] [other-files]
tar--long-option -function-options files

[/codesyntax]

tar可使用的参数非常多,先列举几个最常用的参数:
[codesyntax lang=”text”]

-t, --list
	列出归档文件内容目录
-x, --extract, --get
	从归档文件中解析文件
-c, --create
	创建新的归档文件
上面三个参数,不能同时存在,仅能使用其中一个,即t/x/c
-f file, --file=file
	指定备份文件,或设备,例如磁带机/dev/st0
-v, --verbose
	显示命令的执行过程
-Z, --compress, --uncompress
	使用compress命令处理备份文件
-z, --gzip, --gunzip, --ungzip
	使用gzip命令处理备份文件
-j, --I, --bzip
	使用bzip2命令处理备份文件
	-z和-j都是在备份文件打包后才进行压缩的操作的,并且,该操作会影响其他的参数。
-C directory, --directory=directory
	先进入指定的目录,再释放

[/codesyntax]

举例:
把/etc目录中所有的文件打包为etc.tar文件
[codesyntax lang=”bash”]

tar -cvf /tmp/etc.tar /etc

[/codesyntax]
把/etc目录中所有的文件打包并使用gzip压缩为etc.tar.gz文件
[codesyntax lang=”bash”]

tar -zcvf /tmp/etc.tar.gz /etc

[/codesyntax]
把/etc目录中所有的文件打包并使用bzip2压缩为etc.tar.bz2文件
这里的tar.gz或tar.bz2都是惯例,并不是特定条件。它仅为方便标识,也可将其设置成如tgz等。但建议遵循惯例
[codesyntax lang=”bash”]

tar -jcvf /tmp/etc.tar.bz2 /etc

[/codesyntax]
查看备份包中的内容,若为已经压缩的文件,需加上-z或者-j参数
[codesyntax lang=”bash”]

tar -ztvf /tmp/etc.tar.gz

[/codesyntax]
默认情况下,tar打包时都是使用相对路径的。所以释放时需要先进入目录目录,然后再解压。
同样的,根据使用的压缩方式,应加上-z或者-j参数
[codesyntax lang=”bash”]

cd /tmp && tar -zxvf /tmp/etc.tar.gz

[/codesyntax]
PS:这是另一种写法,结果和上面的相同,其会先进入/tmp目录,然后再释放包的
[codesyntax lang=”bash”]

tar -zxvf /tmp/etc.tar.gz -C /tmp

[/codesyntax]
释放单个etc/passwd文件,正如前面提到的,tar包中的是相对路径,所以不能使用“/etc/passwd”
并且,这里不能使用-C参数,释放文件是当前路径的相对路径,并带目录释放
[codesyntax lang=”bash”]

tar -zxvf /tmp/etc.tar.gz etc/passwd

[/codesyntax]
tar还可以支持很多额外的参数,方便我们在备份和释放的时候进行控制。

三、更多参数

1、备份

[codesyntax lang=”text”]

-d, --diff, --compare
	找出归档文件和文件系统的不同之处
-r, --append
	将文件附加到归档文件之后
-u, --update
	只附加比归档中新的文件
-A, --catenate
	将 tar 文件附加到归档文件之后
--concatenate
	与 -A 相同
--delete
	从归档文件中删除 (不能在磁带上!)
-N date, --newer=date, --after-date=date
	只将比指定日期更新的文件保存到备份文件
--exclude=pattern
	排除符合查找模式的文件
-P, --absolute-names
	备份文件中的文件名使用绝对路径,而不移除文件名前的“/”,默认是相对路径的
-l, --one-file-system
	复制文件或目录存放的文件系统必须和tar命令当前执行的文件系统相同,否则不执行;也就是讲,不处理其他分区的文件。(可忽略mount挂载分区的问题)
--mode=permissions
	备份时,把加入备份文件中的文件属性修改为指定的属性,格式和chmod命令接受的格式相同
--group=group
	备份时,把加入备份文件中的文件所属组设定成指定的组
--owner=owner
	备份时,把把加入备份文件中的文件所有者设定成指定的用户
--numeric-owner
	以UID和GID代替用户名和组名
--recursion
	递归模式(默认)
--no-recursion
	不进行递归处理,即不把指定目录下的所有文件和文件夹都备份
--newer-mtime=date
	仅增加指定日期后修改过内容的文件到备份文件中
--anchored
	排除时,排除匹配式中匹配整个文件路径(默认)
--no-anchored
	排除时,排除匹配式中可匹配“/”后的路径
--ignore-case
	排除时,排除匹配式中忽略大小写
--no-ignore-case
	排除时,排除匹配式中大小写敏感(默认)
--wildcards
	排除匹配式支持通配符(默认)
--no-wildcards
	排除匹配式不支持通配符
--wildcards-match-slash
	排除匹配式的通配符匹配“/”(默认)
--no-wildcards-match-slash
	排除匹配式的通配符不匹配“/”
-X file, --exclude-from file
	指定样式文件,供程序执行时剔除符合条件的文件
--remove-files
	删除已经加入到备份文件中的文件

[/codesyntax]
举例:
创建当前目录的全备份到backup.tar文件
(使用find的原因是,这样可以打包所有隐含文件或不符合命令规范的文件和目录)
[codesyntax lang=”bash”]

tar cvf - `find . -print` > backup.tar

[/codesyntax]
比2005年6月1日新的文件才会备份
[codesyntax lang=”bash”]

tar -N '2005/06/01' -zcvf home.tar.gz /home

[/codesyntax]
除/home/dmtsai目录外,/home和/etc目录的所有东西都打包
[codesyntax lang=”bash”]

tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

[/codesyntax]
删除etc.tar文件中的etc/pbm2ppa.conf文件
[codesyntax lang=”bash”]

tar --delete etc/pbm2ppa.conf -vf etc.tar

[/codesyntax]
把tmp.tar文件附加到etc.tar后面
[codesyntax lang=”bash”]

tar -A tmp.tar -vf etc.tar

[/codesyntax]
根据-T参数后的样式文件list.txt,打包/etc中指定的文件,同样的,list.tx默认也是相对路径的
[codesyntax lang=”bash”]

find . -name "*.d" -o -name "*.conf" > list.txt
	tar -T list.txt -czvf etc.tar.gz /etc

[/codesyntax]
通过管道,使用一条命令实现上面相同的功能
[codesyntax lang=”bash”]

find . -name "*.d" -o -name "*.conf" | tar -czvf etc.tar.gz -T -

[/codesyntax]

值得注意几个地方:
1)-f后面必须紧跟备份文件,xxx.tar或者xxx.tar.gz
2)使用–delete、-u、-r、-A的时候,后面跟的备份文件都必须为未压缩的,若备份文件已经压缩,需要使用gunzip先解压,操作完后再gzip;
也就是说,不能对tar.gz、tar.bz2等文件直接操作的;
3)备份打包时,默认为相对路径;而排除匹配式默认也是全路径匹配的
所以,在打包时,会提示:“tar: Removing leading `/’ from member names”
除非你使用-P参数或特定的参数指定

2、释放

[codesyntax lang=”text”]

-k, --keep-old-files
	还原备份文件时,不覆盖已存在的文件
-m, --modification-time, --touch
	还原文件时,不变更文件的更改时间
-p, --same-permissions
	解析许可权限信息,即保留备份文件中的权限信息
-s, --same-order, --preserve-order
	以与备份文件相同的顺序还原文件
--preserve
	等于同时设置-p和-s
--no-same-permissions
	不解析许可权限信息,这是普通用户的默认设置,仅对影响管理员的操作有影响
--no-same-owner
	不使用备份文件中的所有者信息,而以您自己的身份解析文件
--same-owner
	使用相同的文件所有者还原文件
--overwrite
	覆盖已经存在的文件和目录
--overwrite-dir
	覆盖已经存在的目录
--recursive-unlink
	释放前,先删除整个目录下所有文件的连接

[/codesyntax]
举例:
释放文件时,设置为备份文件中的相同所有者(仅对管理员而言)
[codesyntax lang=”bash”]

tar --same-owner -xzvf etc.tar.gz

[/codesyntax]
通过管道,把/etc目录用tar整个“拷贝”到/backup/etc,而不用建立任何临时文件
因为根本不需要生成备份包文件,所以这里不需要-z参数
[codesyntax lang=”bash”]

tar cvf - /etc | tar xvf - -C /backup/etc

[/codesyntax]
这里同上面的原理是一样的,只不过通过ssh直接“拷贝”到远端机器上而已
配合ssh密钥匹配,可实现不用人工干预的备份工作
[codesyntax lang=”bash”]

tar cvf - /etc | (ssh root@192.168.228.244 'tar xvf - -C /backup/etc')

[/codesyntax]

3、操作磁带设备

部分参数只适用于磁带设备,不适用于常规的磁盘文件。
[codesyntax lang=”text”]

-K file, --starting-file=file
	从指定的文件开始还原(按顺序)
-L length, --tape-length=length
	设置磁带的容量,单位为1024字节(bytes)
-M, --multivolume
	在建立、还原备份文件或列出其中内容时,采用多卷模式(不能对文件操作)
-V name, --label=name
	建立使用指定卷标的备份文件
-W, --verify
	写入备份文件后,校验文件是否正常
-F script, --info-script=script, --new-volume-script=script
	更换磁带时执行指定的脚本文件,必须与参数-M同时使用

[/codesyntax]
举例:
把/bin、/usr/bin目录都打包到st0磁带设备中
[codesyntax lang=”bash”]

	tar cvf /dev/st0 /bin /usr/bin

[/codesyntax]
把old.dmp文件追加到st0磁带中(使用cvf,会删除原来的文件的)
[codesyntax lang=”bash”]

	tar rvf /dev/st0 old.dmp

[/codesyntax]

4、其他

还有一些控制参数这里不详细讨论了,请自行测试。
但提醒一句,-T参数比较重要哦。
[codesyntax lang=”text”]

--null
-T
	从null设备读取文件名,覆盖-C的设置
-o, --old-archive, --portability
	将数据写入备份文件时使用V7格式
--posix
	将数据写入备份文件时使用POSIX格式
-G, --incremental
	处理旧GNU格式的增量备份
--rsh-command=command
	不使用rsh命令连接远程主机,而使用指定的命令进行
--suffix=suffix
	指定要删除文件前备份文件,该备份文件使用的后缀,默认是“~”
--totals
	创建备份文件时,列出已建立的备份文件的大小
tar --totals -cvf tmp.tar tmp/
-R, --block-number
	在输出信息时,一同block number信息
-S, --sparse
	若文件中有大量连续0字节时,将该文件保存成稀疏文件
-T file, --files-from=file
	指定样式文件,文件内容为一个或多个条件样式,供程序还原或创建符合指定条件的文件
--use-compress-program=program
	使用指定的压缩程序对备份文件压缩或解压
--volno-file=FILE
	使用或更新FILE文件中指定的卷号码
-w, --interactive, --confirmation
	当遇到问题时,要求用户先确认
-B, --read-full-records
	读取数据是重设扇区大小,仅适用于BSD 4.2的管道操作
-O, --to-stdout
	把从备份文件里还原的文件输出到标准输出设备
--version
	版本信息
--help
	帮助信息

[/codesyntax]

Linux查看系统信息

查看主板的序列号:
[codesyntax lang=”bash”]

dmidecode | grep -i ’serial number’

[/codesyntax]

用硬件检测程序kuduz探测新硬件:
[codesyntax lang=”bash”]

service kudzu start ( or restart)

[/codesyntax]

查看CPU信息:
[codesyntax lang=”bash”]

cat /proc/cpuinfo [dmesg | grep -i 'cpu'][dmidecode -t processor]

[/codesyntax]

查看内存信息:
[codesyntax lang=”bash”]

cat /proc/meminfo [free -m][vmstat]

[/codesyntax]

查看板卡信息:
[codesyntax lang=”bash”]

cat /proc/pci

[/codesyntax]

查看显卡/声卡信息:
[codesyntax lang=”bash”]

lspci |grep -i ‘VGA’[dmesg | grep -i 'VGA']

[/codesyntax]

查看网卡信息:
[codesyntax lang=”bash”]

dmesg | grep -i ‘eth’[cat /etc/sysconfig/hwconf | grep -i eth][lspci | grep -i 'eth']

[/codesyntax]

查看PCI信息:
[codesyntax lang=”bash”]

lspci (相比cat /proc/pci更直观)

[/codesyntax]

查看USB设备:
[codesyntax lang=”bash”]

cat /proc/bus/usb/devices

[/codesyntax]

查看键盘和鼠标:cat /proc/bus/input/devices
[/codesyntax]

查看系统硬盘信息和使用情况:
[codesyntax lang=”bash”]

fdisk & disk – l & df

[/codesyntax]

查看各设备的中断请求(IRQ):cat /proc/interrupts
[/codesyntax]

查看系统体系结构:
[codesyntax lang=”bash”]

uname -a

[/codesyntax]

查看及启动系统的32位或64位内核模式:
[codesyntax lang=”bash”]

isalist –v [isainfo –v][isainfo –b]

[/codesyntax]

dmidecode查看硬件信息,包括bios、cpu、内存等信息

测定当前的显示器刷新频率:
[codesyntax lang=”bash”]

/usr/sbin/ffbconfig –rev /?

[/codesyntax]

查看系统配置:
[codesyntax lang=”bash”]

/usr/platform/sun4u/sbin/prtdiag –v

[/codesyntax]

查看当前系统中已经应用的补丁:
[codesyntax lang=”bash”]

showrev –p

[/codesyntax]

显示当前的运行级别:
[codesyntax lang=”bash”]

who –rH

[/codesyntax]

查看当前的bind版本信息:
[codesyntax lang=”bash”]

nslookup –class=chaos –q=txt version.bind

[/codesyntax]

查看硬件信息:
[codesyntax lang=”bash”]

dmesg | more 

[/codesyntax]

显示外设信息, 如usb,网卡等信息:
[codesyntax lang=”bash”]

lspci 

[/codesyntax]

查看已加载的驱动:
[codesyntax lang=”bash”]

lsnod 

[/codesyntax]

查看当前处理器的类型和速度(主频):
[codesyntax lang=”bash”]

lshw
psrinfo -v 

[/codesyntax]

打印当前的OBP版本号:
[codesyntax lang=”bash”]

prtconf -v 

[/codesyntax]

查看硬盘物理信息(vendor, RPM, Capacity):
[codesyntax lang=”bash”]

iostat –E 

[/codesyntax]

查看磁盘的几何参数和分区信息:
[codesyntax lang=”bash”]

prtvtoc /dev/rdsk/c0t0d0s 

[/codesyntax]

显示已经使用和未使用的i-node数目:
[codesyntax lang=”bash”]

df –F ufs –o i 

[/codesyntax]

[codesyntax lang=”bash”]

isalist –v

[/codesyntax]

对于“/proc”中文件可使用文件查看命令浏览其内容,文件中包含系统特定信息:

Cpuinfo 主机CPU信息
Dma 主机DMA通道信息
Filesystems 文件系统信息
Interrupts 主机中断信息
Ioprots 主机I/O端口号信息
Meninfo 主机内存信息
Version Linux内存版本信息

备注:
proc – process information pseudo-filesystem 进程信息伪装文件系统

Shell访问MySQL数据库方法

原有搭建了两台Mysql主从数据库服务器

先准备每日从主服务器进行数据增量备份 然后在子机上进行数据增量恢复

而实现数据库的每日增量备份还原

 

主机数据库的备份比较好弄  直接mysqldump就可以了

但是子机上的还原 有那么一点小麻烦

上网搜索了一下 然后自己整理了一下用脚本访问数据库的两种方法:

1. 直接利用mysql的参数进行控制

[codesyntax lang=”bash”]

#!/bin/sh
#数据库基本信息
DBUSER=bak
DBPASSWD=backup
#数据库连接
mysql -u${DBUSER} -p${DBPASSWD}

[/codesyntax]
这种方法 只能是直接进入到数据库 但是后续的处理还需要进行二次编写

 

2. 直接编写expect脚本进行控制

首先下载expect,这个比较好处理  直接yum或者是sudo apt-get就可以了

然后就是编写脚本 也没有想象中的要困难
[codesyntax lang=”bash”]

#!/usr/bin/expect
spawn mysql -ubak -p
expect "Enter password:"
send "backup\n"
expect "mysql>"
send "select * from mysql.user;\n"
expect "mysql>"
send "show databases;\n"
#echo 正在显示用户数据
expect eof

[/codesyntax]
用第二种方法至少可以进行数据库的相对操作,毕竟expect本来就是进行交互式脚本运行的

 

当然还有其他的方式进行的  这个后续进行补充吧……

毕竟现在主要的是将任务给完成

 

WordPress添加豆瓣音乐

有的同学也许会和我一样,很喜欢用豆瓣FM来听歌。
恩!有种上学时听收音机的感觉,而且豆瓣会更具你的习惯推荐歌曲,很不错!

豆瓣fm

其实这个实现非常简单:

  • 新建文章或者页面
  • 转到【文本】模式下编辑
  • 添加如下代码

wenben-douban

以下是插入的代码:

[codesyntax lang=”html4strict”]

 <iframe name="iframe_canvas" 
src="http://douban.fm/partner/baidu/doubanradio" 
scrolling="no" frameborder="0" width="420" height="190"></iframe>

[/codesyntax]

效果预览:

解决主机500错误

使用主机有时候登陆网站的时候会出现“Internal Server Error,500 error”。经上网搜索,发现出现该种情况通常有以下三种可能:

1.服务器资源超载

如果你没对网站文件做过什么更改的话,最有可能的是同服务器的资源超载:即同一时间内处理器有太多的进程需要处理的时候,会出现500错误。借助SSH,可以在命令行中输入以下命令查看:

ps faux
ps faux |grep <em>username</em>

如果你查到某个进程消耗过多资源,可以用kill命令强制关闭这个进程,只需输入该进程的进程号(Pid):

kill -9 <em>pid</em>

2.文件权限设置错误

500错误还有可能是对文件设置了不正确的权限:

后台目录和文件的权限默认应该是755,而图片,文字等html文件应该是644。所以如果在刚刚上传文件后出现500错误,应该主要检查文件权限设置。

可以使用FTP软件选中所有文件,然后批量修改文件权限。也可以在SSH中更改相应的权限…

chmod 644 [filename]

3 .htaccess文件写入错误的代码

在使用某些wordpress SEO插件的时候,插件会改写.htacess文件,如果语法错误的话就有可能造成500错误!

在.htaccess文件中,可能因为添入了一些与源文件冲突的代码。所以为了检测到错误语句,最好的方法是为语句添加注释来逐条验证。因为注释之后,语句就不再起作用。

逐条添加“#”在语句前面,如

DirectoryIndex default.html
AddType application/x-httpd-php5 php

你可以添加#到该命令前,从而实现注释效果:

DirectoryIndex default.html
#AddType application/x-httpd-php5 php

这个方法可以迅速定位错误的命令,如果你找不到错误的段落,可以尝试把所有的命令全部添上注释然后反过来逐条删除#检查错误!判断出错误语句之后,可以删掉#恢复正常!