Linux学习笔记

Posted Practitioner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习笔记相关的知识,希望对你有一定的参考价值。

作者:Grey

原文地址:Linux学习笔记

文件系统

image

除了/boot的数据,其他目录下的数据都存在了sda3里面了
/var 可变化的文件,比如:日志文件,数据文件
更多文件类型说明见:

image

## 级联创建目录
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

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

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

挂载实验

演示块设备

# 生成100m的空img文件
# dd命令可以用于硬盘的互相拷贝
dd if=/dev/zero of=mydisk.img bs=1048576 count=100

losetup /dev/loop0 mydisk.img 
mke2fs /dev/loop0

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

# 搜索一下bash的位置 whereis bash
mkdir /mnt/myos/bin
cd /mnt/myos
cp /bin/bash /bin

cd /mnt/myos/bin

# 查看bash需要的依赖
ldd bash
#	linux-vdso.so.1 (0x00007ffe0413d000)
#	libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007fa608cb0000)
#	libdl.so.2 => /lib64/libdl.so.2 (0x00007fa608aac000)
#	libc.so.6 => /lib64/libc.so.6 (0x00007fa6086e9000)
#	/lib64/ld-linux-x86-64.so.2 (0x00007fa6091fb000)



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

chroot ./
echo "d" > /abc.txt

文件描述符实验

https://blog.csdn.net/qq_31186123/article/details/82190776

# 创建一个文件,写入一些内容
vi abc.txt

# 写入如下内容:
dfasdfasdfasdfa1
asdfasdfasd2
sadfasdfasd3

# 将abc.txt读入fd4
exec 4< abc.txt

# 查看当前进程所有文件描述符
[root@sec fd]# ll /proc/$$/fd
....
lr-x------. 1 root root 64 May 18 10:11 4 -> /root/abc.txt


[root@sec fd]# lsof -p $$
COMMAND  PID USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
....
bash    1719 root    4r   REG  253,0        43 33576569 /root/abc.txt
....


# 将abc.txt第一行读出来
[root@sec fd]# read a 0<& 4
[root@sec fd]# echo $a
dfasdfasdfasdfa1

文件偏移量实验

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

# 查看文件偏移量
# 一开始偏移量:0t17
[root@sec fd]# lsof -op $$
COMMAND  PID USER   FD   TYPE DEVICE OFFSET     NODE NAME
....
bash    1719 root    4r   REG  253,0   0t17 33576569 /root/abc.txt
....

# 重新打开一个
# 偏移量0t0
[root@sec fd]# exec 4< /root/abc.txt 
[root@sec fd]# lsof -op $$
COMMAND  PID USER   FD   TYPE DEVICE OFFSET     NODE NAME
....
bash    1719 root    4r   REG  253,0    0t0 33576572 /root/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

管道

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

父子进程

[root@sec ~]# echo $$1719[root@sec ~]# /bin/bash[root@sec ~]# echo $$1824# pstree,安装:yum install psmisc -y [root@sec ~]# pstreesystemd─┬─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

永久关闭SELinux的方法

vim /etc/selinux/config

把SELinux设置为disabled

image.png

配置ssh密钥连接Linux

首先Win10系统上需要有OpenSSH,像这样:终端输入ssh

这样就是有的(好像Win10 1809+默认就是有的)。
然后生成密钥对:
ssh-keygen -t rsa
接着按提示信息可根据个人需求选择,这里是默认(连续三个回车即可)。
生成的密钥对默认保存在当前用户的根目录下的.ssh目录中(C:\\Users\\username.ssh):

接着我们将公钥id_rsa.pub上传至Linux服务器(保存到你要连接的用户根目录下~/.ssh/中,没有.ssh目录则创建):
修改/etc/ssh/sshd_config配制文件,修改以下内容
RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no

上传好后,将Linux中的id_rsa.pub重命名为authorized_keys,更改文件权限为600,更改.ssh目录权限为700:
mv id_rsa.pub authorized_keys
chmod 600 authorized_keys
chmod 700 .ssh

然后就可以通过ssh方式连接到Linux

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]}

Q:

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

[

](https://www.cnblogs.com/z-joshua/p/10042681.html)

命令积累

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

  1. 安装ntpdate工具
yum -y install ntp ntpdate
  1. 设置时间为阿里服务器的时间
ntpdate ntp1.aliyun.com
  1. 将系统时间写入硬件时间
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的sessionscreen -ls         ## 列出当前所有的sessionscreen -r yourname ## 回到yourname这个sessionscreen -d yourname ## 远程detach某个sessionscreen -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的链接会丢失

参考资料

Linux命令行大全

Linux就该这么学

Linux预习资料 提取码:7w30

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

Linux内核设计与实现

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

以上是关于Linux学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

DOM探索之基础详解——学习笔记

学习笔记 链接

ReactJs学习笔记01

OpenCV 学习笔记(颜色直方图计算 calcHist)

JSP 学习笔记