Linux鸟哥私房菜 笔记二

in Linux with 0 comment

续linux鸟哥私房菜 笔记一

more 文档名
 空格:向下翻页
 enter: 向下一行
 /字符串:向下搜索字符串
 :f :显示文件名及当前所在行
 q :退出
 
 less 文档名
 空格:向下翻页
 pagedown:向下翻页
 pageup:向上翻页
 /字符串:向下搜索
 ?字符串:向上搜索
 n : 在搜索字符串的时候向下
 N :在搜索字符串的时候向上
 q : 退出 
 
 
 head [-n nunbers] 文档名
 tail [-n numbsers] 文档名
 
 od [-t type] 档案
 -t
   : a 利用预设的字符来输出
   : c 用ASCII字符来输出
   : d[size] 十进制来输出,每个整数占size bytes
   : f[size] 浮点数值输出 ,每个数占size bytes
   : o[size] 八进制...
   : x[size] 十六进制...
   
od -t c /usr/bin/passwd   

-----------------------------------------------------
touch [-amctd] 文档名
-a: 只修改atime
-c: 只修改ctime
-m: 只修改mtime
-t :后面加unix时间戳
-d: "2 days ago" 也可以用 --date=""

//只修改mtime
root@test-month:/tmp# touch -m wtmp

root@test-month:/tmp# ls -l --time=atime wtmp_2; ls -l --time=ctime wtmp_2; ls -l wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 26 11:05 wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 26 11:06 wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 26 09:31 wtmp_2

//修改wtmp_2的所有时间
root@test-month:/tmp# touch wtmp_2
root@test-month:/tmp# ls -l --time=atime wtmp_2; ls -l --time=ctime wtmp_2; ls -l wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 28 10:06 wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 28 10:06 wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 28 10:06 wtmp_2

root@test-month:/tmp# touch -d "2 days ago" wtmp_2
// 注意: ctime没有改
root@test-month:/tmp# ls -l --time=atime wtmp_2; ls -l --time=ctime wtmp_2; ls -l wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 26 10:08 wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 28 10:08 wtmp_2
-rw-rw-r-- 1 root utmp 21120 Nov 26 10:08 wtmp_2

 

Linux档案与目录预设权限

linux下默认建立文档时,权限为 rw-rw-rw-,建立目录时 rwxrwxrwx

umask是指linux系统默认值的基础上减掉的权限,预设的情况下umask = 022

e.g. ubuntu 下 umask 默认是022

通过umask 输出或 umask -S 输出
因此
//建立档案
-rw-rw-rw - (----w--w-) -- > -rw-r--r--
//建立目录
drwxrwxrwx - (d----w--w-) --> drwxr-xr-x
//建立可执行档
-rwxrwxrwx - (-----w--w-) --> -rwx-r-xr-x ,main为编译阶段产生的可执行文档
-rwxr-xr-x 1 root root 8927 Dec 19 06:17 main

linux档案隐藏属性

除了那九个属性,其实文档或目录还有隐藏的一些属性,这些属性在linux安全[Security]上面比较有用

chattr [+-=] [ASacdistu] 档案或目录
+ :只增加一个其它不动
-: 只减少一个,其它不动
=: 只有后边的参数
几个比较重要常用的

a: 这个档案只能增加数据,不能删除,root才能设定这个属性
i: 设定后连root也不能增删改查了

lsattr:显示档案或隐藏属性
-a: 连隐藏的也一起显示了
-R :递归子目录

root@test-month:/tmp# chattr +i wtmp

root@test-month:/tmp# lsattr *
-------------e-- 0507150202
-------------e-- bashrc
-------------e-- bashrc_hlink
lsattr: Operation not supported While reading flags on bashrc_slink
-------------e-- bashrc_slink2
-------------e-- gxg.tx
lsattr: Operation not supported While reading flags on mysql.sock
-------------e-- passwd
-------------e-- passwd-hd
lsattr: Operation not supported While reading flags on php-cgi.sock
-------------e-- suidtest
-------------e-- swap
-------------e-- testtouch
-------------e-- umaskfile
-------------e-- umaskfile1
----i--------e-- wtmp
-------------e-- wtmp_2

