跳到正文
本地阅读 · Bash 脚本、SSH/SCP 与任务调度入门

Bash 脚本、SSH/SCP 与任务调度入门

计算机基础 · Linux

前置知识:进程、资源、后台运行与日志

本章目录

本章学习目标

  • 把手工处理变成可重复参数化脚本
  • 验证输入并处理失败与临时资源
  • 理解远程连接及定时任务的环境边界

脚本是可复核的操作说明

第一行 shebang 指定解释器,例如 /usr/bin/env bash;直接执行还需执行权限,bash script.sh 则显式启动 Bash。参数依次为 $1、$2,$# 是数量,"$@" 保持每个参数边界。参数不等于环境变量,前者是一次调用的输入,后者是进程配置。用固定名称的默认值能让读者在无额外输入时运行教学示例。

脚本应先验证输入文件存在、可读、格式符合要求,再产生输出。引用每个路径,不对未知字符串 eval。set -euo pipefail 帮助发现错误、未定义变量和失败管道,但仍需显式处理允许的空匹配与预期失败。函数组织重复逻辑,返回状态与打印值分开,不能把诊断混进数据结果。

小型任务的完整流程

示例先生成简单 value 文件,函数检查每行是非负整数,再用 awk 求和。坏行返回非零且只在 stderr 给诊断。函数对合法数据输出六;随后故意加入 bad 行,用 if 捕获失败,证明验证确实生效。原始文件位于课程输出目录,所以不会误读取其他文件或将用户输入当命令执行。

真实数据处理还需空文件、超大文件和编码检查。先写入自己创建的临时文件,验证完成后移动成最终结果,可以避免失败时留下半成品。移动是否原子取决于是否在同文件系统,多个并发任务也需不同临时名。trap 在退出时清理自己资源,不清理无法证明属于本任务的文件。

SSH 与 SCP 的阅读示例

SSH 连接形式如 ssh analyst@example-host,只是占位讲解,不由课程执行。首次连接的主机密钥指纹需通过可信渠道核对,不能盲目跳过检查。私钥不上传课程目录,不把密码写在命令参数或日志里。远程命令运行的环境、当前目录与权限可能与本机不同,先执行受限读取检查再运行分析任务。

SCP 用于文件传输,例如 scp ./report.csv analyst@example-host:/home/analyst/reports/。这也是外部条件示例,不假设服务器存在。大量数据传输需要核对路径、空间、完成状态与校验和,不能只看进度条达到结束。WSL 可读取 Windows 挂载目录,但远端并不能访问本地 D 盘路径;路径属于对应机器与文件系统。

调度、日志与失败通知

cron 表达式五字段分别是分钟、小时、月日、月份、星期,例如 0 9 * * * 每天九点。真正调度前需确认系统时区,不能假定与用户上海时区一致。cron 环境通常精简,没有交互 Shell 的工作目录或全部 PATH,任务需绝对路径、明确环境和显式日志重定向。本章只说明,不修改 crontab。

不要把重复调度等同成功自动化:前一次未完成可能与下一次重叠,失败可能静默,重复导入可能重复计数。实际任务需要幂等输出、互斥机制、完成标记和失败监控。课程脚本先通过单次及重复运行验证,远程执行和系统调度列为需读者环境的扩展操作,不在没有服务器和调度器的环境里声称通过。

执行环境与验证边界

本课程命令使用 GNU 工具和 Bash 语法。Windows PowerShell 中的变量、引号、重定向和程序解析与 Bash 并不相同;请在 WSL 的 Ubuntu 终端运行示例,不能把整段 Bash 直接粘贴进 PowerShell。Git Bash 可以运行部分命令,但进程、权限、用户和工具选项可能不同;在 Git Bash 上成功不能证明已经在 Ubuntu 上验证。安装 WSL 是读者的环境准备步骤,课程脚本不会替读者更改系统配置。

每个可运行示例从脚本自身位置确定课程根目录,并只在课程 outputs/linux 子目录或自己建立的临时目录操作。首次运行前先阅读脚本,辨认哪些语句读取、哪些写入、哪些清理。检查路径中有空格时是否仍能运行,检查失败后是否返回非零状态,检查重新运行是否得到同样的结果。对生产数据进行操作时不能照搬练习目录的删除命令,必须重新确认目标范围。

