如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器?

news2024/11/27 10:25:26

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器?

    • 1.1 背景需求
    • 1.2 解决方案
    • 1.3 附录
      • 1.3.1 scp命令用法与示例
        • 1.3.1.1 scp命令用法与解释
        • 1.3.1.2 scp 命令用法示例
          • 1.3.1.2.1 示例一:从本地复制文件到远程计算机
          • 1.3.1.2.2 示例二:从远程计算机复制文件到本地
          • 1.3.1.2.3 示例三:递归复制整个目录到远程计算机
          • 1.3.1.2.4 示例四:从远程计算机下载整个目录到本地
      • 1.3.2 expect 命令用法与示例
        • 1.3.2.1 expect 基本用法
        • 1.3.2.2 expect 用法示例
          • 示例 1:自动登录 SSH
          • 示例 2:自动化 FTP 文件传输
          • 示例 3:交互式配置脚本

1.1 背景需求

这篇博文分享如何使用scpexpect命令写一个脚本来自动填充密码并实现自动登录并上传文件到服务器。

  • 假设目标服务器:192.168.159.175
  • 远程文件服务器登录账号假设是 root
  • 远程文件服务器登录密码假设是 toor
  • /Users/zhaoqingfeng/downloads/test/dist/ 是前端打包部署文件夹
  • /Users/zhaoqingfeng/downloads/test/dist/ 上传到 /var/www/html/your_project/ 目录下

1.2 解决方案

执行脚本输入如下命令:

sh publish.sh 

执行命令脚本内容如下:

#!/bin/bash

# local host file folde path
local_dir="/Users/zhaoqingfeng/downloads/test/dist/"

# config remote server info
# remote server ip
remote_server="192.168.159.175"
# config your remote server acccount
remote_user="root"
# config your remote server password
remote_password="toor"
# config remote server target path
remote_dir="/var/www/html/your_project/"

# upload local file to remote server
expect -c "
spawn scp -r $local_dir $remote_user@$remote_server:$remote_dir
expect {
    \"*assword:\" {
        send \"$remote_password\r\"
        exp_continue
    }
    \"yes/no\" {
        send \"yes\r\"
        exp_continue
    }
    eof
}
"

# Check scp command
if [ $? -eq 0 ]; then
    echo "Upload file success!"
else
    echo "File upload fail"
fi

脚本含义详细解释:

  • 在这个脚本中,使用expect来处理自动登录并上传文件。
    expect -c "...":这是Expect的命令行工具,它允许您在命令行中执行Expect脚本。
    • 在这个命令中,整个Expect脚本被包含在引号内。
  • spawn scp -r $local_dir $remote_user@$remote_server:$remote_dir
    • 这一行使用spawn命令启动了一个新的进程,该进程执行scp命令来将本地目录(或文件)$local_dir传输到远程服务器$remote_server的指定目录$remote_dir
    • -r选项表示递归地复制目录。
      expect {...}:这是Expect脚本的主体,它定义了脚本的行为,根据不同的情况采取不同的操作。
    • "*assword:":这是一个Expect匹配模式(pattern),它用来匹配scp命令执行时可能出现的提示,通常是要求输入密码的提示。*通配符表示匹配任何字符,因此它可以匹配包含"assword:"的任何提示。
    • send "$remote_password\r":当匹配到密码提示时,脚本会使用send命令发送远程密码$remote_passwordscp命令。
    • \r表示回车键,以便输入密码后模拟按下回车键来提交密码。
    • exp_continue:这个命令告诉Expect继续等待并匹配下一个条件。在这种情况下,它会一直等待,直到出现新的匹配条件。
    • "yes/no":这是另一个匹配模式,用于处理SSH连接时可能出现的确认远程主机的提示,通常是在首次连接时出现的。
    • send "yes\r":当匹配到"yes/no"提示时,脚本会自动发送"yes"来确认连接。
    • eof:这个条件匹配到远程scp命令执行结束,即传输完成,并且脚本可以退出。

