日志:348 评论:13
北京, 西城
【Shell】Shell学习笔记

基础

基本

语法

shell是一个脚本,不是程序,需要通过解析程序执行。解析程序一笔情况下为 /bin/sh,需要在脚本内容第一行声明。

[root@localhost]# vi helloworld.sh
#!/bin/sh

echo "helloworld"

shell是linux的产物,linux没有“扩展名”概念,也就是说扩展写什么都无所谓。不过,为了区别其他类型的文件,我们习惯上还是会给加上一个扩展名 sh。

执行

通过 /bin/sh 执行

/bin/sh helloworld.sh

授权执行

chmod 0755 helloworld.sh

./helloworld.sh

技巧

变量

普通

var="hello"

echo $var
echo ${var}

数学表达式

可以通过 $((...)) 语法将一个数学表达式的结果作为变量

for i in {1..10}
do
    echo $(( (i==6) ? i*100 : i ))
done

判断

if

if [ "" = "$var" ] && [ "" = "$var" ] ; then

fi

循环

for

第一种方法

for i in $(seq 1 10)
do

done

第二种方法

for ((i=1;i<=10;i++));
do

done

第三种方法

for i in {1..10}
do

done

while

while [ 1 ] ;
do

done

字符串替换

sed

在sed中引入外部变量的方法

name="tongfu"

echo "who is engineer!" | sed 's/who/'"${name}"'/'

使用sed替换文件的内容

echo "abcdef" > file1

sed 's/cd/CD/' file1

abCDef

使用sed替换文件的内容并保持到文件

echo "abcdef" > file1

sed -i 's/cd/CD/' file1

字符串格式化

awk

在awk中使用行数(行号)

touch file1
echo "zhang 3" >> file1
echo "li 4" >> file1
echo "wang 5" >> file1

cat file1 | awk '{print NR, $0}'

1 zhang 3
2 li 4
3 wang 5

在awk中引入外部变量的方法

touch file1
echo "zhang 3" >> file1
echo "li 4" >> file1
echo "wang 5" >> file1
linenum=2

cat file1 | awk '{printf("name of list is '%s'%s\n", $0, (NR == '"${linenum}"')?"(current)":"")}'

name of list is zhang 3
name of list is li 4(current)
name of list is wang 5

正则表达式

特殊字符

  • 空格 - [:space:]

  • Tab - [\t]

  • 换行符 - [\r\n]

首位匹配

如果要从目标第一个字符开始匹配,则需要使用字符“^”

示例判断字符串是否为“#”开头

echo $str | sed -n '/^\#/p'

末位匹配

如果要从目标最后一个字符开始匹配,则需要使用字符“$”

示例判断字符串是否是“.”结尾

echo $str | sed -n '/\.$/p'

条件选择

case

使用case实现switch语句的功能

case $var in

case1)
    # statement case 1
    ;;
    
case2)
    # statement case 2
    ;;
    
*)
    # statement case out
esac

数组

定义

定义一个数组

arr1=(100 200 300 400 500 600)

定义一个包含各种类型元素的数组

arr2=(1 "2" 3.1 "four" "五" "陆")

定义一个指定元素下标的数组

arr3=([10]=100 [20]=200 [30]=300 [40]=400 [50]=500 [60]=600)

获取元素

获取数组下标为3的元素

${arr[3]}

获取数组所有元素

${arr[*]}
${arr[@]}

Screen使用

screen就是linux的窗口操作,可以将一个持续任务再窗口里操作而不会因为注销用户而中断进程

创建窗口

screen -S [窗口名称]

退出窗口

使用Ctrl + D退出当前窗口

或者

screen -d [窗口名称]

查看窗口

screen -ls

恢复窗口

screen -r [窗口名称]

常用命令

查看服务端口

netstat -tunlp

查看服务器NAT列表

iptables -t nat -L
iptables -t nat -vnL PREROUTING

开放服务端口

CentOS 6

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT

CentOS 7

firewall-cmd --zone=public --add-port=22/tcp

关闭服务端口

CentOS 6

iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -D OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT

CentOS 7

