一、背景


有时我们写好了一个shell脚本,但是执行时最会报一定错误,因此,运维人员可能想在脚本执行时,进行跟踪,或脚本执行前,检查脚本语法,减少脚本出错或帮助改善脚本;

二、操作

linux系统中,其实shell是有一个真实的调试模式的。在执行一个脚本时,可以有如下4种方式来对脚本进行调试:

1)sh -x script.sh //将执行该脚本并显示所有变量的值。-x参数,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来;另-v参数可边执行脚本,边将执行过的脚本命令打印到标准错误输出。

2)sh -n script.sh //读一遍脚本中的命令但不执行,用于检查脚本中的语法错误,该命令这将返回所有语法错误。

3)$ sh -x ./script.sh //在命令行提供参数

4)#! /bin/sh -x //脚本声明开头提供参数

5)如下示例脚本中,脚本中用set命令启用或禁用参数:

#! /bin/sh
if [ -z "$1" ]; then
set -x  ##启用
echo "ERROR: Insufficient Args." //只对脚本中的某一段进行跟踪调试
exit 1
set +x
fi

三、附录:脚本备份文件后免密传送到远程服务器

1)ssh-keygen -t rsa -b 4096 //-b 参数,指定了秘钥长度,t指定密钥类型,可选dsa|ecdsa|ed25519|rsa|rsa1,-f 指定生成的秘钥文件名,如果不提供此参数则使用默认文件名,-C “root@localhost-5.web”,-e参数读取openssh的私钥或者公钥文件

authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥
id_rsa : 生成的私钥文件
id_rsa.pub : 生成的公钥文件
know_hosts : 已知的主机公钥清单

可直接:cat id_rsa.pub >>authorized_keys_node1 //因环境中已经有authorized_keys文件,这里采用追加de方式

2)公钥传送到远程服务器上,执行:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@romote_S_IP  //ssh-copy-id默认端口是22,如不是,用-p指定,然后touch authorized_keys && chmod 600 /root/.ssh/authorized_keyscat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys#或者:
scp authorized_keys_node1 root@node2:/root/.ssh/
#然后执行:
cat authorized_keys_node1 >>authorized_keys

3)验证scp免密传输

4)示例脚本

#!/bin/bash
ngnix_day=$(date -d last-day +%Y%m%d)
node_day=$(date -d yesterday +%Y-%m-%d)
#backup xx.172.129.xx node4
ssh root@xx.172.129.xx "sh /logdata/sh/node4_backup.sh"
sleep 1m
scp root@xx.172.129.xx:/logdata/access_$ngnix_day.tar.gz /logdata/nginxlog/node4-access_$ngnix_day.tar.gz
scp root@xx.172.129.xx:/logdata/node1-$node_day.log /logdata/nodelog/node4-node1-$node_day.log
scp root@xx.172.129.xx:/logdata/node2-$node_day.log /logdata/nodelog/node4-node2-$node_day.log
scp root@xx.172.129.xx:/logdata/node3-$node_day.log /logdata/nodelog/node4-node3-$node_day.log
date
sleep 1m
date
if [ -f /logdata/nodelog/node4-node1-$node_day.log ];
then ssh root@xx.172.129.xx "rm -f /logdata/node1-$node_day.log";
else
echo "The node4-node1-$node_day.log is not exists!" >>/logdata/sh/node.txt
fi
if [ -f /logdata/nodelog/node4-node2-$node_day.log ];
then ssh root@xx.172.129.xx "rm -f /logdata/node2-$node_day.log";
else
echo "The node4-node2-$node_day.log is not exists!" >>/logdata/sh/node.txt
fi
if [ -f /logdata/nodelog/node4-node3-$node_day.log ];
then ssh root@xx.72.129.xx "rm -f /logdata/node3-$node_day.log";
else
echo "The node4-node3-$node_day.log is not exists!" >>/logdata/sh/node.txt
fi

5)对于脚本中命令的错误代码,下面给出了含义,可用perror+code查看

