6.NULL The missing Semester of your CS Education
shell
- ls(英文全拼:list files): 列出目录及文件名
- cd(英文全拼:change directory):切换目录
- pwd(英文全拼:print work directory):显示目前的目录
- mkdir(英文全拼:make directory):创建一个新的目录
- rmdir(英文全拼:remove directory):删除一个空的目录
- cp(英文全拼:copy file): 复制文件或目录
- rm(英文全拼:remove): 删除文件或目录
- mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp。
Tee 用于读取标准输入的数据,并将其内容输出成文件
tee [-ai][--help][--version][文件...]
- -a或–append 附加到既有文件的后面,而非覆盖它.
- -i或–ignore-interrupts 忽略中断信号。
man命令
用于查看某个命令的参数
查看时需要翻屏:
向后翻一屏:space(空格键) 向前翻一屏:b
向后翻一行:Enter(回车键) 向前翻一行:k
查看时需要查找:
/关键词 向后查找 n:下一个
?关键词 向前查找 N:前一个
chmod命令 用于控制用户对文件的权限命令
Shell Tools and scripting
1、命令之间使用 && (||)连接,实现逻辑与(或)的功能。
2、对于&&,只有在 && 左边的命令返回真的情况下,&& 右边的命令才会被执行。只要有一个命令为假,后面的命令都不会执行,即:短路的功能 。
3 、对于||有点不同于常规语法的“或“的功能,它是表示:只有在 || 左边的命令返回假,|| 右边的命令才会被执行。但是,只要有一个命令返回真,后面的命令就不会被执行,即:一直会运行到返回为真的命令时才会停止执行。
false || echo "Oops, fail"
# Oops, fail
true || echo "Will not be printed"
#
true && echo "Things went well"
# Things went well
false && echo "Will not be printed"
#
true ; echo "This will always run"
# This will always run
false ; echo "This will always run"
# This will always run
定义新的命令
mcd () {
mkdir -p "$1"
cd "$1"
}
使用变量需要加$
二、linux脚本运行时常会用到一些变量,大致如下:
$$:Shell本身的PID(ProcessID)
$!:Shell最后运行的后台Process的PID
$?:最后运行的命令的结束代码(返回值)
$-:使用Set命令设定的Flag一览
$*:所有参数列表。用”$1” “
2
”
…
“
2” … “
2”…“n” 来获取参数值。
$@:所有参数列表。用”$1” “
2
”
…
“
2” … “
2”…“n” 来获取参数值。
$#:添加到Shell的参数个数
$0:Shell本身的文件名
1
~
1~
1~n:添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
#!/bin/bash
echo “File Name: $0”;
echo “First Parameter : $1”;
echo “First Parameter : $2”;
echo “Quoted Values: $@”;
echo “Quoted Values: $*”;
echo “Total Number of Parameters : $#”
执行结果
➜ missing sh b param1 param2
“File Name: b”
“First Parameter : param1”
“First Parameter : param2”
“Quoted Values: param1 param2”
“Quoted Values: param1 param2”
“Total Number of Parameters : 2”
将某个命令行的输出结果当成变量
$(CMD)
就可以当作执行CMD语句
例如,可以使用for file in $(ls)
来遍历ls查询出来的文件目录
<(CMD)
会执行CMD
命令并将结果放在临时文件中,并将<()
替换成文件名
For example, diff <(ls foo) <(ls bar)
will show differences between files in dirs foo
and bar
.
当grep没有找到pattern时,会返回1,如果返回不等于0,那么就执行if后面的语句,此示例可以测试$?
返回值
#!/bin/bash
echo "Starting program at $(date)" # Date will be substituted
echo "Running program $0 with $# arguments with pid $$"
for file in "$@"; do
grep foobar "$file" > /dev/null 2> /dev/null
# When pattern is not found, grep has exit status 1
# We redirect STDOUT and STDERR to a null register since we do not care about them
if [[ $? -ne 0 ]]; then
echo "File $file does not have any foobar, adding one"
echo "# foobar" >> "$file"
fi
done
shell脚本中 [-eq] [-ne] [-gt] [-lt] [ge] [le]
-eq //等于
-ne //不等于
-gt //大于 (greater )
-lt //小于 (less)
-ge //大于等于
-le //小于等于
在linux 中 命令执行状态:0 为真,其他为假
和>都属于输出重定向,<属于输入重定向。
2、文件内容的区别:
会覆盖bai目标的原有内容。当文件存在时会先删除原文件,再重新创建文件,然后把内容写入该文件;否则直接创建文件。
会在目标原有内容后追加内容。当文件存在时直接在文件末尾进行内容追加,不会删除原文件;否则直接创建文件。
linux上的shebang符号(#!)
用来指明执行这个脚本文件的解释程序
https://blog.youkuaiyun.com/u012294618/article/details/78427864
#!/bin/bash
echo "hello, world."
echo "hello, ${1}." #1代表的是输入程序的第一个参数
/test.sh leng (运行之时,其实是 /bin/bash ./test.sh leng)
rpm指令
1.安装一个包
# rpm -ivh
2.升级一个包
# rpm -Uvh
3.移走一个包
# rpm -e
4.安装参数
--force 即使覆盖属于其它包的文件也强迫安装
--nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。
5.查询一个包是否被安装
# rpm -q < rpm package name>
6.得到被安装的包的信息
# rpm -qi < rpm package name>
7.列出该包中有哪些文件
# rpm -ql < rpm package name>
8.列出服务器上的一个文件属于哪一个RPM包
#rpm -qf
9.可综合好几个参数一起用
# rpm -qil < rpm package name>
10.列出所有被安装的rpm package
# rpm -qa
11.列出一个未被安装进系统的RPM包文件中包含有哪些文件?
# rpm -qilp < rpm package name>
find指令
find [OPTION]… [查找路径] [查找条件] [处理动作]
#Find all directories named src
find . -name src -type d
# Find all python files that have a folder named test in their path
find . -path '*/test/*.py' -type f
# Find all files modified in the last day
find . -mtime -1
# Find all zip files with size in range 500k to 10M
find . -size +500k -size -10M -name '*.tar.gz'
find . -name '*遥感*'
还可以通过exec来对查找到的文件进行操作
# Delete all files with .tmp extension
find . -name '*.tmp' -exec rm {} \;
# Find all PNG files and convert them to JPG
find . -name '*.png' -exec convert {} {}.jpg \;
-exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。
{} 花括号代表前面find查找出来的文件名。
使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。
查找当前目录下的文件,并对查找结果执行ls -l 命令
find . -type f -exec ls -l {} \;
直接删除
find -type f -mtime -1 -exec rm {} \;
查找当前目录下文件名以.log结尾且24小时内更改过的文件,并进行安全删除操作(即删除前会进行询问)
find -name "*.log" -type f -mtime -1 -ok rm {} \;
查找当前目录下的以.log结尾的文件或目录,并移动到test目录下
find -name "*.log" -exec mv {} test \;
还可以使用locate指令,非实时查找(数据库查找),查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db
- 查找速度快
- 模糊查找
- 非实时查找
- 搜索的是文件的全路径,不仅仅是文件名
- 可能只搜索用户具备读取和执行权限的目录
locate和find的区别
https://www.cnblogs.com/struggle-1216/p/12066969.html
history | grep find
来查找command历史中的某种指令
ls指令详细参数
http://linux.51yip.com/search/ls
在shell脚本中调用另一个脚本
- fork方法 sh命令/点号.
sh test.sh
. test.sh
fork是最普通的, 就是直接在脚本里面用/directory/test.sh来调用script.sh这个脚本.
运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。
sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell
- source
与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.
source test.sh
- exec
exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别
压缩文件
打包成tar.gz格式压缩包
# tar -zcvf renwolesshel.tar.gz /renwolesshel
解压tar.gz格式压缩包
# tar zxvf renwolesshel.tar.gz
xargs
xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
管道实现的是将前面的stdout作为后面的stdin,但是有些命令不接受管道的传递方式,最常见的就是ls命令。有些时候命令希望管道传递的是参数,但是直接用管道有时无法传递到命令的参数位,这时候需要xargs,xargs实现的是将管道传输过来的stdin进行处理然后传递到命令的参数位上。也就是说xargs完成了两个行为:处理管道传输过来的stdin;将处理后的传递到正确的位置上。
[root@xuexi tmp]# echo "/etc/inittab" | cat # 直接将标准输入的内容传递给cat
[root@xuexi tmp]# echo "/etc/inittab" | xargs cat # 将标准输入的内容经过xargs处理后传递给cat
练习
第一题
#ls -ltrh
-rw-r--r-- 1 jiarui staff 134B 1 19 16:31 marco.sh
第二题
test_path="/Users/jiarui/Study"
marco(){
test_path=$(pwd)
echo $(pwd)
echo $test_path
}
polo(){
cd $test_path
}
第三题
ttime=0
while true
do
sh function.sh >> res.txt
#echo "the res is"
#echo $?
if [[ $? -eq 1 ]]
then
echo $ttime >> res.txt
break
fi
let "ttime++"
done
需要注意的地方:while、if的用法,变量赋值的时候不能有空格,if的条件语句中,[]和条件之间要空格隔开,自增还可以使用{{ttime++}}
第四题
find . -name "*html" | xargs tar -zcvf b.tar.gz
Editors(Vim)
Movement
Basic movement: hjkl (left, down, up, right)
Words: w (next word), b (beginning of word), e (end of word)
Lines: 0 (beginning of line), ^ (first non-blank character), $ (end of line)
Screen: H (top of screen), M (middle of screen), L (bottom of screen)
Scroll: Ctrl-u (up), Ctrl-d (down)
File: gg (beginning of file), G (end of file)
Line numbers: :{number}<CR> or {number}G (line {number})
Misc: % (corresponding item)
Find: f{character}, t{character}, F{character}, T{character}
find/to forward/backward {character} on the current line
, / ; for navigating matches
Search: /{regex}, n / N for navigating matches
Command-line Environment
SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
SIGSTOP(Ctrl-Z)
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略
bg
将一个在后台暂停的命令,变成继续执行
fg
将后台中的命令调至前台继续运行
jobs
查看当前有多少在后台运行的命令
ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停
nohup 命令
用途:不挂断地运行命令
$ sleep 1000
^Z
[1] + 18653 suspended sleep 1000
$ nohup sleep 2000 &
[2] 18745
appending output to nohup.out
$ jobs
[1] + suspended sleep 1000
[2] - running nohup sleep 2000
$ bg %1
[1] - 18653 continued sleep 1000
$ jobs
[1] - running sleep 1000
[2] + running nohup sleep 2000
$ kill -STOP %1
[1] + 18653 suspended (signal) sleep 1000
$ jobs
[1] + suspended (signal) sleep 1000
[2] - running nohup sleep 2000
$ kill -SIGHUP %1
[1] + 18653 hangup sleep 1000
$ jobs
[2] + running nohup sleep 2000
$ kill -SIGHUP %2
$ jobs
[2] + running nohup sleep 2000
$ kill %2 (等同于-SIGTERM,正常终止)
[2] + 18745 terminated nohup sleep 2000
$ jobs
tmux可以管理窗口和会话
别名
点文件,用来配置信息
ssh
#查看job的id
ps aux | grep xxx
MetaPrograming
make
编译和链接
先将源文件编译成中间代码文件,再将大量的object file合成执行文件(链接)
安全与密码学
熵
correcthorsebatterystaple” is more secure than one like “Tr0ub4dor&3”.
熵以比特来度量,当从一组可能的结果中随机选择时,熵等于log2(可能性#)。均匀抛硬币得到1比特的熵。掷一个骰子(六面骰子)有大约2.58位的熵
攻击者可能知道密码的模型,但是不知道选择特定密码的随机性(例如投骰子的结果),一个较为安全的密码应该40bit
哈希函数