档案的特殊权限 SUID/SGID/Sticky Bit

当 s 这个权限在 user 的 x 位置时,也就是类似上表的 -r-s--x--x ,称为 Set UID ,简称为 SUID , 这个 UID 代表的是 User 的 ID ,而 User 代表的则是这个程序 (比如 /usr/bin/passwd) 的拥有者

SUID仅可以用在二进制档案(binary file)上,即档案要有x执行权限,suid因为是程序在执行过程中拥有档案所有者的权限,因此,可以用在binary file上,不能用在shell scripts上面,shell scripts只是把很多的binary执行档集合起来执行而已.
SUID对于目录是无效的

Set GID:如果s的权限在group 的 x 位置时,那么就是set gid ,(SGID),SGID可以用在目录与档案

比如 drwxrws---. 2 root dealdotgroup 4096 Feb 2 23:16 dealdotgroup,dealdotgroup这个文件夹的权限s,它的所属组为dealdotgroup,因此dealdotgroup内的所有成员都可以在dealdotgroup文件夹内进行读写

Sticky Bit :只对目录有效:在具有SBit的目录下,使用者若在该目录下有w及x的权限,则当使用者在该目录下建立档案或目录时,只有档案拥有者与root才有权力删除.
比如/tmp目录下的权限[drwxrwxrwt],任意使用者都能增加,修改档案,但只有该档案或目录的所有者与root才能删除

个人总结:

拥有新建目录和档案的权限的话需要有w和x的属性

ls -l即查看的权限需要有r属性

// SUID ,SGID ,Sticky Bit属性设置,演示的假设文档是二进制的
root@test-month:/tmp# touch suidtest
root@test-month:/tmp# ls -l suidtest 
-rw-r--r-- 1 root root 0 Nov 27 10:31 suidtest
root@test-month:/tmp# chmod 4755 suidtest 
root@test-month:/tmp# ls -l suidtest 
-rwsr-xr-x 1 root root 0 Nov 27 10:31 suidtest
root@test-month:/tmp# chmod 6755 suidtest 
root@test-month:/tmp# ls -l suidtest 
-rwsr-sr-x 1 root root 0 Nov 27 10:31 suidtest
root@test-month:/tmp# chmod 1755 suidtest 
root@test-month:/tmp# ls -l suidtest 
-rwxr-xr-t 1 root root 0 Nov 27 10:31 suidtest

//7755这个不对,只是演示一下,因为t不能针对文档,只能针对目录
root@test-month:/tmp# chmod 7755 suidtest 
root@test-month:/tmp# ls -l suidtest 
-rwsr-sr-t 1 root root 0 Nov 27 10:31 suidtest

//这里出现大写的S和T,因为s,t都是取代x属性的,这里[666]没有x属性,因此这里是T,S代表空

root@test-month:/tmp# chmod 7666 suidtest 
root@test-month:/tmp# ls -l suidtest 
-rwSrwSrwT 1 root root 0 Nov 27 10:31 suidtest

file 文档名 可以查看文档类型

root@changda:/tmp# file lampp-64.tar.gz 
lampp-64.tar.gz: gzip compressed data, from Unix, last modified: Wed Jun 25 22:39:57 2014

root@test-month:/tmp/umaskdemo# file /etc/passwd
/etc/passwd: ASCII text

root@test-month:/tmp/umaskdemo# file /usr/bin/file
/usr/bin/file: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=d10e62520c13c8b95ababc7dff08bcfcc4887806, stripped

linux 档案的搜索

which -a 档案名[二进制可执行文档]

root@changda:~# which vi
/usr/bin/vi

whereis [-bmsu] 档案或目录名

-b: 只找binary档案
-m: 只找说明文件manual路径下的档案
-s: 只找source来源的档案
-u: 没有说明的档案

