[内容] Linux while 循环

案例一:无限循环

#!/bin/bash

while ((1));
do
        sleep 1
        echo "infinite loop"
done

或者:

#!/bin/bash

while :
do
        sleep 1
        echo "infinite loop"
done

案例二:从 1 计数到 5

#!/bin/bash

i=1;n=5
while ((i <= n))
do

        echo $i
        let i++

done

或者:

#!/bin/bash

i=1;n=5
while [[ $i -le $n ]]
do

        echo $i
        let i++

done

案例三:从 1 加到 5

#!/bin/bash

i=1
while ((i <= 5));
do

        let sum=$sum+$i
        let i++

done

echo $sum

或者:

#!/bin/bash

i=1
while [[ $i -le 5 ]];
do

        let sum=$sum+$i
        let i++

done

echo $sum

案例四:输入多个数字,通过同时按下 “Ctrl” 键和 “D” 键结束输入,并将多个数字相加

#!/bin/bash

sum=0
echo "Please input number, press "ctrl" and "d" at the same time to end the input"

while read num
do
        let sum=$sum+$num
done

echo $sum

案例五:阅读文件

#!/bin/bash

while read line
do
        echo $line

done < test.txt

或者:

#!/bin/bash

cat test.txt | {
while read line
do
        echo $line

done }

或者:

#!/bin/bash

cat test.txt | while read line
do
        echo $line

done

(补充:这里以阅读 test.txt 文件为例)

问题排查的方法

方法一:按时间顺序分析 (Chronological Analysis)

根据问题发生的时间线,回溯最近发生了哪些情况和做了哪些变更,通过回溯找到发生问题的原因

方法二:深度价值分析 (Pain Value Analysis)

根据事件的重要性和特点找到其核心点,并根据核心点分析产生问题的核心

方法三:KTKT 分析 (Kepner and Tregoe)

对发生的问题进行定义,对问题的特征进行描述,通过定义和特征逐一排查,找到可能导致问题的原因

方法四:头脑风暴 (Brainstorming)

大家一起什么都想,快速获得任何和问题相关的信息,但是得到信息往往不够客观

方法五:鱼骨图 (Ishikawa Diagrams)

将发生的问题看成一个主线,分析每一条汇入这条主线的分线,这些分线都有可能导致最后出现在主线上的问题,最终找到导致主线问题的原因在哪条分线上

方法六:帕累托分析 (Pareto Analysis)

分析哪些问题影响最大,先解决所有问题中最重要的那 20%,因为往往解决最重要的 20% 问题可能就会达到 80% 的效果

方法七:5 个为什么 (5 Why)

5 个为什么只是一个抽象的概念,真实情况是对发生问题的原因一只追问下去,先问导致问题的原因是什么,根据这个原因再问导致这个原因的原因是什么,直到问到根本原因以后才停止,此方法由日本丰田公司大野耐一发明。使用此方法需要注意:
1) 避免使用借口回答问题
2) 避免在追问的过程中牵扯到人的心理
3) 避免回答问题时推卸责任
4) 避免各个问题之间没有层级关系

[步骤] SFTP 安全 (将 SFTP 端口和 SSH 端口分离、限制 SFTP 用户可以进入的目录和禁止 SFTP 用户 SSH 登录版)

步骤一:将 SFTP 端口和 SSH 端口分离

1.1 创建新的 SFTP 配置文件

1.1.1 创建新的 SFTP 配置文件
# cp /etc/ssh/sshd_config /etc/ssh/sshdsftp_config
1.1.2 让新创建的 SFTP 配置文件被 systemctl 管理
1.1.2.1 创建管理 SFTP 配置文件的 systemctl 管理文件
# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshdsftp.service
1.1.2.2 修改管理 SFTP 配置文件的 systemctl 管理文件
# vim /etc/systemd/system/sshdsftp.service

将以下内容:

......
Description=OpenSSH server daemon
......
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
......

修改为:

......
Description=OpenSSH SFTP server daemon
......
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshdsftp_config $OPTIONS $CRYPTO_POLICY
......
1.1.2.3 让 systemctl 加载 SFTP 配置文件的 systemctl 管理文件
# systemctl daemon-reload

1.2 将 SFTP 端口和 SSH 端口分离

1.2.1 修改 SFTP 使用的端口
# vim /etc/ssh/sshdsftp_config

将以下内容:

......
#Port 22
......

修改为:

......
Port 2222
......
1.2.2 从 SSH 的配置文件里删除 SFTP 的功能
# vim /etc/ssh/sshd_config

如果是 CentOS Linux & RHEL,将以下内容:

......
Subsystem  sftp    /usr/libexec/openssh/sftp-server
......

修改为:

......
#Subsystem  sftp    /usr/libexec/openssh/sftp-server
......

如果是 openSUSE & SLE, 将以下内容:

......
Subsystem       sftp    /usr/lib/ssh/sftp-server
......

修改为:

......
# Subsystem       sftp    /usr/lib/ssh/sftp-server
......
1.2.3 开放 SFTP 使用的端口
1.2.3.1 在防火墙上允许被 SFTP 使用的端口可以被访问
1.2.3.1.1 在防火墙上允许被 SFTP 使用的端口可以被访问
# firewall-cmd --add-port=2222/tcp --perm

(补充:这里以在 firewalld 防火墙开通 2222 端口为例)

1.2.3.1.2 让新的防火墙策略立刻生效
# firewall-cmd --reload
1.2.3.2 在 SELinux 上给 SFTP 使用的端口打上 SSH 标签
# semanage port -a -t ssh_port_t -p tcp 2222

(补充:这里以给 2222 端口打上 SSH 的标签为例)

