作者:Grey

原文地址:Linux学习笔记

说明

本文中Linux基于CentOS 7,主要是日常学到的一些笔记,所以内容相对零散。

/目录下文件夹主要作用

[root@linux /]# ll /
total 16
lrwxrwxrwx.   1 root root    7 Aug 17 02:40 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Sep 13 22:03 boot
drwxr-xr-x.  20 root root 3200 Sep 13 21:58 dev
drwxr-xr-x.  74 root root 8192 Sep 13 22:03 etc
drwxr-xr-x.   2 root root    6 Apr 11  2018 home
lrwxrwxrwx.   1 root root    7 Aug 17 02:40 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Aug 17 02:40 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Apr 11  2018 media
drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root    6 Apr 11  2018 opt
dr-xr-xr-x. 109 root root    0 Sep 13 21:58 proc
dr-xr-x---.   2 root root  151 Sep 13 21:59 root
drwxr-xr-x.  25 root root  740 Sep 13 22:03 run
lrwxrwxrwx.   1 root root    8 Aug 17 02:40 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root    0 Sep 13 21:58 sys
drwxrwxrwt.   8 root root  172 Sep 13 22:58 tmp
drwxr-xr-x.  13 root root  155 Aug 17 02:40 usr
drwxr-xr-x.  19 root root  267 Aug 17 02:45 var

其中:

/boot

系统启动相关的文件,如内核,initrd,以及grub(bootloader)

/dev

设备文件

/etc

配置文件

/home

用户的家目录,每一个用户的家目录通常默认为:/home/USERNAME

/root

管理员的家目录

/lib

库文件

/media

挂载点目录,移动设备

/mnt

挂载点目录,额外的临时文件系统

/opt

可选目录,第三方程序的安装目录

/proc

伪文件系统,内核映射文件

/sys

伪文件系统,跟硬件设备相关的属性映射文件

/tmp

临时文件,/var/tmp

/var

可变化的文件,比如:日志文件,数据文件

/bin

可执行文件,用户命令

/sbin

管理命令

文件系统相关命令

df 显示磁盘的使用情况

du 显示文件系统的使用情况

ls 显示目录

Linux中的文件类型

- 普通文件

d 目录文件

b 块设备文件(block)

c 字符设备文件

l 符号链接文件(symbolic link file)

p 命令管道文件(pipe)

s 套接字文件(socket)

文件基本信息说明

image

image

挂载/卸载

/boot目录的加载和卸载
在/下:

umount /dev/sda1
mount /dev/sda1 /boot

通过挂载实验来演示块设备

第一步,通过以下命令生成100m的空img文件,其中dd命令可以用于硬盘的互相拷贝。

dd if=/dev/zero of=mydisk.img bs=1048576 count=100

第二步,使用losetup将磁盘镜像文件虚拟成块设备

losetup /dev/loop0 mydisk.img 

第三步,通过mke2fs命令用于建立ext2文件系统。

mke2fs /dev/loop0

第四步,挂载

mkdir /mnt/myos

mount -t ext2 /dev/loop0 /mnt/myos

查看/dev/loop0信息,它就是一个块设备

[root@linux /]# ll /dev/loop0
brw-rw----. 1 root disk 7, 0 Sep 14 01:15 /dev/loop0

继续完善/mnt/myos目录,首先,拷贝bash到myos的bin目录中

mkdir /mnt/myos/bin

cd /mnt/myos

cp /bin/bash ./bin

查看bash需要的依赖

ldd /mnt/myos/bin/bash
linux-vdso.so.1 =>  (0x00007ffd88ba5000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fb19c6ca000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb19c4c6000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb19c0f8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb19c8f4000)

模拟bash的依赖结构,我们建立好对应的依赖存放目录

mkdir /mnt/myos/lib64

将系统中bash的所有依赖拷贝到这个目录

cp /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /mnt/myos/lib64/

启动myos下的bash

cd /mnt/myos
chroot ./

注:chroot 命令把根目录换成指定的目的目录。

使用echo和重定向测试bash

