每天一点点
一点点,每天就进步一点点。
破小孩儿
互联网
系统分析师和软件架构师
设计模式 SOA 分布式
展开
-
Shell基础——重导向(Redirections)
前言在学习重导向之前,请先了解什么是文件描述符。查看一个进程打开了哪些文件,可以通过/proc/[pid]/fd目录查看。其中,pid是这个进程的进程号。例如:我在终端tty2执行命令$ less /var/log/dpkg.log 然后在终端tty1执行命令$ ps -e | grep less 107 tty2 00:00:00 less$ ls -al /proc/107/fdtotal 0dr-x------ 2 felix felix 0 Jul 5 14:20原创 2020-07-05 14:43:25 · 452 阅读 · 0 评论 -
How to do Threat Modeling
How to do Threat ModelingFirstly, answer four questions1. What are we working on?draw first picture on whiteboardcollaborate with stake holders on the whiteboard.2. What can go wrong?use STRIDE as a guid.SpoofingTamperingRepudiationInformatio原创 2020-07-01 07:49:12 · 381 阅读 · 0 评论 -
Bash的功能——控制提示符
Bash打印每个主提示(PS1)之前,都会检查变量PROMPT_COMMAND的值。如果设置了PROMPT_COMMAND并且值非空,则执行该命令。$ PROMPT_COMMAND='echo hello word'hello word$hello word$hello word$在交互式Shell里,Bash会在读取命令的第一行之前展开并显示PS1,并在读取多行命令的第二行及后续行之前会展开并显示PS2. Bash在读取命令之后但在执行命令之前会展开并显示PS0.PS1的默认值是’\原创 2020-06-28 15:00:05 · 440 阅读 · 0 评论 -
Shell基础——模式匹配
Bash的模式匹配用处广泛。可以用在文件名扩展$ ls fo*fo0 foo原创 2020-06-26 15:37:36 · 1440 阅读 · 0 评论 -
Shell基础——Shell参数和变量扩展
基本格式Shell参数和变量扩展的最基本的格式是${parameter}如果parameter是数字,则是参数扩展;如果parameter是字符串,则是变量扩展;如果parameter是数组,那么就遵循数组的扩展规则;parameter还可以是@, *, #, ?, -等,那参考特殊参数的扩展。只要在不引起混淆的情况下,{ }是可以省略的,比如$ set -- a b c d e f g h i j k l m n$ echo $12a2$ echo ${1}2a2$ echo ${1原创 2020-06-17 21:56:02 · 882 阅读 · 0 评论 -
Shell基础——Shell扩展
Shell的执行过程里说到,Shell将输入分解为tokens后,会按照下面的顺序进行扩展:{ }扩展~扩展Shell参数和变量扩展命令替换算术扩展进程替换单词拆解文件名扩展引号删除其中,{ }扩展,单词拆解,文件名扩展,"$@“和$*,”${name[@]}"和${name[*]}会在扩展后增加单词的数目,其他的扩展都是一个单词扩展为另一个单词。{ }扩展{ }扩展的格式是可选的前缀,然后是{ }之间一系列用逗号分隔的字符串或序列表达式,然后是可选的后缀。扩展后,在{ }中的每原创 2020-06-14 21:58:24 · 461 阅读 · 0 评论 -
Shell基础——特殊参数
$*和$@扩展成位置参数$ bash -s a b c$ echo $*a b c$ echo $@a b c如果有引号,$*扩展为一个单词,$@还是扩展为多个单词$ IFS=.$ echo "$*"a.b.c$ echo "$@"a b c$ IFS=""$ echo "$*"abc$ echo "$@"a b c\S@扩展的单词会和前后的单词连接$ echo "12$@3"12a b c3$#扩展为位参个数$ bash -s a b c$ echo原创 2020-06-13 21:47:35 · 520 阅读 · 0 评论 -
Shell基础——位置参数
位置参数是用一位或多位数字(除了0)表示的参数,位置参数N可以引用为${N},或者当N由单个数字组成时,引用为$N位置参数是在调用shell时从shell参数中分配的$ bash -s a b c$ echo $1 $2 $3a b c$ cat scriptecho $1 $2 $3$ bash script a b ca b c在执行shell函数时临时替换位置参数$ bash -s a b c$ func () { echo $1 $2 $3; }$ func e d f原创 2020-06-12 21:52:21 · 460 阅读 · 0 评论 -
Shell基础——变量
声明变量name=[value]declare name=[value]Bash里的变量不仅有值,还有属性。declare命令可以给变量设置属性。$ declare -i abc=123 # 给变量abc赋予integer属性声明变量时,如果没有提供value,变量的值为null变量声明后,只能通过unset命令删除$ isVarSet () { if [ -v var ]; then echo "var = $var"; fi; }$ isVarSet$ var=$ isV原创 2020-06-11 21:56:05 · 211 阅读 · 0 评论 -
Shell基础——Shell函数
name () compound-command [ redirections ]function name [()] compound-command [ redirections ]Shell函数将命令列表组合作为一个单元执行。与命令组{ }和( )不同,定义Shell函数时不会理解执行compound-command。当将函数的名称被用作命令时,才会执行与该函数名称关联的命令列表。Shell函数在当前Shell执行,不会为函数创建一个进程。但会为函数里的命令创建进程。$ name () {原创 2020-06-08 21:04:20 · 222 阅读 · 0 评论 -
Shell内置命令——pwd, cd
pwd [-LP]打印当前工作目录的绝对路径名。 如果提供了-P选项,则打印的路径名将不包含符号链接。 如果提供了-L选项,则打印的路径名可能包含符号链接。 除非确定当前目录的名称时遇到错误或提供了无效的选项,否则返回状态为零。$ cd /dev/fd$ pwd/dev/fd$ pwd -L/dev/fd$ pwd -P/proc/6/fd...原创 2020-06-05 22:03:00 · 1057 阅读 · 0 评论 -
Bash基础——命令组
Bash提供了两种方法将命令列表组合作为一个单元执行。( ) 和 { }组合命令后,重定向应用于整个命令列表。$ echo 1;echo 2 >foo1$ cat foo2$ (echo 1;echo 2) >foo$ cat foo12两种组合方式的区别(list){ list; }( )会创建一个subshell环境,list这个环境下执行。{ }不会创建一个subshell环境,list在当前shell下执行( )是运算符,list不需原创 2020-06-04 21:57:45 · 359 阅读 · 0 评论 -
Bash内置命令——循环结构里的break和continue命令
break从for, while, until或select循环中退出。 如果提供了n,则退出第n层嵌套循环。 n必须大于或等于1。返回状态为零,除非n不大于或等于1。continue恢复for, while, until或select循环的下一次迭代。 如果提供了n,则从第n层嵌套循环的下一次迭代执行。 n必须大于或等于1。返回状态为零,除非n不大于或等于1。...原创 2020-06-04 21:37:05 · 689 阅读 · 0 评论 -
Bash基础——循环结构for
forfor结构的退出状态由最后执行的commands决定。如果commands一次都没有被执行,for结构的退出状态为0.for infor name [ [in [words …] ] ; ] do commands; done迭代遍历words里每个成员,绑定到name上,并执行commands.如果in words不存在,等同于in “$@”,即遍历位置参数。$ for var in a b c; do echo $var; doneabc$ bash -s 1 2 3$ f原创 2020-06-04 21:29:10 · 172 阅读 · 0 评论 -
Bash基础——循环结构until和while
untiluntil test-commands; do consequent-commands; done只要test-commands的退出状态不为0, 就会一直执行consequent-commands.until结构的退出状态是最后一次consequent-commands执行的退出状态。如果consequent-commands一次都没有被执行,until结构的退出状态就为0.$ let i=0$ until (( i >= 10 )); do (( i++ ));echo $i原创 2020-06-03 21:43:01 · 287 阅读 · 0 评论 -
Bash基础——循环结构select
selectselect name [in words …]; do commands; done如果in words存在,就会把words打印到标准错误(standard error)流里,并显示PS3提示符,等待从标准输入中读取读取一行。如果in words不存在,等同于in “$@”,即将位置参数打印到标准错误(standard error)流里,并显示PS3提示符,等待从标准输入中读取读取一行。$ select var in a b c d; do echo $var;break; don原创 2020-06-01 22:00:53 · 443 阅读 · 0 评论 -
Bash基础——条件结构case
casecase word in [ [(] pattern [| pattern]…) command-list ;;]…esacBash在执行case结构前,会对word做~扩展,参数扩展,命令扩展,算术扩展和删除引号;对pattern做~扩展,参数扩展,命令扩展和算术扩展command-list后的结束符可以是;; ;& ;;&,只有它们前面的command-list被执行了,这些结束符才会发生作用,决定Bash对case后面的pattern和command-list原创 2020-05-31 21:57:21 · 238 阅读 · 0 评论 -
Bash基础——条件结构if
ifif test-commands; then consequent-commands;[elif more-test-commands; then more-consequents;][else alternate-consequents;]fi执行test-commands,如果返回状态为零,则执行consequent-commands如果test-commands返回非零状态,则依次执行每个elif的more-test-commands,如果退出状态为零,则执行相应的more-原创 2020-05-31 21:24:01 · 160 阅读 · 0 评论 -
Bash基础——复合命令:条件、循环和命令组
复合命令是Shell编程语言的一种结构,用reserved word和control operator对多个命令进行组合。Bash提供三种复合命令结构:条件、循环和命令组。复合命令在Bash里被作为一个执行单元。简单解释一下这里所说的“一个执行单元”的含义。例如在交互式shell里编写until … do… done的循环结构时,在没有输入保留字done之前,无论输入了多少个换行符,Bash都不会执行已经输入的命令。直至done输入后敲回车,Bash才会从until开始启动执行。但要注意的时,虽然复合命原创 2020-05-31 21:15:21 · 406 阅读 · 0 评论 -
Bash基础——顺序执行命令
首先,值得提一下的是,在Bash里,最小的执行单位应该是pipeline. Bash支持对pipelines进行组合,产生顺序、条件、循环等结构。每个pipeline在其自己的subshell中执行,有自己的PID. 但是为了方便,在这里介绍顺序、条件、循环结构时,不刻意强调是由pipeline组成,依旧以命令(command)视为基本单元顺序结构用;分隔的顺序结构$ command1;command2以;分隔的命令按顺序执行。Shell会依次等待每个命令执行终止,即每个命令都在自己的subsh原创 2020-05-29 22:05:31 · 3004 阅读 · 1 评论 -
Shell基础——简单命令和pipeline
简单命令由空格分隔,由control operators(‘||’, ‘&&’, ‘&’, ‘;’, ‘;;’, ‘;&’, ‘;;&’, ‘|’, ‘|&’, ‘(’, or ‘)’)终止的单词序列,构成了shell的简单命令(Simple Command)。通常,第一个单词指定要执行的命令,其余单词是该命令的参数。control operators将命令进行组合,产生pipeline和listpipeline首先,一个独立的简单命令,都是pipe原创 2020-05-28 21:59:04 · 2305 阅读 · 0 评论 -
Bash的功能——执行启动文件
login shell如果Bash作为login shell调用时,它按顺序读取和执行以下文件中的命令:/etc/profile(如果存在)~/.bash_profile~/.bash_login~/.profile通常,在/etc/profile里有这么一句:if [ -d /etc/profile.d ]; then for i in /etc/profile.d/*.sh; do if [ -r $i ]; then . $i fi done原创 2020-05-27 21:57:58 · 432 阅读 · 0 评论 -
Bash的功能——Login Shell
除了Linux的login进程通过/etc/passwd文件调用bash进入Login Shell模式,还有几种进入Login Shell模式的方式。原创 2020-05-26 21:25:54 · 1681 阅读 · 0 评论 -
Bash的功能——交互式Shell
有如下几种调用Bash进入交互式Shell的方式:没有任何非选项参数$ bash$ PS1=">> " # 此处进入了交互式的子Shell里>> exit # 退出子Shellexit$用-s选项,但不能用-c选项. 这种方式也可以进入交互式Shell.-s选项后面的参数会作为位参传递给交互式Shell$ bash -s a b c$ echo $1 $2 $3a b c-i选项强制Shell以交互式方式运行$ bash -i$ PS1="原创 2020-05-24 21:51:59 · 1679 阅读 · 0 评论 -
Shell基础——引号规则
在shell里,有些字符或word有特殊的含义,shell会特殊对待它们。例如reserved word, metacharacters, operator,参数扩展符$, 历史扩展符 ! 等。而引号或转移字符的作用就是删除它们的特殊含义。转义字符 \\ 保留了下一个字符的字面值$ echo $(( 1+1 ))2$ echo \$\(\( 1+1 \)\)$(( 1+1 ))$ echo \$\(\( \1\+\1 \)\)$(( 1+1 ))$ echo \\\但是换行符例外。\原创 2020-05-21 21:21:20 · 250 阅读 · 0 评论 -
Shell基础——Shell执行过程
Shell读取并执行命令时,基本上会执行如下操作:读取输入。Shell输入的来源有三种:文件(Shell脚本),调用bash命令时-c选项提供的参数,用户终端。原创 2020-05-19 21:22:19 · 807 阅读 · 0 评论 -
Shell基础——Shell脚本
Shell在读取和执行命令时,基本上会执行如下操作:从文件,从-c选项的参数,或者从用户终端读取输入从文件Shell脚本是包含Shell命令的文本文件。当调用Bash时将此类文件用作第一个非选项参数,并且-c和-s选项均未提供时,Bash将从文件中读取并执行命令,然后退出。这种操作模式将创建非交互式Shell。Shell先在当前目录中搜索文件,如果找不到,再在$PATH目录中查找。当Bash运行Shell脚本时,它将特殊参数0设置为文件名,而不是Shell的名称,并且位置参数设置为其余参数。原创 2020-05-18 21:26:24 · 141 阅读 · 0 评论 -
Shell里的定义
POSIX基于Unix的一系列开放系统标准。 Bash主要关注POSIX 1003.1标准的Shell和Utilities部分。blankspace字符和tab字符builtin由Shell本身在内部实现的命令,而不是由文件系统中某个位置的可执行程序实现的命令。special builtin在POSIX标准中被分类为特殊的builtin。metacharacter当不加引号时,用来分隔单词的字符。元字符有:space, tab, newline, 还有 | & ; ( ) <.原创 2020-05-18 06:07:19 · 185 阅读 · 0 评论 -
Bash的功能——条件表达式
条件表达式用在[[ expression ]], test expression和[ expression ]中。-a fileTrue如果文件file存在-b fileTrue如果文件file存在并且是块文件(block special file)-c fileTrue如果文件file存在并且是字符文件(character special file)-d fileTrue如果文件file存在并且是个目录-e fileTrue如果文件file存在-f fileTrue如果文件fil原创 2020-05-14 21:33:00 · 475 阅读 · 0 评论 -
Bash内置命令——read
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]从标准输入中读取一行,或从-u选项指定的文件描述符fd读取一行,拆成单词后,依次赋值给name$ echo 1 2 3 >foo$ read a b c <foo$ echo $a+$b=$c1+2=3$ read -u 3 e f g 3<foo$原创 2020-05-11 22:00:30 · 456 阅读 · 0 评论 -
Bash的功能——数组
Bash提供两种数组变量:索引数组和关联数组。Bash的数组变量是一维的。任何变量都可以用作索引数组。当使用name[subscript]=value这种语法时,就自动创建了一个索引数组变量。(subscript是必须得到数字的算术表达式)$ bar=1+2$ declare -p bardeclare -- bar="1+2"$ bar[0]=1$ declare -p bardeclare -a bar=([0]="1")$ bar=1+2$ declare -p bardeclar原创 2020-05-08 22:12:43 · 552 阅读 · 0 评论 -
Bash的功能——shell算术
shell会在以下几种情况下对算术表达式求值算术扩展(Arithmetic Expansion) $ echo $(( 1+2 ))3Bash内置命令let$ let foo=1+2$ echo $foo3复合命令(($ (( foo=1+2 ))$ echo $foo3declare命令的-i选项$ declare -i foo=1+2$ ech...原创 2020-05-07 21:59:59 · 197 阅读 · 0 评论 -
Bash内置命令——local
locallocal [option] name[=value] …声明变量name,并赋值。为变量name赋予属性。local命令的option参考declare命令。local命令只能在一个函数内使用; 它使变量名的可见范围仅限于该函数及其子函数。如果name为‘-’,则将shell选项集设置为局部的:在函数内部使用set命令更改的shell选项只在函数内生效,当函数退出后,恢复原...原创 2020-05-07 21:16:45 · 3478 阅读 · 0 评论 -
Bash内置命令——declare
declaredeclare [-aAfFgilnrtux] [-p] [name[=value] …]声明变量并为其赋予属性。$ declare foo=bar abc=123$ echo ${foo} ${abc}bar 123如果没有给name,则显示所有变量。$ declareBASH=/bin/bashBASHOPTS=checkwinsize:cmdhis...原创 2020-05-06 22:02:04 · 1970 阅读 · 0 评论 -
Shell内置命令——执行Bash脚本的 . 运算符
. 句号. filename [arguments]从当前Shell上下文中的filename读取和执行命令。如果没有执行任何命令,return status为0;否则,return status为最后执行的命令的exit status;如果找不到filename,或无法读取,return status不为0。等同于另一个Shell内置命令source例子1 filename里有/...原创 2020-05-05 21:57:59 · 288 阅读 · 0 评论 -
Shell内置命令——:运算符,看似无用,其实可以巧用
: 分号: [arguments]除了扩展参数(extend arguments)和执行重定向(redirections)之外,什么也不做。 返回状态(return status)为零。原创 2020-05-05 21:17:34 · 207 阅读 · 0 评论