总体来说就是

  • 使用scp -r 命令递归遍历 /Users/zhaoqingfeng/downloads/test/dist/目录下的所有文件后都上传
  • 它会等待密码提示或是否信任主机的提示,并自动填充密码或发送"yes"以完成操作。
  • 最后,检查scp命令的退出状态以确定上传是否成功。确保将remote_password替换为实际的远程服务器密码。

最后执行成功如下所示:
在这里插入图片描述

1.3 附录

1.3.1 scp命令用法与示例

1.3.1.1 scp命令用法与解释

scp 命令是用于在本地计算机和远程计算机之间进行安全文件传输的工具。

它可以用来上传或下载文件和目录。以下是 scp 命令的基本用法和解释:

scp [options] source_file/directory target_file/directory

scp: 是 Secure Copy 的缩写,用于进行安全的文件复制。

  • options: 可以是一些标志,用于自定义传输行为。一些常见的选项包括:
    • -r:递归复制,用于复制目录及其内容。
    • -P <端口号>:指定远程 SSH 服务器的端口号。
    • -i <身份验证密钥文件>:指定身份验证密钥文件。
    • -v:详细模式,显示详细的传输信息。
  • source_file/directory: 指定要传输的文件或目录的路径。这可以是本地文件系统上的路径或远程计算机上的路径。如果是远程路径,通常以 <用户名>@<远程主机>:<路径> 的格式指定。
  • target_file/directory: 指定传输的目标位置。与源相似,可以是本地或远程路径。

1.3.1.2 scp 命令用法示例

以下是一些示例 scp 命令用法:

1.3.1.2.1 示例一:从本地复制文件到远程计算机
scp localfile.txt user@remotehost:/remote/directory/
1.3.1.2.2 示例二:从远程计算机复制文件到本地
scp user@remotehost:/remote/file.txt /local/directory/
1.3.1.2.3 示例三:递归复制整个目录到远程计算机
scp -r local_directory/ user@remotehost:/remote/directory/
1.3.1.2.4 示例四:从远程计算机下载整个目录到本地
scp -r user@remotehost:/remote/directory/ /local/directory/
  • 这些示例演示了 scp 命令的基本用法,可以根据需要使用不同的选项和参数来满足具体的文件传输需求。
  • 需要注意的是,scp 使用 SSH 协议来保证传输的安全性,因此需要在远程主机上启用 SSH 服务。

1.3.2 expect 命令用法与示例

  • expect 是一个用于自动化交互式任务的命令行工具,它允许你编写脚本来模拟用户输入和对命令行程序的预期输出做出响应。
  • 通常用于自动化任务、测试和自动化配置。

下面是 expect 命令的一些基本用法和示例:

1.3.2.1 expect 基本用法

expect 命令的基本语法如下:

expect [选项] <期望模式> <动作>

选项:可以包括一些常见的选项,如 -c 用于指定要执行的 expect 脚本代码。

<期望模式>:这是一个正则表达式,用于匹配命令行程序的输出,以确定下一步的操作。

<动作>:这是要执行的命令或操作,通常是响应匹配到的输出。

1.3.2.2 expect 用法示例

以下是一些 expect 命令的示例:

示例 1:自动登录 SSH
#!/usr/bin/expect
set timeout 10
spawn ssh user@hostname
expect "password:"
send "your_password\r"
expect "$"
send "ls -l\r"
expect "$"
send "exit\r"
  • 在这个示例中,expect 脚本模拟了 SSH 登录。
  • 它启动 SSH 连接,等待看到 “password:”,
  • 然后发送密码, 接着等待 “$” 提示符,发送了一个 “ls -l” 命令,
  • 最后发送 “exit” 退出 SSH 会话。
示例 2:自动化 FTP 文件传输
#!/usr/bin/expect
set timeout 10
spawn ftp ftp.example.com
expect "Name (ftp.example.com:user):"
send "your_username\r"
expect "Password:"
send "your_password\r"
expect "ftp>"
send "put localfile.txt remotefile.txt\r"
expect "ftp>"
send "quit\r"

  • 这个示例展示了如何使用 expect 自动化 FTP 文件传输。
  • 它启动了一个 FTP 会话,输入用户名和密码,
  • 然后上传一个本地文件到远程服务器。