[root@linux myos]# chroot ./
bash-4.2# echo "d" > /abc.txt

退出bash,并在/mnt/myos目录下,

[root@linux myos]# cat /mnt/myos/abc.txt
d

文件描述符操作实验

第一步,创建一个文件,并写入一些内容。

vi abc.txt

写入一些内容

dfasdfasdfasdfa1
asdfasdfasd2
sadfasdfasd3

将abc.txt读入4号文件描述符

exec 4< abc.txt

查看当前进程所有文件描述符

ll /proc/$$/fd
[root@linux data]# ll /proc/$$/fd
total 0
lrwx------. 1 root root 64 Sep 14 02:44 0 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 02:44 1 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 02:44 2 -> /dev/pts/0
lrwx------. 1 root root 64 Sep 14 02:46 255 -> /dev/pts/0
lr-x------. 1 root root 64 Sep 14 02:46 4 -> /data/abc.txt

查看当前进程打开的文件

lsof -p $$
[root@linux data]# lsof -p $$
COMMAND  PID USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
....
bash    1252 root    4r   REG  253,0        84 34172896 /data/abc.txt
....

将abc.txt第一行读出来

[root@linux data]# read a 0<& 4
[root@linux data]# echo $a
sdfasdfasdfasdfasdfasdfasdfasd

文件偏移量实验

每个进程的偏移量互不影响,每个fd会单独维护一个seek(指针)
查看文件偏移量

lsof -op $$

可以看到,一开始偏移量(OFFSET字段):0t31

[root@linux data]# lsof -op $$
COMMAND  PID USER   FD   TYPE DEVICE OFFSET     NODE NAME
....
bash    1252 root    4r   REG  253,0   0t31 34172896 /data/abc.txt
....

重新打开一个,并再次查看文件偏移量,0t0。

exec 4< /data/abc.txt 
[root@linux data]# lsof -op $$
COMMAND  PID USER   FD   TYPE DEVICE OFFSET     NODE NAME
....
bash    1252 root    4r   REG  253,0    0t0 34172896 /data/abc.txt
....

模拟socket实验

[root@sec fd]# echo $$
1719
[root@sec fd]# cd /proc/1719/fd
[root@sec fd]# exec 8<> /dev/tcp/www.baidu.com/80
[root@sec fd]# ll
total 0
....
lrwx------. 1 root root 64 May 18 10:11 8 -> 'socket:[32794]'

[root@sec fd]# lsof -op $$
COMMAND  PID USER   FD   TYPE DEVICE OFFSET     NODE NAME
....
bash    1719 root    8u  IPv4  32794    0t0      TCP sec:55974->183.232.231.174:http (ESTABLISHED)
....

重定向操作符

[root@sec ~]# ls ./
abc.txt  anaconda-ks.cfg
[root@sec ~]# ls ./ 1> ~/ls.out
[root@sec ~]# ll
total 12
-rw-r--r--. 1 root root   80 May 18 10:18 abc.txt
-rw-------. 1 root root 1060 Apr 20 17:15 anaconda-ks.cfg
-rw-r--r--. 1 root root   31 May 18 10:34 ls.out
[root@sec ~]# cat ls.out 
abc.txt
anaconda-ks.cfg
ls.out

[root@sec ~]# cat 0< ls.out 1>cat.out
[root@sec ~]# cat cat.out 
abc.txt
anaconda-ks.cfg
ls.out

# 覆盖操作
[root@sec ~]# read a
fasdfasdfasdfas
[root@sec ~]# echo $a
fasdfasdfasdfas
[root@sec ~]# read a 0< cat.out
[root@sec ~]# echo $a
abc.txt


标准输入输出,错误输出

# 由于asdfasdfasdf目录不存在,所以执行ls会报错
[root@sec ~]# ls ./ /asdfasdfasdf 1>ls01.out
ls: cannot access '/asdfasdfasdf': No such file or directory
[root@sec ~]# cat ls01.out 
./:
abc.txt
anaconda-ks.cfg
cat.out
ls01.out
ls.out