root@changda:~# whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd
root@changda:~# whereis -m passwd
passwd: /usr/share/man/man5/passwd.5.gz /usr/share/man/man1/passwd.1.gz /usr/share/man/man1/passwd.1ssl.gz

> whereis查询速度很快比find快很多,那原理是什么呢?
是因为 Linux 系统会将系统内的所有档案都记录在一个数据库档案里面, 而当使用 whereis 或者是底下
要说的 locate 时,都会以此数据库档案的内容为准, 因此,有的时后你还会发现使用这两个执行档时,
会找到已经被杀掉的档案! 而且也找不到最新的刚刚建立的档案呢! 这就是因为这两个指令是由数据库
当中的结果去搜寻档案的所在啊 [系统默认是每天进行update一次这个数据库] 可以执行 `/usr/bin/updatedb`来手动执行

locate 文档名

那么在完整文件名 `(包含路径名称)` 当中,只要有 passwd 在其中, 就会被显示出来的,也是在数据库中搜索的[数据库为 /var/lib/slocate/] ,可以在 /etc/updatedb.conf 这个档案内设定。


find 在硬盘中搜索文档速度比较慢些

find [PATH] [OPTION] [ACTION]

-atime n :n是数字,在n天前的一天内被access
-ctime n :n是数字,在n天前的一天内change状态
-mtime n :n是数字,在n天前的一天内修改过
-newer file :file是一个存在的档案,只要比file新[可以理解为mtime]就会列出来

-uid n :n是数字 /etc/passwd中帐号对应的uid
-gid n :n是数字 /etc/group中群组名字对应的gid
-user name : name是帐号名
-group name: name为群组名
-nouser :寻找不在 /etc/passwd下的所有者文档
-nogroup:寻找分组不在/etc/group下的文档

-name :搜索文件名为filename的档案
-size:[+-]SIZE: -size +10M (比10M大), -size -10M(比10M小)
-type TYPE: TYPE有f[正规档案],b,c(装置档案),d(目录),l(连接档),s(sockets),p(FIFO)

-perm mode:档案属性等于Mode的档案

root@changda:/tmp# find / -perm 4755
/bin/ping
/bin/fusermount
/bin/umount
/bin/ping6
/bin/mount
/bin/su
find: `/proc/14263/task/14263/fd/5': No such file or directory
find: `/proc/14263/task/14263/fdinfo/5': No such file or directory
find: `/proc/14263/fd/5': No such file or directory
find: `/proc/14263/fdinfo/5': No such file or directory
/usr/bin/chfn
/usr/bin/traceroute6.iputils
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/pkexec
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/mtr
/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device

-perm -mode:搜索的档案属性要全部包括mode属性

-perm +mode:搜索的档案属性包含任一mode属性即列出来


-exec comman:command为其它指令对搜索结果进行处理
-print : 将结果打印来屏幕上


root@changda:/tmp# find / -perm +7000  
find: `/proc/14287/task/14287/fd/5': No such file or directory
find: `/proc/14287/task/14287/fdinfo/5': No such file or directory
find: `/proc/14287/fd/5': No such file or directory
find: `/proc/14287/fdinfo/5': No such file or directory


所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出
root@changda:/tmp# find / -perm +7000
..
..
/var/cache/man/da/cat5
/var/cache/man/da/cat8
/var/cache/man/da/cat1
/var/cache/man/it
/var/cache/man/it/cat5
/var/cache/man/it/cat8
/var/cache/man/it/cat1
/var/cache/man/tr
..
.

 find / -perm +7000 -exec ls -l {} \; 
 
 {}表示处理前边得到的结果 \;则表示exec的结束符
 
 find / -size +10M 找到大于10M的文档
 
 当一个使用者的 umask 分别为 033 与 044 他所建立的档案与目录的权限为何? 
 
 默认file: -rw-rw-rw, 默认目录: drwxrwxrwx
 
 umask 033时: file: -rw-r--r--, 目录: drwxr--r--
 umask 044时:  file: -rw--w-w- , 目录 drwx-wx-wx


