Linux学习笔记
Posted Practitioner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习笔记相关的知识,希望对你有一定的参考价值。
作者:Grey
原文地址:Linux学习笔记
文件系统
除了/boot的数据,其他目录下的数据都存在了sda3里面了
/var 可变化的文件,比如:日志文件,数据文件
更多文件类型说明见:
## 级联创建目录
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
配置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自带的命令)
外部命令(不是Shell自带的命令,由用户安装的)
查看命令是一个什么类型的文件
查看ifconfig命令在哪个位置
whereis ifconfig
什么是Shell? bash shell,就是一个程序,就是Linux系统安装的一个软件
root/密码写对后,直接进入bash shell软件
echo $PATH
内部命令的帮助用help指令,外部命令的帮助用man指令
echo $$: 当前bash shell的进程号
如果平时退出不了某个程序,可以复制一个ssh对话,用ps -ef找到那个进程,用kill -9 退出即可
bash shell在执行命令的时候,做了两步优化:
- 通过PATH来
- 通过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)
命令积累
与时间服务器上的时间同步
- 安装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的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预习资料 提取码:7w30
CentOS6.x升级到CentOS7.x的注意事项视频 提取码: yhfd
以上是关于Linux学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段