“OS error code 1: Operation not permitted”
“OS error code 2: No such file or directory”
“OS error code 3: No such process”
“OS error code 4: Interrupted system call”
“OS error code 5: Input/output error”
“OS error code 6: No such device or address”
“OS error code 7: Argument list too long”
“OS error code 8: Exec format error”
“OS error code 9: Bad file descriptor”
“OS error code 10: No child processes”
“OS error code 11: Resource temporarily unavailable”
“OS error code 12: Cannot allocate memory”
“OS error code 13: Permission denied”
“OS error code 14: Bad address”
“OS error code 15: Block device required”
“OS error code 16: Device or resource busy”
“OS error code 17: File exists”
“OS error code 18: Invalid cross-device link”
“OS error code 19: No such device”
“OS error code 20: Not a directory”
“OS error code 21: Is a directory”
“OS error code 22: Invalid argument”
“OS error code 23: Too many open files in system”
“OS error code 24: Too many open files”
“OS error code 25: Inappropriate ioctl for device”
“OS error code 26: Text file busy”
“OS error code 27: File too large”
“OS error code 28: No space left on device”
“OS error code 29: Illegal seek”
“OS error code 30: Read-only file system”
“OS error code 31: Too many links”
“OS error code 32: Broken pipe”
“OS error code 33: Numerical argument out of domain”
“OS error code 34: Numerical result out of range”
“OS error code 35: Resource deadlock avoided”
“OS error code 36: File name too long”
“OS error code 37: No locks available”
“OS error code 38: Function not implemented”
“OS error code 39: Directory not empty”
“OS error code 40: Too many levels of symbolic links”
“OS error code 42: No message of desired type”
“OS error code 43: Identifier removed”
“OS error code 44: Channel number out of range”
“OS error code 45: Level 2 not synchronized”
“OS error code 46: Level 3 halted”
“OS error code 47: Level 3 reset”
“OS error code 48: Link number out of range”
“OS error code 49: Protocol driver not attached”
“OS error code 50: No CSI structure available”
“OS error code 51: Level 2 halted”
“OS error code 52: Invalid exchange”
“OS error code 53: Invalid request descriptor”
“OS error code 54: Exchange full”
“OS error code 55: No anode”
“OS error code 56: Invalid request code”
“OS error code 57: Invalid slot”
“OS error code 59: Bad font file format”
“OS error code 60: Device not a stream”
“OS error code 61: No data available”
“OS error code 62: Timer expired”
“OS error code 63: Out of streams resources”
“OS error code 64: Machine is not on the network”
“OS error code 65: Package not installed”
“OS error code 66: Object is remote”
“OS error code 67: Link has been severed”
“OS error code 68: Advertise error”
“OS error code 69: Srmount error”
“OS error code 70: Communication error on send”
“OS error code 71: Protocol error”
“OS error code 72: Multihop attempted”
“OS error code 73: RFS specific error”
“OS error code 74: Bad message”
“OS error code 75: Value too large for defined data type”
“OS error code 76: Name not unique on network”
“OS error code 77: File descriptor in bad state”
“OS error code 78: Remote address changed”
“OS error code 79: Can not access a needed shared library”
“OS error code 80: Accessing a corrupted shared library”
“OS error code 81: .lib section in a.out corrupted”
“OS error code 82: Attempting to link in too many shared libraries”
“OS error code 83: Cannot exec a shared library directly”
“OS error code 84: Invalid or incomplete multibyte or wide character”
“OS error code 85: Interrupted system call should be restarted”
“OS error code 86: Streams pipe error”
“OS error code 87: Too many users”
“OS error code 88: Socket operation on non-socket”
“OS error code 89: Destination address required”
“OS error code 90: Message too long”
“OS error code 91: Protocol wrong type for socket”
“OS error code 92: Protocol not available”
“OS error code 93: Protocol not supported”
“OS error code 94: Socket type not supported”
“OS error code 95: Operation not supported”
“OS error code 96: Protocol family not supported”
“OS error code 97: Address family not supported by protocol”
“OS error code 98: Address already in use”
“OS error code 99: Cannot assign requested address”
“OS error code 100: Network is down”
“OS error code 101: Network is unreachable”
“OS error code 102: Network dropped connection on reset”
“OS error code 103: Software caused connection abort”
“OS error code 104: Connection reset by peer”
“OS error code 105: No buffer space available”
“OS error code 106: Transport endpoint is already connected”
“OS error code 107: Transport endpoint is not connected”
“OS error code 108: Cannot send after transport endpoint shutdown”
“OS error code 109: Too many references: cannot splice”
“OS error code 110: Connection timed out”
“OS error code 111: Connection refused”
“OS error code 112: Host is down”
“OS error code 113: No route to host”
“OS error code 114: Operation already in progress”
“OS error code 115: Operation now in progress”
“OS error code 116: Stale NFS file handle”
“OS error code 117: Structure needs cleaning”
“OS error code 118: Not a XENIX named type file”
“OS error code 119: No XENIX semaphores available”
“OS error code 120: Is a named type file”
“OS error code 121: Remote I/O error”
“OS error code 122: Disk quota exceeded”
“OS error code 123: No medium found”
“OS error code 124: Wrong medium type”
“OS error code 125: Operation canceled”
“OS error code 126: Required key not available”
“OS error code 127: Key has expired”
“OS error code 128: Key has been revoked”
“OS error code 129: Key was rejected by service”
“OS error code 130: Owner died”
“OS error code 131: State not recoverable”
“MySQL error code 132: Old database file”
“MySQL error code 133: No record read before update”
“MySQL error code 134: Record was already deleted (or record file crashed)”
“MySQL error code 135: No more room in record file”
“MySQL error code 136: No more room in index file”
“MySQL error code 137: No more records (read after end of file)”
“MySQL error code 138: Unsupported extension used for table”
“MySQL error code 139: Too big row”
“MySQL error code 140: Wrong create options”
“MySQL error code 141: Duplicate unique key or constraint on write or update”
“MySQL error code 142: Unknown character set used”
“MySQL error code 143: Conflicting table definitions in sub-tables of MERGE table”
“MySQL error code 144: Table is crashed and last repair failed”
“MySQL error code 145: Table was marked as crashed and should be repaired”
“MySQL error code 146: Lock timed out; Retry transaction”
“MySQL error code 147: Lock table is full; Restart program with a larger locktable”
“MySQL error code 148: Updates are not allowed under a read only transactions”
“MySQL error code 149: Lock deadlock; Retry transaction”
“MySQL error code 150: Foreign key constraint is incorrectly formed”
“MySQL error code 151: Cannot add a child row”
“MySQL error code 152: Cannot delete a parent row”