Linux 学习应关注输入、输出、错误输出和退出状态这四件事。标准输出用于数据,标准错误用于诊断,退出状态用于让上层脚本判断成功与否;三者不能互相替代。把手工执行过程写成小脚本后,再通过独立目录重复运行一次。遇到差异时记录操作系统、Bash 和工具版本,把环境限制和代码错误区分开,这比无条件写下“全部通过”更有用。

完整示例与实际输出

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)"
WORK="$ROOT/outputs/linux/linux-script"
mkdir -p -- "$WORK"
sum_values() {
  local input_file=$1
  [[ -r "$input_file" ]] || { printf 'unreadable input\n' >&2; return 2; }
  awk 'BEGIN {total=0; bad=0} /^[0-9]+$/ {total+=$0; next}
    {print "invalid integer at line " NR > "/dev/stderr"; bad=1}
    END {if (bad) exit 2; print total}' "$input_file"
}
printf '%s\n' 1 2 3 > "$WORK/valid.txt"
sum_values "$WORK/valid.txt" > "$WORK/result.txt"
printf 'sum: '; cat "$WORK/result.txt"
test "$(cat "$WORK/result.txt")" = 6
printf '%s\n' 1 bad > "$WORK/invalid.txt"
if sum_values "$WORK/invalid.txt" > "$WORK/rejected.txt" 2> "$WORK/error.log"; then
  printf 'validation unexpectedly accepted bad data\n' >&2; exit 1
else
  printf '%s\n' 'bad data rejected as expected'
  cat "$WORK/error.log"
fi

实际运行通过Git Bash/MSYS on Windows compatibility run; Ubuntu and remote behavior not verified.

sum: 6
bad data rejected as expected
invalid integer at line 2

五道自测:先回答,再核对

01 · "$@" 与未引用 $@ 差在哪?

查看提示

参数边界。

查看参考答案

引用后保留每个输入参数,未引用可能按空格再拆分与通配符展开。

02 · set -e 可以代替所有错误处理吗?

查看提示

条件和管道例外。

查看参考答案

不能,需显式处理预期失败、清理和状态。

03 · SSH 首次主机密钥可直接忽略吗?

查看提示

确认连接对象。

查看参考答案

不应忽略,应通过可信渠道核对指纹。

04 · cron 中会自动处于项目目录吗?

查看提示

环境精简。

查看参考答案

不会保证,使用绝对路径或显式 cd 并检查环境。

05 · 每日任务成功一次意味着可安全重复吗?

查看提示

重复导入与任务重叠。

查看参考答案

不是,需幂等、互斥、失败监测和恢复设计。

两项动手任务

任务 1 · 给出只读取一个文件参数的安全脚本,错误时返回二。

提示

检查参数数目和可读性。

完整参考解答与检查方式#!/usr/bin/env bash set -euo pipefail if [[ $# -ne 1 || ! -r "${1-}" ]]; then printf 'usage: reader.sh readable-file\n' >&2 exit 2 fi wc -l -- "$1" 保存为自己练习目录的 reader.sh,在 Bash 中用 bash reader.sh '带空格路径' 运行;没有参数或文件不可读时输出到 stderr 并返回二。

任务 2 · 解释每天上海时间九点运行任务需要哪些准备,并写示意调度行。

提示

确认调度器时区与绝对路径。

完整参考解答与检查方式先确认 Ubuntu 系统/调度器时区为 Asia/Shanghai,实际程序路径、权限和环境有效,单次执行通过,并防止重叠。示意:0 9 * * * /bin/bash /home/analyst/course/job.sh >>/home/analyst/course/outputs/job.log 2>&1。这是说明,不执行 crontab;真实路径替换后再由读者在自身环境配置。

官方资料与掌握状态

完成两项任务后,按独立完成程度记录。状态会尽量保存在当前浏览器,可导出备份。

动手任务记录

掌握状态与复习

关掉资料独立完成后记 A;提示后完成记 B;需要重学记 C。

记录尽量保存在当前浏览器,建议定期导出备份。