Bash 脚本:使用 Expect 将文件发送到 SFTP

2024-03-29

我必须将一些 gzip 压缩文件从本地服务器发送到 SFTP 服务器。

我的服务器信息

发行商 ID:Ubuntu 说明:Ubuntu 12.04.4 LTS 发布:12.04 代号:精确

创建了一个 bash 脚本,并且能够将文件发送到 sftp,但我想在传输成功时发送电子邮件。

 #!/bin/bash
 HOST=hostname.domain
 PORT=22
 USER=username
 PASSWORD=password
 SOURCE_FILE=path/filename
 TARGET_DIR=PATH

 /usr/bin/expect<<EOD

 spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST
 expect "password:"
 send "$PASSWORD\r"
 expect "sftp>"
 send "put $SOURCE_FILE $TARGET_DIR\r"
 expect "sftp>"
 send "bye\r"
 EOD

现在我想如果上述传输成功,则发送成功电子邮件,如果失败则发送包含错误消息的失败电子邮件。

请帮忙!!

Thanks.


您可以将错误信息从脚本传输到文件,并使用第二个脚本来 grep 查找错误。第二个脚本甚至可以运行第一个脚本,并且可能如下所示:

/path/firstscript.sh 2>&1 > results.txt
if [ -n "$(grep 'error expected' results.txt)" ]
 then 
  echo "Found error" | mail -S "Error" [email protected] /cdn-cgi/l/email-protection
 else
  echo "No error" | mail -s "Okay" [email protected] /cdn-cgi/l/email-protection
 fi

就我个人而言,我发现最好通过进行第二次连接并在那里列出输出来检查目标站点上的文件。然后我检查第二个连接日志是否存在上传的文件。

我无法与我为其编写文件传输脚本的三个不同公司使用 rsync 或密钥身份验证,因此我对那些在提出问题时得到“不要这样做”答案的人表示同情。当您寻找答案时情况会更糟,因为您已经知道人们推荐的内容不会起作用。

以下是更接近我实际所做的示例:

电子邮件结果.bash

#!/bin/bash
./uploadfile_example.bash 2>&1 > log.txt
if [ -n "$(grep "$(date +%b' '%d)" log.txt|grep "testfile")" ]
 then
  echo "File uploaded" |mail -s "Test success" [email protected] /cdn-cgi/l/email-protection
 else
  echo "File not uploaded" |mail -s "Test fail" [email protected] /cdn-cgi/l/email-protection
 fi

上传文件_example.bash

#!/bin/bash
datestamp=$(date +%s)
/bin/cp -v testfile.txt testfile.${datestamp}.txt
HOST="localhost"
USER="testuser"
PASS="YourPasswordHere"

expect -c "
spawn sftp ${USER}@${HOST}
expect \"password: \"
send \"${PASS}\r\"
expect \"sftp>\"
send \"put testfile.${datestamp}.txt\r\"
expect \"sftp>\"
send \"ls -l testfile.${datestamp}.txt\r\"
expect \"sftp>\"
send \"bye\r\"
expect \"#\"
"