(注意:此步骤只有在 SELinux 开启,且处于 enforcing 状态时才需要设置)

1.3 让 SFTP 端口和 SSH 端口分离的设置生效

1.3.1 开启 SFTP 并将 SFTP 设置为开机自启
# systemctl enable --now sshdsftp
1.3.2 重启 SSHD
# systemctl restart sshd

步骤二:限制 SFTP 用户可以进入的目录

2.1 限制 SFTP 用户可以进入的目录

# vim /etc/ssh/sshdsftp_config

如果是 CentOS Linux & RHEL,将以下内容:

......
Subsystem  sftp    /usr/libexec/openssh/sftp-server
......

修改为:

......
#Subsystem  sftp    /usr/libexec/openssh/sftp-server
......

如果是 openSUSE & SLE, 将以下内容:

......
Subsystem       sftp    /usr/lib/ssh/sftp-server
......

修改为:

......
# Subsystem       sftp    /usr/lib/ssh/sftp-server
......

并添加以下内容:

......
Subsystem       sftp    internal-sftp
Match LocalPort 2222
ChrootDirectory /%u
ForceCommand    internal-sftp
AllowTcpForwarding no
X11Forwarding no


补充:
1) 这里以将 SFTP 的端口设置为 2222 和 SFTP 用户可以进入的目录只能为 /<user> 为例
2) 其它配置方案可以参考

2.2 让限制 SFTP 用户可以进入的目录的设置生效

# systemctl restart sshdsftp

步骤三:禁止 SFTP 用户 SSH 登录

3.1 创建 SFTP 用户

# useradd sftpuser

(补充:这里以创建名为 sftpuser 的用户为例)

3.2 禁止 SFTP 用户 SSH 登录

# usermod -s /bin/false sftpuser

(补充:这里以将用户 sftpuser 的解释器修改成 /bin/false 为例)

或者:

# usermod -s /sbin/nologin sftpuser

(补充:这里以将用户 sftpuser 的解释器修改成 /sbin/nologin 为例)

3.3 给 SFTP 用户设置密码

# passwd sftpuser

(补充:这里以给 sftp 用户设置密码为例)

3.4 创建 SFTP 用户的 SFTP 目录

3.4.1 创建 SFTP 用户的 SFTP 目录
# mkdir /sftpuser

(补充:这里以创建 /sftp 目录为例)

3.4.2 设置此 SFTP 目录的所属主
# chown root: /sftpuser

(补充:这里以设置 /sftp 目录的所属主为 root 为例)

(注意:SFTP 目录的所属主必须是 root,权限最高只能是 755,否则就算此目录的所属主是此 SFTP 用户也会报错)

3.4.3 设置此 SFTP 目录的权限
# chmod 755 /sftpuser

(补充:这里以给 /sftp 目录设置 755 权限为例)

(注意:SFTP 目录的所属主必须是 root,权限最高只能是 755,否则就算此目录的所属主是此 SFTP 用户也会报错)

步骤四:测试 SFTP

4.1 创建测试用户

4.1.1 创建测试用户
# useradd nosftp

(补充:这里以创建测试用户 nosftp 为例)

4.1.2 给测试用户设置密码
# passwd nosftp

4.2 测试 SFTP 用户无法 SSH

# ssh sftpuser@127.0.0.1

(补充:这里以测试用户是 sftp 为例)

4.3 测试 SFTP 目录范围

4.3.1 登录 SFTP
# sftp -P 2222 sftpuser@127.0.0.1
Connected to sftpuser@127.0.0.1.
sftp>

(补充:这里以 SFTP 端口是 2222,SFTP 目录时 /sftpuser ,测试用户是 sftpuser 为例)

4.3.2 确认 SFTP 根目录
4.3.2.1 切换到 SFTP 的根目录
sftp> cd /
4.3.2.2 显示 SFTP 根目录下的文件或目录
sftp> ls
write  
sftp>

(补充:此时发现目前 SFTP 的根并不是 Linux 系统的根目录)

4.4 测试 SSH 和 SFTP 分离

4.4.1 SSH 测试
4.4.1.1 SSH 端口可以正常 SSH
# ssh nosftp@127.0.0.1

(补充:这里以 SSH 端口是 22,测试用户是 nosftp 为例)

4.4.1.2 SFTP 端口不能被 SSH
4.4.1.2.1 有 SFTP 目录的用户不能通过 SFTP 端口 SSH
# ssh -p 2222 sftpuser@127.0.0.1
nosftpuser@192.168.8.58's password: 
This service allows sftp connections only.
Connection to 10.0.0.3 closed.
#

(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftpuser,测试用户是 sftpuser 为例)

4.4.1.2.2 没有 SFTP 目录的用户不能通过 SFTP 端口 SSH
# ssh -p 2222 nosftp@127.0.0.1
client_loop: send disconnect: Broken pipe
#

(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftp,测试用户是 nosftp 为例)

4.4.2 SFTP 测试
4.4.2.1 SSH 端口不能 SFTP
# sftp sftpuser@127.0.0.1
subsystem request failed on channel 0
Connection closed
#

(补充:这里以 SFTP 端口是 22,测试用户是 sftpuser 为例)

4.4.2.2 没有 SFTP 目录的用户不能通过 SFTP 端口 SFTP
# sftp -P 2222 nosftp@127.0.0.1
client_loop: send disconnect: Broken pipe
Connection closed
#

(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftp,测试用户是 nosftp 为例)

4.4.2.3 有 SFTP 目录的用户可以通过 SFTP 端口 SFTP
# sftp -P 2222 sftpuser@127.0.0.1
Connected to sftpuser@127.0.0.1.
sftp>

(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftpuser ,测试用户是 sftpuser 为例)