Linux 笔记

博客地址:http://www.moonxy.com

一、Unix 和 Linux 的区别

目前主流的 Unix 系统有三种,分别是 IBM-AIX、HP-UX、SUN-Solaris,它们分别运行在各自的 Unix 服务器上,这些 Unix 服务器自成体系,有自己生产的 CPU、内存、主板等等,这些 Unix 系统互不兼容,它们各自有自己的系统工程师,这些工程师一般只熟悉其中的某种 Unix 系统,如果要熟悉其它的 Unix 系统,则还要继续学习,这些 Unix 系统没有好坏,只有不同。

UNIX 系统大多是与硬件配套的,而 Linux 则可运行在多种硬件平台上。

UNIX 是商业软件,而 Linux 是自由软件,即免费、公开源代码的。

Linux 是一种外观和性能与 UNIX 相同或更好的操作系统,但是 Linux 不源于任何版本的 UNIX 的源代码,并不是 UNIX,而是一个类似于 UNIX的产品。Linux 产品成功的模仿了 UNIX 系统和功能,具体地说 Linux 是一套兼容于 System V 以及 BSD UNIX 的操作系统,对于 System V 来说,目前把软件程序源代码拿到 Linux 底下重新编译之后就可以运行,而对于 BSD UNIX 来说它的可执行文件可以直接在 Linux 环境下运行。

通常情况下,如果你有机会使用到 Unix 环境,比如银行、电信部门,那一般都是固定机型的 Unix。比如电信里 SUN 的居多,民航里 HP 的居多,银行里 IBM 的居多。不同的 Unix 命令集有些不同,需要注意。

二、常用命令

1.Linux的7个运行级别

# cat /etc/inittab

命令行模式:

# init 3

图形模式:

# init 5

关闭:

# init 0

重启:

# init 6

2.快捷键

# Ctrl + C:终止当前命令

# Ctrl + Z:暂停当前进程。暂停后,使用fg命令恢复该进程

# Ctrl + A:光标到命令行首

# Ctrl + E:光标到命令行尾

# Ctrl + U:删除光标前所有字符

# Ctrl + K:删除光标后所有字符

# Ctrl + L:清屏

# Ctrl + D:退出登录,等效于exit

# Ctrl + S:锁住命令终端,按任何键没有反应

# Ctrl + Q:解锁命令终端

3. 命令 history

查看交互的历史命令;# !cp 执行最近执行过的 cp 命令;# !$ 会匹配执行上一条命令的最后一个参数;# echo $? 用于输出上一条命令执行的状态码,如果为 0 表示执行成功,否则表示失败。

4. 命令 uname

uname - print system information,# uname -a,可以查看linux版本及位数。

[root@ryan ~]# uname -a
Linux ryan 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

5. 命令 file

file - determine file type,确定文件类型,如下表示此文件为 ASCII 英文文本。

[root@ryan ~]# file /etc/inittab
/etc/inittab: ASCII English text

6. 命令 type

查看命令类型,如 cd 为内置的 shell 命令。

[root@ryan ~]# type cd
cd is a shell builtin

7. 命令 man

man - format and display the on-line manual pages,Linux 帮助手册。

[root@ryan ~]# man ls
Formatting page, please wait...
LS(1) User Commands LS(1)

NAME
ls - list directory contents
……

Linux 系统目录结构

8. 命令 ls

ls - list directory contents,用于列出指定目录或者文件。

-a 列出所有目录或者文件,包括隐藏目录或者文件,以 . 开头的表示隐藏目录或者文件。

[root@ryan ~]# ls -a
. .config .gconfd .lesshst .pulse-cookie
.. .cshrc .gnome2 linux .tcshrc
anaconda-ks.cfg .dbus .gtk-bookmarks .local Templates
.bash_history Desktop .gvfs Music Videos
.bash_logout Documents .ICEauthority .nautilus
.bash_profile Downloads .imsettings.log Pictures
.bashrc .esd_auth install.log Public
.cache .gconf install.log.syslog .pulse

-l 查看目录或者文件的详细信息。