/bin/rm -vf testfile.${datestamp}.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 脚本:使用 Expect 将文件发送到 SFTP 的相关文章

  • 使用 nzsql 将数据导出到 CSV

    我想从 netezza 将数据导出为 CSV 数据由数百万行记录组成 数据应位于引号内 并应使用 作为分隔符 例如 a b c 每当您想要从 Netezza 导出数据时 您都会需要使用其外部表功能 如果要导出到 Netezza 主机本地安装
  • 如何设置PS1使git和conda都可以在bash中显示?

    我的 bashrc show a short way shortwd num dirs 3 pwd symbol newPWD PWD HOME if echo n newPWD awk F print NF gt num dirs the
  • 获取后台进程的退出代码

    我有一个从我的主 bourne shell 脚本中调用的命令 CMD 该命令需要很长时间 我想修改脚本如下 作为后台进程并行运行命令 CMD CMD 在主脚本中 有一个循环每隔几秒监视生成的命令 该循环还向标准输出回显一些消息 指示脚本的进
  • 使用 sed 反转输入顺序

    我有一个文件 我们将其命名为 a txt 该文件包含以下文本行 do to what 我想知道 SED 命令是什么来反转此文本的顺序 使其看起来像 what to do 我必须做某种追加吗 就像将 do 附加到 to 所以它看起来像 to
  • 为什么 ssh-agent 需要 root 访问权限?

    我刚刚安装了 Archbang 并尝试克隆我的 Git 项目 这需要 SSH 密钥 过去 我在 Ubuntu 和 RedHat 机器上遵循 Github 指南取得了成功 但由于某种原因 它在我的新 Arch 安装上不起作用 我已使用以下命令
  • 使用单个 shell 脚本运行 React 和 Flask

    我构建了一个使用 ReactJS 作为前端和 Flask 作为中间件的应用程序 我可以使用以下命令序列来执行它 npm start cd Equation Solver python m flask run 执行第一个命令后 我必须打开另一
  • 传递到 mvn exec:java 时保留参数间距等

    我有一个启动 Maven exec java 进程的 shell 脚本 exec mvn exec java Dexec mainClass Dexec args 现在可悲的是如果我跑步 myMagicShellScript arg1 ar
  • ${ARGUMENT+x} 在 Bash 中意味着什么? [复制]

    这个问题在这里已经有答案了 我有一个使用以下语法的 bash 脚本 if z ARGUMENT x then 参数名称后面的 x 语法是什么意思 这意味着如果 ARGUMENT设置后 它将被字符串替换x 让我们在 shell 中尝试一下 e
  • unix 命令行执行方式为 . (点)与没有

    在 unix 命令行中 通过简单地键入程序名称来执行程序与通过键入 点 后跟程序名称 例如 runme vs runme name来源称为文件name进入当前外壳 所以如果一个文件包含这个 A hello 然后 如果您获取它 之后您可以引用
  • 即使退出命令后,Shell 脚本仍继续运行

    我的shell脚本如下所示 bin bash Make sure only root can run our script EUID ne 0 echo This script must be run as root 1 gt 2 exit
  • 如何通过管道将输入和输出传送到交互式 shell?

    我正在尝试构建一个应用程序 使用户能够与命令行交互式 shell 例如 IRB 或 Python 进行交互 这意味着我需要将用户输入通过管道传输到 shell 并将 shell 的输出返回给用户 我希望这会像管道 STDIN STDOUT
  • 如何在 ubuntu 上的 emacs 中运行 shell 命令,同时避免 bash 作业控制错误?

    我在 ubuntu 中安装了 emacs 使用 sudo apt get install emacs 我遇到的问题是 当我尝试从 emacs 中运行 shell 命令时 例如M ls 输出之前是这样的 bash cannot set ter
  • PHP exec - 检查是否启用或禁用

    有没有办法检查 php 脚本是否exec 在服务器上启用还是禁用 这将检查该功能是否确实有效 权限 权利等 if exec echo EXEC EXEC echo exec works
  • 使用 AWK 或 SED 以及以下标签以逗号分隔

    使用 AWK 或 SED 以及下面使用的标签以逗号分隔 BEGIN AccountID BEGIN CallerID BEGIN Billed Account Attributes 1111111 1111111 1111111 END B
  • 打印一个字符串,并将其特殊字符打印为文字转义序列

    我在 shell bash 脚本中有一个字符串 我想打印字符串 并将其所有 特殊字符 例如换行符 制表符等 打印为文字转义序列 例如换行符打印为 n 选项卡打印为 t 等等 不确定我是否使用了正确的术语 该示例应该能够澄清问题 Exampl
  • 如何将 Markdown 文档批量转换为 HTML?

    我正在用 Markdown 编写一些文档 并为文档的每个部分创建一个单独的文件 我希望能够一次性将所有文件转换为 HTML 但我找不到其他人尝试过同样的事情 我使用的是 Mac 所以我认为一个简单的 bash 脚本应该能够处理它 但我从未在
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格
  • 使用 sh shell 比较字符串

    我正在使用 SH shell 我试图将字符串与变量的值进行比较 但是if条件始终执行为真 为什么 这是一些代码 Sourcesystem ABC if Sourcesystem eq XYZ then echo Sourcesystem M
  • 验证 BASH 脚本时出现问题 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试验证 bash 脚本时出现代码 lint 错误 bin bash if eq 0 then printf No argum
  • 将 erlang shell 作为守护进程/服务运行

    显然 我有一个在 Erlang shell 中运行的 Erlang 程序 我想监视它 这就是我要的 当机器启动时 Erlang shell 应该随之启动 并且在 shell 中运行的程序也应该随之启动 如果 Erlang shell 由于某