linux下打包与压缩

压缩文档的原理: 目前我们使用的计算机系统中都是使用所谓的 byte 单位来计量的!不过,事实上,计算机最小的计量单位应该是 bits 才对啊,此外,我们也知道 1 byte = 8 bits 。但是如果今天我们只是记忆一个数字,亦即是 1 这个数字呢?

把一个字节(bytes)看作八位(bits),则1可以表示为0000 0001,前七个可以理解为没有利用,一些算法会利用这个原理把档案所占的空间变小,这就是所谓的压缩技术

简单的说,你可以将他想成,其实档案里面有相当多的『空间』存在,并不是完全填满的, 而『压缩』的
技术就是将这些『空间』填满,以让整个档案占用的容量下降! 不过,这些『压缩过的档案』并无法直接
被我们的操作系统所使用的,因此, 若要使用这些被压缩过的档案数据,则必须将他『还原』回来未压缩
前的模样, 那就是所谓的『解压缩』啰

Unix-Like系统中,有个tar二进制程序,在/bin/tar下用来打包的,可以将很多档案包括目录打包成一个相当或目录,开始的时候tar仅是打包而已,而后的GNU中把压缩也集成进去了

root@changda:/tmp# gzip passwd
//直接生成passwd.gz,原文档passwd不存在了
-rw-------  1 root  root   490 Nov 28 16:27 passwd.gz
//读取压缩文档的内容
root@changda:/tmp# zcat passwd.gz
//解压缩
root@changda:/tmp# gzip -d passwd.gz

//设置压缩比最大,并且把压缩内存重定向到passwd.gz,原文档保留
root@changda:/tmp# gzip -9 -c passwd > passwd.gz

bzip 类似于gzip,是升级版,用法不解释

tar [-cxtzjvfpPN] 档案与目录...
-c :create建立一个压缩档案
-x: 解开一个压缩档案
-t :查看tarfile里的档案
-z :以gizp压缩
-j : 以bizp2来压缩
-v : 压缩过程中显示被压缩的档案
-f :使用档案名,在f之后立即接档案名
-p :使用原来 档案的属性
-P :可以用绝对路径压缩
-N :比后边日期yyyy/mm/dd新的才会被打包
--exclude File :不要将File打包压缩

root@changda:~# tar zcvf demo.tar.gz .bash*

root@changda:~# tar -tf demo.tar.gz 
.bash_history
.bash_logout
.bashrc

root@changda:~# tar -tvf demo.tar.gz 
-rw------- root/root       634 2016-11-28 11:11 .bash_history
-rw-r--r-- root/root       220 2014-04-09 09:03 .bash_logout
-rw-r--r-- root/root      3637 2014-04-09 09:03 .bashrc

//只解压包中的某个文件
root@changda:~/ddxx# tar -zxvf demo.tar.gz .bashrc

在/tmp中比这个给定的日期新的档案才打包压缩
root@changda:~# tar -N '2005/08/01' -zcvf home.tar.gz /tmp

打包www.ard.org.in下除了db的所有文件为model.tar.gz

tar --exclude /opt/lampp/htdocs/helloa/www.ard.org.in/db -zcvf model.tar.gz /opt/lampp/htdocs/helloa/www.ard.org.in

