hugo-teek is loading...

shell排错

最后更新于:

shell排错

image-20240417082514933

目录

[toc]

案例:shell代码里出现不可见字符<0xa0>-2024.4.17==(已解决)==

故障现象

目标脚本:(格式有问题版脚本)

mysql5.7.29_install.sh

 1#!/bin/bash
 2
 3#MySQL5.7 Download URL: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz
 4. /etc/init.d/functions 
 5SRC_DIR=`pwd`
 6MYSQL='mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz'
 7COLOR='echo -e \E[01;31m'
 8END='\E[0m'
 9MYSQL_ROOT_PASSWORD=magedu
10
11check (){
12if [ $UID -ne 0 ]; then
13 action "当前用户不是root,安装失败" false
14  exit 1
15fi
16
17
18cd  $SRC_DIR
19if [ !  -e $MYSQL ];then
20        $COLOR"缺少${MYSQL}文件"$END
21 	    $COLOR"请将相关软件放在${SRC_DIR}目录下"$END
22        exit
23elif [ -e /usr/local/mysql ];then
24       action "数据库已存在,安装失败" false
25        exit
26else
27 return
28fi
29}
30
31
32install_mysql(){
33    $COLOR"开始安装MySQL数据库..."$END
34    yum  -y -q install libaio numactl-libs   libaio &> /dev/null
35    cd $SRC_DIR
36   tar xf $MYSQL -C /usr/local/
37    MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`
38    ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
39    chown -R root.root /usr/local/mysql/
40   id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; }
41        
42    echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
43    . /etc/profile.d/mysql.sh
44    cat > /etc/my.cnf <<-EOF
45[mysqld]
46server-id=1
47log-bin
48datadir=/data/mysql
49socket=/data/mysql/mysql.sock                                                   
50                                                
51log-error=/data/mysql/mysql.log
52pid-file=/data/mysql/mysql.pid
53[client]
54socket=/data/mysql/mysql.sock
55EOF
56
57   mkdir -p /data/mysql
58   chown mysql:mysql /data/mysql
59   mysqld --initialize --user=mysql --datadir=/data/mysql 
60   cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
61   chkconfig --add mysqld
62   chkconfig mysqld on
63    service mysqld start
64   [ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
65    MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
66   mysqladmin  -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null
67   action "数据库安装完成"
68}
69
70check
71
72install_mysql

shell脚本在.sh里执行后报错,但手动复制到linux终端里是可以正常执行的。

shell脚本在.sh里执行后报错:

image-20240407075552660

  • ==但手动复制到linux终端里是可以正常执行的:==

image-20240415072450307

测试过程

  • 使用cat等命令测试故障文件(无异常)

image-20240415071541432

  • 把代码拷贝到sublime里:发现有异常,存在<0xa0>异常代码。

image-20240407075730419

解决办法

将shell代码拷贝到sublime里,手动删除,然后再次执行脚本测试。

mysql5.7.29_install.sh (正确版代码)

 1#!/bin/bash
 2
 3#MySQL5.7 Download URL: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz
 4. /etc/init.d/functions 
 5SRC_DIR=`pwd`
 6MYSQL='mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz'
 7COLOR='echo -e \E[01;31m'
 8END='\E[0m'
 9MYSQL_ROOT_PASSWORD=magedu
10
11check (){
12if [ $UID -ne 0 ]; then
13 action "当前用户不是root,安装失败" false
14 exit 1
15fi
16
17
18cd $SRC_DIR
19if [ ! -e $MYSQL ];then
20    $COLOR"缺少${MYSQL}文件"$END
21 	    $COLOR"请将相关软件放在${SRC_DIR}目录下"$END
22    exit
23elif [ -e /usr/local/mysql ];then
24    action "数据库已存在,安装失败" false
25    exit
26else
27 return
28fi
29}
30
31
32install_mysql(){
33  $COLOR"开始安装MySQL数据库..."$END
34    yum -y -q install libaio numactl-libs  libaio &> /dev/null
35  cd $SRC_DIR
36  tar xf $MYSQL -C /usr/local/
37  MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`
38  ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
39  chown -R root.root /usr/local/mysql/
40  id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; }
41    
42  echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
43   . /etc/profile.d/mysql.sh
44  cat > /etc/my.cnf <<-EOF
45[mysqld]
46server-id=1
47log-bin
48datadir=/data/mysql
49socket=/data/mysql/mysql.sock                          
50                        
51log-error=/data/mysql/mysql.log
52pid-file=/data/mysql/mysql.pid
53[client]
54socket=/data/mysql/mysql.sock
55EOF
56
57   mkdir -p /data/mysql
58   chown mysql:mysql /data/mysql
59  mysqld --initialize --user=mysql --datadir=/data/mysql 
60  cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
61  chkconfig --add mysqld
62  chkconfig mysqld on
63  service mysqld start
64  [ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
65  MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
66  mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null
67  action "数据库安装完成"
68}
69
70check
71
72install_mysql