随机推荐

  • 在 Firestore 中安全保存数据

    Firestore 文档shows https firebase google com docs firestore security rules query examples https firebase google com docs
  • Groovy:从文件中读取一系列行

    我有一个文本文件 其中包含大约 2 000 000 行的大量数据 使用以下代码片段浏览文件很容易 但这不是我需要的 def f new File input txt f eachLine Some code here 我只需要从文件中读取特
  • 函数指针作为参数

    我尝试调用一个不带参数作为函数指针传递的函数 但我无法使其工作 void disconnectFunc void D setDisconnectFunc void func disconnectFunc func void D discon
  • TPL 是否可以在多个线程上运行任务?

    欢迎特定于 Mono Xamarin 的答案 我正在使用 Task Run 运行 System Threading Tasks TPL 是否会在任务执行的生命周期内将创建的任务分配给单个线程 或者创建的任务是否有可能在运行时被抢占 然后再次
  • Plotly - 如何绘制圆柱体?

    I have a function plotting the cylinder using matplotlib 我想知道如何使用情节来做同样的事情 下面是我绘制圆柱体的 matplotlib 函数 function to plot the
  • 更新核心数据存储位置以支持应用程序组

    我在 App Store 中已有一个使用核心数据来保存数据的应用程序 现在 当 iOS 8 即将发布时 我想为其添加一个小部件 因此我必须使用应用程序组在二进制文件之间共享数据 但有一个问题 我需要更改商店位置以支持所有现有用户的应用程序组
  • 使用 Python 将 HTML 转为 RTF 字符串

    我正在寻找一种将 HTML 文本转换为 RTF 字符串的方法 有没有任何图书馆可以完成这项工作 我在项目中动态获取 html 内容 并需要将其以 RTF 格式呈现 我正在使用 HTML 解析器将 HTML 文本转换为普通字符串 然后尝试使用
  • Boost.Python - 向量到 Numpy 数组

    我有以下课程 class PyWav public static inline boost python object sdVecToNumpyArray std vector
  • 如何模拟 DefaultCellEditor 的“onStartCellEditing”

    CellEditorListener 有 editingStopped 和 editingCancelled 但是 我如何实现在单元格编辑会话开始时需要运行的一段代码呢 一个典型的示例可能是 当您开始编辑时 您希望 JTextField 编
  • 使用 SQL Server 2016 批量导入 Unicode

    由于我们已经迁移到 SQL Server 2016 我们现在尝试使用非 XML 格式文件和 UTF 8 编码数据文件 使用换行符 Unix LF 通过 BULK IMPORT 将 Unicode 字符导入表中 格式文件指定主机文件数据长度
  • Javafx 删除应用程序启动时的快速白屏

    使用 javafx 7 更新 60 操作系统 Windows 7 我刚刚从那里获取了 helloworldhttp docs oracle com javafx 2 get started hello world htm http docs
  • 如何在客户端使用 Java 读取 gRPC 中的元数据

    我正在使用 Java 和 Protoc 3 0 编译器 我的 proto 文件如下所述 https github com openconfig public blob master release models rpc openconfig
  • 具有多个视图的 Durandal 小部件

    我正在使用 Durandal 开发 SPA 并且我创建了一个用于显示特定页面组件的小部件 继杜兰达尔文档 http durandaljs com documentation Creating A Widget 小部件位于app widget
  • 当图像不存在时,如何使用 CSS 隐藏替代文本?

    是否可以在所有浏览器中使用 CSS 隐藏替代文本 我尝试过color transparent 它适用于除 IE 之外的所有浏览器 可以在 IE 中使用 CSS 实现吗 预先感谢您的任何帮助 怎么样使用font size 0 它在隐藏中起作用
  • 使用 javascript 永久更改 :root .css 变量(通过输入获取变量信息)

    我正在为我正在创建的这个网站开发一个想法 这个想法基本上是要求用户提供颜色输入 12345 一旦输入 用户就会提交输入 这将在所有内容中永久更改 css 变量页 这是我的代码 HTML div class adminpage backgro
  • 无法将 DrawerLayout 放在 StatusBar 下

    我有一个活动Navigation Drawer并使用ScrimInsetsFrameLayout我能够将布局放在StatusBar一切都很顺利 然后我决定更换颜色Toolbar and StatusBar with a png所有活动布局的
  • 如何将 3D 模型从 Cinema4D 导出到 Three.js?

    如果我有一个网格建模4D影院 我怎样才能将其导出three js http github com mrdoob three js3D JS 引擎 另外 导出材料也很方便colors for 多边形选择 为此 我刚刚为 Cinema4D 编写
  • 在VBA中处理错误时如何管理无错误情况? [复制]

    这个问题在这里已经有答案了 我需要使用以下命令捕获一些 VBA 错误GoTo陈述 Sub mySub On Error GoTo errorHandler Workbooks Open myWorkbook Some Code errorH
  • 更改 ggplot 中某些类别的线型?

    我有一些数据 library reshape2 library ggplot2 df data frame cat LETTERS 1 6 VAR1 runif 6 VAR2 runif 6 VAR3 runif 6 VAR4 runif
  • Bash 脚本:使用 Expect 将文件发送到 SFTP

    我必须将一些 gzip 压缩文件从本地服务器发送到 SFTP 服务器 我的服务器信息 发行商 ID Ubuntu 说明 Ubuntu 12 04 4 LTS 发布 12 04 代号 精确 创建了一个 bash 脚本 并且能够将文件发送到 s