仅个人想法,会持续不间断更新和改进。
繁忙的世界中,偶尔也需要放空一下自己,找寻一下自我。
简而言之,就是要解压一下。
那么在Linux的世界里,也是有不少的解压方法的。
Linux的tar命令可以用来压缩或者解压缩文件。
官方定义为:
tar
- an archiving utility
$ tar optionA [optionsB] filename
使用该命令时,optionA选项是必须要有的,它告诉tar
要做什么事情,optionsB选项是辅助使用的,可以选用。
其中optionsA主要为:
-c
创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。相当于打包。-x
从档案文件中释放文件。相当于拆包。-t
列出档案文件的内容,查看已经备份了哪些文件。不过需要注意的是,这三个参数仅仅能存在一个。
辅助选项常用的为:
-z
:是否同时具有 gzip 的属性,有的话压缩文件格式为:filename.tar.gz-j
:是否同时具有 bzip2 的属性,有的话压缩文件格式为:filename.tar.bz2-v
:压缩的过程中显示文件,这个基本都需要带上-p
:使用原文件的原来属性(属性不会依据使用者而变)--exclude FILE
:在压缩的过程中,不要将 FILE 打包!接下来的命令为把a,b,c,d压缩到文件test.tar.gz中。
$ tar czvf test.tar.gz a b c d
a
b
c
d
接下来的命令将列出压缩文件的内容,但是不解压,所以可以先确定,再解压不迟
$ tar tzvf test.tar.gz a b c d
-rw-rw-r-- oper/oper 12 2010-05-24 22:51 a
-rw-rw-r-- oper/oper 18 2010-05-24 22:51 b
-rw-rw-r-- oper/oper 15 2010-05-24 22:51 c
-rw-rw-r-- oper/oper 28 2010-05-24 22:51 d
接下来就可以解压操作了。
$ tar zxvf test.tar.gz
a
b
c
d
Linux zip
命令的功能是用于压缩文件,解压命令为unzip
。
通过zip
命令可以将很多文件打包成.zip格式的压缩包,里面会包含文件的名称、路径、创建时间、上次修改时间、权限等信息,与tar
命令相似。
对于类似文本文件而言,压缩比基本可以达到2:1到3:1.
官方的定义为:
zip - package and compress (archive) files
zip的参数超级的多,各种设置也是很巧妙,不过常用的就几个,其他的放在后面再说。
$ zip [-aABcdDeEfFghjklLmoqrRSTuvVwXyz!@$] [--longoption ...] [-b path] [-n suffixes] [-t date] [-tt date] [zipfile [file ...]] [-xi list]
-r
或 --recurse-paths
:遍历整个目录 for example:
-j
或 --junk-paths
: 仅保存文件名,而不保存路径。默认情况下zip将保存整个路径
将指定目录及其内全部文件都打包成zip格式压缩包文件:
$ zip -r backuptest.zip /etc
adding: etc/resolv.conf (stored 0%)
adding: etc/fonts/ (stored 0%)
adding: etc/fonts/conf.d/ (stored 0%)
adding: etc/fonts/conf.d/65-0-wqy-zenhei-sharp.conf (deflated 88%)
adding: etc/fonts/conf.d/59-liberation-mono.conf (deflated 57%)
adding: etc/fonts/conf.d/57-paratype-pt-sans.conf (deflated 66%)
adding: etc/fonts/conf.d/59-liberation-sans.conf (deflated 74%)
adding: etc/fonts/conf.d/65-0-ttf-arphic-uming.conf (deflated 87%)
adding: etc/fonts/conf.d/65-1-vlgothic-gothic.conf (deflated 74%)
adding: etc/fonts/conf.d/65-0-lohit-nepali.conf (deflated 57%)
adding: etc/fonts/conf.d/20-unhint-small-dejavu-sans.conf (deflated 43%)
adding: etc/fonts/conf.d/61-urw-d050000l.conf (deflated 71%)
adding: etc/fonts/conf.d/57-dejavu-sans.conf (deflated 77%)
...
zip
还支持通配符的表达,比如将当前工作目录内所有以.jpg为后缀的文件打包:
$ zip -r backuptest.zip *.jpg
adding: test0.jpg (deflated 56%)
adding: test10.jpg (deflated 56%)
adding: test12.jpg (deflated 56%)
adding: test14.jpg (deflated 56%)
adding: test16.jpg (deflated 56%)
adding: test18.jpg (deflated 56%)
adding: test20.jpg (deflated 56%)
adding: test2.jpg (deflated 56%)
adding: test22.jpg (deflated 56%)
adding: test24.jpg (deflated 56%)
adding: test26.jpg (deflated 56%)
adding: test28.jpg (deflated 56%)
zip
默认情况下会保存路径信息,如果加上-j将不保存路径信息,而仅仅保存文件。
这个情况可以在希望把同一类文件放在一起时比较有用。
$ zip -j foo foo/*
Linux unzip
命令用于解压缩zip文件。
官方的定义为:
unzip - list, test and extract compressed files in a ZIP archive
$ unzip file.zip
unzip
只需在命令后跟上要解压的文件名,如 file.zip
,将该压缩文件解压缩到当前目录。
如果需要指定解压缩的目标目录,可以使用 -d
参数:
$ unzip archive.zip -d /path/where/to/extract
这样就会把压缩文件解压到指定的目录中。
如果压缩的文件巨大,而不想解压其中的某些,可以用下面的命令
$ unzip file.zip -x data
这个命令的意思为,解压file.zip,但是不把里面的data解压。
gzip
用于对后缀为gz
文件进行解压:
$ gzip -d data.gz
这个命令将解压examplefile.gz
,并且在当前目录下生成一个名为data
的解压后的文件。
但特别需要留意的是,这个操作会删除源文件,会删除源文件,会删除源文件。
所以如果你想保留原始压缩文件,一定记得使用-k
选项:
$ gzip -dk data.gz
这会保留原始的data.gz
文件,并生成一个解压后的data
文件。
仅个人想法,会持续不间断更新和改进。
Linux系统中的命令最美妙也最危险。
如果几个操作系统(Windows/MacOSX/Linux)的危险水平有段位,那么Linux应该首当其冲。
如若使用不当,轻则伤筋动骨摔键盘,重则历年数据烟消云散。
本文本着大家熟悉其危险性,尽量避免一些误操作。
为什么Linux最危险呢?那主要是因为root 用户对系统具有绝对的操作权限,可以执行任何命令、任何操作,所以会产生任何后果。
所以在以 root 用户身份进行操作时,尤其一定要特别小心。
如果不确定命令的执行结果,可以在虚拟环境线操作一下,再在生产环境执行。
如果单纯按照熟悉或者段位来讲,rm
首当其冲,轻则丢点数据,重则系统崩溃。目前看到的很多删库跑路的程序员大多就因为这个。
特别是
rm -rf /
,不要执行,不要执行,不要执行,重要的事情说三遍,这个命令会导致整个系统被毁坏
随后的应该就是chmod和chown,特别是对于重要的数据,一般建议对于新手而言,仅仅具备只读权限即可;
接下来的dd以及mkfs命令,可能不太常见,但是也具备一定的杀伤力。
fork炸弹暂且不表,总之随便来的命令不要随便执行。
rm
命令用于删除文件或者目录。官方定义为:
remove files or directories
删除当前目录下的所有文件及目录,命令行为:
$ rm -r *
文件一旦通过rm命令删除,则无法恢复,所以必须格外一定切记小心地使用该命令。
因为发生过很多欲哭无泪的故事。。。
主要的痛点就在如果是在root账户权限下,rm无所不能呀
dd
这个命令一直没有弄明白缩写的含义,这个命令应该归到Linux炫技里面,因为我也是很晚才用到,不过有些功能还可以尝试一下。
官方含义为:
dd
- convert and copy a file
从官方含义来看,是不是定义为
cc
比较合适,_
dd
命令用于复制文件,转换或者格式化文件,这里也是危险所在,如果使用dd对设备进行低级别的复制和转换操作时,如果命令行参数错误,可能导致数据丢失。
比如 dd if=/dev/random of=/dev/sda
:这个命令将设备(例如硬盘)的内容重写为随机数据,导致设备上所有数据的永久丢失。
万万不要制定了错误的硬盘,切记切记。
这个命令格式化的很彻底。
在root账户下,可以直接立即关闭系统,很容易造成数据没有保存,一般需要延迟个1分钟,不要使用shutdown -h now
来立即关闭系统。
> file
:这个命令会清空文件内容。若对关键的系统文件使用这个命令,可能会破坏系统。
桃花谢了春红,太匆匆,无奈朝来风雨晚来风。
时光只解催人老,不信多情,长恨离亭,泪滴春衫酒易醒。
时间就在指缝间,悄然的离去了。
date命令可以用来打印显示亦或者更改日期和时间。
看看官方的定义如下:
date - print or set the system date and time
用法如下:
$ date [OPTION]... [+FORMAT]
$ date [-u | --utc| --universal] [MMDDhhmm[[CC]YY][.ss]]
较常用的OPTION为:
-R
: 显示时区-u, --utc, --universal
:打印或者设置世界协调时-d, --date=STRING
:显示STRING的时间date 命令默认情况下为CST时区,
$ date
Mon Jun 5 15:11:44 CST 2014
如果加上 -R
参数就可以带上时区,比如我们的东八区
$ date -R
Mon, 05 Jun 2014 15:15:25 +0800
选项-u, --utc, --universal
可以显示世界协调时
$ date -u
Mon Jun 5 07:15:46 UTC 2014
$ date --utc
Mon Jun 5 07:15:48 UTC 2014
$ date --universal
Mon Jun 5 07:15:55 UTC 2014
可以通过不同的参数来格式化日期,这里需要注意的是:不同的大小写代表的是不同的含义
比较常用的日期和时间如下:
# 显示年月日时分秒
$ date +%Y-%m-%dT%H:%M:%S
2013-01-17T18:01:08
# 或者 下面一样的效果
$ data +%FT%T
2013-01-17T18:02:12
Linux time
命令的用途,在于测量指定命令消耗的时间。
最常用的在于大概评估一个程序的运行时间。
这个命令很容易给人的印象是与date混淆起来
官方定义为:
time - time a simple command or give resource usage
可以给出包括系统的粗略时间。
$ time [options] command [arguments...]
参数:
- 可以认为没有参数
会显示程序或命令执行的消耗时间
$ time ls /var
account crash games lib log ......
real 0m0.014s
user 0m0.003s
sys 0m0.010s
$ time ps -aux
root 295490 0.0 0.0 0 0 ? S Feb20 0:10 [ldlm_cb00_019
root 297717 0.0 0.0 0 0 ? S< Jan29 0:04 [kworker/58:1H
root 304801 0.0 0.0 0 0 ? S Mar19 0:00 [kworker/1:1]
root 311110 0.0 0.0 0 0 ? S Mar20 0:00 [kworker/66:0]
root 313146 0.0 0.0 0 0 ? S Mar20 0:01 [kworker/73:2]
root 313461 0.0 0.0 0 0 ? S< Jan29 0:00 [kworker/44:2H
root 313914 0.0 0.0 0 0 ? S Feb21 0:10 [kworker/9:2]
root 314118 0.0 0.0 0 0 ? S Feb21 3:34 [kworker/18:1]
root 315801 0.0 0.0 0 0 ? S Mar20 0:00 [kworker/79:2]
real 0m0.180s
user 0m0.019s
sys 0m0.114
唯一需要留意的是上面的三个含义:
Linux sleep
命令可以用来将目前动作延迟一段时间。
sleep
的官方定义为:
sleep - delay for a specified amount of time
或许你觉得计算机太累,让它稍事休息,亦或许过个个把钟头需要喝杯水,此时sleep
就有点小作用了。
其用法如下:
$ sleep [--help] [--version] number[smhd]
除了帮助和版本信息,基本没有参数了。
其中的number是必须的,也就是sleep多久的数字,默认为s
秒。其他的几个含义为:
s
second 秒m
minute分钟h
hour 小时d
day 天工作太累了,学习太累了,躺着太累了,休息5分钟
$ sleep 5m
$ sleep 1h
当然,sleep
也是支持时分秒搭配使用的,如下所示:
$ sleep 1h 2m 3s
将会sleep
1个小时2分钟3秒。
当然也可以做个循环计时器,通过sleep 1
$ echo "five" && sleep 1 && echo "four" && sleep 1 && sleep 1 && echo "three" && sleep 1 && echo "two" && sleep 1 && echo "one" && echo "Stop"
sleep
在程序里面使用比较频繁,特别是单片机的走马灯等。而Linux的sleep
,也是比较常与bash脚本来配合使用,如下:
#!/bin/bash
echo -e "start to sleep 15 seconds......"
sleep 15
echo -e "continue to run program......"
./program
仅个人想法,会持续不间断更新和改进。
在Linux世界中,为了更加高效地浏览和定位文件,需要一些常用的目录导航命令。
… note::
月桥花院,琐窗朱户,只有春知处。
宋 辛弃疾《青玉案·元夕》
cd
命令应该是除了 ls
命令外用的最多的命令了。除非你大门不出二门不迈,做个大家闺秀。
cd
命令的含义为
cd - change directory
可以让我们访问不同的文件夹。
最简单的用法为:
$ cd /the/path/you/want/to/go/
接下来说一些技巧,让效率加倍。
让cd命令对参数大小写不敏感
如果你需要同时显示大写和小写的目录名(即便是你给的参数只是小写的),执行下面的bind
命令,此时就可以避免Linux
和linux
的尴尬。
$ bind "set completion-ignore-case on"
想要进入刚才进入的地方(目测没有很多人再用,但是真的很好用)运行:
$ cd –
需要快速地回到你的家目录,输入cd
即可,这里其实不用一级一级的进入
$ cd
这个需要你有root权限
cd ~username
进入username的家目录。
这些是一些比较基础和入门的,还有一些高级一点的,这些技巧可能用的比较少,不过也是很有帮助的。
变量CDPATH定义了目录的搜索路径:
$ export CDPATH=/the/path/you/add/:/another/path/
现在,不用输入cd /the/path/you/add/hello/
这样长了,我可以直接输入下面的命令进入 /the/path/you/add/hello/
:
$ cd html
这个命令目测,用的人不多,其实比较有用,且有效。
$ cd !$
表明的意思是将上一个命令的参数作为cd的参数来使用。
使用shopt -s cdspell
可以自动修正cd
时拼写错误的目录名。
如果你在输入时经常犯些错误,这个命令是很有用的。详见以下示例:
# cd /etc/mall
-bash: cd: /etc/mall: No such file or directory
# shopt -s cdspell
# cd /etc/mall
# pwd
/etc/mail
注: 当我错误的把mail敲成了mall,用这个命令mall就自动被换成了mail
… note::
寻寻觅觅,冷冷清清,凄凄惨惨戚戚。
宋 李清照《声声慢·寻寻觅觅》
如果linux
命令来个排名,ls
命令应该是最常用的命令,除非你像黄蓉的母亲,有过目不忘的本领,惹得黄药师抱憾终身。
ls
命令是list
的缩写,通过ls命令,我们可以查看目录的内容,确定各种重要文件和目录的属性。
ls [参数] [路径]
如果不加任何参数,默认列出当前目录的内容。
$ ls /etc/sysconfig/network-scripts
ifcfg-em1
ifcfg-em2
ifcfg-em3
ifcfg-em4
....
-l 就是使用long listing format长格式,来显示更多的内容信息。
$ ls -l /etc/sysconfig/network-scripts
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
......
如果希望看到最近创建的文件,就需要用到-t参数了。
$ ls -lt /etc/sysconfig/network-scripts/
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
...
如果希望删除很早以前的文件,看到最早创建的文件,就需要用到-r参数了。
$ ls -ltr /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
$ ls -lS /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
pwd
命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径。
官方定义为:
pwd - print name of current/working directory
所以pwd
是Print Working Directory第一个字的缩写。
唯二需要了解的参数如下:
-L
, --logical
:打印逻辑路径,与pwd
一致-P
, --physical
:打印物理路径,这里可以从超级链接直达原处此时比如我们进入一个目录,然后在打印出来,如下:
$ cd /etc/sysconfig/network-scripts/
$ pwd
/etc/sysconfig/network-scripts
可以看到pwd将输出完全路径
比如如下:
$ pwd
/opt/test
$ ls -l
总用量 1
lrwxrwxrwx 1 root root 14 Jan 15 2012 dir -> source/dir
drwxrwxrwx 1 root root 14 Jan 15 2012 source
可以看到此时的路径在/opt/test/里面有两个目录source和dir,其中dir链接到source里面的dir。
接下来对比一下-L和-P的区别。
$ cd dir
$ pwd
/opt/test/dir
$ pwd -L
/opt/test/dir
$ pwd -P
/opt/test/source/dir
从上面的输出可以发现,-P
参数会显示文件最原始的路径;而-L
则是逻辑上的路径。
Linux tree
命令以树状图列出目录的内容。
执行tree
指令,它会列出指定目录下的所有文件,包括子目录里的文件。
官方定义为:
tree
- list contents of directories in a tree-like format.
使用方法为:
$ tree [-acdfghilnpqrstuvxACDFQNSUX] [-L level [-R]] [-H baseHREF] [-T title] [-o filename] [--nolinks] [-P pattern] [-I pat‐
tern] [--inodes] [--device] [--noreport] [--dirsfirst] [--version] [--help] [--filelimit #] [--si] [--prune] [--du]
[--timefmt format] [--matchdirs] [--fromfile] [--] [directory ...]
参数比较多,也比较复杂。其中常用的选项为:
-d
显示目录名称而非内容。-D
列出文件或目录的更改时间。
默认显示当前目录的信息,比如tree和tree .的含义一样。命令有如下输出结果:
$ tree
.
├── a
├── aa
│ ├── aab
│ ├── aac
│ ├── aad
│ └── aae
├── b
├── bb
│ └── bbb
├── c
├── d
├── e
└── f
2 directories, 11 files
$ tree -d
.
├── aa
└── bb
$ tree -D
.
├── [Apr 7 22:34] a
├── [Apr 7 22:37] aa
│ ├── [Apr 7 22:35] aab
│ ├── [Apr 7 22:35] aac
│ ├── [Apr 7 22:35] aad
│ └── [Apr 7 22:35] aae
├── [Apr 7 22:34] b
├── [Apr 7 22:39] bb
│ └── [Apr 7 22:39] bbb
├── [Apr 7 22:34] c
├── [Apr 7 22:34] d
├── [Apr 7 22:33] e
└── [Apr 7 22:33] f
2 directories, 11 files
默认情况下tree可能没有安装,可以通过
apt
/yum
install tree来安装。
仅个人想法,会持续不间断更新和改进。
这次介绍一些好玩有趣的命令,不过说实话,实用性倒不是很大,纯粹好玩,给单调的命令行界面增加了一些童趣和欢乐。
发现这个命令是在输入ls
命令的时候,一不小心敲反了,直接命运的小火车开始跑了起来。
sl
是一个 “Steam Locomotive” 的缩写,它会显示一个老式的蒸汽火车在终端中穿梭。
$ sl
( ) (@@) ( ) (@) () @@ O @ O @ O
@)
______ ___________
\__I_I_____===__|_________|
______/ | | =|___ ___| _________________
| | | ||_| |_|| _| \_____A
__--------------------| [___] | =| |
__|_____/[][]~\_______| | -| |
-I_____I [][] [] D |=======|____|________________________|_
=====O=====O\ ____Y___________|__|__________________________|_
|| || |_____/~\___/ |_D__D__D_| |_D__D__D_|
/ \__/ \__/ \_/ \_/ \_/ \_/ \_/
在Linux的世界中,figlet是一个神奇的命令,可以将文字艺术化.
特别适合作为标题、口号或者问候语,还有很多软件程序的招呼语,也可以用这个来实现。
比如:
$ figlet HELLO
_ _ _____ _ _ ___
| | | | ____| | | | / _ \
| |_| | _| | | | | | | | |
| _ | |___| |___| |__| |_| |
|_| |_|_____|_____|_____\___/
cowsay
cowsay
顾名思义就是一头牛为你加持,一款让命令行界面生动有趣的工具。
cowsay
可说话、可思考,与fortune加持更可以变为一头睿智的牛。
该命令接受一个文本字符串,并输出一个牛说话的图形。
下面是一头牛在说它喜欢 Linux:
$ cowsay I love linux.
_______________
< I love linux. >
---------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
在Linux中,有一条神奇的命令连接着智慧与幽默,那就是fortunes
命令。
看似普通的指令,背后却藏匿着千言万语,无论是名人箴言还是妙趣横生的笑话,在这里都能找到它们的踪迹。
另外最重要的,还可以根据自己的需求进行增删,目前就用基于唐诗宋词的库。
fortune
并非只是简单的一句话,而是承载着古今中外智慧的涌泉。
每次执行,它都会带来截然不同的感受。或许是一位哲人的深刻格言,或是一句调皮的笑话,或者唐诗,或者宋词,与先贤对话,岂不快哉。
最简单的方法就是把这个命令,加到.bashrc文件中,每次启动,总会有触动。
$ fortune
何以称英雄?识以领其先
- 清·袁枚
$ fortune
一件作品的固有力量从来不会被长期地埋没或禁锢。一件艺术品可能被时间遗忘,可能遭到查禁,可能被埋进棺材,但威力强大的东西总要战胜没有过大前途的东西。
- 茨威格
$ fortune
Yow! We're going to a new disco!
lolcat
lolcat
是一款让终端从黑白灰变得缤纷多彩的神奇工具。
通过将文字渲染成彩虹般的颜色,让你的终端充满欢乐与活力。
可以把这个命令替换掉cat,这样你的内容都灵动了起来
比如lolcat /etc/resolv.conf
会生成如下信息:
cmatrix
来到黑客帝国的命令cmatrix
,这不仅仅是一串字符在终端中的运动,它仿佛是数字的舞蹈,变幻着无穷的图案。从绿色的数字雨到模拟Matrix电影的效果,cmatrix
让我们进入了数字的奇妙世界。
screenfetch
命令的神奇之处在于其简单而又直观的功能,该命令能够快速地收集系统信息并以一种富有个性的方式展示出来。
从使用的发行版到内核版本,再到处理器和内存,一目了然地展现系统的全貌。
$ screenfetch
./+o+- oper@localhost
yyyyy- -yyyyyy+ OS: Ubuntu
://+//-yyyyyyo Kernel: aarch64 Linux 6.4.16-linuxkit
.++ .:/++++++/-.+sss/` Uptime: 33m
.:++o: /++++++++/:--:/- Packages: 134
o:+o+:++.`..```.-/oo+++++/ Shell: bash 5.1.16
.:+o:+o/. `+sssoo+/ Disk: 32G / 59G (57%)
.++/+:+oo+o:` /sssooo. CPU: 12x Apple
/+++//+:`oo+o /::--:. RAM: 877MiB / 7844MiB
\+/+o+++`o++o ++.
.++.o+++oo+:` /dddhhh.
.+.o+oo:. `oddhhhh+
\+.++o+o``-````.:ohdhhhhh+
`:o+++ `ohhhhhhhhyo++os:
.o:`.syhhhhhhh/.oo++o`
/osyyyyyyo++ooo+++/
`````+oo+++o\:
`oo++.
仅个人想法,会持续不间断更新和改进。
怎么忽然来硬的呢,因为在Linux的世界中,系统是灵活,但是骨架同样重要。
而跟踪确认硬件信息对于我们同样重要。
lsblk
命令可以查看系统中的块设备信息
$ lsblk
这个命令会列出系统中所有的块设备(比如硬盘、分区和挂载点)的信息。
默认情况下,它会显示每个设备的名称、大小、类型、挂载点等信息。
如果需要显示更详细的信息,可以使用 -a
或 --all
选项:
$ lsblk -a
这会显示完整的块设备信息,包括未挂载的设备。
当然,还可以根据需求,定制化输出,不过单单这个命令,足矣。
fdisk
是用于检查一个磁盘上分区信息最通用的命令。
fdisk
可以显示分区信息及一些细节信息,比如文件系统类型等。
设备的名称通常是/dev/sda、/dev/sdb 等。
对于以前的设备有可能还存在设备名为 /dev/hd* (IDE)的设备,这个设备逐步淘汰了。
fdisk
也可以用于创建并操控分区表信息,支持主任GPU、MBR、Sun、SGI和BSD。
块设备可以划分为一个或多个称为分区的逻辑磁盘。这种划分的记录会保存在分区表,通常位于磁盘的第 0 扇区。
fdisk的官方解释为:
fdisk - manipulate disk partition table
语法格式为:
$ fdisk [options] device
$ fdisk -l [device...]
其中一些常用的参数为:
-l
列出指定的外围设备的分区表状况-L, --color[=when]
:将输出颜色化,其中when可以指定为auto, never or always. 默认为 auto.这个也是我唯一推荐入门者使用的 命令,仅仅list显示出目前的系统分区。
万万不要输入fdisk执行其他操作,极易格式化硬盘,切记切记。
$ fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
Disk /dev/sda: 256.1 GB, 256060514304 bytes, 500118192 sectors # 磁盘空间及扇区信息
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: FAF37680-0ECE-4BE7-93FC-E87A8F2F6455
hwinfo
又一个用于显示硬件信息的命令。
可以获得 Linux 系统的各种硬件组件(如CPU、内存、显卡、硬盘等)的详细信息。
sudo hwinfo
列出系统上几乎所有可用硬件的详细信息。
sudo hwinfo --cpu
sudo hwinfo --memory
sudo hwinfo --gfxcard
sudo hwinfo --disk
通过在命令后添加 --cpu
、--memory
、--gfxcard
、--disk
等参数,获取特定硬件的信息。
lshw
是Hardware Lister
的缩写,直面意思即列出系统硬件信息。
可以显示关于计算机硬件组件(如处理器、内存、硬盘、网卡等)的详细信息,对于系统管理员和用户来说是一个非常有用的工具。
任何参数都不加的话,可用,信息极多,但是可用信息不多。
sudo lshw
这将输出系统中所有可用硬件的详细信息,包括硬件组件的制造商、型号、驱动程序等。
显示摘要信息:相对而言,这个反而好一些,简单的就是有用的
sudo lshw -short
这将显示硬件的摘要信息,包括设备名、类别、描述等。
显示指定类型的硬件信息:
sudo lshw -C network
上述示例将仅显示网络相关的硬件信息。
比如还可以查看memory
、cpu
、disk
等信息。
lshw
提供了全面的硬件信息,帮助用户了解系统配置和硬件组件的细节。在查看和诊断硬件问题或了解系统配置时,它是一个非常有用的工具。
仅个人想法,会持续不间断更新和改进。
Linux有好几个关于帮助的命令,可以让我们在不上网的情况下获取一些丰硕的信息。
唯一的要求就是英语好一些,唯二的情况就是不确定的情况下在此确认后再执行。
首先,这man是什么意思?
最开始很多人认为是不知道这个什么意思,找man呀。
其实man是manual的缩写,也就是手册的意思。
man
命令提供了系统命令的详细帮助信息。
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man
一下即可。这个也是每个程序员必备的功能,在没有网络的情况下,man
能解决很多问题和疑惑。
看一下官方定义:
Man - format and display the on-line manual pages
如果要读懂并使用man
,首先需要了解man
命令输出的格式,下面的几个是比较常用且需要注意的:
同时也可以使用man man 查看man的使用方法。
章节 | 含义 |
---|---|
NAME | 命令名称及功能简要说明 |
SYNOPSIS | 用法说明,包括可用的选项 |
DESCRIPTION | 命令功能的详细说明,可能包括每一个选项的意义 |
OPTIONS | 每一选项的意义 |
EXAMPLES | 一些使用示例 |
比如输入man ls
后,跳出下面的内容:
LS(1) User Commands LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of
-cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .
-A, --almost-all
do not list implied . and ..
--author
with -l, print the author of each file
-b, --escape
print C-style escapes for nongraphic characters
--block-size=SIZE
scale sizes by SIZE before printing them; e.g., '--block-size=M' prints sizes in units of 1,048,576
bytes; see SIZE format below
-B, --ignore-backups
Manual page ls(1) line 1 (press h for help or q to quit)
此时可以通过空格键或者回车键来向后翻屏或者翻页,可以使用b或者k向前查看。
查看关键词时可以使用:
/关键词
向后查找 n
:下一个
?关键词
向前查找 N
:前一个
可以通过q
来退出。
ls后面还有一个(1),详细的解释可以参考《Linux 安装 man 帮助程序》
man
有个参数为-f
,就是whatis
的功能,比如:
$ man -f ls cd file cat more less
ls (1) - list directory contents
ls (1p) - list directory contents
cd (1) - bash built-in commands, see bash(1)
cd (1p) - change the working directory
cd (n) - Change working directory
file (1) - determine file type
file (1p) - determine file type
file (n) - Manipulate file names and attributes
cat (1) - concatenate files and print on the standard output
cat (1p) - concatenate and print files
more (1) - file perusal filter for crt viewing
more (1p) - display files on a page-by-page basis
less (1) - opposite of more
less (3pm) - perl pragma to request less of something
与whatis命令完全一致
man
有个参数为-k
,就是apropos
的功能,比如:
$ man -k who
at.allow (5) - determine who can submit jobs via at or batch
at.deny (5) - determine who can submit jobs via at or batch
btrfs-filesystem (8) - command group of btrfs that usually work on the whole filesystem
docker-trust-signer (1) - Manage entities who can sign Docker images
ipsec_newhostkey (8) - generate a new raw RSA authentication key for a host
ipsec_showhostkey (8) - show host's authentication key
w (1) - Show who is logged on and what they are doing.
who (1) - show who is logged on
who (1p) - display who is on the system
whoami (1) - print effective userid
与apropos命令完全一致
如果遇到一个不熟悉或者完全不知道的命令,此时可以通过下面的3个步骤来了解:
man -k command
查询所有类似帮助文件信息,或许有可能就能找到你需要的信息;man -f command
查询以command
开始的相关帮助信息列表man N command
通过直接定位N获得详细帮助信息其实整个命令已出现,你的脑海里面应该浮现的是:
What is your name?
如题所述,这个命令用于查询一个命令到底执行了什么功能,并将查询的结果输出出来,相当于man
的一个选项-f
。
whatis
的官方定义为:
whatis - display manual page descriptions
仅仅提供一个比较简单的命令描述.
使用方法也比较简单,如下:
$ whatis [options] name
其中的name可以是Linux命令、系统调用、库函数、系统等等内容
以前面的命令为例,执行如下所示:
$ whatis ls cd file cat more less
ls (1) - list directory contents
ls (1p) - list directory contents
cd (1) - bash built-in commands, see bash(1)
cd (1p) - change the working directory
cd (n) - Change working directory
file (1) - determine file type
file (1p) - determine file type
file (n) - Manipulate file names and attributes
cat (1) - concatenate files and print on the standard output
cat (1p) - concatenate and print files
more (1) - file perusal filter for crt viewing
more (1p) - display files on a page-by-page basis
less (1) - opposite of more
less (3pm) - perl pragma to request less of something
可以看到whatis是支持同时查询多个命令的
whatis
可以通过-w
、-r
以及-C
等选项来设定通配符、正则表达式以及配置文件等等,不过最简单的还是简单查看一个命令的简单描述,其他的可以交给man
来处理。
Linux whereis
命令用于定位查找一个命令的二进制、源文件或帮助文件。
不过这些文件一般是位于特定目录的。
其他的程序定位可以考虑使用locate
命令。
官方的定义为:
whereis - locate the binary, source, and manual page files for a command
使用语法如下:
$ whereis [options] [-BMS directory... -f] name...
其他的选项可以为:
-b
: 查找二进制文件
-m
:查找手册
-s
:查找源文件
-B
在设置的目录下查找二进制文件。
-M
在设置的目录下查找说明文件。
-S
在设置的目录下查找原始代码文件。
比如查找bash
的位置,输入如下命令:
$ whereis bash
bash: /usr/bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
可以看到,以上的输出信息从左至右分别为程序名、bash路径、bash的man帮助手册路径。
可以通过不同的参数来查找不同的文件,如下:
# 查找二进制文件
$ whereis -b bash
bash: /usr/bin/bash /etc/bash.bashrc
# 查找帮助文件
$ whereis -m bash
bash: /usr/share/man/man1/bash.1.gz
# 查找源文件
$ whereis -s bash
bash:
apropos
的中文含义就是恰好的、合适的,奈何这个单词或者命令确实不好记,当然是可以扩充词汇量的。
什么时候会用到这个命令呢,先看看这个命令的定义。
apropos
命令的官方定义为:
search the manual page names and descriptions
意思很明显,如果我不记得命令或者不知道该用什么命令的时候,可以通过关键词来索引查找这些命令,比如我们想用linux绘制图像,但是不知道什么命令,测试可以使用:
$ apropos plot
bno_plot (1) – generate interactive 3D plot of IO blocks and sizes
gnuplot (1) – an interactive plotting program
pbmtoplot (1) – convert a PBM image into a Unix 'plot' file
或许每个人的输出不同,这个主要取决于安装的软件包和索引的数据库。以上。
再来一个实例,这个应该大部分的都类似:
$ apropos who
at.allow (5) - determine who can submit jobs via at or batch
at.deny (5) - determine who can submit jobs via at or batch
btrfs-filesystem (8) - command group of btrfs that usually work on the whole filesystem
docker-trust-signer (1) - Manage entities who can sign Docker images
ipsec_newhostkey (8) - generate a new raw RSA authentication key for a host
ipsec_showhostkey (8) - show host's authentication key
w (1) - Show who is logged on and what they are doing.
who (1) - show who is logged on
who (1p) - display who is on the system
whoami (1) - print effective userid
这个命令平时用的不多,跟whatis类似,因为这些功能都被加到了包罗万象的man命令。
Linux系统中的命令那是相当地丰富,不同的版本可能还有不同的命令,不过Linux核心自带的命令大概有几百个,这个不管是什么发行版一般都是共用的。
如果希望探索Linux的所有命令,可能不太实际,因为这个数字可能达到惊人的万计。
不过还好的是,Linux命令的入门只要掌握不到100个命令即可,而如果相对而言行云流水的话也就200个命令足矣。
而如果准备试试Linux,可能只需要下面的几个实用频率最高、功能最关键、也最常用的命令也就基本可以完成日常的工作、学习需要了。
忽然想用姓氏排序的方法,不过感觉不太行,索性就大概按照使用率来统计了。
仅个人习惯,会持续不间断更新和改进。
个人感觉这个命令,属于名副其实用的最多的命令,我们进入Linux的第一个命令,可能除了输入用户名密码就属它了。
工欲善其事,必先利其器,你欲使用Linux,必先了解当前的文件和内容。
如果不加任何参数,默认列出当前目录的内容。
$ ls /etc/sysconfig/network-scripts
ifcfg-em1
ifcfg-em2
ifcfg-em3
ifcfg-em4
....
-l 就是使用long listing format长格式,来显示更多的内容信息。
$ ls -l /etc/sysconfig/network-scripts
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
......
如果希望看到最近创建的文件,就需要用到-t参数了。
$ ls -lt /etc/sysconfig/network-scripts/
total 264
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
...
如果希望删除很早以前的文件,看到最早创建的文件,就需要用到-r参数了。
$ ls -ltr /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
$ ls -lS /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root 341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root 294 May 13 2016 ifcfg-em2
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em3
-rw-r--r--. 1 root root 272 May 10 2016 ifcfg-em4
更多内容参考:https://shaoguangleo.github.io/tags/ls/
这个命令可能估计能排在第二,类似于Winows的双击,在不同目录件徜徉。
在各个文件夹遍历是我们的习惯和倔强的证明。
cd命令没有太多参数,但是有一些技巧所在,可以N多人从来没有用过。
cd直接使用即可,技巧是下面几个:
想要进入刚才进入的地方(目测没有很多人再用,但是真的很好用)运行:
$ cd –
需要快速地回到你的家目录,输入cd
即可,这里其实不用一级一级的进入
$ cd
这个需要你有root权限
cd ~username
进入username的家目录。
更多内容参考:https://shaoguangleo.github.io/tags/cd/
说到cd到某个目录,就需要提高创建目录,也就新建文件夹。
参数不过,处理默认什么参数也不加,会一个-p递归创建文件夹即可。
$ mkdir hello
$ mkdir -p a/b/c/d/e/f/g
更多内容参考:https://shaoguangleo.github.io/tags/mkdir/
rm
命令用于删除文件或者目录。
这个命令其实我不想把它归为最常用的命令,因为它也是最危险⚠️的命令之一,文件一旦通过rm命令删除❌,则无法恢复,所以必须格外一定切记小心地使用该命令。因为发生过很多欲哭无泪的故事。。。
文件如果少,可以使用-i
删除前逐一询问确认,确认时比较好用;
而下面的两个参数十分残暴,除非百分之两百确认,否则慎用:
-f
即使原档案属性设为唯读,也直接删除,无需逐一确认,是force的意思。-r
将目录及里面的子文件逐一删除。更多内容参考:https://shaoguangleo.github.io/tags/rm/
cp可以实现文件和目录的复制,如果你只会cp a b
,或者加上-r来递归目录,那么你还需要挖掘很多呀,比如只复制不存在或者更新的文件。
以下就是cp
常用的选项如下所示:
i
: 覆盖一个已经存在的文件前,提示用户进行确认r
:递归地复制目录及其内容,复制目录的时候必须使用这个参数u
:只复制不存在或者更新的文件v
:复制文件时,显示复制信息这个在显示复制信息的时候,也可以复制目录
$ cp -rv dir1/* dir2/
‘dir1/a’ -> ‘dir2/a’
‘dir1/b’ -> ‘dir2/b’
‘dir1/c’ -> ‘dir2/c’
‘dir1/d’ -> ‘dir2/d’
这个参数在使用rm的时候已经记得使用,不然就像rm -rf /
一样,一个公司没有了。
$ cp -i dir1/* dir2/
cp: overwrite ‘dir2/a’? y
cp: overwrite ‘dir2/b’? y
cp: overwrite ‘dir2/c’? y
这个选项在文件超级多时候,慎用!!
u
表示update
,也就是从一个目录拷贝到另外一个目录时,只会复制那些不存在或者目标目录相应文件的更新文件。
执行下面的命令:
$ cp -u dir1/* dir2/
可以得到:
$ ll *
dir1:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:23 a
-rw-rw-r-- 1 user user 0 Jul 20 21:23 b
-rw-rw-r-- 1 user user 0 Jul 20 21:23 c
-rw-rw-r-- 1 user user 0 Jul 20 21:23 d
dir2:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:29 a
-rw-rw-r-- 1 user user 0 Jul 20 21:25 b
-rw-rw-r-- 1 user user 0 Jul 20 21:29 c
-rw-rw-r-- 1 user user 0 Jul 20 21:25 d
-rw-rw-r-- 1 user user 0 Jul 20 21:25 e
现在有文件夹filename
,内有文档,名字是从1.txt, 2.txt, 3.txt
一直到9999.txt,10000.txt
,现在希望从第N
组数据即N.txt
到第M
组数据M.txt
的文件拷贝到别的文件夹中,方法如下:
$ cp {N..M}.txt newfilename/
这个方法可是相当的赞呀(≧▽≦)/,基本可以秒掉大多数的GUI程序了。
更多内容参考:https://shaoguangleo.github.io/tags/cp/
如果mv的命令还停留在重命名一个文件或者文件夹,那么就花3分钟看一下。
mv能做的还很多。
比如为了防止误删,mv可以提前做个备份;比如为了防止覆盖,可以考虑只有文件较新的时候才移动。
详细如下:
mv几个比较常用的选项如下:
$ ls
a.txt
$ mv a.txt b.txt
$ ls
b.txt
直接移动或者叫做重命名,文件夹也类似的操作。
$ ls
a.txt a.txt~
$ cp -b ../a.txt a.txt
$ ls
a.txt a.txt~
可以看到此时多了一个备份文件
$ cp -u a b
此时的操作为,只有a比b更新或者b不存在的时候,才会进行更新,否则失败。
这个用法多用在:当横向对比两个文价夹有无重要更新的时候才会用到。
$ cp -i b.txt a.txt
cp:是否覆盖"a.txt"?
在文件存在的时候,-i选项会进行提示,此时需要输入y才能覆盖,而输入n就会取消这个操作。
更多内容参考:https://shaoguangleo.github.io/tags/mv/
pwd
命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径, 所以pwd
是Print Working Directory第一个字的缩写。
唯二需要了解的参数如下:
-L
, --logical
:打印逻辑路径,与pwd
一致-P
, --physical
:打印物理路径,这里可以从超级链接直达原处此时比如我们进入一个目录,然后在打印出来,如下:
$ cd /etc/sysconfig/network-scripts/
$ pwd
/etc/sysconfig/network-scripts
可以看到pwd将输出完全路径
比如如下:
$ pwd
/opt/test
$ ls -l
总用量 1
lrwxrwxrwx 1 root root 14 Jan 15 2012 dir -> source/dir
drwxrwxrwx 1 root root 14 Jan 15 2012 source
可以看到此时的路径在/opt/test/里面有两个目录source和dir,其中dir链接到source里面的dir。
接下来对比一下-L和-P的区别。
$ cd dir
$ pwd
/opt/test/dir
$ pwd -L
/opt/test/dir
$ pwd -P
/opt/test/source/dir
从上面的输出可以发现,-P
参数会显示文件最原始的路径;而-L
则是逻辑上的路径。
更多内容参考:https://shaoguangleo.github.io/tags/pwd/
…
Hi,XDJM们,更多信息欢迎移步我的主页或微信公众号letsProgramming.
仅个人想法,会持续不间断更新和改进。
虚虚假假,真真实实,如何快速的去伪存真,抽丝剥茧。
需要在开放的网络世界掌握一些最基础的命令,让自己知己知彼。
Linux ifconfig
命令用于显示或设置网络设备,在调试或调优的时间经常使用。
官方定义为:
ifconfig - configure a network interface
对于这个命令,一般只要掌握如何查看,如何设置IP地址基本就可以了,对于网络钻的比较深的,还需要更多一些参数。
使用方法为:
# 显示
$ ifconfig [-v] [-a] [-s] [interface]
# 设置
$ ifconfig [-v] interface [aftype] options | address ...
一些参数的含义为:
-a
:显示所有网卡的状态,即使是down的状态-s
:显示一个短列表interface mtu N
设置最大传输单元【需要管理员权限】netmask addr
:设置掩码地址【需要管理员权限】interface up
激活网卡【需要管理员权限】interface down
关闭网卡【需要管理员权限】interface hw ether xx.xx.xx.xx.xx.xx
设置MAC地址【需要管理员权限】如果不指定任何参数,直接显示当前活动的接口,如下:
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.123 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x0<global>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 5634431 bytes 4994127142 (4.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 858051 bytes 109858013 (104.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xc7320000-c733ffff
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.123 netmask 255.255.255.0 broadcast 192.168.6.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 1547215 bytes 92862867 (88.5 MiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 3230 bytes 922051 (900.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 219608 bytes 105943591 (101.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 219608 bytes 105943591 (101.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
其中一般希望看到的信息包括:
不加任何参数只会显示已经配置并且活跃的网卡信息,如果使用ifconfig -a
就可以显示全部的网卡状态了,即使有些网卡是down的状态。
亦或者指定一个interface,比如上面的eth1,则只输出这个网卡的信息,如下:
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.123 netmask 255.255.255.0 broadcast 192.168.6.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 1547215 bytes 92862867 (88.5 MiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 3230 bytes 922051 (900.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果只想看到MTU以及数据包的状态,可以用该参数,如下:
$ ifconfig -s
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 5665450 0 0 0 867639 0 0 0 BMRU
eth1 1500 3489187217 0 101054 0 501260400 0 0 0 BMU
lo 65536 219708 0 0 0 219708 0 0 0 LRU
输出信息主要包含了MTU值,发送及接收的数据情况。
如下对eth0网卡配置IP地址、掩码以及广播地址,当然可以分布操作
# 给eth0配置IP地址
$ ifconfig eth0 192.168.1.123
# 给eth0配置IP地址和子网掩码
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0
# 给eth0配置IP地址、子网掩码还有广播地址
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0 broadcast 192.168.1.255
在某些情况下可能需要修改MTU值,比如增到到MTU为9000,如下:
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.123 netmask 255.255.255.0 broadcast 192.168.6.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 1547215 bytes 92862867 (88.5 MiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 3230 bytes 922051 (900.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 修改MTU
$ ifconfig eth1 MTU 9000
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9000
inet 192.168.6.123 netmask 255.255.255.0 broadcast 192.168.6.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 1547215 bytes 92862867 (88.5 MiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 3230 bytes 922051 (900.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
已经看到输出的信息已经把mtu更新为了9000.
这个值对网络传输影响很大。
启动关闭主要的应用场景为重新设置了IP地址,或者暂时对某个网卡进行操作。
# 关闭eth0
$ ifconfig eth0 down
# 启动eth0
$ ifconfig eth0 up
不过需要注意的是
ip
来搞定。等明天~。在linux系统里面如果想判断网络的好坏,脑海中蹦出的第一个命令就是ping
了。
官方定义为:
ping - send ICMP ECHO_REQUEST to network hosts
ping
命令基本是最常用的网络命令,它可以用来测试与目标主机的连通性。
ping
使用ICMP传输协议,通过发送ICMP ECHO_REQUEST数据包到网络主机,并显示返回的相应情况,根据这些信息就可以判断目标主机是否可以访问,在发送的过程中还会有一个时间戳用来计算网络的状态。
不过有些服务器为了防止通过ping
探测到,可能会在防火墙或者内核参数中禁止ping
命令,这样的话,可能虽然目标主机可以访问,但是无法ping
通,所以并不能说ping
不通的网络就是不能访问的。
需要注意linux下的ping和windows下的ping稍有区别,linux下ping不会自动终止,需要按ctrl+c终止或者用参数-c指定要求完成的回应次数。
ping
的使用说实话挺复杂,挺多的,不过常用的这篇短文基本就够了。
详细如下:
# ALL
$ ping [-aAbBdDfhLnOqrRUvV46] [-c count] [-F flowlabel] [-i interval] [-I interface] [-l preload] [-m mark] [-M pmtudisc_option] [-N node‐info_option] [-w deadline] [-W timeout] [-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp option] [hop ...] destination
# 较常用的选项如下:
$ ping [-c count] [-i interval] destination
参数说明:
-c
<完成次数> 设置完成要求回应的次数。
-i interval
指定收发信息的间隔时间。
如果不加任何参数,查看是否ping
通
$ ping www.baidu.com
PING www.a.shifen.com (115.239.210.27) 56(84) bytes of data.
64 bytes from 115.239.210.27: icmp_seq=1 ttl=52 time=6.06 ms
64 bytes from 115.239.210.27: icmp_seq=2 ttl=52 time=5.56 ms
64 bytes from 115.239.210.27: icmp_seq=3 ttl=52 time=5.67 ms
64 bytes from 115.239.210.27: icmp_seq=4 ttl=52 time=5.82 ms
64 bytes from 115.239.210.27: icmp_seq=5 ttl=52 time=5.70 ms
64 bytes from 115.239.210.27: icmp_seq=6 ttl=52 time=5.79 ms
^C # 此处输入了Ctrl+C强制退出
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.152/0.159/0.172/0.017 ms
可以看到可以ping
通www.baidu.com,时延还算比较OK,几个毫秒量级。
这里看一下几个字段的含义,其中:
56(84) bytes of data:表示默认的数据包长度为56字节;
time=5.56ms:表示响应的时间,值越小,证明连接越快;
TTL=52:TTL是Time To Live的缩写,表示DNS记录在DNS服务器上存在的时间,是IP协议包的一个值,告诉路由器啥时候抛弃这个数据包,(大体上可以通过这个值来判断目标类型的操作系统。)
可以通过 参数-c
来发送指定数目的包后停止
$ ping www.baidu.com -c 5
PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data.
64 bytes from 115.239.211.112: icmp_seq=1 ttl=52 time=6.03 ms
64 bytes from 115.239.211.112: icmp_seq=2 ttl=52 time=5.96 ms
64 bytes from 115.239.211.112: icmp_seq=3 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=4 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=5 ttl=52 time=6.21 ms
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 5.791/5.958/6.215/0.186 ms
此时将在发送5次数据包以后自动停止,在Linux里面,如果不加这个参数,是会一直发送运行的。
可以通过 参数 -i N
指定每个N秒发送一次信息,如下将每隔3秒发送一次ping
信息。
$ ping www.baidu.com -i 3
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=4 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=5 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=6 ttl=55 time=28.6 ms
^C
6 packets transmitted, 6 received, 0% packet loss, time 15041ms
rtt min/avg/max/mdev = 28.650/28.670/28.697/0.139 ms
如上,每隔3秒会发送一次,对于需要持续检测或者记录的可以考虑适当加大这个时间间隔。
注意,只有管理员可以设置小于0.2秒的时间间隔。所以这个数值可以是浮点数~
上面的几个例子是可以配合使用的,比如
$ ping www.baidu.com -c 4 -i 5
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=55 time=29.3 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=4 ttl=55 time=29.4 ms
5 packets transmitted, 5 received, 0% packet loss, time 20045ms
rtt min/avg/max/mdev = 29.396/29.428/29.461/0.110 ms
这个例子为:每个5秒查询一次,一共查询4次,然后退出。
Linux ip
命令与 ifconfig
命令类似,但比 ifconfig
命令更加强大,主要用于显示或设置网络设备。
已经在Linux 2.2 加入到了内核。所以ip
是加强版的网络配置工具,用来替代ifconfig
并强化其他功能。
官方定义为:
ip - show / manipulate routing, devices, policy routing and tunnels
对于这个命令,命令集是相当的多。先说一些基础的,其他就要自己摸索了。
使用方法为:
$ ip [ OPTIONS ] OBJECT { COMMAND | help }
$ ip [ -force ] -batch filename
# OBJECT的取值
# OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | | tcp_metrics | token | macsec }
# OPTIONS的取值
# OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] | -r[esolve] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -rc[vbuf] [size] | -t[imestamp] | -ts[hort] | -n[etns] name | -a[ll] | -c[olor] }
COMMAND的值主要取决于OBJECT,可能有所不同,一般可以使用add
,delete
和show
(或者list
),均可以输入help
来进行查询。
OBJECT中常用的为:
link
网络设备address
设备上的协议地址-s, -stats, -statistics
统计化输出# 显示网络设备
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
# 显示IP等更多信息
$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.1.123/24 brd 192.168.254.255 scope global noprefixroute eno1
valid_lft forever preferred_lft forever
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global noprefixroute
valid_lft forever preferred_lft forever
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
命令中的show为默认,也可以直接使用ip link
或者ip address
,结果一致。
可以通过ip addr add/del xxx.xxx.xxx.xxx dev interface
来设置或者删除IP地址。
如下设置or删除eth0的IP地址。
# 设置IP地址
$ ip addr add 192.168.0.1/24 dev eth0
# 删除IP地址
$ ip addr del 192.168.0.1/24 dev eth0
与ifconfig类似,也使用up与down来进行启动和关闭,具体如下:
# 开启网卡
$ ip link set eth0 up
# 关闭网卡
$ ip link set eth0 down
选项-s可以统计一些信息方便我们阅读,如下看看网络的情况:
$ ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
871883256468 251700492 0 0 0 0
TX: bytes packets errors dropped carrier collsns
871883256468 251700492 0 0 0 0
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
64930085920632 50955323447 0 613156 0 472190933
TX: bytes packets errors dropped carrier collsns
17534345850354 17448077191 0 0 0 0
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0
可以看到对输出进行了一些格式化,看起来更直观。
在Linux系统中,网络是至关重要的部分,而netstat
命令是管理和监视网络连接的强大工具之一。
它提供了关于网络接口和路由表的详细信息,有助于了解网络连接状态、统计信息以及网络协议的使用情况。
也更方便我们对网络的管理、故障排除以及安全监控等等。
netstat
命令比较简单,通过简单的参数组合,可以获得各种网络相关的信息。
以下是一些常用的参数及其功能:
-a
:显示所有连接和监听端口。-t
:仅显示TCP连接。-u
:仅显示UDP连接。-n
:以数字形式显示地址和端口号。-p
:显示进程标识符和程序名称。-r
:显示路由表。-s
:显示统计信息。Linux
系统中的wget
是一个下载文件的命令行工具,特别普遍 。
对于Linux
用户是必不可少的工具,对于经常要下载一些软件或从远程服务器恢复备份到本地服务器,这个命令尤为重要。
wget
支持很多协议,比如HTTP
,HTTPS
和FTP
协议,还可以使用HTTP
代理。
wget
的有诸多特点,比如
wget
支持自动下载,即wget
可以在用户退出系统的之后在后台执行。这意味着你可以登录系统,启动一个wget
下载任务,然后退出系统,wget
将在后台执行直到任务完成,这是个牛气冲天的功能。wget
可以跟踪HTML
页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget
遵循Robot Exclusion标准(/robots.txt). wget
可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。wget
非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget
会不断地尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。$ wget [参数] [URL地址]
用于从网络上下载资源,没有指定目录,下载资源会默认为当前目录。wget
虽然功能强大,但是使用起来还是比较简单:
wget
的命令参数很多,不过常用的为下面几个,详细的可以看进阶。
比如,我们下载个Ubuntu的最新版本,试下效果如何
$ wget http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso
在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。
这个对于动态链接的下载比较有用,特别是有些文件的名字实在是太…长了
$ wget -O wordpress.zip http://www.ubuntu.com/download.aspx?id=1234
$ wget -c http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso
# or
$ wget --continue http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso
使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。
$ wget -o download.log URL
不希望下载信息直接显示在终端而是在一个日志文件,可以使用,特别注意需要与-O
来区分开~
仅个人想法,会持续不间断更新和改进。
在Linux的庞大世界中,搜索犹如明灯,可以拨开云雾见青天,照亮我们前行大道路。
无论你是在浩瀚的代码库中搜索一个特定的函数,还是在庞大的文件系统中寻找一个文件,搜索命令着实是不可或缺尤为重要的工具。
而其中最绕不开的当属以下几个。
find
命令用来在指定目录下查找文件,功能相当之强大。
官方定义为:
find - search for files in a directory hierarchy
Linux的哲学是一切皆文件,那么find的使命就是一切皆可查。
使用语法为:
$ find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
比较常用的几个参数为:
-exec <执行指令>
:假设find指令的回传值为True,就执行该指令;-size <文件大小>
:查找符合指定的文件大小的文件;-mtime <24小时>
:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;-type <文件类型>
:只寻找符合指定的文件类型的文件;如果使用该命令时,不设置任何参数,则find
命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。
$ ls -l
total 310M
-rw-rw-r-- 1 user user 10M Mar 21 20:01 a
drwxrwxr-x 2 user user 22 Mar 21 20:01 aa
-rw-rw-r-- 1 user user 100M Mar 21 20:01 b
-rw-rw-r-- 1 user user 200M Mar 21 20:01 c
$ find
.
./a
./b
./c
./test
通过-size大小来查找文件
$ find . -size -100M
.
./a
./aa
$ find . -size 100M
./b
$ find . -size +100M
./c
./aa/d
可以通过参数-mtime来查找文件的修改时间,比如如下可以查找当前目录下最近60天没有被修改的文件。
$ find . -mtime +60
# 最近2天以内未修改
$ find . –mtime -2
我经常把 find
命令和他的选项 exec
一起使用,比如我想查找一个目录中的所有文件并将其更改其权限。可以通过以下简单命令完成:
$ find /path/ -type f -exec chmod 644 {} \;
这个命令会递归搜索指定目录内/path/下的所有文件,并对找到的文件执行 chmod
命令。
… note::
众里寻他千百度,蓦然回首,那人却在灯火阑珊处
Linux locate
命令用于查找符合条件的文档、程序、目录等等。这个命令会在数据库中查找符合条件的各种信息。
一般情况我们只需要输入 locate name
即可查找。
官方定义为:
locate
- list files in databases that match a pattern
使用方法为:
$ locate [-d path | --database=path] [-e | -E | --[non-]existing] [-i | --ignore-case] [-0 | --null] [-c |
--count] [-w | --wholename] [-b | --basename] [-l N | --limit=N] [-S | --statistics] [-r | --regex ] [--regex‐
type R] [--max-database-age D] [-P | -H | --nofollow] [-L | --follow] [--version] [-A | --all] [-p | --print]
[--help] pattern...
看着很复杂,不过常用的参数倒是不多,基本为:
-n
: 至多显示 n个输出。-i, --ignore-case
: 忽略大小写默认情况下,locate
直接跟上需要查找的信息就可以了,如下所示:
$ locate set_vis.cpp
/home/user/mycode/src/set_vis.cpp
# 以查找apropos为例
$ locate apropos
/usr/bin/apropos
/usr/local/difmap/help/apropos.hlp
/usr/share/emacs/24.3/lisp/apropos.elc
/usr/share/man/de/man1/apropos.1.gz
/usr/share/man/es/man1/apropos.1.gz
/usr/share/man/fr/man1/apropos.1.gz
/usr/share/man/id/man1/apropos.1.gz
/usr/share/man/it/man1/apropos.1.gz
/usr/share/man/ja/man1/apropos.1.gz
/usr/share/man/man1/apropos.1.gz
/usr/share/man/nl/man1/apropos.1.gz
/usr/share/man/pl/man1/apropos.1.gz
/usr/share/man/ru/man1/apropos.1.gz
如果输出的信息很多,仅仅希望看到前面的几个,使用-n
参数既可
# 仅仅查看前的3个
$ locate -n 3 apropos
/usr/bin/apropos
/usr/local/difmap/help/apropos.hlp
/usr/share/emacs/24.3/lisp/apropos.elc
部分情况下,可能有大小写混淆的情况,此时使用-i
参数既可
$ $ locate -i set_vis.cpp
/home/user/mycode/src/set_vis.cpp
/home/user/mycode_CPP/src/set_VIS.cpp
不过刚按照的系统,这个命令并不一定有输出,主要是因为locate
与 find
不同, find
直接在硬盘找,而locate
只在数据库中查找。
这个数据库在CentOS系统默认的为 /var/lib/mlocate/mlocate.db 中,所以 locate
的查找会比较快,但并一定是实时的,而是以数据库的更新为准。
可以通过下面的命令手工升级数据库 ,命令为:
$ updatedb
然后就可以使用了。
Linux grep
命令用于查找文件里符合条件的字符串。
官方定义为:
grep
,egrep
,fgrep
- print lines matching a pattern
grep支持正则表达式,是一个强大的文本搜索工具。
语法也挺复杂,因为功能确实很强大。
$ grep [OPTION...] PATTERNS [FILE...]
$ grep [OPTION...] -e PATTERNS ... [FILE...] # 使用egrep
$ grep [OPTION...] -f PATTERN_FILE ... [FILE...] # 使用fgrep
常用的参数为:
假定有如下3个文件,1个文件夹,内容如下:
a
This is a
Hello a
b
this is b
Hello b
c
This is c
Hello c
d/d
This is d
Hello d
在当前目录搜索包含is字符串,可以看到**a/b/c**三个文件均有输出,而d因为是目录,暂时无输出。
$ grep is *
a:This is a
b:this is b
c:This is c
grep: d: Is a directory
与其他命令类似,增加-r
参数,递归搜索
$ grep -r is *
a:This is a
b:this is b
c:This is c
d/d:This is d
在某些情况下,或许正想找到不包含某些字符串的内容,如下:
$ grep -rv is *
a:Hello a
b:Hello b
c:Hello c
d/d:Hello d
此时可以看到,不包含is的内容显示了出来。
而某些情况下,或许我们希望找到不区分大小写的内容,比如对于This/this而言:
$ grep -r This *
a:This is a
c:This is c
d/d:This is d
$ grep -ri This *
a:This is a
b:this is b
c:This is c
d/d:This is d
可以看到此时有可能笔误,或者其他原因的b文件已经被找到了。
如果文件内容比较多,此时显示内容在哪一行,是很重要的,加上-n
参数既可解决。
$ grep -rn This *
a:1:This is a
c:1:This is c
d/d:1:This is d
仅个人想法,会持续不间断更新和改进。
看看网络,确认一下目前的状态,看看有没有异常进程。
Linux ifconfig
命令用于显示或设置网络设备,在调试或调优的时间经常使用。
官方定义为:
ifconfig - configure a network interface
对于这个命令,一般只要掌握如何查看,如何设置IP地址基本就可以了,对于网络钻的比较深的,还需要更多一些参数。
使用方法为:
# 显示
$ ifconfig [-v] [-a] [-s] [interface]
# 设置
$ ifconfig [-v] interface [aftype] options | address ...
一些参数的含义为:
-a
:显示所有网卡的状态,即使是down的状态-s
:显示一个短列表interface mtu N
设置最大传输单元【需要管理员权限】netmask addr
:设置掩码地址【需要管理员权限】interface up
激活网卡【需要管理员权限】interface down
关闭网卡【需要管理员权限】interface hw ether xx.xx.xx.xx.xx.xx
设置MAC地址【需要管理员权限】如果不指定任何参数,直接显示当前活动的接口,如下:
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.123 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x0<global>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 5634431 bytes 4994127142 (4.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 858051 bytes 109858013 (104.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xc7320000-c733ffff
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.123 netmask 255.255.255.0 broadcast 192.168.6.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 1547215 bytes 92862867 (88.5 MiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 3230 bytes 922051 (900.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 219608 bytes 105943591 (101.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 219608 bytes 105943591 (101.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
其中一般希望看到的信息包括:
不加任何参数只会显示已经配置并且活跃的网卡信息,如果使用ifconfig -a
就可以显示全部的网卡状态了,即使有些网卡是down的状态。
亦或者指定一个interface,比如上面的eth1,则只输出这个网卡的信息,如下:
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.123 netmask 255.255.255.0 broadcast 192.168.6.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 1547215 bytes 92862867 (88.5 MiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 3230 bytes 922051 (900.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果只想看到MTU以及数据包的状态,可以用该参数,如下:
$ ifconfig -s
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 5665450 0 0 0 867639 0 0 0 BMRU
eth1 1500 3489187217 0 101054 0 501260400 0 0 0 BMU
lo 65536 219708 0 0 0 219708 0 0 0 LRU
输出信息主要包含了MTU值,发送及接收的数据情况。
如下对eth0网卡配置IP地址、掩码以及广播地址,当然可以分布操作
# 给eth0配置IP地址
$ ifconfig eth0 192.168.1.123
# 给eth0配置IP地址和子网掩码
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0
# 给eth0配置IP地址、子网掩码还有广播地址
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0 broadcast 192.168.1.255
在某些情况下可能需要修改MTU值,比如增到到MTU为9000,如下:
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.123 netmask 255.255.255.0 broadcast 192.168.6.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 1547215 bytes 92862867 (88.5 MiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 3230 bytes 922051 (900.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 修改MTU
$ ifconfig eth1 MTU 9000
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9000
inet 192.168.6.123 netmask 255.255.255.0 broadcast 192.168.6.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 1547215 bytes 92862867 (88.5 MiB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 3230 bytes 922051 (900.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
已经看到输出的信息已经把mtu更新为了9000.
这个值对网络传输影响很大。
启动关闭主要的应用场景为重新设置了IP地址,或者暂时对某个网卡进行操作。
# 关闭eth0
$ ifconfig eth0 down
# 启动eth0
$ ifconfig eth0 up
不过需要注意的是
ip
来搞定。等明天~。ps
命令是“process status”的缩写,类似于 windows 的任务管理器
ps
命令用于显示当前系统的进程状态。
通常搭配kill
指令随时中断、删除不必要的程序。
同时呢,ps
命令是非常强大的进程查看命令,可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分【Windows】任务管理器的信息都是可以通过执行该命令得到的。
$ ps [参数]
常用参数
其中aux的输出信息如下所示:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
$ ps
PID TTY TIME CMD
44965 pts/0 00:00:00 bash
56519 pts/0 00:00:00 ps
什么参数都不跟的话,基本输出没啥用处。
通常情况下,最常用的为把所有进程显示出来:
$ ps -aux
$ ps -A
把所有进程显示出来,并输出到ps.txt文件:
$ ps -aux > ps.txt
大部分情况下,希望查找有问题的进程或者感兴趣的进程,使用管道如下:
$ ps -aux | grep ssh
root 1303 0.0 0.0 82468 1204 ? Ss Apr17 0:00 /usr/sbin/sshd
root 3260 0.0 0.0 52864 572 ? Ss Apr17 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root 24188 0.0 0.0 112652 956 pts/0 S+ 11:39 0:00 grep --color=auto ssh
top
命令比较像Windows里面的任务管理器,提供一个动态实时的系统状态检测,可以检测实时显示内存、CPU、进程的运行状态,主要在分析系统负载的时候比较常用。
官方定义为:
top - display Linux processes
状态默认实时显示,间隔为1秒。
使用的方法如下(选项超级多,其实不复杂):
$ top -bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols]
参数说明:
-d
: 改变显示的更新速度,或是在交互式( interactive command)按 s
或d
-c
: 切换显示模式,共有两种模式,一是只显示执行程序的名称,另一种是显示完整的路径与名称;这个在定位执行命令的时候较常用-n
: 更新的次数,完成后将会退出-b
: 批模式操作,主要用来将 top
的结果输出到其他程序或者文件;-i
: 不显示任何闲置不使用CPU的进程-s
: 安全模式,取消交谈式指令-pN1 -pN2 ... or -pN1,N2,N3 ...
:指定PID模式,仅仅监控N1,N2等信息-u/U user
:仅仅关注user的进程情况在输入top
命令以后,如果希望退出,可以数据q或者直接Ctrl+c即可。
还有一个情况,可以输入h进行帮助查询,用于进一步的交互操作。
通常情况下,最常用的就是输入top
命令,不加任何参数,这种情况下最希望看到的就是最占用系统资源的进程。
如下所示:
$ top
top - 22:23:20 up 461 days, 7:52, 18 users, load average: 1.82, 1.57, 1.45
Tasks: 773 total, 1 running, 768 sleeping, 0 stopped, 4 zombie
%Cpu(s): 10.1 us, 6.5 sy, 0.0 ni, 83.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32664832 total, 668020 free, 15683576 used, 16313236 buff/cache
KiB Swap: 16449532 total, 13409776 free, 3039756 used. 15787188 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7965 dbus 20 0 76092 8456 1704 S 7.5 0.0 40307:04 dbus-daemon
23460 root 20 0 397640 5560 3248 S 4.2 0.0 4738:26 accounts-daemon
4321 user 20 0 821828 104812 4584 S 3.2 0.3 7380:28 gsd-color
此时可以看到系统的基本信息,可以看到分为三个部分:
$ top -c
7965 dbus 20 0 76092 8456 1704 S 7.5 0.0 40307:04 /usr/bin/dbus-daemon
此时省去其他信息,可以看到dbus-daemon增加了路径信息为**/usr/bin/dbus-daemon**
这个命令用于定量显示,比如刷新10次后退出,如下:
$ top -n 10
如果觉得太长或者太短,可以通过-d
来设置,或者在交互模式下输入d
或者s
来设置。
$ top -d 0.8 # 设置为0.8秒
$ top -d 6 # 设置为6秒
如果仅仅对某个进程感兴趣,如下指定PID即可。
$ top -p 1234 # 对进程1234感兴趣
作为管理员or朋友,或许对某个用户感兴趣,比如user,此时可以仅仅显示该用户的进程信息
$ top -u user
仅个人想法,会持续不间断更新和改进。
用户信息,重中之重。
虽然21世纪最重要的是人才。
但对于我们个人而言,用户信息也是极其重要并特别需要留意的。
Linux last
命令用于显示用户最近的登录信息。
官方定义为:
last, lastb - show listing of last logged in users
通过读取/var/log/wtmp文件来获取这些信息。
$ last [-R] [-num] [ -n num ] [-adFiowx] [ -f file ] [ -t YYYYMMDDHHMMSS] [name...] [tty...]
参数:
-R
省略 hostname 的栏位
-n
展示前 num 个
username
展示 username 的登入讯息
tty
限制登入讯息包含终端机代号
$ last
username2 pts/17 192.168.100.123 Wed Mar 23 22:14 still logged in
username3 pts/20 localhost:11.0 Wed Mar 23 14:26 - 15:48 (01:21)
username4 pts/23 localhost:11.0 Wed Mar 23 14:26 - 15:48 (01:21)
username4 pts/4 192.168.100.125 Thu Jun 10 18:37 - 22:57 (04:20)
username5 pts/4 192.168.100.125 Thu Jun 10 18:21 - 18:21 (00:00)
username6 pts/9 192.168.100.126 Thu Jun 10 18:11 - 18:20 (00:09)
username7 pts/15 192.168.100.122 Thu Jun 10 18:04 - 23:44 (1+05:40)
username8 pts/14 192.168.100.121 Thu Jun 10 17:59 - 07:50 (13:50)
username9 pts/9 192.168.100.126 Thu Jun 10 17:59 - 18:03 (00:04)
wtmp begins Thu Jun 10 17:33:14 2013
$ last -3
username2 pts/17 192.168.100.123 Wed Mar 23 22:14 still logged in
username3 pts/20 localhost:11.0 Wed Mar 23 14:26 - 15:48 (01:21)
username4 pts/23 localhost:11.0 Wed Mar 23 14:26 - 15:48 (01:21)
wtmp begins Thu Jun 10 17:33:14 2013
$ last -3 -R
username2 pts/17 Wed Mar 23 22:14 still logged in
username3 pts/20 Wed Mar 23 14:26 - 15:48 (01:21)
username4 pts/23 Wed Mar 23 14:26 - 15:48 (01:21)
wtmp begins Thu Jun 10 17:33:14 2013
$ last -n 5 -a -i
username3 pts/17 Wed Mar 23 22:14 still logged in 192.168.100.123
username5 pts/20 Wed Mar 23 14:26 - 15:48 (01:21) 0.0.0.0
username6 pts/23 Wed Mar 23 14:26 - 15:48 (01:21) 0.0.0.0
username7 pts/19 Wed Mar 23 13:46 - 15:48 (02:01) 192.168.100.123
username8 pts/17 Wed Mar 23 13:18 - 15:47 (02:29) 192.168.100.123
wtmp begins Thu Jun 10 17:33:14 2013
我知道你是谁,但我不知道我是谁,此时whoami
可以帮助你,哈哈。
whoami
将打印当前用户的名字。与id -un
类似。
官方定义为:
whoami - print effective userid
用法为:
$ whoami [option] ..
这命令,基本没有参数。
我暂时。。也没有想到为什么会有这个命令。
唯一的可能使你找管理员来配置个啥,然后他需要知道你是谁,不,我是谁。
我看了一下源码,果然简洁:
#include
#include
#include
#include
#include "system.h"
#include "die.h"
#include "error.h"
#include "long-options.h"
#include "quote.h"
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "whoami"
#define AUTHORS proper_name ("Richard Mlynarik")
void
usage (int status)
{
if (status != EXIT_SUCCESS)
emit_try_help ();
else
{
printf (_("Usage: %s [OPTION]...\n"), program_name);
fputs (_("\
Print the user name associated with the current effective user ID.\n\
Same as id -un.\n\
\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
emit_ancillary_info (PROGRAM_NAME);
}
exit (status);
}
int
main (int argc, char **argv)
{
struct passwd *pw;
uid_t uid;
uid_t NO_UID = -1;
initialize_main (&argc, &argv);
set_program_name (argv[0]);
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
atexit (close_stdout);
parse_gnu_standard_options_only (argc, argv, PROGRAM_NAME, PACKAGE_NAME,
Version, true, usage, AUTHORS,
(char const *) NULL);
if (optind != argc)
{
error (0, 0, _("extra operand %s"), quote (argv[optind]));
usage (EXIT_FAILURE);
}
errno = 0;
uid = geteuid ();
pw = (uid == NO_UID && errno ? NULL : getpwuid (uid));
if (!pw)
die (EXIT_FAILURE, errno, _("cannot find name for user ID %lu"),
(unsigned long int) uid);
puts (pw->pw_name);
return EXIT_SUCCESS;
}
其中使用的即为uid = geteuid ();
。
… note::
物是人非事事休,欲语泪先流。
李清照《武陵春·春晚》
知道了我是谁,接下来就要知道谁是谁了。
who
将显示谁在登录,显示的内容可能包括用户名、终端登录口,登录的时间等等信息。
官方定义为:
who - show who is logged on
用法为:
$ who [OPTION]... [ FILE | ARG1 ARG2 ]
常用的参数为:
-q , --count
:只显示登入系统的帐号名称和总人数;-s
:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题;-a, --all
:效果为加上 -b -d --login -p -r -t -T -u
-b, --boot
:上一次系统的重启时间-d, --dead
:打印dead进程-H, --heading
:打印每一列的表头-q, --count
:所有登录的用户名以及用户登录的数量-s, --short
:打印USER/LINE/WHEN(默认为这个参数)显示当前登录系统的用户
$ who
user pts/0 2012-03-02 10:12
user2 pts/1 2012-03-10 09:12
这个信息显示系统自上一次重启后的运行时间。
$ who -b
system boot 2012-02-16 14:05
使用-H
或者--heading
可以看到表头信息
$ who -H
USER LINE WHEN
user pts/0 2012-03-02 10:12
user2 pts/1 2012-03-10 09:12
$ who -q
user1 user1 user2 user2 user3 user4
# users=6
w
可以认为是加强版的who
,果然越简洁越强大,就比如less
比more
是功能更多的。
w
不仅可以显示谁在登录,还可以打印他们在做什么。w
显示的信息如下:
官方定义为:
w - Show who is logged on and what they are doing.
用法为:
$ w [options] user [...]
常用的两个选项为:
-h
不显示各栏位的标题信息列。
-s
简洁格式列表,不显示用户登入时间,JCPU或者PCPU的时间
显示当前用户的登录信息及执行的命令
$ w
16:29:03 up 26 days, 2:49, 6 users, load average: 1.00, 0.97, 0.96
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user pts/4 :1 07Sep21 20days 9:59 1:53m bash
user pts/0 :2 08Sep21 6days 0.70s 1:53m zsh
user pts/1 :3 08Sep21 20days 1:13m 1:53m bash
user :0 :0 15Sep21 6days 27days 21.36s zsh
user pts/2 :0 15Sep21 14days 0.25s 0.25s zsh
user pts/3 :3 16Sep21 24:45m 0.22s 0.22s bash
$ w -h
16:29:16 up 26 days, 2:49, 6 users, load average: 1.20, 0.67, 0.76
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user pts/4 :1 07Sep21 20days 9:59 1:53m bash
user pts/0 :2 08Sep21 6days 0.70s 1:53m zsh
user pts/1 :3 08Sep21 20days 1:13m 1:53m bash
user :0 :0 15Sep21 6days 27days 21.36s zsh
user pts/2 :0 15Sep21 14days 0.25s 0.25s zsh
user pts/3 :3 16Sep21 24:45m 0.22s 0.22s bash
$ w -s
16:29:26 up 26 days, 2:49, 6 users, load average: 1.50, 0.67, 0.36
USER TTY FROM IDLE WHAT
user pts/4 :1 20days bash
user pts/0 :2 6days zsh
user pts/1 :3 20days bash
user :0 :0 6days zsh
user pts/2 :0 14days zsh
user pts/3 :3 24:45m bash
passwd
用于创建或者更新用户密码,是管理员必备的命令之一。
这个命令最终的实现是通过调用Linux-PAM 和Libuser API来实现的。
官方的定义为:
passwd - update user’s authentication tokens
使用的方法为:
$ passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
其中很常用的options为:
-S, --status
:显示密码的状态信息-d, --delete
:删除用户密码,此时该用户将处于无密码状态不太常用的options为:
--stdin
:可以通过标准输入,亦可以为一个pipe-l, --lock
:锁定账号,不过也不是完全锁定,因为用户可以通过ssh key来继续访问-u, --unlock
:与上面的-l
选项相反,属于解锁用户-w, --warning DAYS
:口令到期前通知用户,具备password lifetime的才支持这个是最常用的用法,用于设置或者修改更新用户密码
$ sudo passwd user #设置用户user的密码
Enter new UNIX password: #输入新密码,输入的密码不显示
Retype new UNIX password: #再次输入确认密码
passwd: password updated successfully
# 此时设置成功
$ sudo passwd -d user
passwd: password expiry information changed.
此时用户处于无密码的状态,很类似最近说的,没有密码就是最安全的密码。
$ sudo passwd -S user
[sudo] password for oper:
user PS 2013-02-11 0 99999 7 -1 (Password set, SHA512 crypt.)
说到密码,有两个比较重要的原则: