当前位置: 首页 > news >正文

Linux Shell: 使用 Expect 自动化 SCP 和 SSH 连接的 Shell 脚本详解

文章目录

    • 0. 引言
    • 2. 解决方案
    • 3. 脚本详解
      • 脚本1:使用 SSH 和 Expect 自动化登录远端机器
        • 脚本说明
      • 脚本2:使用 SCP 和 Expect 自动化文件上传
        • 脚本说明
      • 脚本3:使用 SCP 和 Expect 自动化文件下载
        • 脚本说明
    • 4. 脚本的使用方法
    • 5. 关键技术点
      • 5.1. Expect 脚本的引号处理
      • 5.2. 处理密码中的特殊字符
      • 5.3. 自动接受主机密钥
    • 6. 参考资料

0. 引言

在日常的开发过程中,我们经常需要在不同的服务器之间传输文件或者远程登录。Expect 工具是常用的自动登录工具之一,但是在处理包含特殊字符的密码(例如 &$ 等)时,需要特别注意。这些字符在 Shell 和 Expect 中有特殊的含义,可能导致脚本执行出错。

2. 解决方案

通过以下方法,我们可以编写健壮的脚本:

  • 使用 Expect 自动化交互式命令:Expect 是一个基于 Tcl 的工具,专门用于自动化交互式程序。
  • 正确处理特殊字符:在 Expect 脚本中,使用单引号和双引号的组合,确保密码中的特殊字符被正确处理。
  • 增加超时时间:防止由于网络延迟导致的超时错误。

3. 脚本详解

脚本1:使用 SSH 和 Expect 自动化登录远端机器

#!/bin/bash# 设置终端类型以确保兼容性
export TERM=xterm-256color# IP 地址和密码
ip='192.168.1.10'
password='your_password_here'# 从 known_hosts 文件中删除目标主机,防止 SSH 警告
ssh-keygen -f "/home/$(whoami)/.ssh/known_hosts" -R "${ip}"# 使用 Expect 自动化 SSH 连接过程
expect -c 'set timeout 10set password "'"$password"'"spawn ssh -o StrictHostKeyChecking=no root@'"$ip"'expect {# 自动回复 "yes" 以接受主机的真实性"*yes/no*" { send "yes\r"; exp_continue }# 当出现密码提示时,发送实际的密码"*password:*" { send "$password\r"; exp_continue }eof}interact
'
脚本说明
  • 清理 known_hosts:使用 ssh-keygen -R 命令从 known_hosts 文件中删除目标主机,防止因主机密钥变化导致的 SSH 警告。
  • 自动化 SSH 登录:使用 Expect 自动化输入密码,实现无人工干预的 SSH 登录。
  • 动态主目录:使用 $(whoami) 获取当前用户名,避免硬编码用户路径。

脚本2:使用 SCP 和 Expect 自动化文件上传

#!/bin/bash# 设置终端类型以确保兼容性
export TERM=xterm-256color# 目标文件和 IP 地址
file=$1
ip='192.168.1.10'# 密码(此处已做修改,实际使用时请替换为你的密码)
password='your_password_here'# 本地目标目录
destination_dir=$2
if [[ -z $destination_dir ]]; thendestination_dir='~/'
fi# 使用 Expect 自动化 SCP 过程
expect -c 'set timeout 10set password "'"$password"'"spawn scp -o StrictHostKeyChecking=no '"$file"' root@'"$ip"':'"$destination_dir"'expect {# 自动回复 "yes" 以接受主机的真实性"*yes/no*" { send "yes\r"; exp_continue }# 当出现密码提示时,发送实际的密码"*password:*" { send "$password\r"; exp_continue }eof}
'
脚本说明
  • 参数处理:接受两个参数,$1 为要传输的文件,$2 为目标目录。
  • 特殊字符处理
    • 使用单引号 ' 包裹整个 Expect 脚本,防止 Bash 提前解析其中的内容。
    • 在单引号内,使用 '"$variable"' 的方式正确嵌入 Bash 变量。
  • Expect 模式匹配
    • 使用 "*yes/no*""*password:*" 进行模式匹配,确保自动回复正确的内容。
  • 超时时间:将超时时间设置为 10 秒,防止网络延迟导致的超时。

脚本3:使用 SCP 和 Expect 自动化文件下载

#!/bin/bash# 设置终端类型以确保兼容性
export TERM=xterm-256color# 远程文件路径和 IP 地址
remote_file=$1
ip='192.168.1.10'# 密码(此处已做修改,实际使用时请替换为你的密码)
password='your_password_here'# 本地目标目录(默认为当前目录)
destination_dir=$2
if [[ -z $destination_dir ]]; thendestination_dir='.'
fi# 使用 Expect 自动化 SCP 下载过程
expect -c 'set timeout 10set password "'"$password"'"spawn scp -o StrictHostKeyChecking=no root@'"$ip"':'"$remote_file"' '"$destination_dir"'expect {# 自动回复 "yes" 以接受主机的真实性"*yes/no*" { send "yes\r"; exp_continue }# 当出现密码提示时,发送实际的密码"*password:*" { send "$password\r"; exp_continue }eof}
'
脚本说明
  • 参数处理:接受两个参数,$1 为远程服务器上的文件路径,$2 为本地目标目录。
  • 特殊字符处理
    • 与前两个脚本相同,正确处理密码中的特殊字符。
  • Expect 模式匹配
    • 自动处理主机真实性确认和密码输入。
  • 超时时间:同样设置为 10 秒。