[root@ryan ~]# ls -l
total 60
-rw-------. 1 root root 943 Nov 12 07:43 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Desktop
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Documents
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Downloads
-rw-r--r--. 1 root root 13368 Nov 12 07:43 install.log
-rw-r--r--. 1 root root 3482 Nov 12 07:42 install.log.syslog
drwxr-xr-x. 4 root root 4096 Nov 26 03:57 linux
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Music
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Pictures
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Public
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Templates
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Videos

-d 查看目录信息。

[root@ryan ~]# ls -ld
dr-xr-x---. 21 root root 4096 Nov 26 02:37 .

-t 按照时间倒序排列(降序)。

[root@ryan ~]# ls -lt
total 60
drwxr-xr-x. 4 root root 4096 Nov 26 03:57 linux
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Videos
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Documents
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Downloads
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Music
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Pictures
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Public
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Templates
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Desktop
-rw-------. 1 root root 943 Nov 12 07:43 anaconda-ks.cfg
-rw-r--r--. 1 root root 13368 Nov 12 07:43 install.log
-rw-r--r--. 1 root root 3482 Nov 12 07:42 install.log.syslog

-r 按照时间正序排列(升序)。

[root@ryan ~]# ls -ltr
total 60
-rw-r--r--. 1 root root 3482 Nov 12 07:42 install.log.syslog
-rw-r--r--. 1 root root 13368 Nov 12 07:43 install.log
-rw-------. 1 root root 943 Nov 12 07:43 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Desktop
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Templates
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Public
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Pictures
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Music
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Downloads
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Documents
drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Videos
drwxr-xr-x. 4 root root 4096 Nov 26 03:57 linux

-i 列出 inode 索引节点号。

[root@ryan ~]# ls -li
total 60
1046539 -rw-------. 1 root root 943 Nov 12 07:43 anaconda-ks.cfg
1046648 drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Desktop
1046666 drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Documents
1046653 drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Downloads
1046530 -rw-r--r--. 1 root root 13368 Nov 12 07:43 install.log
1046532 -rw-r--r--. 1 root root 3482 Nov 12 07:42 install.log.syslog
1046557 drwxr-xr-x. 4 root root 4096 Nov 26 03:57 linux
1046667 drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Music
1046668 drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Pictures
1046663 drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Public
1046654 drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Templates
1046669 drwxr-xr-x. 2 root root 4096 Nov 14 06:19 Videos

-h 合理的显示文件的大小。

[root@ryan ~]# ls -lh
total 60K
-rw-------. 1 root root 943 Nov 12 07:43 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4.0K Nov 14 06:19 Desktop
drwxr-xr-x. 2 root root 4.0K Nov 14 06:19 Documents
drwxr-xr-x. 2 root root 4.0K Nov 14 06:19 Downloads
-rw-r--r--. 1 root root 14K Nov 12 07:43 install.log
-rw-r--r--. 1 root root 3.5K Nov 12 07:42 install.log.syslog
drwxr-xr-x. 4 root root 4.0K Nov 26 03:57 linux
drwxr-xr-x. 2 root root 4.0K Nov 14 06:19 Music
drwxr-xr-x. 2 root root 4.0K Nov 14 06:19 Pictures
drwxr-xr-x. 2 root root 4.0K Nov 14 06:19 Public
drwxr-xr-x. 2 root root 4.0K Nov 14 06:19 Templates
drwxr-xr-x. 2 root root 4.0K Nov 14 06:19 Videos

-s 列出文件占用磁盘块的大小。

[root@ryan linux]# ls -lhs
total 140K
4.0K -rwxr-xr-x 1 root root 117 Apr 8 22:38 1.sh
16K -rw-r--r--. 1 root root 14K Mar 20 20:46 file.log
16K -rw-r--r--. 1 root root 14K Mar 18 17:48 install.log
4.0K -rw-r--r-- 1 root root 18 Apr 20 22:19 linux1.txt
4.0K -rw-r--r-- 1 root root 18 Apr 20 22:22 linux2.txt
4.0K drwxr-xr-x 2 root root 4.0K Apr 17 23:03 shelltest
4.0K drwxr-xr-x 2 root root 4.0K Apr 12 22:44 shtest
4.0K drwxr-xr-x. 2 root root 4.0K Mar 31 20:03 split_dir