6)通过Ansible实现批量免密配置

//将需要做免密操作的机器hosts添加到/etc/ansible/hosts下
vim /etc/ansible/hosts
[Avoid close]
192.168.1.1
192.168.1.2
192.168.1.3#执行批量免密
ansible -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub') }}'" -kSSH password: ----->输入密码   192.168.1.4 | success >>{   
"changed": true,    
"key": "ssh-rsa AAAAB4NzaC1yc2EAAAABIwAAAQEArZI4kxlYuw7j1nt5ueIpTPWfGBJoZ8Mb02OJHR8yGW7A3izwT3/uhkK7RkaGavBbAlprp5bxp3i0TyNxa/apBQG5NiqhYO8YCuiGYGsQAGwZCBlNLF3gq1/18B6FV5moE/8yTbFA4dBQahdtfPwe2LlSAbb5ZoGK8AtLlcRq49IENoXB99tnFVn3gMM0aX24ido1ZF9RfRWzfYF7bVsLsrIiMPmVNe5KaGL9kZ0svzoZ708yjWQQCEYWp0m+sODbtGPC34HMGAHjFlsC/SJffLuT/ug/hhCJUYeExHIkJF8OyvfC6DeF7ArI6zdKER7D8M0SM  W3mpK9ltj2nltuv3Q== root@localhost.localdomain",
"key_options": null,    
"keyfile": "/root/.ssh/authorized_keys",    
"manage_dir": true,    
"path": null,    
"state": "present",    
"unique": false,    
"user": "root"  
}   