//把/haha下的打包不产生文档直接解压到当前文件夹
root@changda:~/xixi# tar cvf - ../haha|tar xvf -
以/这种绝对路径的方式来打包会提示:tar: Removing leading `../' from member names,
这是系统默认的避免出现问题把/给去了,若要想以绝对路径来打包加参数 -P

dd 命令

dd if="input_file" of ="output_file" bs="block_size" count ="number"
if : input file,也可以是装置
of : output file,也可以是装置
bs : 规划一个Block的大小,默认是512字节
count: 有多少个block

root@changda:~/xixi/haha# dd if=/dev/vda of=/tmp/mbr.back bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000518079 s, 988 kB/s

cpio: 用在管道及数据流导向中,主要用来备份及还原,适用范围广,可用于装置中...

cpio -covB > [file|device] <== 备份
cpio -icduv < [file|device] <==还原


vi 命令

vi这一篇主要是多实践,记住十几个常用的命令就基本可以了

image

image

这里 :! command的模式的使用也 可以用bg背景模式,vi编辑的时候ctrl+z退到后台,然后执行你想要执行的程序,jobs显示work id,再fg workid即可

image

image

认识BASH SHELL

这里要先定义$a,然后才能在$myname里用$a
root@changda:/opt# a="is a "
root@changda:/opt# myname="Vbird $a "
root@changda:/opt# echo $myname
Vbird is a 

$要当作一般字符来用必须加 \ [跳脱字符]
root@changda:/opt# myname="Vbird \$dealdot"
root@changda:/opt# echo $myname
Vbird $dealdot

'与空格都要加 \ [跳脱字符]转义
root@changda:/opt# myname=Vbirds\'s\ name
root@changda:/opt# echo $myname


root@changda:/opt# paths=$PATH:/home/dealdot/bin
root@changda:/opt# echo $paths
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/dealdot/bin"

root@changda:/opt# name=hello

root@changda:/opt# name=${name}every
root@changda:/opt# echo $name
helloevery

root@changda:/opt# name="$name"every
root@changda:/opt# echo $name
helloeveryevery

//设定变量的场景一

root@changda:/tmp# VARIS="/usr/bin"
root@changda:/tmp# echo $VARIS
/usr/bin
root@changda:/tmp# cd $VARIS

可以对变量设置unset variable来取消对它的赋值

//获取0-29之间的整数
declare -i number=$RANDOM*29/32767; echo $number

// 修改PS1 \#是记录命令的个数,每执行一次就会加1
// PS1='[\u@\h \w #]\$'
PS1='[\u@\h \w \A #\#]\$'
[root@changda ~ 10:01 #17]#

//修改PS1显示
[root@changda /tmp]#PS1='[\u@\h:\w]\$'
[root@changda:/tmp]#

//默认PS1
root@test-month:/tmp# PS1='\u@\h:\w\$'
root@test-month:/tmp#

//$输出PID,进程号
root@test-month:/tmp#echo $$
9342

//上个执行的指令所回传的值,成功执行返回0
root@test-month:/tmp#echo $?
0

root@test-month:/tmp#ldd
ldd: missing file arguments
Try `ldd --help' for more information.
//不成功则返回随机数
root@test-month:/tmp#echo $?
1

//export的使用

root@test-month:/tmp# export TESTBB="testbb"
root@test-month:/tmp# echo $TESTBB
testbb

root@test-month:/tmp# bash
root@test-month:/tmp# echo $TESTBB
testbb

//语系档案的变量 (locale)



read 从键盘输入变量

[root@changda:/tmp]#read demotest
i am a demo
[root@changda:/tmp]#echo $demotest
i am a demo

[root@changda:/tmp]#read -p "please input your name:" named
please input your name:dealdot
[root@changda:/tmp]#echo $named
dealdot


declare 定义变量属性 
-[aixr] 变量

//sum为i[整型]
root@changda:/tmp# declare -i sum=90+87+455
root@changda:/tmp# echo $sum
632
// -x等于export
root@changda:/tmp# declare -x sum
root@changda:/tmp# echo $sum
632
root@changda:/tmp# bash
root@changda:/tmp# echo $sum
632

//定义arrays数组
root@changda:/tmp# declare -a arrays
root@changda:/tmp# arrays=[1,2,3]
root@changda:/tmp# echo $arrays
[1,2,3]


档案系统与程序的设定关系 ulimit

bash可以限制使用都对系统资源的使用,包括可开启的文件数量,占用CPU,占用内存等

ulimit [-SHacdflmnpstuv] [配额] 