firewall-cmd --zone=public --remove-port=22/tcp

重启防火墙

CentOS 6

service iptables restart

CentOS 7

systemctl restart firewalld

查看执行过程

sh -x yourshell.sh

执行过程写入文件

sh -x yourshell.sh &> log

常用配置操作

配置SSH信任

在A机器操作

建立密钥

[root@localhost]# ssh-keygen -t rsa
[root@localhost]# ls ~/.ssh/id_rsa*
id_rsa  id_rsa.pub

查看公钥

[root@localhost]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAADCAQABAAABAQDYXXQoe6Q0YUBgQWRtdgqSccd0rx3fOphZE5gsciq8m/OmuCQoVTonrGKjCUu2OlxJRUmBofnV4MC4MLN8QEjhitELmLK77sntGjGcDZvyqNHn1eUHWYlK7zowDvBTq74NWp24Dy6D21hvAGvyQ6p3o+G1/OLi5zlNyCmZYCtNW5YXA35yzcd8xnOc3IfD/Up4/n0wVBs3DyNy581Yj1NyJ6l+qWrXQ3P298Qh5AmpUJWtPR7vpfDI7vYMzbpj/xnbyiU5ZjyYQ03xZN/LQV4NZ7trxtrCFq2BjtB5Et0KfSZtaCgRcmp7LGqp3aAIwXHP4Dsa2W8J/iTBID1USN7N root@test

在B机器操作

授权公钥

[root@localhost]# echo "ssh-rsa AAAAB3NzaC1yc2EAAADCAQABAAABAQDYXXQoe6Q0YUBgQWRtdgqSccd0rx3fOphZE5gsciq8m/OmuCQoVTonrGKjCUu2OlxJRUmBofnV4MC4MLN8QEjhitELmLK77sntGjGcDZvyqNHn1eUHWYlK7zowDvBTq74NWp24Dy6D21hvAGvyQ6p3o+G1/OLi5zlNyCmZYCtNW5YXA35yzcd8xnOc3IfD/Up4/n0wVBs3DyNy581Yj1NyJ6l+qWrXQ3P298Qh5AmpUJWtPR7vpfDI7vYMzbpj/xnbyiU5ZjyYQ03xZN/LQV4NZ7trxtrCFq2BjtB5Et0KfSZtaCgRcmp7LGqp3aAIwXHP4Dsa2W8J/iTBID1USN7N root@test" >> ~/.ssh/authorized_keys
[root@localhost]# chmod 0700 ~/.ssh
[root@localhost]# chmod 0600 ~/.ssh/authorized_keys

这样通过B机器去操作A机器的时候就不需要密码了

结论

记住一个结论:谁拿了我的公钥,我就可以随便进谁家

自助SSL证书

自助创建ssl证书文件

创建 server.key 文件

openssl genrsa -des3 -out server.key 1024

创建 server.csr 文件,有五项信息必须填写

命令

openssl req -new -key server.key -out server.csr -config /etc/pki/tls/openssl.cnf

必填项

Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:District east
Organization Name (eg, company) [Default Company Ltd]:TONGFU.net
Common Name (eg, your name or your server's hostname) []:tongfu.net

创建 ca.crt 和 ca.key 文件,有五项信息必须填写

命令

openssl req -new -x509 -keyout ca.key -out ca.crt -config /etc/pki/tls/openssl.cnf

必填项

Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:District east
Organization Name (eg, company) [Default Company Ltd]:TONGFU.net
Common Name (eg, your name or your server's hostname) []:tongfu.net

如果没有文件 /etc/pki/CA/index.txt 就创建一个

touch /etc/pki/CA/index.txt

如果没有文件 /etc/pki/CA/serial 就创建一个

echo "00" > /etc/pki/CA/serial

创建 server.crt 文件

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config /etc/pki/tls/openssl.cnf

最后会生成如下文件

ca.crt  ca.key  server.crt  server.csr  server.key

创建免密key文件

创建后使用server.key.unsecure就可以在重启web服务的时候不需要输入密码了

openssl rsa -in server.key -out server.key.unsecure