-S 按照文件大小排序,默认降序,添加 r 属性表示反转排序为升序排列。

[root@ryan linux]# ls -lhsS
total 140K
16K -rw-r--r--. 1 root root 14K Mar 20 20:46 file.log
16K -rw-r--r--. 1 root root 14K Mar 18 17:48 install.log
4.0K drwxr-xr-x 2 root root 4.0K Apr 17 23:03 shelltest
4.0K drwxr-xr-x 2 root root 4.0K Apr 12 22:44 shtest
4.0K drwxr-xr-x. 2 root root 4.0K Mar 31 20:03 split_dir
8.0K drwxr-xr-x+ 2 root root 4.0K Dec 3 13:35 test
4.0K drwxr-xr-x. 2 root root 4.0K Nov 26 03:46 test1
4.0K drwxr-xr-x. 3 root root 4.0K Mar 20 21:24 test4
4.0K -rw-r--r-- 1 root root 890 Apr 7 11:32 test3
4.0K -rw-r--r-- 1 root root 842 Apr 7 18:00 test4.log
4.0K -rw-r--r--. 1 root root 678 Mar 20 21:31 test4.zip

9. 命令 who

who - show who is logged on,用于显示当前系统的在线人员。

[root@ryan ~]# who
root pts/0 2017-12-03 17:53 (192.168.1.101)

10. 命令 whoami

whoami - print effective userid,用于打印当前用户,也可在中间添加空格 # who am i。

[root@ryan ~]# who am i
root pts/0 2017-12-03 17:53 (192.168.1.101)

11. 命令 w

w - Show who is logged on and what they are doing,显示当前登录的用户信息和他们执行的命令。

[root@ryan ~]# w
20:09:52 up 14 days, 22:48, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 18:00 2:09m 0.00s 0.03s login -- root
root pts/0 124.89.91.57 11:49 0.00s 0.04s 0.04s -bash

说明:

在命令行模式下,默认有 6 个终端,即 tty1 - tty6;

以图形形式登录会显示 tty7;

如果是通过远程登录的,会显示 pts/0,pts/1,pts/2……。

三、Linux 系统的顶层目录结构

 /                          根目录

├── bin              存放用户二进制文件

├── boot            存放内核引导配置文件

├── dev             存放设备文件

├── etc              存放系统配置文件

├── home          用户主目录

├── lib               动态共享库

├── lib64           64位系统动态共享库

├── lost+found  文件系统恢复时的恢复文件

├── media         可卸载存储介质挂载点

├── mnt             文件系统临时挂载点

├── opt              附加的应用程序包

├── proc            系统内存的映射目录,提供内核与进程信息

├── root             root 用户主目录

├── sbin            存放系统二进制文件

├── srv              存放服务相关数据

├── sys              sys 虚拟文件系统挂载点

├── tmp             存放临时文件

├── usr              存放用户应用程序

└── var              存放邮件、系统日志等变化文件

[root@ryan ~]# tree -L 1 /
/
├── bin
├── boot
├── dev
├── etc
├── home
├── lib
├── lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── sbin
├── selinux
├── srv
├── sys
├── tmp
├── usr
└── var

四、远程登录 Linux 系统

Linux 系统通过 sshd 服务实现远程登录功能。sshd 服务默认开启了 22 端口,当我们安装完系统时,这个服务已经安装,并且是开机启动的。sshd 服务的默认文件为 /etc/ssh/sshd_config,可以修改这个配置文件,比如端口等。

SSH(Secure Shell)是一种通用的、功能强大的、基于软件的网络协议安全解决方案。计算机每次向网络发送数据时,SSH都会自动对其进行加密。数据到达目的地时,SSH自动对加密数据进行解密。整个过程都是透明的,使用OpenSSH工具将会增进你的系统安全性,主要用于代替 Telnet 与 FTP 登录等。

从客户端来看,SSH 提供两种级别的安全验证。

第一种级别(基于口令的安全验证)

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到"中间人"这种方式的攻击。

第二种级别(基于密钥的安全验证)

