知识点: 用户权限 链接 数据重定向 文本处理:vim awk sed 正则表达式 软件包管理:rpm yum 源码编译
修改CentOS7网卡名称为eth0 :
gedit /boot/grub2/grub.cfg linux16 后加 net.ifname=0
sed -i.bak ‘s/rhgb quiet/rhgb quiet net.ifname=eth0/’ /etc/default/grub
ntp时间同步 : ntpdate $NTP_SERVER
gedit /etc/ntp.cfg
server $NTP_SERVER ibrust
service ntpd start
screen屏幕同步操作: 连接同一台主机 一台使用screen -S help命令 创建名为help的会话连接 另一台使用screen -x help 加入help会话 双方都可修改 都可输入exit退出会话
双引号可识别变量,不可识别命令
单引号命令与变量均不识别
命令调用命令 用$() 或 “(反引号) 命令与变量均可识别
touch /data/file{1,2,3}.{txt,log}
date +%F 生成日期,年月日格式2018-03-11
history 查看历史命令 !数字 : 执行历史记录中对应数字的命令 !:0 执行上一条命令 不带参数 !$上一条命令的最后一个参(按Esc后按.键 或者同时按Alt和.键) !英文字母 : 执行历史记录中最近以英文字母开头的命令 历史命令个数由$HISTSIZE变量决定 位于/etc/profile文件的HISTSIZE行
Ctrl+r 搜索历史命令
如何查看命令帮助:
内部命令(加载在内核) help CM / man bash 外部命令 (在各个bin目录) CMD –help 内部/外部命令查看 type which
rm别名为mv: nano ~/.bashrc alias rm=’mv -t /backups’
硬链接VS软链接
硬连接 软链接
重定向
Linux给程序提供三种I/O设备
STDIN – 0 标准输入
STDOUT – 1 标准输出
STDERR – 2 标准错误
STDIN STDOUT 重定向至文件:
STDOUT重定向 2>STDERR重定向 &>所有输出重定向
ls &> /data/all.log
ls > /data/all.log 2>&1 >只保留本次输入的内容 上次的内容覆盖掉
ls >> /data/ls.out >>为追加保存 不会覆盖以前的数据
set -C 禁止覆盖 可追加 STDOUT STDERR都写入文件
/etc/passwd文件描述
由:分割为7个字段(列)
第一列 用户名
第二列 X 早期的系统存放加密的登录口令 (现已失效,密码存放于/etc/shadow中.为兼容旧版本此项保留)
第三列 UID
第四列 GID
第五列 用户信息
第六列 所属组
第七列 SHELL类型
管理用户与组
linux系统内三类用户 : 文件的所有者 所属组 其他人 .分别用 U G O 表示
而每类人对文件又有读写和执行三类权限.分别用RWX表示
权限位 | 文件 | 目录 |
r | 可以读文件 | 可以查看目录中内容 |
w | 可以写文件 | 可以增删目录中内容 |
x | 可以执行文件 | 可以进入目录 |
创建 useradd groupadd
修改 usermod groupmod
删除 userdel groupdel
密码 passwd gpasswd
切换用户 su &USERNAME 非登录式切换,不读取目标用户配置文件
su – &USERNAME 登陆式切换,读取目标用户配置文件
提权 sudo 普通用户以目标用户(默认为root)的身份执行命令而不需要输入目标用户密码.
配置文件 /etc/sudoers root用户只读.可用visudo命令修改,有语法检测
visudo编辑规则 :帐号 来源主机名 = (可切换的身份) 可通过sudo执行的命令
6k ALL=(root) /usr/bin/passwd #6k用户可从任意来源的主机已root身份执行passwd命令
创建名为mysql的系统帐号 指定相同的UID和GID
groupadd -g 666 mysql
#-g 666 指明GID为666
useradd -u 666 -r -s /sbin/nologin -g mysql mysql
#-u 666 指明UID为666 -r 创建系统用户 -s /sbin/nologin 指定SHELL为nologin -g mysql 指定用户为mysql组
创建名为gentoo的一般用户,附加组为distro和linux,默认shell为/bin/csh,注释信息为”GentooDistribution”
groupadd distro,linux
useradd -G distro,linux -s /bin/csh -c “GentooDistribution” gentoo
r=4 w=2 x=1
rwx = 二进制的111 = 十进制的7
rw- = (110)B = (6)D
— = 0 = 0
umask
用来规定新建文件与目录的默认权限 在/etc/profile文件中设置可对所有用户生效
umask的后三位+默认权限值 =666(file) | 777(dir)
但新建文件均无执行权限
只有一种情况. 对文件,用666减umask结果如果有奇数,加1.
umask默认值为0 0 2 — — -w-
目录权限 rwx rwx r-x (775) 目录创建的默认权限
SUID 4 继承用户所有者的权限
SGID 2 继承用户所属组的权限
STICKY 1 除了文件所有者和root 其他人即使对目录有鞋权限也无法修改或删除文件
可执行文件SUID权限:
ll /etc/passwd
-r-s–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd
1.SUID的作用仅针对于二进制程序。
2.使用者要对该二进制程序有”x”权限
3.”以文件拥有者的身份”只在执行过程中有效(执行过程中我获得了该程序owner的权限)
例子就好比 /usr/bin/passwd 这个二进制文件。
它的权限是 -rwsr-xr-x ,我不是所有者,我具有”x”权限,我执行它时,获得了它的所有者(即root)的权限,所以在该二进制程序执行时,我可以用它来读到我平时是没有权限访问的 /etc/shadow 文件(-r——–),从而能更改我自己的密码。
目录STICKY权限:
无论一个文件的权限或拥有者如何.只要对该目录具有写权限,普通用户可以删除该目录中的任何文件,包括其他普通用户和root的的文件.
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件.但设置在文件上无意义./tmp目录默认为rwxrwxrwt权限
STICKY权限设定:
chmod o+t DIR…
chmod o-t DIR…
chmod[124]755
124分别为sticky SGID SUID
例如:
ls -ld /tmp drwxrwxrwt 12 root root 4096 Nov 2 15:44 /tmp
可执行文件上SGID权限
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有
执行权限
启动为进程之后,其进程的属组为原程序文件的属组
权限设定:
chmod g+s FILE…
chmod g-s FILE…
目录上的SGID权限
默认情况下,用户创建文件时,所属组为此用户所属的主组
一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件的所属组为此目录的属组
通常用于创建一个协作目录
权限设定:
chmod g+s DIR…
chmod g-s DIR…
查看文本的命令
cat tac rev more less
head
tail 看文本的后几行 常用于跟踪日志
tail -f 跟随模式,显示文本内容的变化
cut -d: #指定:为分割符 -f1,3-5 #取第一以及第三至第五列
cut -d: -f1,3-5 /etc/passwd
df -h | cut -c34-36 #取第34至36列
取IP地址
ifconfig |head -2 |tail -1 |cut -c21-36 #head -2 #取前两行 tail -1 #取后一行 cut -c21-36#取第21至第36列
centos6
ifconfig |head -2 |tail -1 |cut -d: -f2 |cut -d’ ‘ -f1
ifconfig |head -2 |tail -1 |tr -s ” “| cut -d’ ‘ -f3 | cut -d: -f2 #tr -s ” “压缩空格
centos7
ifconfig |head -2 |tail -1 |cut -d’t’ -f2 |cut -d’ ‘ -f2
取分区利用率
df |tr -s ” ” “%”|cut -d% -f5 #tr -s ” ” “%” 将空格替换为%
合并文件
paste 左右合并
cat 上下合并
统计访问网站的前十名用户
cut -d” ” -f1 access_log|uniq -c|sort -nr|head -10
cut -d” ” -f1 access_log #以空格为分隔符,取第一列
uniq -c #统计频次(第一列为频次 第二列为文本数据)
sort -nr #以数值大小降序排列 sort默认对第一列排序
head -10 #取前10行
uniq -d #求同
uniq -u #存异
分类 sort -t “:” -k3 /etc/passwd
去重 uniq -d
输出1到55之间的随机数 echo $[RANDOM%55+1]
正则表达式取IP地址
ifconfig eth0 | grep “[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}”
ifconfig eth0 | grep addr |grep -o “[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}”
ifconfig eth0 | grep addr |grep -o “\([0-9]\{1,3\}\)\.\1\.\1\.\1”
ifconfig eth0 | grep addr |grep -o “\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}”
ifconfig eth0 | grep addr |grep -Ewo “([0-9]{1,3}\.){3}[0-9]{1,3}”
----------------------------------------------------------------------------------------------------------------------------------
知识点 : 99乘法表 list列表 pyenv 原反补码与异或运算 打印菱形与闪电 斐波那契数列 猴子吃桃 素数
10^-9
10 0000 1010
-9 1000 1001
异或 1000 0011
最后结果为-3
for i in range(1,10):
for j in range(1,i+1):
print(j,'x',i,'=',i*j,sep='',end='\t')
print()
print('-------------------------------------------------------------------------')
for i in range(1,10):
line=''
for j in range(i,10):
line+='{}x{}={:<2} '.format(i,j,i*j)
print('{:>72}'.format(line))
print('------------------------------------------------------------------------')
'''
打印99乘法表 需注意多处细节
1 根据左右上下三角分别确定行和列的上下限
2 输出结果可直接使用print函数 或对字符串进行拼接再打印
3 注意print函数的两种分隔符设定print(value, ..., sep=' ', end='\n',)
4 注意print函数默认为左对齐 若想右对齐 需使用print('{:>72}'.format())形式设定左右对齐方式(>表示右对齐)以及最长行占位数(72)
'''
for i in range(1,10):
print(' '*(i-1)*8,sep=' ',end='')
for j in range(i,10):
product=i*j #product是乘积的英文
if product>9:
end=' '
else:
end=' '
# product=str(product)+' '
# line+='{}x{}={}'.format(i,j,product)
print(i,'x',j,'=',product,sep='',end=end)
print()
'''最后一种右对齐不用format 需要更复杂的逻辑判断
1 乘积大于9的末尾空两格 小于等于9的空三格
2 因此每项式子的宽度都是8 为实现右对齐 可在列较少的行事先打印出空格,并关闭print本行的换行功能
至于空格数量 则是(i-1)*8 因为需补空格的数量刚好比行号i少1
3 此题不可眼高手低 需认真判断行列号的范围 并适当调整空格数
'''
m=int(input('>>>'))
while True:
s=input('>>>')
if s:
n=int(s)
if n>m:
m=n
print('max is ',m)
else:
# print('max is ',m)
break
count=0
sum=0
while True:
s=input('>>>')
if s:
count+=1
sum+=int(s)
print('ave is ',sum/count)
else:
break
'''
输入若干数字 可用以下代码实现
while True:
s=input('>>>')
if s:
pass
else:
break
注意不要形成s=int(input('>>>'))的思维定式 若要求输入若干数字
应采用以上办法 输入为空则停止循环
'''
'''
*
***
*****
*******
*****
***
*
以下为规律分析:
用print函数打印 print为左对齐
故只需考虑 行号L 左侧空白数b 星号数s的数学关系即可
行号L 空白数b 星号数s 循环行号i
1 3 1 -3
2 2 3 -2
3 1 5 -1
4 0 7 0
5 1 5 1
6 2 3 2
7 3 1 3
规律总结
设总行数为n hn=n//2
i=L-4 故range函数可写为range(-hn,n-hn)
b=abs(i)
s=n-2*b
乘2 除2 最好用位运算<<1 >>1代替
下面倒三角的规律只需做小改动
建议将不同的项目分开写 改变量名很麻烦也很容易出错
*******
*****
***
*
***
*****
*******
'''
n=9
hn=n>>1
for i in range(-hn,n-hn):
b=abs(i)
s=n-(b<<1)
print(' '*b,'*'*s)
nd=7
hnd=nd>>1
for i in range(-hnd,nd-hnd):
bd=hnd-abs(i)
sd=nd-(bd<<1)
print(' '*bd,'*'*sd)
# print(bd,sd)
last=1
for i in range(9):
last=(last+1)<<1
print(last)
'''
猴子吃桃问题可用逆向思维(加一再乘二)实现
但应注意循环的次数是9次而不是10次
'''
a=1
b=1
c=0
print(a,b,sep='\n',end='\n')
while True:
c=a+b
if c>100:
break
a=b
b=c
print(c)
'''
根据斐波那契数列的定义 下次加和时前两位数各向后推一位
这句话翻译为编程语言就是a=b b=c 需好好体会
'''
# n=int(input('nst of fbnq>>>'))
n=101
a=1
b=1
# c=0
if n==1:
print(a)
elif n==2:
print(b)
else:
for i in range(n-2):
c=a+b
a=b
b=c
print(c)
a=int(input('输入一个数,判断是否为质数'))
if a<2:
print('注意,0和1既非素数也非合数')
elif a==2:
print(a,'是质数')
else:
# for i in range(2,a):
for i in range(2,int(a**0.5)+1):
if a%i ==0:
print(a,'不是质数')
break
# elif i
import datetime
start=datetime.datetime.now()
count=1
for a in range(3,100000,2):#1
if a%10==5 and a>10:#2
continue
for i in range(3,int(a**0.5)+1,2):#3
if a%i ==0:
# print(a,'不是质数')
break
else :
# print(a,'是质数')
count+=1
pass
print(count)
end=datetime.datetime.now()
print(end-start)
'''
本题的几点优化方向
1 求质数 可以先舍去所有偶数 可减少一半的任务量
2 对于大于10的数 若个位数是5, 必然是5的倍数 可直接排除
3 数n对2到n-1取模 其实从2到根号n就够了 同时待测数中已无偶数,因此取模的数也不需要偶数
'''