写在前面:我看过很多技术相关的书籍,但是很少有全部看完的。大部分都是看了一小半,甚至是一大半。但是印象中,没有哪一本是全部读完的,哪怕的通读。
不过这本《Linux命令速查手册》,我倒是很快读完了。当然,这本书主要是一些命令的介绍,并没有深邃的内容。但是,读完了,还是很开心的。~
这篇笔记就是对这本书的全部笔记了。有点简陋,也没有做任何格式的排版。就酱吧,主要是记录一下这些命令。大部分还是熟悉或者了解的,较少部分是之前没有使用过的。
命令记录:
ls
:-l -a -S -X -F -r -R
…
cd
: change dirctory
pwd
: print workspace dirctory
touch
:-t -a
mkdir
: -p -v
cp
: -a -r -v -R -i
mv
:-i -v
rm
:-r/-R -f -v -i
rmdir
: only remove empty dirctory
shred
: 重写文件25次。[私密文件删除前执行,可以防止泄密]
shred password.txt && rm password.txt
su
: swich user
su
:-l
==> --login
, su -
whoami
man
:-k -u -f -t
info
whereis
:-m -b
whereis命令的功能非常有用:它可以告诉你命令的可执行程序、 它的源文件(如果存在的话)及其man page的路径。
whatis
读取命令的描述
-w -r
apropos
基于功能查找命令
-w -r
which
找出将要运行的命令的版本
-a
连续运行多个命令:;
只有前面的命令运行成功,才运行下一个命令:&&
只有前面的命令运行失败,才运行下一个命令:||
将一个命令的输出插入到另一个命令:$()
date “+%Y-%m-%d”
mkdir $(date "+%Y-%m-%d-%H:%M:%S")
将一个命令的输出用作另一个命令的输入:|
将命令的输出重定向到文件:>
防止重定向时覆盖文件:set -o noclobber
, replace >
by >|
恢复到默认[可以覆盖文件的状态]:set +o noclobber
将命令的输出追加到文件:>>
将文件作为命令的输入:<
在标准输出设备上查看文件:cat
将文件拼接至标准输出设备:cat
拼接文件,并给文件加上行号:cat -n
tac
分屏查看文本文件:less
,more
,most
,pg
,head
,tail
tail -f
列出所有可用的打印机:lpstat -p
找到默认的打印机:lpstat -d
查看打印机是如何连接的:lpstat -s
将文件打印到默认的打印机:lpr
修改文件或目录属于的用户组:chgrp
-R
, -c
, -v
sudo chgrp sudo njManifest/default.xml
修改文件和目录的拥有者:chown
-R
, -c
, -v
同时修改文件和目录的拥有者和用户组:chown owner:group
;
示例:
chown pycat:root -R -c codes/
==> 将codes/
目录的所有者改成pycat
,所在组改成root
使用
chown
仅仅用来修改组:chown :pycat libby.jpg
Linux
认为有三组用户会使用文件或目录,即实际拥有者(也称
为文件的用户)、用户组及系统中的其他人。每组用户分别用不同的
字母表示.
使用者 | 字母表示 |
---|---|
用户(拥有者)(User) | u |
组(Group) | g |
其他(Other) | o |
用字母表示法修改文件和目录的权限:chmod [ugo][+-=][rwx]
$ ls –l
-rw-r--r-- 1 scott family ... libby.jpg
$ chmod g+w libby.jpg
$ ls -l
-rw-rw-r-- 1 scott family ... libby.jpg
$ ls –l
-rw-r--r-- 1 scott family ... libby.jpg
$ chmod go+w libby.jpg
$ ls -l
-rw-rw-rw- 1 scott family ... libby.jpg
$ ls –l
-rw-r--r-- 1 scott family ... libby.jpg
$ chmod a=rw libby.jpg
$ ls -l
-rw-rw-rw- 1 scott family ... libby.jpg
$ ls –l
-rw-rw-rw- 1 scott family ... libby.jpg
$ chmod go-w libby.jpg
$ ls -l
-rw-r--r-- 1 scott family ... libby.jpg
$ chmod o-r libby.jpg
$ ls -l
-rw-r----- 1 scott family ... libby.jpg
$ ls –l
-rw-rw-rw- 1 scott family ... libby.jpg
$ chmod g=r libby.jpg
$ ls -l
-rw-r--rw- 1 scott family ... libby.jpg
$ chmod o= libby.jpg
$ ls -l
-rw-r----- 1 scott family ... libby.jpg
注意最后的chmod
命令, o
等于什么也没有,相当于删除了系统中
所有其他用户的所有权限。
用数字权限修改文件和目录的权限:chmod [0-7][0-7][0-7]
数字权限(也称为八进制权限)是基于二进制数字系统而创建的。我们将不解释为什么权限要用特定的数字来表示,而重点介绍最终的结果:读(read, r)的值为4,写(write, w)的值为2,而执行(execute,x)的值是1。记住, Linux权限识别三个用户组,即拥有者、组以及其他人,每个用户组都能进行读、写和执行操作。
Owner(拥有者) | Group(组) | World(其他人) |
---|---|---|
权限 | r; w; x | r; w; x |
数字表示 | 4; 2; 1 | 4; 2; 1 |
Chmod命令 | ls -l表示 | 含 义 |
---|---|---|
chmod 400 |
-r-------- |
拥有者能够读,其他任何人不能进行任何操作 |
chmod 644 |
-rw-r--r-- |
所有人都能够读,但只有拥有者才能编辑 |
chmod 660 |
-rw-rw---- |
拥有者和组用户能够读和写,其他人不能进行任何操作 |
chmod 664 |
-rw-rw-r-- |
所有人都能读,但只有拥有者和组用户能够编辑 |
chmod 700 |
-rwx------ |
拥有者能够读、写和执行,其他用户不能进行任何操作 |
chmod 744 |
-rwxr--r-- |
所有人都能读,但只有拥有者才能编辑和执行 |
chmod 755 |
-rwxr-xr-x |
所有人都能读和执行,但只有拥有者才能编辑 |
chmod 777 |
-rwxrwxrwx |
所有人都能读、写和执行(这样的设置通常不是个好想法) |
递归地修改权限:chmod -R
设置和清除 suid
:chmod u[+-]s
设置和清除 sgid
:chmod g[+-]s
数字表示法:对于suid
,那个数字是4;对于sgid
,这个数字是2。
$ ls -lF
drwxr-xr-x 11 scott admins ... bin/
$ chmod 2755 bin
$ ls -lF
drwxr-Sr-x 11 scott admins ... bin/
删除sgid的方法和删除suid的方法是一样的,在开头输入0,就去掉了sgid权限。
$ ls -lF
drwxr-Sr-x 11 scott admins ... bin/
$ chmod 0755 bin
$ ls -lF
drwxr-xr-x 11 scott admins ... bin/
设置和清除 sticky bit
: chmod [+-]t
。
用 zip
归档和压缩文件:zip
zip dest.zip src.tif
用 zip
获得最好的压缩效果: -[0-9]
用密码保护压缩的 Zip
文档: -P
或者 -e
。
解压文件:unzip
,-v
$ unzip moby.zip
Archive: moby.zip
inflating: job.txt
inflating: moby-dick.txt
inflating: paradise_lost.txt
列出将要解压的文件(并不解压): -l
unzip -l abc.zip
测试将要解压的文件: -t
unzip -t moby.zip
gunzip -c paradise_lost.txt.gz > paradise_lost.txt
如果你不喜欢使用
gunzip
命令,也可以使用gzip –d
(或--decompress
或--uncompress
)。
gzip , bzip2 用法完全一致
用 tar 归档文件:-cf
(--create
,--file
)
tar -cf moby.tar *.txt
用 tar
和 gzip
归档和压缩文件: -zcvf
(--gzip
,--create
,--verbose
,--file
)
tar -zcvf src.bak.tar.gz src/ # 将 src/ 压缩到 src.bak.tar.gz 中
测试将要解开和解压的 tarball
:-ztvf
tar -ztvf src.bak.tar.gz
要确保-f
是最后一个选项,因为在它后面需要指定.tar.gz
文件路径。
解开和解压 tarball
:-zxvf
(--gzip
,--extract
,--verbose
,--file
)
对于bzip2
的 ,就是 -jxvf
, -jtvf
, -jtcf
。
搜索文件名数据库: locate
因为运行slocate
对用户来说是透明的(也就是说,用户看不到
他运行的是slocate
),而且locate
使用的字母更少一些,输入得更快,
所以本书(《Linux命令速查手册》)也继续使用locate
,虽然实际运行的命令是slocate
。
搜索文件名数据库,不区分大小写: locate -i
更新 locate
使用的数据库:updatedb
(需要root
或者 sudo
)
如果想知道updatedb
的运行花费了多长时间,可以在 updatedb
前面加上time命令,如下所示:
time updatedb
在文本文件中搜索匹配的模式: grep
locate
命令可以搜索文件和目录的名称,但是不能搜索文件的内容。要搜索文件内容,应该使用grep
命令。 grep
的处理过程基本上就是,为它提供一个搜索想要匹配的模式,指定要搜索的一个或一组文件(甚至是整个硬盘空间),然后grep
就会输出能够与搜索模式匹配的各行内容的列表。
$ grep pain three_no_more_forever.txt
all alone and in pain
这个例子是用grep来检查一个文件中是否包含pain这个词(文件的内容是Peter Von Zer Muehlen写的一首名为“Three No More Forever”的诗)。当然,这个文件中有pain这个词,所以grep就在终端界面上打印出包含搜索内容的那一行。但如果想一次在多首Peter所写的诗中进行搜索,又该怎么办呢?使用通配符可以解决这一问题。
$ grep pain *
fiery inferno in space.txt:watch the paint peel,
three_no_more_forever.txt:all alone and in pain
the speed of morning.txt:of a Chinese painting.
8 hour a day.txt:nice paint job too
ghost pain.txt:Subject: ghost pain
在文本文件中搜索特定模式的基础知识
在刚开始使用grep
时, 新用户会对这个命令有好几种版本感到很困惑。
grep的不同版本
支持的模式 | grep命令选项 | 单独的命令 |
---|---|---|
基本的正则表达式 | grep -G(或 –basic-regexp) | grep |
扩展的正则表达式 | grep -E(或 –extended-regexp) | egrep |
固定字符串的列表,匹配其中任何一项 | grep -F(或 –fixed-strings) | fgrep |
Perl正则表达式 | grep -P(或 –perl-regexp) | 不可用 |
通配符不等于正则表达式。虽然通配符和正则表达式都使用星号(*
) 字符,但它们的含义完全不同。通配符中使用特定的字符(如?
和*
)表示替换(substitution
),而正则表达式中同样的字符表示要对前面的内容进行匹配的次数。例如,在通配符中,可以把c?t
中的?
替换成另一个字符,而且只能替换一次,所以这个通配符可以匹配cat
、 cot
和cut
,但不能与ct
匹配。在正则表达式中, c[a-z]?t
中的?
表示从字母A
到Z
都可以匹配,但只可以匹配0
次或1
次,所以这个正则表达式可以匹配cat
、 cot
、 cut
,也可以匹配ct
。
正则表达式中的单引号和双引号的用法也有很大区别。单 引号(‘和’)是在告诉shell正在搜索一个字符串,而双引号(“和”) 则是让shell知道想要使用shell变量。
$ grep 'hey!' *
txt/pvzm/8 hours a day.txt:hey you! let’s run!
如果要搜索精确的匹配结果,就使用单引号;如果要把shell变量 结合到搜索内容中(很少有这样的需要),就使用双引号;但如果搜 索关键字只包含数字和字母,完全不使用任何引号也没有问题。如果 想要安全些,放心地使用单引号吧,即使只有一个词,也可以加上单 引号,这没什么损害。
递归式地搜索文件中的文本: -R
星号(
*
)通配符可以一次搜索同一目录中的多个文件,但要搜 索多个子目录,就需要使用-R
(或--recursive
)选项。
搜索文件中的文本,忽略大小写: -i
(或--ignore-case
)
在文件中只搜索整个词: -w
在默认情况下,
grep
命令搜索字符串pain所有可能出现的位置, 显示包含pain
的整行内容,包括paint
和painting
。如果搜索的文件中包 含painless
、Spain
、或painstaking
,包含这些词的行也会显示出来。但 如果只需要精确匹配pain
的行,又该怎么办呢?这时就要使用-w
(或--word-regexp
)选项。
显示搜索结果在文件中的行号: -n
在其他命令的输出中搜索特定内容: ls -al | grep P53
查看文件中搜索内容的上下文信息: -A , -B , -C
grep
可以输出包含 搜索内容的实际行,但也可以让grep
输出匹配内容之前和之后的若干行。
-B
或--before-context=#
-A
或--after-context=#
-C
或--context=#
显示没有包含搜索内容的行: -v
列出包含搜索内容的文件名: -l
或 --files-with-matches
grep
命令能够列出包含你要搜索的内容的行,但有时可能并不需 要知道这些行的具体内容,而只要知道包含这些匹配行的文件名称就可以了。
ls -1 | grep 196[6-7] | grep -v Live
根据文件名搜索文件:find -name
find . -name error.log
find $(pwd) -name error.log
如果搜索使用的是相对路径,那么搜索结果使用的也是相对路 径;如果搜索使用的是绝对路径,那么结果使用的也会是绝对路径。
根据拥有者搜索文件:find -user
find $(pwd) -user cat -name src
查找拥有者不是
scott
的文件,可能更容
易,只要在想取反的选项前面加一个叹号(!
)就可以了。
find $(pwd) ! -user cat -name src
根据用户组搜索文件: find -group
根据文件大小搜索文件: file -size
有时,可能需要根据文件的大小查找文件,
find
命令可以进行这 样的搜索。使用-size
选项指定文件大小,在其后的数字后面加一个字符,表示使用的单位。如果不提供单位字符,则使用默认值。不过,你应该明白这可能不能搜索出你想找的内容。如果没有在数字后面附 加字符,默认使用的大小单位就是512
字节块(文件的字节数先除以512
,再取整到最接近的一个整数)。真是太复杂的数学计算。更容易 的表示方法是在数字后面使用后缀,用较为通用的单位表示文件大小。
后缀 | 含义 |
---|---|
b |
512字节块(默认值) |
c |
字节(Byte ) |
k |
千字节(Kilobyte,KB ) |
M |
兆字节(Megabyte,MB ) |
G |
吉字节(Gigabyte,GB ) |
find . -size 10M
使用
find
命令时需要注意一点:如果只说10M
,那么find
命令就只搜索文件大小恰好是10 MB
的文件(当然是 取整后的10 MB
)。如果要搜索的文件大小大于10 MB
,需要在指定的 大小前面加一个加号(+
);如果要搜索的文件大小小于10 MB
,则需 要在大小前面加一个减号(-
)。
find . -size +10k
根据文件类型搜索文件: find -type
文件类型字符 | 含 义 |
---|---|
f | 普通文件 |
d | 目录 |
l | 符号(软)链接 |
b | 块文件 |
c | 字符文件 |
p | FIFO(First In First Out)文件 |
s | 套接字 |
当表达式均为 true
时显示结果(AND
):find -a
find . -name error.log -a -type f
wc
(word count
):统计文本字数 wc -l
: 统计文本行数 wc -w
: 统计单词数 wc -c
: 统计字符数
当表达式中只有一个为 true
时就显示结果(OR
):find -o
find . \( -size +10M -o -size 10M \) ! -name
: 查找文件大小大于等于10M,并且名字中不包含 “25” 的文件.
"*25*"
当表达式为 not true
时显示结果(NOT
): find -n
使用叹号(!)来对表达式进行取反.
find . ! -type f | grep -v ".git"
对搜索到的每个文件执行命令: find -exec
现在进入find
命令真正展露其威力的领域:能够对搜索到的文件再执行命令。在列出用于限制搜索的选项(例如-name
、-type
或-user
) 后,再附加一个-exec
选项,后面跟上要为找到的每个文件执行的命令。用{}
符号来代表找到的每个文件,并用\
对分号(;
)进行转义以作为命令的结束,这样shell
就不会把它理解为命令栈的标志。
find . -name " *MP3" -exec rename 's/MP3/mp3/g' {} \;
rename
命令后面是关于文件名如何变化的指令,其格式为:s/old/new/g
[s
代表substitute
(替换),g
代表global
(目标)]。
将搜索结果打印到文件:find -fprint
查看命令行历史: history
显示所有命令的别名: alias
查看特定命令的别名: alias [alias name]
alias gr
创建新的临时别名: alias [alias]= '[command]'
alias lsd='ls -d */'
如果想让别名能够在不同的shell
会话中使用,就需要把它们添加 到shell
用来保存别名的文件中。大多数情况下,这个文件不 是 .bashrc
,就是.bash_aliases
。
在该文件中添加一行:
alias lsd='ls -d */'
需要重新加载.bash_aliases
(或.bashrc
,如果使用的是这个文件),新增加的别名才会生效。有两种办法:第一 种办法是退出shell,再登录进来,但这种办法并不好用,不推荐使用; 第二种是通过运行命令来重新加载文件,如下所示。
. .bash_aliases
删除别名: unalias
(需要永久生效,就要去对应的文件中删除之前添加的别名。)
查看当前正在运行的所有进程: ps aux
要查看系统中用户正在运行的所有进程,可以在
ps
命令后面使用 以下选项:a
(表示所有用户)、u
(以面向用户的格式显示,或显示 拥有每个进程的用户)、x
(没有控制tty1
或终端屏幕的进程,“显示每 个进程”的另一种方法)
ps
命令能提供很多信息,包括进程的拥有者、唯一的进程ID
编号(PID
,用于标识进程)、进程正在使用的CPU
百分比(%CPU
)和内存
百分比(%MEM
)、进程的当前状态(STAT
)及进程的名称。
STAT
列用不同的字母表示进程的状态
STAT 字母 |
含义 |
---|---|
R |
运行(running ) |
S |
休眠(sleeping ) |
T |
停止(stopped ) |
Z |
僵尸1(zombie ) |
Z
是个坏消息,因为它意味着进程基本上一直处于挂起状态,不能 停止(幸运的是,这并不意味着没有解决问题的办法)。如果某个程 序有问题,ps
标明其状态为Z
,这时或许只有重启计算机才能完全关 闭这个程序。
查看进程树: ps axjf
在
Linux
世界中,进程并不是凭空出现的。通常,启动一个程序 的同时,也会启动其他程序。例如,Linux
系统中的所有进程最初都 来自init
,它是所有进程的源头,其PID
总为1
。ps
命令能够提供该进 程树的一种基于文本的表现方式,这样就能可视化地看看该进程又创 建了哪些其他进程。要查看进程树,除了使用上一节用过的a
、u
和x
选项,还要加上个f
(其名称源于ASCII art forest)
选项。
ps axjf
/ps axuf
在ubuntu
正常,在macOs
不能识别。
查看特定用户拥有的进程: ps U [username]
ps U pycat
终止正在运行的进程: kill
当使用
kill
命令时,可以用一个 数字或单词来指定关闭进程的紧急程度。
信号编号 | 信号单词 | 含义 |
---|---|---|
-1 (数字1) |
-HUP (hang up,挂起) |
控制进程已经死了,关闭进程(如果用于系统 服务,会导致重新加载配置文件并重启) |
-15 |
-TERM |
正常中止进程,清除将要失控的进程和文件 |
-9 |
-KILL |
停止任何正在进行的处理,马上关闭 |
通常,应该先试试-15
(其实,如果kill
命令没有使用任何选项, 它就是默认值)。
-1
(或-HUP
)选项,主要用于Samba
或无线连接之类的服务。
对于 STAT
显示的是Z
的进程:即使-9
选项对“僵尸”进程也 没有效果,这样的进程早已经死掉了,因此kill
命令对它也 无能为力。重启是唯一能够解决这种问题的办法。
查看正在运行的进程的动态更新列表: top
top
命令输出的前5行显示了大量的系统信息,之后则逐行列出每 个正在运行的进程。注意,top
命令会自动根据%CPU
列的数值对输出 进行排序,所以当程序占用的处理器资源变得更多或更少时,它们在top
命令列表中的位置也会发生相应变化。如果想在
top
命令中关闭程序,只需按k
键。这时在列表上方(在 以Swap:开始的那一行的后面),会看到以下内容:PID to kill
: 输入想关闭进程的PID(假设为8026),按Enter键,命令会询问要使用什么信号编号: Kill PID 8026 with signal [15]:top
命令默认使用的信号是15
。如果乐意用这个默认值,就按Enter
键;如果不乐意,就直接输入想使用的信号编号,然后按Enter
键。一 两秒钟以后,要关闭的进程就会从top
显示中消失了。
按q
键;退出top
命令。
列出打开的文件: lsof
(list open files
)
Linux
系统中的所有东西都是文件,包括目录、 网络连接和设备。这意味着,即使在你看来只打开了一个文件,而实际上系统在这个时候打开了几千个文件。
列出某个用户打开的文件:lsof -u
lsof -u pycat
列出正在使用特定文件的用户: lsof [file]
lsof /etc/passwd
列出特定程序的进程: lsof -c [program]
lsof -c sshd
lsof
命令的选项数量多得让人吃惊,这里看到的只是它很小的 一个子集。lsof
的源代码包含一个名为00QUICKSTART
的文件 (前面两个是0
),它是一个教程,介绍了关于这个命令的一些更
为强大的特性。
显示系统 RAM 的信息: free
在默认情况下,
free
命令以千字节为单位显示结果,与使用-k
选 项一样。不过,可以改变这一设置。-b
选项以字节为单位显示内存使 用大小,而-m
选项(可能是最常用的选项)则以兆字节为单位。
free -m
total used free shared buffers cached
Mem: 64320 48260 16060 0 15928 133
-/+ buffers/cache: 32197 32123
Swap: 16289 1037 15252
从
free
命令的输出可以看出,这台计算机有64320 MB
可用的物理 RAM。第一行显示有48260 MB
RAM
正在使用中,只剩下16060 MB
空闲的RAM
。交换区(或虚拟内存)差不多有16289 MB
,已经使用了1027M
。 表面看起来就是这样的。不过,事情并没有那么简单。重要的是中间标记为
-/+ buffers/ cache
的那一行。硬盘驱动器使用缓冲(buffer
)和缓存(cache
)来加速访问,如果一个程序需要内存,系统就能够快速地为该程序分配内存。对于Linux计算机中正在运行的应用程序而言,现在可以使用的空闲内存有32123 MB
,缓存空间为32197 MB
(如果需要的话,可以使 用)。除了交换空间,它们也是可以使用的空间。如果Linux
的内存管 理做得没有那么高效的话,那么它也就什么也不是了。
显示文件系统的磁盘使用情况: df
, -h
或--human-readable
free
命令处理的是系统的RAM
,而df
命令(可以认为是disk free
的缩写)处理的则是系统中硬盘空间的大小。运行df
,就会列出系统 中可以使用的磁盘空间,每个空间已经使用了多少,及它们各自挂载 到文件系统的什么位置。
报告目录使用的文件空间: du
df
命令可以提供整个硬盘的情况,但如果只想知道一个目录和它 的内容使用了多少空间,又该怎么办呢?du
命令(disk usage
的缩写) 能够解决这个问题。
只报告目录使用的总空间: du -s
为基于 RPM
的 Linux
系统安装软件:
rpm -ihv [package]
rpm -Uhv [package]
rpm
命令用于安装以.rpm
为后缀的软件安装程序,这看起来完全符合逻辑。要安装RPM
软件包,需要先下载。用业界标准的开源网络端 口扫描器nmap
来作为例子。从www.insecure.org/nmap/download.html
可以下载nmap
的RPM
软件包,下载到系统以后,只需运行rpm
命令, 并提供3个选项:-i
(安装软件包)、-h
(安装过程中显示hash标记) 和-v
(显示命令的执行过程)。要运行rpm
命令,还必须具有root
权限, 其基本格式如下所示:
rpm -ihv nmap-4.01-1.i386.rpm
不过,实际上这还不是你应该运行的命令。一个更好的选择是
-Uhv
,其中-U
代表“update
(升级)”。为什么-U
比-i
更好呢?因为选项-i
只进行安装,而选项-U
则进行升级和安装。如果软件包在系统中 已经存在,现在正试图在计算机上安装一个更新的版本,-U
选项将执行升级。如果系统中还没有安装过这个软件包,-U
选项会注意到这个 情况,并安装软件包。所以,只使用-U
选项就可以,不管是进行升级 还是安装。
如果你想一次安装多个RPM,只要把它们依次列在命令后面,并 用空格分隔开:
rpm -Uhv nmap-4.01-1.i386.rpm nmap-frontend-4.01-1.i386.rpm
如果有许多RPM
要安装的话,也可以使用通配符。例如,如果在 名为software
的子目录中有20个.rpm
文件,只需要运行以下命令:
rpm -Uhv software/*.rpm
除了在安装内核时,应该使用
-i
选项,在绝大多数情况下,-U
选项都是更好的选择。如果用-U
选项对内核进行升级,新 的内核将不能工作。另一方面,如果用-i
选项安装了一个新 的内核,旧的内核作为备份也仍然在计算机上存在,以防新 内核发生崩溃。
删除基于 RPM
的 Linux
系统中的软件包:
rpm -e [package]
-e
(代表erase
)
为基于 RPM
的 Linux
系统安装软件包及其依赖程序:
yum install [package]
删除基于 RPM
的 Linux
系统中的软件包及其 依赖程序:
yum remove [package]
升级基于 RPM
的 Linux
系统中的软件包及其依赖程序:
yum update
为基于 RPM
的 Linux
系统查找可供下载的软件包:
yum search [string]
yum list available
yum list available | grep gimp
为 Debian
安装软件包: dpkg -i [package]
删除 Debian
中的软件包: dpkg -r [package]
当使用
dpkg -i
安装软件时,需要指定文件名,否则dpkg
没有办法知道你想安装什么。而当使用dpkg -r
删除软件时,需要指定的是 包名,因为安装文件早就不存在了,apt
是通过包名来识别软件的。
为 Debian
安装软件包及其依赖程序: apt-get install [package]
如果想一次安装多个软件包,只需将它们依次都列在命令行上。 例如,如果你想安装sshfs
和shfs-utils
,可以用以下命令:
apt-get install sshfs shfs-utils
只要找到了sshfs
或shfs-utils
的任何依赖包,apt就会询问是否
需要安装它们。嗯,apt就这么简单。
删除 Debian
中的软件包及其依赖: apt-get remove [package]
apt-get remove sshfs
不过,卸载软件包时并不会删除这个包的所有东西,被删除软件 的配置文件还会残留在计算机中.如果你确实想要删除所有东西,则 应该加上–purge选项,如下所示:
apt-get --purge remove sshfs
升级 Debian
中的软件包及其依赖: apt-get upgrade
apt-get update
apt-get upgrade
先运行apt-get update
命令,以便 让你的计算机和apt
仓库保持同步。接着apt-get upgrade
检查本机已 经安装过的软件包与apt仓库可用的软件包是否有任何区别。如果存在区别,apt
就会显示它将要下载和安装的软件包列表。
apt-get update && apt-get upgrade
为基于 Debian
的 Linux
系统查找可供下载的软件包: apt-cache search [packagename]
apt-cache search dvdcss
清除 Debian
中不再需要的安装包: apt-get clean
在使用
apt
下载和安装好软件包以后,.deb
文件将仍然保留在/var/cache/apt/archives/
目录中。时间一长,这些不必要的安装文件可能就会占据大量的磁盘空间。删除这些不需要的.deb
文件,可以 使用apt-get clean
命令。
查看网络接口状态: ifconfig
要快速查看系统的网络设备,以及它们是否正在运行,可以使用 ifconfig
(代表interface configuration
,接口配置)命令和它的-a
(代 表all
)选项。
$ ifconfig -a
ath0 Link encap:Ethernet HWaddr 00:14:6C:06:6B:FD
inet addr:192.168.0.101 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::214:6cff:fe06:6bfd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1257 errors:7557 dropped:0 overruns:0 frame:7557
TX packets:549 errors:2 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:200
RX bytes:195869 (191.2 KiB) TX bytes:95727 (93.4 KiB)
Interrupt:11 Memory:f8da0000-f8db0000
eth0 Link encap:Ethernet HWaddr 00:02:8A:36:48:8A
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:11092 errors:0 dropped:0 overruns:0 frame:0
TX packets:11092 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:982629 (959.5 KiB) TX bytes:982629 (959.5 KiB)
这里列出了3个网络接口:
ath0
(一个无线网卡)、eth0
(一个以太网卡)和lo
[环回(loopback
)接口,详情稍后介绍]。对于每一个网络接口,显示的信息有可连接类型、MAC
(Media Access Control
) 或硬件地址、IP
地址、广播地址和子网掩码,还有接收和发送的数据 包的信息,以及其他信息。如果断开某个连接,相应的许多信息就会 消失。其实,用这种方法可以看到,ath0
和lo
的网络连接是打开的, 而eth0
则断开了:eth0
没有IP
地址,也没有其他重要信息。当然,一种更简单的判断方法是:ath0
和lo
接口信息的第4行是以UP
开始的, 而eth0
则没有这个信息。
先来介绍第三个网络接口。lo
是环回地址,用于访问机器本身。这个环回地址总是由IP地址 127.0.0.1
来代表。基本上,系统需要它才能正常工作。如果能够看到这个接口, 你可能不会为它操什么心。但如果看不到这个接口,你才会去了解这 个接口,因为你的系统有麻烦了。
eth0
是一个以太网卡,就是插入网线的那个网卡。因为当前没有 把网线插到这个网卡上,所以该网卡不是活动的,也没有任何地址: IP
、广播地址以及子网掩码。一台计算机上可能同时具有有线和无线 网络接口,不过通常没有这个必要。
最后是ath0
,这是一个无线PCMCIA
卡。如果某个无线网卡是主要的网络接口,可能就会看到一个名字与eth0
类似的无线网卡接口。 如果该无线网卡是次要的,可能看到的就类似于eth1
。在插入无线网 卡后,K/Ubuntu
系统会自动识别该网卡,并配置系统,以启用这个新网卡,将其标识符设置为ath0
。因为无线网络接口其实就是带有一些 额外的无线向导的以太网接口,所以通过ifconfig
得到的有关ath0
的信息看起来与eth0
的类似(如果启用这个网卡)。
验证计算机是否正在运行和能否接收请求:
ping
ping -c
ping
命令能够向指定的IP
地址发送一种特殊的数据包(ICMP
ECHO_REQUEST
消息)。如果那个地址上的计算机正在监听ICMP
消息,它将用ICMP
ECHO_REPLY
数据包做出响应(确实,防火墙可 以阻止ICMP
消息,使ping
无效,但大多数时候这并不是问题)。如 果ping
响应成功,则意味着两台计算机之间的网络是连通的。
ping www.google.com
如果想给
ping
加一些限制,仅发送一定数量的数据 包,则可以使用-c
选项,后面跟上一个数字。
跟踪数据包在两台主机之间经过的路由: traceroute
执行 DNS
查询: host
DNS
(Domain Name System,
域名系统)的建立使得人们可以更容易地访问因特网上的各种资源。毕竟,计算机可以完美地处理数字, 它所做的每一件事实际上都可以表示为数字,而人类则更擅长记忆和 处理文字信息。一个网站的IP
地址可能是72.14.203.99
,但大多数人都很难记住这么长串数字。而要访问www.google.com
,记忆这个名字就 容易得多了。DNS
基本上就是一个巨大的数据库,记录了72.14.203.99
和www.google.com
之间的对应关系,以及其他数百万的IP
地址和域名的数据。
host www.baidu.com
host www.google.com
也可以做相反的操作,找出与某个IP地址关联的域名:
host 65.214.39.152
配置网络接口: ifconfig
要将eth0
上的以太网卡的IP
地址修改为192.168.0.125
,可以运行以下命令(几乎所有与ifconfig
相关的命令,都需要以root
用户来运行):
ifconfig eth0 192.168.0.125
为了运行某种类型的网络数据包嗅探工具(如强大的Ethereal
), 需要首先将网卡设置为混杂(promiscuous
)模式。在默认情况下, eth0
只监听发送给它的特定数据包,但为了嗅探网络上传递的所有数据包,就需要让网卡监听所有数据包,这就是混杂模式,如 下所示:
ifconfig eth0 promisc # 打开混杂模式
ifconfig eth0 -promisc # 关闭混杂模式(默认关闭)
查看无线网络接口的状态: iwconfig
ifconfig
命令可以显示网络接口的状态,包括无线网卡。然而, 它不能显示关于无线网络接口的全部数据,因为ifconfig
根本不知道 这些信息。要尽可能多地得到与无线网卡相关的数据,应该用iwconfig
代替ifconfig
。
配置无线网络接口: iwconfig
相当长的一段时间以来,有线网络的拓扑结构(例如,星型、总 线型、环型,仅举几个例子)已经为人们所熟知和理解。而无线网络 则引人了一些新的拓扑结构,包括以下几种常见的拓扑结构:
-
Managed
(一个接入点创建一个网络,其他无线设备可以连接 到这个网络,这是一种最常见的无线网络拓扑结构)。-
Ad-Hoc
(两个或更多的无线设备组成一个网络,彼此协同工 作)。 -
Master
(无线设备相当于一个接入点)。 -
Repeater
(无线设备将数据包转发到其他无线设备)。
-
无线网络的拓扑结构还有其他类型,但以上列出的是主要的几种。可以使用iwconfig
设置无线网卡,让它根据新的拓扑结构,以不同的模式来运行。
iwconfig ath0 mode ad-hoc
指定接口以后,再简单地使用mode选项,后面跟着想要使用的
拓扑模式的名称。
记住,这个例子中使用的网卡的接口名称是
ath0
;但你的网 卡接口名称可能是etH1
、wlan0
或其他完全不同的东西。要 查找网络接口的名称,可以只使用iwconfig
命令,如前一节所述。
ESSID
(Extended Service Set Identifier,扩展服务区标识符)是 你已经加入的或想加入的无线网络的名称。在大多数时候,假设无线 网络的其他需求都能满足(例如加密,如果有必要的话),那么任意 的ESSID
名称都可以很好地工作。不过,有些网络可能需要你指定确 切的ESSID
。
iwconfig ath0 essid lincoln
这样就意味着你正在加入一个ESSID为lincoln的无线网络。只使 用essid选项,后面跟着ESSID的名称,就可以了。
越来越多的网络正在使用加密来保护用户之间的通信,以免被 嗅探器捕获所有的网络流量后,从中查看是否存在有用的信息。无线网络中最简单的网络加密形式是
WEP
(Wired Equivalent Privacy,有线等效加密)。虽然这种加密机制被认为非常缺乏安全性,但它的特点是简单。WEP
很容易被知识渊博的攻击者破解,现在已经被更加健壮的WPA
(Wi-Fi Protected Access)协议取代。遗憾的是,在Linux
中的无线网卡上使用WPA
可能非常复杂。此外,虽然WEP
有缺陷,但仍然很通用,有 点安全保护总比没有的好,只是不要奢望用它能提供十全十美的安全保护。
使用DHCP
获得新的网络地址:dhclient
大部分家庭网络和许多商业网络都使用DHCP
(Dynamic Host Control Protocol,动态主机控制协议)为新加入的机器分配IP
地址 和其他关键信息。如果没有DHCP
,在有新加入的机器时,就必须 为其手工设置所有的网络信息;有了DHCP
,只要把新机器连入网 络,再请求DHCP
服务器给它提供一个IP
地址和其他必需的配置信息,接着就可以自动把DHCP
服务器的响应集成到新设备的网络配置中。
以下讨论假设已经用
DHCP
(而不是手工设置)配置好了网络 设备。各种版本的Linux
系统会在不同的配置文件中查找DHCP
信息。基于Debian
的Linux
系统会在/etc/network/interfaces
中查找iface [interface] inet dhcp
。而基于Red Hat
的Linux
系 统 则 在/etc/sysconfig/network-scripts/ ifcfg-[interface]
中查找BOOTPROTO=dhcp
。在这些例子中, 应该将[interface]替换为实际的网络接口名称。要得到更多 的信息,可以在dhcp your-distro
”(your- distro
是你正在使用的Linux
版本名称)。
有时,你的计算机不能在启动时连接到DHCP
服务器,这样就 需要手工发起DHCP
请求。或者你的网络有问题,因而需要一个新 的IP
地址。无论什么原因,dhcilent
命令都会尝试查询任何可用的 DHCP
服务器,向它们请求必要的数据(必须以root
用户来运行 dhclient
)。
# dhclient eth0
Listening on LPF/eth0/00:0b:cd:3b:20:e2
Sending on LPF/eth0/00:0b:cd:3b:20:e2
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 8
DHCPOFFER from 192.168.0.1
DHCPREQUEST on eth0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1
bound to 192.168.0.104 -- renewal in 37250 seconds. # ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0B:CD:3B:20:E2
inet addr:192.168.0.104 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20b:cdff:fe3b:20e2/64 Scope:Link
要释放(或放弃)DHCP服务器分配的IP地址,可以使用-r(代 表release)选项:
# dhclient -r eth0
sit0: unknown hardware address type 776
sit0: unknown hardware address type 776
Listening on LPF/eth0/00:0b:cd:3b:20:e2
Sending on LPF/eth0/00:0b:cd:3b:20:e2
Sending on Socket/fallback
启动网络连接: ifup
其实你一直都在使用ifup
命令,只是没有意识到它而已。启动计 算机,结果发现已经成功连接到因特网,这时就应该感谢ifup
。如果把以太网线插入Linux
计算机背后的网卡接口,几秒钟后你就又可以接收电子邮件,这正是因为ifup
在幕后做了大量工作。本质上,当ifup
检测到网络事件(例如,机器重启、或插入网线)时,它就会开始运行,接着再执行网络配置文件中的指令。
不过,当偶尔遇到网络问题时,就得手工运行ifup命令了。这相 当容易:以root用户登录,在ifcup命令后面输入你想启动的网络接口 的名字,如下所示:
# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
...
# ifup eth0
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0B:CD:3B:20:E2
inet addr:192.168.0.14 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20b:cdff:fe3b:20e2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
...
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
注意,如果
ifup
执行成功,它不会报告任何信息。其实,和大多数Unix
应用程序一样,如果执行成功,ifup
就保持沉默;只有遇到失败或错误时,它才会报告相关的信息。为了检查ifup
是否成功完成,可以使用ifconfig
命令,如前面例子演示的那样。
关闭网络连接: ifdown
# ifup eth0
ifup: interface eth0 already configured
# ifdown eth0
# ifup eth0
显示 IP
路由表: route
当使用SSH(Secure Shell)连接局域网内的其他计算机时(将在 第15章中介绍),计算机是怎么知道如何把数据包限制在LAN内,而 不是把它们发送到路由器,再发送到因特网上呢?当通过浏览器访问 www.ubuntu.com时,Linux系统是如何知道把请求发送到路由,而不是相邻的另一台计算机呢?
答案是:Linux内核通过路由表来保持跟踪这些信息。要查看当前的路由表,只需要在shell
中输入route
。(查看路由表不需要root权 限,而对其进行修改则需要root权限,这是下一节将要介绍的内容。) 如下所示:
route
IP地址由4个八位元组(octet)构成,其格式可以表示为xxx.xxx. xxx.xxx,如192.168.0.124。当从你的机器发送一个数据包时,就会把这个数据包的目标IP地址和路由表中的Destination (目标)列进行比较。Genmask(子网掩码)列用于标识应该检查IP地址4个八位元组中 的哪一部分,并和Destination 列一同决定数据包的目标网络地址。
例如,假设在shell中输入ping 192.168.0.124。子网掩码 (Genmask)255.255.255.0表明只有最后一个八位元组(由0表示的那 个八位组)是重要的。换句话说,当遇到192.168.0.124这样的IP地址 时,只有.124这部分对于将数据包路由到正确的主机地址才是重要 的。向IP地址从192.168.0.1到192.168.0.255(这个网段IP地址的最大 范围)发送的任何数据包都可以匹配Genmask 和 Destination,于是它 们会呆在局域网中,不会转发给路由器。这也就是为什么在 192.168.0.0旁边的Gateway列有一个星号(*)的原因:不需要通过网关(Gateway),因为是局域网本地流量。
另一方面,其他数据包都默认发送到路由器(在这个例子中是 Gateway列的192.168.0.1)。该行的掩码(Genmask列)是0.0.0.0,这 表明任何不匹配从192.168.0.1 到192.168.0.255的目标IP地址都将通过 192.168.0.1进行发送(因为192.168.0.1是网关地址,这是一种特殊情 况)。72.14.203.99、82.211.81.166以及216.23.180.5都匹配0.0.0.0,所以它们必须通过网关访问外网。route
命令提供的路由表的另一个有趣的地方是它的Flags(标志) 列,该列提供关于路由本身的一些信息。标志有几种,但最常见的是 U(表明路由已启动并可用)和G(表明路由使用网关)。从前面的表中 可以看到,两个路由都已经启动,但只有第二个是网关。
修改 IP 路由表: route
route
命令不仅能够用于显示路由表,还可以对它进行修改。不 过,修改时要小心,否则可能破坏网络,使你的计算机上不了网。
假设你的计算机一直与网关连接不畅,任何数据包都不能有效地 离开局域网访问因特网(我的系统曾经真的发生过这种情况)。运行route
命令,确认网关真的是找不着了,然后使用route
命令把网关添 加到路由表中(虽然普通用户可以查看路由表,但对它进行修改则需 要具有root权限)。
# route add -net default gw 192.168.0.1 dev eth0
现在分析一下这个命令。add
表示正在添加一个新的路由(要删 除路由,则用del
)。-net
选项告诉内核,正在添加的目标是一个网络, 在这个例子中是default
目标。gw
表示想使用位于192.168.0.1
的网关对匹配目标(这里是default
,因此使用子网掩码0.0.0.0
)的数据包进行 路由。最后,dev eth0
指定要使用的设备,在这个例子中使用的是eth0
上的以太网卡。
假设除了以太网卡eth0,你还有块无线网卡ath0,想通过该无线 网卡访问局域网10.1.xxx.xxxx(该LAN的网络基地址)中的资源,但 根本不想让这个无线网卡访问因特网。可以使用以下命令增加一条匹 配这些条件的路由规则:
route add -net 10.1.0.0 netmask 255.255.0.0 dev ath0
以上命令先用dev ath0
指定无线网卡,再将子网掩码设置为 255.255.0.0
,以便可以正确地进行路由。
如果以后又想删除这个路由,则使用以下命令:
route del -net 10.1.0.0 netmask 255.255.0.0 dev eth0
解决网络问题
在网络方面,Linux系统通常可以正常工作,但偶尔也会出现问 题。以下给出了一些解决网络问题的基本技巧。
如果网络接口看起来已经启动和运行,但是不能访问因特网,这 时可以先试着ping一下localhost设备(127.0.0.1)。如果ping不通, 就停下来,不要再试了,因为你的系统已经严重损坏了。如果能ping 通,就继续ping一下计算机的外部IP地址。如果ping不通这个外部IP, 就检查一下计算机是否已经启动了网络。如果能ping通这个外部IP, 就再ping一下网络中的其他计算机(假设有其他计算机)。如果没有 成功,就是网络接口出了问题(假设路由器是正常的)检查一下网线 是否插好了。使用ifconfig(如果是无线网卡,则使用iwconfig)检 查一下网络接口的状态,如果必要的话,可以用ifup命令打开网络接 口。之后再试着ping一次。
如果能ping通本地的其他计算机,接下来就ping一下路由器。如 果能ping通网络上的其他计算机,但是不能ping通路由器,这时就应 该用route命令检查路由表(参见14.11节)。如果路由表有找不到的项 目,则补充完整丢失的内容(详情可以参考“改变路由表”)。
如果有一个可以参考的基准,那么诊断和修复问题将会容易 得多。找台网络正常的计算机,运行route命令,保存结果, 这样,如果以后路由表出了问题,需要恢复什么时,也可以 有个参考。
如果能够ping通路由器,试着ping一个你知道在因特网上启动并 正在运行的主机(如www.google.com 或www.apple.com )。如果ping 不通路由器,则尝试再ping一下同一计算机的IP地址。为了在这样的 场合下使用,最好事先把一些常用IP地址记在便条上或是计算机的文本文件中以备后用。
如果能ping通IP地址,但ping不通它的域名,那就是有DNS问题了。如果正在使用DHCP,可以运行dhclient命令(参见14.8节)更 新DHCP服务器提供的DNS信息。如果你没有使用DHCP,那么为了 找到需要的DNS信息,可以查询路由器,也可以向管理员或ISP服务 商咨询,然后以root用户的身份,手工在/etc/resolv.conf中添加新 的DNS信息,如下所示:
nameserver 24.217.0.5
nameserver 24.217.0.55
每行以nameserver作为开始(必须的),后面是想用作DNS的IP 地址。如果路由器支持DNS,而且也知道它的IP地址(假设是 192.168.0.1),那么第一行可以试着写成:
nameserver 192.168.0.1
试着运行ifdown,再运行ifup,看看网络是否正常。如果仍然有 问题,重新开始,这时通常要从硬件着手。所有硬件安装正确吗?所 有硬件插好了吗?在确保这些都正常以后,开始检查软件。最坏的情 况是硬件没有Linux版本的驱动程序。虽然这种情况不多见,而且以 后会越来越少见,但仍然可能碰巧遇到。
但是,无线网卡可能与Linux非常不兼容,因为保守的硬件制造 商并不想帮助Linux开发人员让他们的硬件在Linux系统中工作。为了 避免遇到这些令人头疼的问题,在购买无线网卡之前,最好先查看它 的网站,确保这种网卡在Linux系统中能很好地工作。这方面的一些 优秀网站包括:Madwifi的硬件支持网站(http://madwifi.org/wiki/ Compatibility);Linux无线局域网支持网站(http://linux-wless.passys. nl/),这个网站虽然有些过时,但还是依然有用;还有一个网站
(http://del.icio.us/rsgranne/wireless),经常在这里更新有关Linux和无线 网络连接的书签。对于特定的硬件,推荐使用Netgear WG511T无线 PCMCIA卡。在运行最新版本的K/Ubuntu的计算机上,只需把这种网 卡插入到计算机中,它就马上能工作了。
噢,解决问题的最后一搏:如果能成功ping通IP地址和域名,那
就看到这儿吧。能上网了!
安全登录到另一台计算机: ssh
如果需要将计算机连接到 其他计算机,无论另一台计算机是在地球的另一边,还是就在隔壁房 间,都可以使用ssh。
ssh tom@192.168.0.25
不用密码安全登录到另一台计算机: ssh
假设现在想从pound(用户名为ezra)登录到eliot(用户名为 tom),而且不需要输入任何密码。首先,用以下命令在pound上创建 一个ssh身份验证密钥(authentication key):
ssh-keygen -t dsa
按Enter键,接受密钥要保存到的默认位置,密语(passphrase)为空,此时将提示按两次Enter键。这样就在~/.ssh/id_dsa
文件中创建了一个私钥,在~/.ssh/id_dsa.pub
文件中创建了一个公钥。
现在需要将公钥(不是私钥)从pound传送到eliot上。ssh开发 人员走得比我们要远,他们已经创建了一个程序,让这一操作变得易 如反掌。为了将公钥自动从pound复制到eliot,只需要在pound上输 入以下命令:
ssh-copy-id -i ~/.ssh/id_dsa.pub tom@192.168.0.25
现在试着用ssh 'tom@192.168.0.25'
登录eliot,再检查一下.ssh/ authorized_keys
,确保这次它没有在这个文件中额外添加你不想要的密钥。
在计算机之间安全地传输文件: sftp
如果能够通过ssh
访问某台计算机,那么也一定能够通过SFTP
访问到它。要使用sftp
命令,从pound
(IP
地址为192.168.0.15
,用户名为ezra
)连接到eliot
(IP
地址为192.168.0.25
,用户名为tom
),只需使用以下命令:
sftp tom@192.168.0.25
$ sftp tom@192.168.0.25
Connecting to 192.168.0.25...
sftp>
通过sftp
登录以后,运行的命令就相当标准了。表15-1列出了一 些常见的命令,完整的命令介绍,可以查看man sftp
。
有用的SFTP命令
| 命令|含义|
|:–|:–| cd
| 切换目录 exit
|关闭与远程SSH服务器的连接 get
|将指定的文件复制到本机 help
| 获取与命令相关的帮助 lcd
|将目录切换到本机 lls
|列出本机上的文件 ls
| 列出远程SSH服务器上当前工作目录中的文件 put
| 将指定的文件复制到远程SSH服务器 rm
| 将指定的文件从远程SSH服务器删除
在主机之间安全复制文件: scp
如果你时间紧,但想安全地把一个文件从一台计算机复制到另一 台,scp
(表示“secure copy”)就是需要使用的命令。以下是scp
命令 的基本使用模式:
scp user@host1:file1 user@host2:file2
假设你想使用scp
命令把backup.sh
从pound
(IP地址为192.168. 0.15
,用户名为ezra
)复制到eliot
(IP地址为192.168.0.25
,用户名为 tom
)的/home/tom/bin
目录,如下所示:
scp ~/bin/backup.sh tom@192.168.0.25/home/tom/bin
假设你想换个复制的方向。你仍然在pound上,想把Libby 的几个图片从eliot复制到pound上,而且还要复制到与当前工作目录 不同的另一个目录,如下所示:
scp tom@192.168.0.25:/home/tom/pictures/dog/libby* ~/pix/libby
当需要在计算机之间安全地复制文件时,scp
命令真的很有用。 不过,如果要复制的文件很多,你很快就会发现使scp
还是麻烦。在这种情况下,你可能还是想用SFTP
,或者挂载一个Samba
共享。
安全传输和备份文件: resync -v
rsync
是最酷、最有用的命令之一,很多人每天都要依赖它(就像 我一样)。它是干什么的呢?它的用途多得数不清(这里再说一遍“关 于这个命令可以写本书!”),但本书主要介绍一个非常强大、必需的功能:有效而安全地备份文件,同时付出最少的网络流量。
假设需要在每天半夜从名为coleridge
的计算机上(用户名为 sam
)将2 GB
的文件备份至一台名为wordsworth
的计算机上(用户名 为will
)。如果没有rsync
,每天夜里你就会看到这2 GB
文件的传输, 即使是在连接速度很快的网络中,这也是不小的数据传输量。不过, 有了rsync
,这一传输一小会儿就可以完成。为什么呢?因为在rsync
备份这2 GB
的文件时,它只传输所有2 GB
数据的文件中发生过变化的那些文件。如果在过去的24小时内只有几百KB字节的数据发生了 变化,那么这就是rsync
命令所有要传输的内容。如果发生变化的数 据有100 MB
,rsync
命令也只复制这100 MB
的数据。不管在什么情况 下,复制的数据量会大大少于2 GB
。
这个命令是这样来用的,从coleridge
计算机上运行,将 documents
目录的所有内容传输到wordsworth
计算机的一个备份驱动 器上。先看看这个命令和它的运行结果,接着仔细研究一些选项的含 意[为了可读性,第一个命令使用了长选项格式,而不是单个字符; 第二个命令的选项则使用了单个字符(如果有可用的短选项),以便 比较],如下所示:
# 长选项
rsync --verbose --progress --stats –recursive --times --perms --links --compress --rsh=ssh --delete /home/sam/documents/ will@wordsworth:/media/backup/documents
# 等效的短选项
rsync -v --progress --stats -r -t -p -l -z -e ssh --delete /home/sam/documents/ will@wordsworth:/media/backup/documents
# (等效的更短命令)选项合并
rsync -vrtplze ssh --progress --stats –delete /home/sam/documents/ will@wordsworth:/media/backup/documents
输出类似如下:
building file list ...
107805 files to consider
deleting clientele/Linux_Magazine/do_it_yourself/13/ gantt_chart.txt~
deleting Security/diebold_voting/black_box_voting/bbv_chapter-9.pdf
deleting E-commerce/Books/20050811 eBay LIL ABNER DAILIES 6 1940.txt
Security/electronic_voting/diebold/black_box_voting/bbv_chapter-9.pdf
legal_issues/free_speech/Timeline A history of free speech.txt E-commerce/2005/Books/20050811 eBay LIL ABNER DAILIES 6 1940.txt
connectivity/connectivity_info.txt
[Results greatly truncated for length]
Number of files: 107805
Number of files transferred: 120
Total file size: 6702042249 bytes
Total transferred file size: 15337159 bytes
File list size: 2344115
Total bytes sent: 2345101
Total bytes received: 986
sent 2345101 bytes received 986 bytes 7507.48 bytes/sec
total size is 6702042249 speedup is 2856.69
现在看看向计算机发出的命令.命令的首部和尾部比较容易理解:命令以rsync
作为开始,后面跟着选项,接着是复制文件的源目录(coleridge计算机上的/home/sam/documents/),随后是复制文件的目标目录(wordsworth计算机上的/media/backup/documents)。在介绍各个选项之前,先重点看看源目录和目标目录的指定方式,这里需要理解清楚,否则会造成实际的损害。
想复制的是coleridge上documents目录中的内容,但不包括目录本身,所以源目录应该使用documents/
,而不是documents
。在/home/sam/documents/中,documents后面的斜线(“/”字符)是在告诉rsync 命令:想把那个目录的“内容”复制到wordsworth上的documents 目录中;如果只用documents,rsync命令复制的就是目录及其内容, 结果是将源目录复制到了wordsworth计算机上的/media/backup/ documents/documents这个目录中。
斜线只在源目录中重要,在目标目录中是否使用斜线则无关紧要。
有个选项在前面的例子中没有使用,但是当想先估计一下rsync
命令将如何构建备份过程时,使用这个选项是个好主意:-n
(或 --dry-run
)。如果命令中包含了这个选项,在rsync
运行时,它并不会真正地删除或复制任何东西。如果你的选择可能会导致删除重要的文件,这个选项就是救命的稻草了。在提交rsync
命令以前,尤其 是当包括了--delete
选项时,最好是自己帮自己的忙,执行一个演练操作。
现在轮到介绍前面例子中的选项了。
-
-v
(或--verbose
)选项, 连同--progress
,它们命令rsync
随时报告它正在进行的操作的细节。 - 在
rsync
结果的末尾显示的那些元数据(传输文件的数量和大小 及其他有趣的数据),它们之所以出现,是因为在命令中包含了--stats
选项。 -
-r
(或--recursive
)选项在其他命令中已经出现多次了,此处它的作用和在其他地方是一样的。加上这个选项后,命令就不会只处理 当前目录,它会遍历所有的子目录,处理路径上找到的所有东西。因为想复制整个documents
目录及它的所有内容,所以需要使用-r
选项。 -
-t
(或--times
)选项让rsync
在传输文件时保留文件的修改时间。如果没有包含这个选项,rsync
就不能判断它以前传输过什么,下一次运行命令时,所有文件会再复制一次。这大概不是你想要的行为, 因为它完全背离了rsync
的初衷,所以一定要记得包含-t
选项。 - 第7章中讨论的权限,这里又再次出现。
-p
(或--perms
)是告诉rsync
要更新目标文件的权限设置,让它们与源文件匹配。这可以让 备份文件与源文件尽可能保持一致。 -
-l
(或--links
)选项就会在目标目录中重建软链接。不必复制实际的文件(这明显不是创建软链接的人的原本意图),只需要复制指向实际文件的链接,这样再一次又 保持了源目录的原始状态。 - 即使具有快速的网络连接,使用
-z
(或--compress
)选项也是个 好想法,因为这时rsync
将使用gzip
来压缩传输的文件。在网速慢的 连接中,必须使用这个选项;在快速的连接中,使用这个选项同样也 能节省更多的时间。 - 为了安全,应该使用
-e=ssh
/(貌似也可以-e=rsh
)(或--rsh=ssh
)选项,告诉rsync用ssh 对它传输的数据进行加密。 - 最后一个要介绍的选项是
--delete
。如果你正在创建文件的镜像,显然一定想让镜像与源文件尽可能保持精确。这意味着在源文件中已经被删除的文件,也同样要在目标文件中删除。但这也意味着,你可能意外地删除些原本想保留的东西。如果准备使用--delete
选项(估计你会用的),记得一定先用-n
(或--dry-run
)选项演练一下(在rsync
选项介绍的一开始讨论的那个选项)。
特别注意:
-e
貌似不能单独使用,需要写成-e=ssh
。后面必须指定加密方式!
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输 # 我备注,这个意思就不太对了
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息
# 将 /home/bf28/mtk_7.1_6739_bsp/ 中的内容传输到 /home/pycat/codes/gm6739bsp 中
rsync -n -z -v --stats --progress -r -t -p -l --delete /home/bf28/mtk_7.1_6739_bsp/ pycat@192.168.59.6:/home/pycat/codes/gm6739bsp
# 加密压缩传输:-e=ssh
rsync -n -z -v --stats --progress -r -t -p -l -e=ssh --delete /home/bf28/mtk_7.1_6739_bsp/ pycat@192.168.59.6:/home/chengguibao/codes/gm6739bsp
如果想真正保证数据的安全,应该在周期性的
cron
作业中设置rsync命令自动运行。例如,创建一个名为backup.sh
的文件 (~/bin是保存这个文件的好地方),在其中输入前面已经用过
的命令,如下所示:
rsync -n -z -v --stats --progress -r -t -p -l -e=ssh --delete /home/bf28/mtk_7.1_6739_bsp/ pycat@192.168.59.6:/home/chengguibao/codes/gm6739bsp
用chmod让这个文件成为可执行的:
$ chmod 744 /home/scott/bin/backup.sh
接着将以下几行命令添加到一个名为cronfile
的文件中(也可以将这个文件放在~/bin目录中):
# backup documents every morning at 3:05 am (这是一句注释。)
05 03 * * * /home/scott/bin/backup.sh
第一行是段注释,解释了这一定时任务的目的,第二行告诉cron在 每天夜里的3:05 a.m自动运行/home/scott/bin/backup.sh
。
现在把这个定时任务加到cron,如下所示:
$ crontab /home/scott/bin/cronfile
现在再也不必为备份文件担心了。它是全自动执行的,只要确保计算 机通宵开着就行!
非交互式地下载文件: wget
网络就像是一个堆满了图片、电影和音乐文件的丰富宝藏,可供 人随时下载。问题是对于一个有200多首MP3的文件集,如果让你逐 一手工下载每个文件,你很快就会烦了,心情变得糟糕,不断唉声叹 气。wget这个命令就是用于无干扰地下载多个文件和Web网站。只要 一个操作来设置好命令,它就会高高兴兴地下载指定的东西,可能会 持续好几个小时,一直到全部下载完。
当然,最难处理的还是如何建立这个命令。wget也是一个功能超 级强大的程序,详细介绍完它的方方面面真得又够写一整本书了,所 以这里没有展示它的所有功能,只重点介绍用它可以做的两件事:下载整个一组文件(本节介绍的内容),以及下载整个网站(下一节将 要介绍的内容)。
如何下载这些位于不同目录中的具有不同文件名称的所有MP3文件。答案就是wget
。
# 下载百度图片[祁同伟](可以下载,但是效果不太对。有反爬虫机制)
wget -r -l2 -np -w 5 -A.jpeg -R.html,.gif http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E7%A5%81%E5%90%8C%E4%BC%9F
- wget的-r(或–recursive)选项会沿着链接,深入到各个子目录中搜索文件。
- -l2(或–level=[#])选项不但重要,而且也很微妙。它用于告 诉wget在取回文件时最多应该递归多深。小写的字母l在这里代表 “level(层)”,数字表示wget应该向下搜索的最大深度。
- 避免下载过多文件的一种办法是使用-np(或–no-parent)选项, 它可以阻止wget递归到父目录。
- -w(或–wait=[#])选项可以在每两个文件的下载 之间引入一个短暂的时间间隔。这有助于当连续不断地从服务器下载 文件时,避免对服务器产生过重的负担。在默认情况下,wget下载间 隔数字的单位是秒;如果需要,也可以在数字后面添加一个m,以指 定分钟,或是用h指定小时,甚至用d来指定天数。
- -A(或–accept)用于告 诉wget:你只想下载某种类型的文件,而其他文件则不需要下载。A 代表accept(接受),后面跟着需要下载的各种文件的后缀名[用逗号
(,)分隔]。 - 相反,-R(或–reject)选项则是告诉wget不想下载的文件: HTML和GIF文件。
非交互式地下载整个网站:wget
如果你想备份整个网站,或是下载别人的网站,也得用wget。在 上一节用wget抓取回了单个的文件,此外,还可以用它获取整个网站 的内容。
假设正在浏览www.neato.com这个网站,现在位于www.neato. com/articles/index.htm这个链接上。你想复制/articles目录下的所有 东西,而且并不想要这个网站上的其他东西。以下命令就可以完成这 个任务:
wget -E -r -k -p -w 5 –np http://www.neato.com/articles/index.htm
也可以把各个选项组合起来使用,如下所示:
wget -Erkp -w 5 –np http://www.neato.com/articles/index.htm
- 使用-E(或–html-extension)选项,wget就会对每个页面进行 转换,让它们均以.html结尾。
- 下载网站可能会引发一些其他问题,不过,幸好可以使用正确的 wget选项来避免它们。当在计算机上打开用wget下载的页面时,页面 上的链接可能会不起作用,这样就不能在页面之间进行导航。通过指 定-k(或–convert-links)选项,就告诉wget重写页面上的链接, 以便让它们能够在计算机上起作用。这个选项修复的不仅是指向页面 的链接,还会修复指向图片、CSS(Cascading Style Sheet,层叠样式 表)等文件的链接。用一下这个选项,你一定会对它感到满意。
- 说到CSS和图片,有必要说一下为什么需要使用-p(或—page -requisites)选项。为了能够让Web页面正常显示,Web开发人员可 能需要指定与页面的HTML一同使用的图片、CSS和JavaScript文件。 -p选项会要求wget下载为了正常显示网页而需要的任何文件。有了这 个选项,在把页面下载到本机后,打开页面就能看到原来在Web中看 到的所有东西。如果没有这个选项,可能最终得到的只是一个不可查 看的文件。
顺序下载多个文件和因特网资源:curl
curl
在指定要下载的链接时能够支持URL的序列或集 合,而wget
则不能这样;同时,wget
支持递归下载,而curl
则没有这个功能。
下载多个文件:
$ curl -O http://www.wbez.org/ta/[1-10].rm
$ curl -O http://www.wbez.org/ta/{one,two,three}.rm
-
-O
(或--remote-name
)选项是必需的。如果不使用它,curl
会将下载的信息输出到STDOUT
,结果终端显示窗口内很快就塞满了一堆 没有用的语言符号。-O
选项的作用就是让curl
把它下载的东西输出到一个文件,并用正在下载的文件名来作为本地文件的名称。
Samba是世界上最重要的开源项目之一,因为它让Linux
(以 及其他基于Unix
的机器,如Mac OS X
)能够使用SMB
(Server Message Block)——所有Microsoft Windows
机器上使用的联网协议。
有了Samba
,Unix
机器就能够连接和装载Windows
机器上共享的资源,能够将文件打印到与Windows
机器相连的共享打印机。Unix
机器也可以安装基于Samba
的打印机和文件共享,而Windows
机器则能够连接 和使用它们。事实上,Samba
非常有用,以至于不必需要相应的 Windows
机器。在Linux
机器组成的网络中,可以选择用Samba
实现文件和打印机共享,因为它工作得相当出色。
查找工作组的主浏览器:
nmblookup -M [Master Browser]
nmblookup -S [NetBIOS name]
nmblookup -A [IP address]
要查询网络中的Master Browser,可以运行带有-M(或–master- browser)选项的nmblookup命令,最后再跟一个“-”,这个字符基本 上表示“给我找一个Master Browser”。
nmblookup -M -- -
nmblookup -SA 192.168.1.151
NetBIOS 名称和 IP 地址的查询和映射: nmblookup -T
nmblookup -T "*"
nmblookup
是找到正在通过Samba共享文件和打印机的任何计算 机的快速方法。在该命令后面添加-T选项,后面再跟上” * “(对,这 里必须使用双引号来告诉shell:不能将星号*作为代表当前工作目录 中所有文件的通配符)。
列出机器上的 Samba
共享: smbaclient
smbclient -L ELIOT -U scott
smbclient -L localhost
用类似 FTP 的客户端访问 Samba 资源: smbclient //server/share -U username
smbclient //eliot/documents -U scott
挂载 Samba 文件系统:
smbmount
smbumount
LAST
很多Linux用户都愿意假装微软不存在,但实际上又不得不承认 还生活在Windows的世界中。Samba 让这些不同系统共存变得相当简 单,它让Linux用户可以访问Windows机器上的资源,也让其他操作系 统的用户可以访问Linux机器上的资源。微软可能不很喜欢Samba,但 Samba确实是一种成熟、稳定、功能强大的技术,而且由于Samba是 开源的,因此它非常有助于将全世界的计算机更紧密地连接在一起。 无论是在家庭,还是在商业领域,Samba都有助于减少对Windows服 务器的需求,用某位女前辈的话来说,Samba真是个好东西!
写在最后,以上内容,除了一个链接引用,其他的全部内容全部来自《Linux命令速查手册》,我只是记录了这里面的内容。蟹蟹。~