# 如果要保存错误信息
[root@sec ~]# ls ./ /asdfasdfasdf 1>ls01.out 2>ls03.out
[root@sec ~]# cat ls03.out 
ls: cannot access '/asdfasdfasdf': No such file or directory

# 或者这样
[root@sec ~]# ls ./ /asdfasdfasdf 1> ls04.out 2>& 1
[root@sec ~]# cat ls04.out 
ls: cannot access '/asdfasdfasdf': No such file or directory
./:
a
abc.txt
anaconda-ks.cfg
cat.out
ls01.out
ls02.out
ls03.out
ls04.out
ls.out

管道

# 查询abc.txt中的第五行数据
[root@sec ~]# head -5 abc.txt | tail -1

父子进程

[root@sec ~]# echo $$1719
[root@sec ~]# /bin/bash
[root@sec ~]# echo $$1824
# pstree,安装:yum install psmisc -y 
[root@sec ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]        ├─auditd───{auditd}        ├─crond        ├─dbus-daemon───{dbus-daemon}        ├─firewalld───{firewalld}        ├─login───bash        ├─polkitd───5*[{polkitd}]        ├─rngd───{rngd}        ├─sshd───sshd───sshd───bash───bash───pstree        ├─sssd─┬─sssd_be        │      └─sssd_nss        ├─systemd───(sd-pam)        ├─systemd-journal        ├─systemd-logind        ├─systemd-udevd        └─tuned───3*[{tuned}]        
# 父子进程的数据是无法互相访问的
[root@sec ~]# x=100
[root@sec ~]# echo $x100
[root@sec ~]# exitexit
[root@sec ~]# echo $x
[root@sec ~]# a=1
[root@sec ~]# echo $a1
[root@sec ~]# { a=9 ; echo "dassdf"; } | catdassdf
[root@sec ~]# echo $a1
# $$ 和 $BASHPID 优先级 , $$ 优先级高, $BASHPID 优先级低
[root@sec ~]# echo $$2163
[root@sec ~]# echo $$ | cat2163
[root@sec ~]# echo $BASHPID | cat2191
# 如果父子进程数据互相访问,需要用export
[root@sec ~]# a=10
[root@sec ~]# export a
[root@sec ~]# /bin/bash
[root@sec ~]# echo $a10

Linux中的内部命令和外部命令

分为内部命令和外部命令 内部命令(Shell自带的命令)

image.png

外部命令(不是Shell自带的命令,由用户安装的)

image.png

查看命令是一个什么类型的文件

image.png

查看ifconfig命令在哪个位置

whereis ifconfig

什么是Shell? bash shell,就是一个程序,就是Linux系统安装的一个软件

root/密码写对后,直接进入bash shell软件

image.png

image.png

echo $PATH

image.png

内部命令的帮助用help指令,外部命令的帮助用man指令

echo $$: 当前bash shell的进程号

如果平时退出不了某个程序,可以复制一个ssh对话,用ps -ef找到那个进程,用kill -9 退出即可

bash shell在执行命令的时候,做了两步优化:

  1. 通过PATH来
  2. 通过hash来,hash查看,hash -r(清空hash)

Shell

编写脚本时候要赋予该文件执行权限chmod u+rx filename

如果bash执行,不需要赋予执行权限

bash ./filename.sh
./filename.sh
以上两种执行方式都是新开一个进程

source ./filename.sh
.filename.sh
这种方式执行不会产生新的子进程

#!/bin/bash/cd /tmppwd

输入重定向符号 <

read var < /path/to/a/file

输出重定向 >   >> 2> &>

echo 123 > /path/to/a/file  清空输入
echo 123 >> /path/to/a/file 追加
echo 12343 2> /path/to/a/file 错误输入
echo 122 &> /path/to/a/file 全部输入

#!/bin/bashcat > /data/m.sh << EOFecho "hello bash"EOF

变量赋值

  • a=123

  • let a=10+2

  • l=ls

  • letc=$(ls -l /etc) 或 letc=ls -l /etc

  • 变量值有空格等特殊字符可以包括在"" 或 ``中

  • echo ${变量名} 查看变量的值