需要依靠密钥,也就是你必须为自己创建一对密钥,并把公用密钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密钥,然后把它和你发送过来的公用密钥进行比较。如果两个密钥一致,服务器就用公用密钥加密"质询"(challenge)并把它发送给客户端软件。客户端软件收到"质询"之后就可以用你的私人密钥解密再把它发送给服务器。

用这种方式,你必须知道自己密钥的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

第二种级别不仅加密所有传送的数据,而且"中间人"这种攻击方式也是不可能的(因为他没有你的私人密钥)。但是整个登录的过程可能需要10 秒,登录过程耗时比较长。

既然可以在 Windows 上安装一个客户端软件(比如 PuTTY)去远程登录到 Linux,那么在 Linux 上可以登录到另外的一个 Linux 上,需要在 Linux 上安装一个客户端软件,CentOS 自带的客户端软件叫做 openssh-clients,可以使用 yum 进行安装,如下:

[root@ryan ~]# man ssh
No manual entry for ssh
[root@ryan ~]# mount /dev/cdrom /mnt/cdrom
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@ryan ~]# yum install -y openssh-clients
Loaded plugins: fastestmirror, refresh-packagekit
Setting up Install Process
Loading mirror speeds from cached hostfile
c6-media                                                                                               | 4.0 kB     00:00 ...
Resolving Dependencies
--> Running transaction check
---> Package openssh-clients.x86_64 0:5.3p1-117.el6 will be installed
--> Processing Dependency: libedit.so.0()(64bit) for package: openssh-clients-5.3p1-117.el6.x86_64
--> Running transaction check
---> Package libedit.x86_64 0:2.11-4.20080712cvs.1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================
 Package                        Arch                  Version                                   Repository               Size
==============================================================================================================================
Installing:
 openssh-clients                x86_64                5.3p1-117.el6                             c6-media                442 k
Installing for dependencies:
 libedit                        x86_64                2.11-4.20080712cvs.1.el6                  c6-media                 74 k

Transaction Summary
==============================================================================================================================
Install       2 Package(s)

Total download size: 516 k
Installed size: 1.5 M
Downloading Packages:
------------------------------------------------------------------------------------------------------------------------------
Total                                                                                         2.3 MB/s | 516 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : libedit-2.11-4.20080712cvs.1.el6.x86_64                                                                    1/2
  Installing : openssh-clients-5.3p1-117.el6.x86_64                                                                       2/2
  Verifying  : libedit-2.11-4.20080712cvs.1.el6.x86_64                                                                    1/2
  Verifying  : openssh-clients-5.3p1-117.el6.x86_64                                                                       2/2

Installed:
  openssh-clients.x86_64 0:5.3p1-117.el6

Dependency Installed:
  libedit.x86_64 0:2.11-4.20080712cvs.1.el6

Complete!

安装好之后,可以使用如下命令查看 ssh 的版本号:

[root@ryan ~]# ssh -V
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

sshd 服务的配置文件为 /etc/ssh/sshd_config,可以根据需要修改这个配置文件,但是只有 root 才可以编辑这个文件。比如:

ssh 要求被连接用户的家目录,.ssh 目录,authorized_keys 三者的权限中不允许除文件所有者之外的其他人编辑,也就是这三者的 group 和 other 中不能含有 w 权限,否则 sshd 服务会拒绝本次远程连接,因为 /etc/ssh/sshd_config 中 StrictModes 选项默认为 yes。除非手动修改 StrictModes 选项值为 no。

[root@ryan ~]# cat /etc/ssh/sshd_config |grep -i StrictModes
#StrictModes yes

修改之后,即使上面三者的权限不满足,也可以远程连接成功。

是 /etc/ssh/sshd_config 立即生效,如下:# service sshd reload

[root@ryan ~]# service sshd reload
Reloading sshd:                                            [  OK  ]

生成密钥对的过程:

1)在客户端生成密钥对

# ssh-keygen

连敲三次回车,会在家目录下生成 $HOME/.ssh/id_rsa 和 $HOME/.ssh/id_rsa.pub,分别为私钥和公钥。

2)把公钥复制到要登录的机器上

# cat id_rsa.pub >> authorized_keys

3)登录 Linux

在客户端输入 # ssh root@192.168.1.121 远程登录要连接的服务器。