哇哦,可以了哦:

总结经验

一些shell执行如果报错,可以按如下方式检查:

1、cat -v file查看文件是否存在异常字符 (如果存在,使用:set ff=uninx来处理异常字符)

2、将代码拷贝到sublime里,观察是否存在异常字符;

案例:脚本在用户登录时输出大量信息,了干扰非交互式 shell 环境,例如sftp服务-2024.7.28(已解决)

故障环境:

centos7.6 1810虚机

1、故障现象

未在/etc/profile.d目录下放置systyeminfo.sh脚本时,typora里可正常上传图片,ShareX也可正常通过sftp上传图片。

但是一旦该目录下有systyeminfo.sh脚本时,typora里会上传图片失败,ShareX也不能通过sftp上传图片。

这个就很奇怪了呀。。。

未在/etc/profile.d目录下放置systyeminfo.sh脚本时

image-20240728123242591

typora里可正常上传图片:

image-20240728123121820

ShareX也可正常通过sftp上传图片:

image-20240728123146577

/etc/profile.d目录下放置systyeminfo.sh脚本时

image-20240728123437393

typora里会上传图片失败:

image-20240728123357656

ShareX也不能通过sftp上传图片:

image-20240728123426739

这个是为什么呢?

???why

systeninfo脚本内容

 1[root@docusaurus-wiki ~]#cat /tmp/systeminfo.sh 
 2#!/bin/bash
 3# by 运维朱工
 4# site:bash.lutixia.cn
 5####################################
 6
 7
 8
 9# 获取IP地址和主机名
10IP_ADDR=$(hostname -I | cut -d' ' -f1)
11HOSTNAME=$(hostname)
12
13# CPU负载信息:
14cpu_load() {
15    echo -e "\t\t\tcpu的负载情况"
16    echo -e "\t------------------------------------------------"
17    echo -e "\tCPU load in 1  min is: `awk  '{printf "%15s",$1}' /proc/loadavg`"
18    echo -e "\tCPU load in 5  min is: `awk  '{printf "%15s",$2}' /proc/loadavg`"
19    echo -e "\tCPU load in 10 min is: `awk  '{printf "%15s",$3}' /proc/loadavg`"
20    echo
21}
22
23# mem基本信息:
24memory_info() {
25    echo -e "\t\t\t内存的使用情况"
26    echo -e "\t------------------------------------------------"
27    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存总容量:",$2}'`"
28    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存空闲容量:",$4}'`"
29    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存缓存:",$6}'`"
30    echo
31}
32
33# 磁盘使用量排序:
34disk_rank() {
35    echo -e "\t\t\t各分区使用率"
36    echo -e "\t------------------------------------------------"
37    df -h  -x tmpfs -x devtmpfs | sort -nr -k 5 | awk '/dev/{printf "\t%-20s %10s\n", $1, $5}'
38    echo
39}
40
41# 显示系统信息
42echo
43echo -e "\t\t\t系统基本信息:"
44echo -e "\t------------------------------------------------"
45echo -e "\tCurrent Time : $(date)"
46echo -e "\tVersion      : $(cat /etc/os-release | grep -w "PRETTY_NAME" | cut -d= -f2 | tr -d '"')"
47echo -e "\tKernel       : $(uname -r)"
48echo -e "\tUptime       : $(uptime -p)"
49echo -e "\tIP addr      : $IP_ADDR"
50echo -e "\tHostname     : $HOSTNAME"
51echo -e "\tCpu          : $(lscpu | grep "Model name:" | sed 's/Model name:\s*//')"
52echo -e "\tMemory       : $(free -h | awk '/^Mem:/ { print $3 "/" $2 }')"
53echo -e "\tSWAP         : $(free -h | awk '/^Swap:/ { print $3 "/" $2 }')"
54echo -e "\tUsers Logged : $(who | wc -l) users"
55echo
56
57cpu_load
58memory_info
59disk_rank

image-20240728123636302

2、gpt

提问:

 1systeminfo.sh 
 2
 3#!/bin/bash
 4# by 运维朱工
 5# site:bash.lutixia.cn
 6####################################
 7
 8
 9