示例 3:交互式配置脚本
#!/usr/bin/expect
set timeout 10
spawn ./configure.sh
expect "Enter your name:"
send "Your Name\r"
expect "Enter your email:"
send "your@email.com\r"
expect "Choose an option (1/2/3):"
send "2\r"
expect eof
  • 在这个示例中,expect 脚本模拟了一个交互式配置脚本的用户输入。
  • 它运行一个名为 configure.sh 的脚本,
  • 然后模拟了用户对一系列问题的响应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/978204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sqlserver 在 SELECT 语句中显示来自 GROUP BY 子句中未涉及的列

在SQL Server中&#xff0c;如果您在GROUP BY子句中对某些列进行了分组&#xff0c;但想在SELECT语句中同时显示未涉及到的其他列&#xff0c;您可以使用聚合函数和子查询的方法来实现。这可以通过在GROUP BY子查询中获取需要的聚合值&#xff0c;并在外部查询中选择其他列来完…

Java复习-20-接口(3)- 代理设计模式

代理设计模式(Proxy) 功能&#xff1a;可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。 代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标目标对象&#xff0c;可以在目…

复旦-华盛顿EMBA:走近亿咖通科技,探寻汽车智能化的科创“密码”

6月20日&#xff0c;应复旦大学-华盛顿大学EMBA项目18班校友周靖的邀请&#xff0c;项目校友参访了科创企业ECARX亿咖通科技。作为该公司资深副总裁、中国首席财务官&#xff0c;周靖带领大家通过产品演示、实车驾驶和交流对话探寻汽车智能化的科创“密码”&#xff0c;近距离感…

1.初识爬虫

爬虫是批量模拟网络请求的程序&#xff0c;想百度谷歌这种搜索类网站本质上就是爬虫 使用爬虫的时候不应该对别人的网站有严重的影响&#xff0c;比如你爬的频率太高了&#xff0c;让人家的网站崩溃了。不应该爬取网页上显示不到的内容&#xff0c;比如有一个直播的网站&#…

【SLAM】G2O优化库超详细解析

G2O&#xff0c;与ceres并列为目前视觉SLAM中应用最广泛的优化算法库。它最大的特点就是基于图优化设计&#xff0c;这对于视觉SLAM来说是异常适配的。在很多的SLAM库的中都使用到它来进行优化操作&#xff0c;比如ORB-SLAM。 代码仓库&#xff1a;https://github.com/RainerK…

渗透测试漏洞原理之---【不安全的反序列化】

文章目录 1、序列化与反序列化1.1、引入1.2、序列化实例1.2.1、定义一个类1.2.2、创建 对象1.2.3、反序列化1.2.4、对象注入 2、漏洞何在2.1、漏洞触发2.1.2、定义一个类2.1.3、定义一个对象2.1.3、反序列化执行代码 2.2 为什么会这样 3、反序列化漏洞攻防3.1、PHP反序列化实例…

[杂谈]-快速了解LoRaWAN网络以及工作原理

快速了解LoRaWAN网络以及工作原理 文章目录 快速了解LoRaWAN网络以及工作原理1、LoRaWAN网络元素1.1 终端设备&#xff08;End Devices&#xff09;1.2 网关&#xff08;Gateways&#xff09;1.3 网络服务器&#xff08;Net Server&#xff09;1.4 应用服务器&#xff08;Appli…

计算机网络的故事——确认访问用户身份的认证

确认访问用户身份的认证 HTTP使用的认证方式&#xff1a;BASIC认证&#xff08;基本认证&#xff09;、DIGEST&#xff08;摘要认证&#xff09;、SSL客户端认证、FormBase认证&#xff08;基于表单认证&#xff09;。 基于表单的认证&#xff1a;涉及到session管理以及cookie…

Mock 基本使用