注意,此处的 root 为远程端的用户,需要连接远程端的哪个用户,就将公钥导入到远程端的哪个用户家目录的 $HOME/.ssh/authorized_keys 中。

要保证用户的家目录,.ssh 目录和 authorized_keys 文件都只有用户自己有写权限。通常将 .ssh 目录权限设置为 700 或 755,建议 700,将 authorized_keys 文件的权限设置为 600 或 644,建议 600。

五、Linux下清空用户登录记录和命令历史的方法

清除登陆系统成功的记录
[root@ryan ~]# echo > /var/log/wtmp //此文件默认打开时乱码,可查到 ip 等信息
[root@ryan ~]# last //此时即查不到用户登录信息

清除登陆系统失败的记录
[root@ryan ~]# echo > /var/log/btmp //此文件默认打开时乱码,可查到登陆失败信息
[root@ryan ~]# lastb //查不到登陆失败信息

清除历史执行命令
[root@ryan ~]# history -c //清空历史执行命令
[root@ryan ~]# echo > ./.bash_history //或清空用户目录下的这个文件即可

在 Linux中,每个用户目录下都有一个 .bash_history 文件用于保存历史命令,当每次注销时,本次登陆所执行的命令将被写入该文件,预设可以保存 1000 条历史命令。所以可以清空该文件,下次登陆后上次保存的命令将消失,清空效果将在下次登陆生效。命令:

echo > .bash_history

可以通过修改 /etc/profile 的 HISTSIZE 参数 ,来自定义保存的历史命令条数,如下:

[root@ryan ~]# grep -i 'HISTSIZE' /etc/profile
HISTSIZE=1000
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

此外,上面提到的 history -c,该命令可以清空本次输出的命令(本次缓存的命令),但不清空 .bash_history 文件,所以下次登陆后,之前的命令还将出现在 history 中。

六、常见 Linux 发行版

详细发行版信息:

七、公钥加密,私钥解密;私钥签名,公钥验签

公钥加密,是用别人给你的公钥加密。(这样别人的私钥才能解密)

加解密过程简述

A 和 B 进行通信加密,B 要先生成一对 RSA 密钥,B 自己持有私钥,给 A 公钥,然后 A 使用 B 的公钥加密要发送的内容,然后 B 接收到密文后通过自己的私钥解密内容。

私钥签名,是用你自己的私钥签名。(这样别人才知道这是你发送的密文,而不是第三方伪造的)

签名验签过程简述

A 给 B 发送消息,A 先计算出消息的消息摘要,然后使用自己的私钥加密消息摘要,被加密的消息摘要就是签名。(A用自己的私钥给消息摘要加密成为签名)

B 收到消息后,也会使用和 A 相同的方法提取消息摘要,然后用 A 的公钥解密签名,并与自己计算出来的消息摘要进行比较,如果相同则说明消息是 A 发送给 B 的,同时,A也无法否认自己发送消息给B的事实。(B 使用 A 的公钥解密签名文件的过程,叫做"验签")

这个过程是:首先用摘要算法对消息进行摘要,然后在把摘要值用信源的私钥加密;接收方先把接收的明文用同样的摘要算法摘要,形成"准签体",然后再把准签体与用信源的公钥解密出的"签体"进行比较,如果相同就认为消息是完整的,否则消息不完整。

附录

linux下PS1、PS2、PS3、PS4最全详解:https://blog.csdn.net/qq_37187976/article/details/79267430

ssh免密码登陆及其原理:https://www.cnblogs.com/kex1n/p/6017963.html

公钥,私钥和数字签名这样最好理解,以及加解密实例:https://blog.csdn.net/ly0303521/article/details/53391741

RSA加密/解密和签名/验签过程理解:https://www.jianshu.com/p/8dc4a5f64e06

https原理通俗了解:https://www.cnblogs.com/zhangshitong/p/6478721.html

消息摘要算法:https://baike.baidu.com/item/%E6%B6%88%E6%81%AF%E6%91%98%E8%A6%81%E7%AE%97%E6%B3%95/3286770?fromtitle=%E6%91%98%E8%A6%81%E7%AE%97%E6%B3%95&fromid=12011257&fr=aladdin

原文地址:https://www.cnblogs.com/cnjavahome/p/7875868.html