10# 获取IP地址和主机名
11IP_ADDR=$(hostname -I | cut -d' ' -f1)
12HOSTNAME=$(hostname)
13
14# CPU负载信息:
15cpu_load() {
16    echo -e "\t\t\tcpu的负载情况"
17    echo -e "\t------------------------------------------------"
18    echo -e "\tCPU load in 1  min is: `awk  '{printf "%15s",$1}' /proc/loadavg`"
19    echo -e "\tCPU load in 5  min is: `awk  '{printf "%15s",$2}' /proc/loadavg`"
20    echo -e "\tCPU load in 10 min is: `awk  '{printf "%15s",$3}' /proc/loadavg`"
21    echo
22}
23
24# mem基本信息:
25memory_info() {
26    echo -e "\t\t\t内存的使用情况"
27    echo -e "\t------------------------------------------------"
28    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存总容量:",$2}'`"
29    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存空闲容量:",$4}'`"
30    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存缓存:",$6}'`"
31    echo
32}
33
34# 磁盘使用量排序:
35disk_rank() {
36    echo -e "\t\t\t各分区使用率"
37    echo -e "\t------------------------------------------------"
38    df -h  -x tmpfs -x devtmpfs | sort -nr -k 5 | awk '/dev/{printf "\t%-20s %10s\n", $1, $5}'
39    echo
40}
41
42# 显示系统信息
43echo
44echo -e "\t\t\t系统基本信息:"
45echo -e "\t------------------------------------------------"
46echo -e "\tCurrent Time : $(date)"
47echo -e "\tVersion      : $(cat /etc/os-release | grep -w "PRETTY_NAME" | cut -d= -f2 | tr -d '"')"
48echo -e "\tKernel       : $(uname -r)"
49echo -e "\tUptime       : $(uptime -p)"
50echo -e "\tIP addr      : $IP_ADDR"
51echo -e "\tHostname     : $HOSTNAME"
52echo -e "\tCpu          : $(lscpu | grep "Model name:" | sed 's/Model name:\s*//')"
53echo -e "\tMemory       : $(free -h | awk '/^Mem:/ { print $3 "/" $2 }')"
54echo -e "\tSWAP         : $(free -h | awk '/^Swap:/ { print $3 "/" $2 }')"
55echo -e "\tUsers Logged : $(who | wc -l) users"
56echo
57
58cpu_load
59memory_info
60disk_rank
61
62
63
64这个systeminfo.sh 脚本被放置在/etc/profile.d目录下,用以登录系统后显示机器的一些配置信息。
65但是,放置后,我之前利用nginx提供了/images作为一个目录提供图床服务,此时无法正常利用picgo来上传图片了,并且sharex软件也无法通过sftp上传图片了。
66将/etc/profile.d目录下的systeminfo.sh移除后,就都正常了。
67
68请帮我看下是什么原因?是这个systeminfo.sh哪里有错吗?

回答:

你的 systeminfo.sh 脚本放置在 /etc/profile.d 目录下后,导致图床服务和文件上传功能无法正常工作。这种情况可能是由于脚本在每次用户登录时执行,并且在某些情况下可能产生了输出或错误,干扰了非交互式 shell 环境的工作。

一些常见的问题包括:

  1. 输出干扰:脚本在用户登录时输出大量信息,可能干扰非交互式 shell 环境,比如 sftp 和其他服务
  2. 潜在错误:脚本可能产生错误输出,这些错误信息可能干扰到其他进程或服务。

可以通过以下方式修改脚本,以减少对非交互式 shell 环境的影响:

1. 确保脚本只在交互式 shell 中运行

在脚本的开头添加条件检查,确保脚本只在交互式 shell 中运行。这可以通过检查 PS1 环境变量是否存在来实现:

 1#!/bin/bash
 2# by 运维朱工
 3# site:bash.lutixia.cn
 4####################################
 5
 6# 检查是否为交互式 shell
 7if [[ $- != *i* ]]; then
 8    return
 9fi
10
11# 获取IP地址和主机名
12IP_ADDR=$(hostname -I | cut -d' ' -f1)
13HOSTNAME=$(hostname)
14
15# CPU负载信息:
16cpu_load() {
17    echo -e "\t\t\tcpu的负载情况"
18    echo -e "\t------------------------------------------------"
19    echo -e "\tCPU load in 1  min is: `awk  '{printf "%15s",$1}' /proc/loadavg`"
20    echo -e "\tCPU load in 5  min is: `awk  '{printf "%15s",$2}' /proc/loadavg`"
21    echo -e "\tCPU load in 10 min is: `awk  '{printf "%15s",$3}' /proc/loadavg`"
22    echo
23}
24
25# mem基本信息:
26memory_info() {
27    echo -e "\t\t\t内存的使用情况"
28    echo -e "\t------------------------------------------------"
29    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存总容量:",$2}'`"
30    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存空闲容量:",$4}'`"
31    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存缓存:",$6}'`"
32    echo
33}
34
35# 磁盘使用量排序:
36disk_rank() {
37    echo -e "\t\t\t各分区使用率"
38    echo -e "\t------------------------------------------------"
39    df -h  -x tmpfs -x devtmpfs | sort -nr -k 5 | awk '/dev/{printf "\t%-20s %10s\n", $1, $5}'
40    echo
41}
42
43# 显示系统信息
44echo
45echo -e "\t\t\t系统基本信息:"
46echo -e "\t------------------------------------------------"
47echo -e "\tCurrent Time : $(date)"
48echo -e "\tVersion      : $(cat /etc/os-release | grep -w "PRETTY_NAME" | cut -d= -f2 | tr -d '"')"
49echo -e "\tKernel       : $(uname -r)"
50echo -e "\tUptime       : $(uptime -p)"
51echo -e "\tIP addr      : $IP_ADDR"
52echo -e "\tHostname     : $HOSTNAME"
53echo -e "\tCpu          : $(lscpu | grep "Model name:" | sed 's/Model name:\s*//')"
54echo -e "\tMemory       : $(free -h | awk '/^Mem:/ { print $3 "/" $2 }')"
55echo -e "\tSWAP         : $(free -h | awk '/^Swap:/ { print $3 "/" $2 }')"
56echo -e "\tUsers Logged : $(who | wc -l) users"
57echo
58
59cpu_load
60memory_info
61disk_rank