mock解决的问题 开发时&#xff0c;后端还没完成数据输出&#xff0c;前端只好写静态模拟数据。数据太长了&#xff0c;将数据写在js文件里&#xff0c;完成后挨个改url。某些逻辑复杂的代码&#xff0c;加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据&#xff0c…

【Springcloud】Sentinel熔断和降级

【Springcloud】Sentinel熔断和降级 【一】基本介绍【1】什么是熔断和降级【2】为什么使用熔断和降级【3】Sentinel熔断和降级【4】核心概念 【二】下载方式【1】Windows平台安装包下载【2】打开控制台 【三】使用案例【1】添加依赖【2】添加Sentinel配置【3】添加TestUserCont…

网络类型+二层封装技术

一、网络类型分类 1、点到点网络 在一个网段中&#xff0c;只能部署两个节点&#xff08;两个IP&#xff09;&#xff0c;如GRE环境就属于虚拟的点到点网络类型&#xff0c;通常是串线连接。 如下图当前只存在两个节点&#xff0c;但并不是点到点&#xff0c;因为它中间网段…

简易版人脸识别qt opencv

1、配置文件.pro #------------------------------------------------- # # Project created by QtCreator 2023-09-05T19:00:36 # #-------------------------------------------------QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsTARGET 01_face TEMP…

【trie树】CF Edu12 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 这其实是一个套路题 区间异或转化成前缀异或&#xff0c;然后枚举 i 对于每一个 i&#xff0c;ai ^ x k&#xff0c;对 x 计数 先建一棵字典树&#xff0c;然后在字典树上计数 先去对 > k 的部分计数&a…

m8130kt GPS模块测试

m8130kt GPS模块测试 ✨在某宝捡电子垃圾&#xff0c;10块钱的价格&#xff0c;就是没有资料可以提供的。上面携带有u-blox UBX-M8130-KT芯片&#xff0c;是肯定的&#xff0c;至于HMC5883芯片不确定&#xff0c;拆了屏蔽罩&#xff0c;芯片实在是太小&#xff0c;使用40倍放大…

SpringCloud实战项目(1)---创建空项目 jdk17

创建空项目 New ProjectAdd Jdk17创建空白标准Maven项目不要选择Create from archetype选项填写相关项目信息创建项目得到一个标准的maven项目&#xff0c;作为一个Parent project存在的&#xff0c;需删除src文件夹。 New Project 使用Idea, File -> New ->Project Add …

语音特征提取与预处理

导入相关包 import librosa import librosa.display import soundfile as sf import numpy as np import matplotlib.pyplot as plt from playsound import playsound 语音读取与显示 file_path test1.wav data, fs librosa.load(file_path, srNone, monoTrue) librosa.d…

word如何插入图片?3种常用的方法

word作为一款常用的办公软件&#xff0c;不仅可以处理文本内容&#xff0c;还能够轻松地插入图片以丰富文档内容。插入图片可以使文档更具吸引力、可读性和信息传达能力。本文将为您介绍word如何插入图片的3种方法&#xff0c;帮助您在文档中灵活、高效地添加图像元素。 word插…

SLAM从入门到精通(矩阵的使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 学习SLAM&#xff0c;离开了矩阵肯定是玩不转的。大学数学里面除了微积分&#xff0c;剩下的就是线性代数和概率论。而矩阵就是线性代数的一部分。…

selenium 动态爬取页面使用教程以及使用案例

Selenium 介绍 概述 Selenium是一款功能强大的自动化Web浏览器交互工具。它可以模拟真实用户在网页上的操作&#xff0c;例如点击、滚动、输入等等。Selenium可以爬取其他库难以爬取的网站&#xff0c;特别是那些需要登录或使用JavaScript的网站。Selenium可以自动地从Web页面…

在多机多卡训练时,保存的文件无法读取,报错文件已经损坏

问题描述&#xff1a;多机多卡训练保存了optimizer.pt文件&#xff0c;但是该文件在被读取时显示已经损坏。 原来的报错&#xff1a; Traceback (most recent call last):File "/mnt/petrelfs/tongjingqi/train-moe/smoe/entrypoint/cpt_fpt.py", line 280, in <…