-a 列出全部限制
-f 可设定最大文件容量KB
-t 占用cpu时间
-u 单一使用都可以用的最大进程数量 process



额外的变量设定功能

root@changda:/tmp# echo $vibrd
/home/vbird/testing/testing.x.sh

root@changda:/tmp# echo ${vibrd}
/home/vbird/testing/testing.x.sh

root@changda:/tmp# echo ${vibrd##/*/}
testing.x.sh

root@changda:/tmp# echo ${vibrd#/*/}
vbird/testing/testing.x.sh

root@changda:/tmp# echo ${vibrd%%/*/}
/home/vbird/testing/testing.x.sh

//全部去除了
root@changda:/tmp# echo ${vibrd%%/*}

//去除比较短的路径
root@changda:/tmp# echo ${vibrd%/*}
/home/vbird/testin

//替换 一次
root@changda:/tmp# echo ${vibrd/testing/TESTING}
/home/vbird/TESTING/testing.x.sh
//全部替换
root@changda:/tmp# echo ${vibrd//testing/Tesha}
/home/vbird/Tesha/Tesha.x.sh


两个变量之间相互判断作用[-  =  ?]

root@changda:/tmp# unset str; var=${str-newvar}
root@changda:/tmp# echo $var,$str
newvar,
root@changda:/tmp# str="oldvar";var=${str-newvar}
root@changda:/tmp# echo $var,$str
oldvar,oldvar

设置别名与取消别名
alias ,unalias
//设定
alias lm ='ls -al|more'
//取消
unalias lm

特别要注意:相对路径,绝对路径与$PATH

比如我在 /opt下有in.sh ,那么我在这个目录下执行 in.sh[可执行二进制文档] 却提示 command not found ,为何?

这是因为每个命令[二进制]下达的时候首先会读取$PATH这个路径,
而当前的这个in.sh可执行文档是路径:/opt 是没有加入到$PATH的,而又不会在当前文件夹[.]下找,所以command not found

方法有四:

一. 把in.sh所在目录/opt加入到$PATH --> 比如 PATH=$PATH:/opt
------------三种修改方法--------------------------------------------
1、直接在命令行中设置PATH
# PATH=$PATH:/usr/local/apache/bin
使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后,PATH设置就会失效。

2、在profile中设置PATH
# vi /etc/profile
找到export行,在下面新增加一行,内容为:export PATH=$PATH:/usr/local/apache/bin。
注:= 等号两边不能有任何空格。这种方法最好,除非手动强制修改PATH的值,否则将不会被改变。
编辑/etc/profile后PATH的修改不会立马生效,如果需要立即生效的话,可以执行# source profile命令[或.]。

3、在当前用户的profile中设置PATH
# vi ~/.bash_profile
修改PATH行,把/usr/local/apache/bin添加进去,如:PATH=$PATH:$HOME/bin:/usr/local/apache/bin。
# source ~/.bash_profile 或者. ~/.bash_profile ,这里的.意义等于source
让这次的修改生效。
------------------------------------------------------------------------------------
二. 或者把.当前文件夹加入$PATH[这种有危险,因为/tmp这个目录任何人都可以读写]

那么万一有居心不良的使用者或者是 Cracker 入侵你的计算机,并在你的 /tmp 里头埋了一个小木马,
并取名为 ls ,好了,改天你以 root 身份登入后,到 /tmp 底下,并执行 ls ,你看会有什么结果?
这个 /tmp/ls 由其它身份的人来执行或许没有问题,但是由 root 来执行却可能会导致 Cracker 所乐意见到的结果
没有把.即当前路径加入$PATH的话,ls运行的会是系统的指令/bin/ls ,而不是cracker定义的那个ls喽

三. 以相对路径来执行命令 ./in.sh [推荐], 这样它就到当前目录来寻找了,一找就找到了

四. 以绝对路径来搞  /opt/in.sh 这保证没问题



再开一篇---->Linux鸟哥私房菜 笔记三

评论