4. 脚本的使用方法

为了方便地使用上述脚本,可以按照以下步骤进行配置:

  • 将脚本存放在指定目录

    建议将三个脚本(例如 ssh_my.shscp_my.shrscp_my.sh)放置在 ~/.ssh 目录下。这样可以统一管理与 SSH 和 SCP 相关的脚本。

    mv ssh_my.sh ~/.ssh/
    mv scp_my.sh ~/.ssh/
    mv rscp_my.sh ~/.ssh/
    
  • 赋予脚本执行权限

    确保脚本具有可执行权限:

    chmod +x ~/.ssh/ssh_my.sh
    chmod +x ~/.ssh/scp_my.sh
    chmod +x ~/.ssh/rscp_my.sh
    
  • 在 Shell 配置文件中设置别名

    为了在终端中方便地调用这些脚本,可以在 ~/.bashrc~/.zshrc 文件中添加别名:

    alias sshmy='~/.ssh/ssh_my.sh'
    alias scpmy='~/.ssh/scp_my.sh'
    alias rscpmy='~/.ssh/rscp_my.sh'
    
  • 重新加载配置文件

    修改完配置文件后,重新加载使之生效:

    source ~/.bashrc
    # 或者
    source ~/.zshrc
    
  • 使用别名调用脚本

    • 登录远程服务器

      sshmy
      
    • 上传文件到远程服务器

      scpmy 本地文件路径 [远程目标目录]
      

      示例:

      scpmy ./example.txt /root/
      
    • 从远程服务器下载文件

      rscpmy 远程文件路径 [本地目标目录]
      

      示例:

      rscpmy /root/example.txt ./
      

5. 关键技术点

5.1. Expect 脚本的引号处理

  • 单引号:将整个 Expect 脚本包裹在单引号内,防止 Bash 对其中内容的变量和特殊字符进行解析。
  • 双引号嵌入变量:在单引号内,需要嵌入 Bash 变量时,使用 '"$variable"' 的形式。

5.2. 处理密码中的特殊字符

  • 由于密码中可能包含 Shell 或 Expect 的特殊字符,直接使用可能导致解析错误。
  • 通过上述引号处理方法,可以安全地传递包含特殊字符的密码。

5.3. 自动接受主机密钥

  • 使用 -o StrictHostKeyChecking=no 选项,自动接受新的主机密钥,防止脚本因交互式提示而挂起。
  • 在 Expect 脚本中,匹配 "*yes/no*",并发送 "yes\r",进一步确保自动化。

6. 参考资料

  • Expect 官方文档
  • Bash Shell 脚本高级编程指南

相关文章:

Linux Shell: 使用 Expect 自动化 SCP 和 SSH 连接的 Shell 脚本详解

文章目录 0. 引言2. 解决方案3. 脚本详解脚本1:使用 SSH 和 Expect 自动化登录远端机器脚本说明 脚本2:使用 SCP 和 Expect 自动化文件上传脚本说明 脚本3:使用 SCP 和 Expect 自动化文件下载脚本说明 4. 脚本的使用方法5. 关键技术点5.1. Ex…...

深入分析MySQL事务日志-Undo Log日志

文章目录 InnoDB事务日志-Undo Log日志2.1 Undo Log2.1.1 Undo Log与原子性2.1.2 Undo的存储格式1)insert类型Undo Log2)delete类型Undo Log3)update类型Undo Log 2.1.3 Undo Log的工作原理2.1.4 Undo Log的系统参数2.1.5 Undo Log与Purge线程…...

828华为云征文 | 在Huawei Cloud EulerOS系统中安装Docker的详细步骤与常见问题解决

前言 Docker是一种轻量级的容器技术,广泛用于应用程序的开发、部署和运维。在华为云的欧拉(Huawei Cloud EulerOS)系统上安装和运行Docker,虽然与CentOS有相似之处,但在具体实现过程中,可能会遇到一些系统…...

什么是数据增强中的插值法?

一、插值法的概念 在数据增强中,插值法是一种重要的技术,它通过数学模型在已知数据点之间估计未知数据点的值。这种方法可以帮助我们在不增加实际数据的情况下,通过生成新的数据点来扩展数据集。插值法基于这样的假设:如果已知的数…...

springboot实战学习(9)(配置mybatis“驼峰命名“和“下划线命名“自动转换)(postman接口测试统一添加请求头)(获取用户详细信息接口)

接着学习。之前的博客的进度:完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、JWT令牌"的组成与使用以及完成了"登录认证"(生成与验证JWT令牌)具体往回看了解的链接…...