2. 确保脚本无错误输出

检查脚本中的每个命令,确保没有错误输出。可以通过重定向错误输出到 /dev/null 来防止错误信息干扰其他进程:

1# 获取IP地址和主机名
2IP_ADDR=$(hostname -I 2>/dev/null | cut -d' ' -f1)
3HOSTNAME=$(hostname 2>/dev/null)

通过上述修改,确保 systeminfo.sh 只在交互式 shell 中运行,避免干扰 nginxsftp 服务。这应该能够解决你的问题。如果问题依然存在,建议进一步检查 nginxsftp 服务的日志,以确定具体的错误原因。

3、解决办法

更新代码

1cd /etc/profile.d/
2vim systeminfo-v2.sh
3
4chmod +x systeminfo-v2.sh

systeminfo-v2-2024.7.28.sh

 1#!/bin/bash
 2# by 运维朱工
 3# site:bash.lutixia.cn
 4####################################
 5
 6# 检查是否为交互式 shell
 7if [[ $- != *i* ]]; then
 8    return
 9fi
10
11# 获取IP地址和主机名
12IP_ADDR=$(hostname -I | cut -d' ' -f1)
13HOSTNAME=$(hostname)
14
15# CPU负载信息:
16cpu_load() {
17    echo -e "\t\t\tcpu的负载情况"
18    echo -e "\t------------------------------------------------"
19    echo -e "\tCPU load in 1  min is: `awk  '{printf "%15s",$1}' /proc/loadavg`"
20    echo -e "\tCPU load in 5  min is: `awk  '{printf "%15s",$2}' /proc/loadavg`"
21    echo -e "\tCPU load in 10 min is: `awk  '{printf "%15s",$3}' /proc/loadavg`"
22    echo
23}
24
25# mem基本信息:
26memory_info() {
27    echo -e "\t\t\t内存的使用情况"
28    echo -e "\t------------------------------------------------"
29    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存总容量:",$2}'`"
30    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存空闲容量:",$4}'`"
31    echo -e "\t`free -h | awk '/Mem/{printf "%-10s %s","内存缓存:",$6}'`"
32    echo
33}
34
35# 磁盘使用量排序:
36disk_rank() {
37    echo -e "\t\t\t各分区使用率"
38    echo -e "\t------------------------------------------------"
39    df -h  -x tmpfs -x devtmpfs | sort -nr -k 5 | awk '/dev/{printf "\t%-20s %10s\n", $1, $5}'
40    echo
41}
42
43# 显示系统信息
44echo
45echo -e "\t\t\t系统基本信息:"
46echo -e "\t------------------------------------------------"
47echo -e "\tCurrent Time : $(date)"
48echo -e "\tVersion      : $(cat /etc/os-release | grep -w "PRETTY_NAME" | cut -d= -f2 | tr -d '"')"
49echo -e "\tKernel       : $(uname -r)"
50echo -e "\tUptime       : $(uptime -p)"
51echo -e "\tIP addr      : $IP_ADDR"
52echo -e "\tHostname     : $HOSTNAME"
53echo -e "\tCpu          : $(lscpu | grep "Model name:" | sed 's/Model name:\s*//')"
54echo -e "\tMemory       : $(free -h | awk '/^Mem:/ { print $3 "/" $2 }')"
55echo -e "\tSWAP         : $(free -h | awk '/^Swap:/ { print $3 "/" $2 }')"
56echo -e "\tUsers Logged : $(who | wc -l) users"
57echo
58
59cpu_load
60memory_info
61disk_rank

4、测试效果

这次是可以正常上传图片的:

image-20240728144645287

image-20240728144713749

登录系统也是可以正常输出信息的:

image-20240728144828154

推荐使用微信支付
微信支付二维码
推荐使用支付宝
支付宝二维码
最新文章

文档导航