调试Linux shell脚本相关推荐

  1. linux如何调试脚本程序,调试Linux shell脚本的方法

    在linux中调试shell脚本,常用的有三个方法.这里介绍下,希望对大家有所帮助. 方法一,使用echo命令. 在调试shell脚本时,可以用echo打印任何变量值,以判断错误原因. 方法二,she ...

  2. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  3. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  4. Linux shell脚本编程(一)

    -------------------------------------------------------------------- 注:如果你对python感兴趣,我这有个学习Python基地, ...

  5. Linux shell脚本基础学习详细介绍(完整版)2

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  6. 批量ping脚本shell_30个Linux Shell脚本经典案例(上)

    在学习Linux运维时,普遍反馈是:Linux Shell是一个很难的知识板块.虽然大家都认真学,基本的语法也都掌握了,但有需求时,很难直接上手编程,要么写了很久,要么写不好! 也有很多做运维很多年的 ...

  7. 编写可靠Linux shell脚本的建议

    编写可靠Linux shell脚本的八个建议https://yangxx.net/archives/949 1. 指定bash shell 脚本的第一行,#!之后应该是什么? 如果拿这个问题去问别人, ...

  8. Linux Shell脚本编程基础

    2 Linux Shell脚本编程基础 发表于: Linux, Shell, UNIX, 资源分享 | 作者: 谋万世全局者 标签: Linux,Shell,编程基础,脚本 本文作者:Leal 授权许 ...

  9. linux shell脚本学习

    linux shell脚本学习笔记 文章目录 linux shell脚本学习笔记 一.脚本入门 1.我的第一个linux脚本 2.关于date命令的知识 二.shell脚本中的变量 1.为什么脚本需要 ...

最新文章

  1. 查看分支编码_高性能编码规范驳斥(一)
  2. w ndows10即将停止更新,微软开始警告Windows 10 v1909用户即将停止更新服务
  3. mysql所支持的比较运算符_MySQL比较运算符一览表(带解析)
  4. 【Java从0到架构师】项目实战 - 前后端分离、后端校验、Swagger、全局异常处理
  5. html背景视频模糊效果,怎么给竖屏视频添加模糊背景效果?
  6. Python 中的循环与 else
  7. oracle 消除块竞争(hot blocks)
  8. 仿映客直播礼物特效制作流程
  9. TCP/IP协议详解:IP、ARP、RARP、ICMP、IGMP
  10. 苹果手机屏幕镜像搜索不到电视_康佳电视投屏不了,3个办法解决!
  11. 学习ajxa 必备插件
  12. ANT 下载,ant的配法 整理
  13. 0xff到底是多少(0x是16进制,f对应11111,因此是11111111,也就是2的8次方-1=255)
  14. CrossBar 将 PUF 技术引入 ReRAM
  15. 【Unity Shader】学习顶点/片元着色器
  16. selinux造成虚拟目录文件无法访问
  17. java中对字符串的一些简单操作
  18. 拨号宽带服务器无响应是什么意思,宽带拨号服务器无响应
  19. 合肥工业大学本科毕业论文答辩和论文选题PPT模板
  20. 中医名词看不懂?用PaddleNLP做一个中医“百科全书”

热门文章

  1. DataNode 启动失败报错 Incompatible clusterIDs
  2. Aconda 修改创建虚拟环境位置
  3. java实现生日提醒_asp实现的可以提醒生日的几种方法附代码
  4. 5G MEC边缘云组网方案与业务案例分析
  5. matlab 进阶绘图:图片保存,极坐标绘图,函数绘图,等高线地图,三维条形图,三维散点图,gif 绘图
  6. c语言接口源码,LAPACKE——LAPACK的两个C语言接口
  7. ASM3142 USB 3.1控制芯片_ ASM3242 USB 3.2 2x2 控制器
  8. 「系统集成方案」智慧工地
  9. 基于单片机的车辆防碰撞及自动刹车系统(STC89C52RC芯片+超声波传感器HC-SR04+液晶屏1602+继电器+蜂鸣器)
  10. crf的Python实现代码