之前做了抵押贷款,现在房市不景气,马上贷款要到期了该怎么办?

面对房贷的重压,特别是对于那些正承受高息贷款之苦的现有房产业主而言,探索有效的减负策略显得尤为重要。今天,我们共同探讨几种智慧策略,旨在帮助您巧妙减轻房贷的经济负担。 一、优化贷款结构:低息置换的魔力 当前&a…...

poi生成的ppt,powerPoint打开提示内容错误解决方案

poi生成的ppt,powerPoint打开提示内容错误解决方案 最近做了ppt的生成,使用poi制作ppt,出现一个问题。微软的powerPoint打不开,提示错误信息 通过xml对比工具发现只需要删除幻灯片的某些标签即可解决。 用的是XML Notepand 分…...

基于stm32物联网身体健康检测系统

在当今社会,由于经济的发展带来了人们生活水平不断提高,但是人们的健康问题却越来越突出了,各种各样的亚健康随处可在,失眠、抑郁、焦虑症,高血压、高血糖等等侵袭着人们的健康,人们对健康的关注达到了一个…...

BeautifulSoup4在爬虫中的使用

一、Beautiful Soup4简介 Beautiful Soup 提供一些简单的python函数来处理导航、搜索等功能。 它是一个工具箱,是python的一个库,最主要的功能是从网页获取数据。 二、Beautiful Soup4安装 在cmd下安装 pip install beautifulsoup4三、BeautifulSou…...

Laya2.x出包alipay小游戏

小游戏开发者工具,支付宝官方已经出了,不说了。 1.LAYA2.X打出得小游戏包中my-adapter.js这个文件需要替换,或者自行修改,替换3.x得; 2.unity导包出得模型文件命名需要注意,避免太长,路径也不…...

Vue极简入门

1.注册路由,如果是子路由,就加一个children import Vue from vue import Router from vue-router import Main from ../views/Main.vue import Login from ../views/Login.vueimport UserProfile from "../views/user/Profile.vue" import Us…...

系统敏感信息搜索工具(支持Windows、Linux)

目录 工具介绍 使用说明 search模块 browser模块 下载地址 工具介绍 可以快速搜索服务器中的有关username,passsword,账号,口令的敏感信息还有浏览器的账户密码。 使用说明 search模块 searchall64.exe search -p 指定路径 searchall64.exe search -p 指定路径 -s &q…...

Fyne ( go跨平台GUI )中文文档-容器和布局 (四)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…...

文心智能体 恐怖类游戏

智能体名称:孤岛惊魂 链接:文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/center/agent/preview/MFhBvA0K9EXXVdjHCcUumadWmWesKvw2 角色与目标设定 🧑🏻 角色:孤岛惊魂是一位虚拟…...

智慧城市运营模式--政府和社会资本合作

1、主要特征 政府和社会资本合作模式是政府与社会资本长期合作提供公共产品和服务的一种创新模式,主要集中在纯公共领域和准公共领域,通过建立“利益共享、风险共担”的长期合作伙伴关系,在增加公共产品和服务供给数量和提升质量的同时,达到减少财政资金支出、降低企业投资…...

【Python报错已解决】ValueError: cannot convert float NaN to integer

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

ClickHouse 与 Quickwit 集成实现高效查询

1. 概述 在当今大数据分析领域,ClickHouse 作为一款高性能的列式数据库,以其出色的查询速度和对大规模数据的处理能力,广泛应用于在线分析处理 (OLAP) 场景。ClickHouse 的列式存储和并行计算能力使得它在处理结构化数据查询时极具优势&…...

Facebook Marketplace无法使用的原因及解决方案

Facebook Marketplace是一项广受欢迎的买卖平台,然而,有时候用户可能会遇到无法访问或使用该功能的问题。通常,这些问题可以归结为以下几类原因: 地理位置限制: Facebook Marketplace并非在全球每个地区都可用。在某些…...

uboot — uboot命令的使用

uboot的命令繁多,下文只对工作中常用到的命令进行记录,其余命令待用到时再查查资料也不迟 一、环境变量操作命令 1、printenv 打印环境变量 2、setenv 修改环境变量/新建环境变量 3、saveenv 保存环境变量/删除环境变量(给环境变量赋空值…...

基础漏洞——SSRF

目录 一.原理 二.引起ssrf的函数 三.这些函数具体作用 (1)File_get_content() (2)Fsockopen() (3)Curl_exec() 四.常见的业务场景(可能出现的漏洞的地方,漏洞挖掘&#xff09…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

SpringCloudGateway 自定义局部过滤器

场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

小木的算法日记-多叉树的递归/层序遍历

🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...

python学习day39

图像数据与显存 知识点回顾 1.图像数据的格式:灰度和彩色数据 2.模型的定义 3.显存占用的4种地方 a.模型参数梯度参数 b.优化器参数 c.数据批量所占显存 d.神经元输出中间状态 4.batchisize和训练的关系 import torch import torchvision import torch.nn as nn imp…...