变量的默认作用范围
默认自己的shell进程中

变量的导出,让子进程获得父进程的变量值

  • export 变量名
    变量的删除
  • unset 变量名

环境变量:每个Shell打开都可以获得的变量

  • set和env命令

  • $? 上一条命令是否正确执行(正确:0, 错误:1)

  • $PATH

  • $PS1

位置变量

  • $1 $2 ... $n
#!/bin/bash# $1 $2 ...$9 ${10}echo $1# 默认打印第二个参数值,如果为空则显示_echo ${2-_}

环境变量配置文件所在目录

  • /etc/profile
  • /etc/profile.d/
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

说明:/etc/下的配置文件,表示所有用户通用的配置,用户家目录的配置文件只能特定用户使用,
su - 用户名  login shell 所有都可以执行
su 用户名 nologin shell  /bashrc, /etc/bashrc

所用终端都应用新的环境变量: export PATH=$PATH:/new/to/path
让环境变量立即生效:source /etc/profile

定义数组

# 数组定义
IPTS=(10.0 1.0 3.0)
# 显示数组中所有元素
echo ${IPTS[@]}
#显示数组元素个数
echo ${#IPTS[@]}
#显示数组的第一个元素
echo ${IPTS[0]}
## 级联创建目录
mkdir -p a/adir/bdir

mkdir a/adir a/bdir a/cdir
mkdir a/{1,2,3}dir


## 复制文件夹
## 将a文件夹复制到cpp文件夹中,复制文件夹用
cp -r a cpp/ 

stat和touch 组合使用,可以增量监控数据改变的时间 linux命令系列 stat & touch

Q:

  • 内建命令不需要创建子进程
  • 内建命令对当前shell有效

命令积累

与时间服务器上的时间同步

第一步,安装ntpdate工具

yum -y install ntp ntpdate

第二步,设置时间为阿里服务器的时间

ntpdate ntp1.aliyun.com

第三步,将系统时间写入硬件时间

hwclock –systohc

一屏可以显示的文件,可以用cat 一屏显示不出来的内容,用more命令,space翻页,无法回看 使用less 命令就可以往后推(space),按b键往前翻(less是将文件一次性load内存,所以文件大的时候只能用more)

head -n 文件名 前n行的数据 tail -n 文件名 后n行数据 tail -f 文件名 监控文件内容改变

管道命令 cat xxx | head -3 cat xxx作为输出流的形式作为后面命令的输入流

ls -l 无法接受前面的输出流的内容,如果要解决,需要这样用: echo "/" | xargs ls -l

head -5 xxx | tail -1 获取第五行的数据

screen -S yourname ## 新建一个叫yourname的session
screen -ls         ## 列出当前所有的session
screen -r yourname ## 回到yourname这个session
screen -d yourname ## 远程detach某个session
screen -d -r yourname ## 结束当前session并回到yourname这个session

硬连接
ln /data/x.txt /data/b.txt
stat x.txt
stat b.txt
Innode号一致
修改任何一个,另外一个都可以同步修改
删掉任何一个,不会影响另外那个

软连接
ln -s /data/x.txt /data/b.txt
Innode号不一致
删掉x.txt个,b.txt的链接会丢失

2、Linux 的常用命令,比如:
ps aux / ps -ef、top C
df -h、du -sh *、free -g
vmstat、mpstat、iostat、netstat

ssh 连接失败,如何定位?
是否能 ping 通(DNS是否正确)、对端端口是否开了防火墙、对端服务是否正常……

拒绝用户登录

Linux用户管理之使用/bin/false和/usr/sbin/nologin拒绝用户登录及其功能分析(转)

参考资料

linux下的exec命令

Linux命令行大全

Linux就该这么学

Linux预习资料 提取码:7w30

CentOS6.x升级到CentOS7.x的注意事项视频 提取码: yhfd

Linux内核设计与实现

极客时间-Linux实战技能100讲

Linux文件权限详解

Linux losetup 命令

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/greyzeng/p/14779862.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!