通过 ssh 将脚本和二进制数据传输到 stdin

2024-02-02

我想远程执行一个 bash 脚本,该脚本使用 tarball 并对其执行一些逻辑。诀窍是我只想使用一个 ssh 命令来完成此操作(而不是scp对于 tarball,然后是ssh对于脚本)。

bash 脚本如下所示:

cd /tmp
tar -zx
./archive/some_script.sh
rm -r archive

我意识到我可以简单地将这个脚本重新格式化为一行并使用

tar -cz ./archive | ssh $HOST bash -c '<commands>'

但我的实际脚本足够复杂,我必须将其通过管道传输到bash通过标准输入。这里的挑战是ssh仅提供一个输入管道(stdin),我想将其用于 bash 脚本和 tarball。


我想出了两个解决方案,都包含 bash 脚本和 stdin 中的 tarball。

1. 将 base64 编码的 tarball 嵌入到定界文档中

在这种情况下,服务器收到一个 bash 脚本,其中 tarball 嵌入到 Heredoc 中:

base64 -d <<'EOF_TAR' | tar -zx
<base64_tarball>
EOF_TAR

这是完整的示例:

ssh $HOST bash -s < <(
# Feed script header
cat <<'EOF'
cd /tmp
base64 -d <<'EOF_TAR' | tar -zx
EOF

# Create local tarball, and pipe base64-encoded version
tar -cz ./archive | base64

# Feed rest of script
cat <<'EOF'
EOF_TAR
./archive/some_script.sh
rm -r archive
EOF
)

然而,在这种方法中,tar在 tarball 通过网络完全传输之前,不会开始提取 tarball。

2. 在脚本后面输入 tar 二进制数据

在这种情况下,bash 脚本通过管道传输到标准输入,然后是原始 tarball 数据。bash将控制权传递给tar它处理标准输入的 tar 部分:

ssh $HOST bash -s < <(
# Feed script.
cat <<'EOF'
function main() {
  cd /tmp
  tar -zx
  ./archive/some_script.sh
  rm -r archive
}
main
EOF
# Create local tarball and pipe it
tar -cz ./archive
)

与第一种方法不同,此方法允许tar当 tarball 通过网络传输时,开始提取 tarball。

边注

为什么我们需要main你问功能吗?为什么首先输入整个 bash 脚本,然后输入二进制 tar 数据?好吧,如果将二进制数据放在 bash 脚本中间,就会出现错误,因为tar消耗超过 tar 文件末尾的内容,在这种情况下会消耗一些 bash 脚本。所以main函数用于强制整个 bash 脚本位于 tar 数据之前。

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

通过 ssh 将脚本和二进制数据传输到 stdin 的相关文章

  • 如何显示 zsh 函数定义(如 bash“type myfunc”)?

    如何在 zsh 中显示函数的定义 type foo没有给出定义 在bash中 bash function foo echo hello bash foo hello bash type foo foo is a function foo e
  • 文本处理问题:删除其中一列不包含特定值的行

    我有一个制表符分隔的文件 如下所示 input sequence match sequence score receptor group epitope antigen organism ASRPPGGVNEQF ASRPPGGVNEQF
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • powershell stdin 管道和重定向

    你好 我一直在制作一个小的跨平台脚 本 我可以将其卷曲并通过管道传输到bash和Powershell中 基本思想是服务器向解释器发送一个命令 然后它给出一个命令将所有输出重定向到标准输出 bash 中的一个例子是 some commands
  • 使用正确的头打印文件名

    我想获取当前目录中的文件名 使得文件的第一行等于myWord 我想结合find type f命令与 exec选项与head 1 filename但无济于事 有没有一些聪明的 单行的解决方案来解决这个问题 您可以使用find with awk
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 语法错误:for 循环变量不正确

    我正在尝试编写一个可以在后台调高收音机音量的脚本 bin sh for i 80 i lt 101 i do amixer cset numid 1 i sleep 60 done 但我有问题 alarmclock vol sh 3 ala
  • SSH 无法对 [email protected] 进行身份验证

    最近 我在 Github com 上注册了一个免费计划 我按照他们的说明生成 ssh 密钥以添加到我的帐户 然而 当我尝试ssh v email protected cdn cgi l email protection 我收到此错误 deb
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 如何判断 Bash 中是否存在文件?

    这会检查文件是否存在 bin bash FILE 1 if f FILE then echo File FILE exists else echo File FILE does not exist fi 我如何只检查文件是否存在not ex
  • jq:将对象数组转换为对象

    我收到了来自curl的回复 格式如下 list value 1 id 12 value 15 id 13 value 4 id 14 给定 id 之间的映射 如下所示 12 newId1 13 newId2 14 newId3 我想做这个
  • 动态参数值取决于另一个动态参数值

    启动前提 非常严格的环境 Windows 7 SP1 Powershell 3 0 使用外部库的可能性有限或不可能 我正在尝试重写之前创建的 bash 工具 这次使用 PowerShell 在 bash 中 我实现了自动完成功能 以使该工具
  • 如何查找所有以句号结尾的单词?

    我有一个包含许多以 a 结尾的单词的文件 其中大部分是缩写 例如 etc p s 如何输出一个仅显示一次所有这些单词的列表 所有单词前面都有一个空格 因此可以使用该空格来查找单词的开头 没有一个单词出现在该行的开头 文件中没有句子 因此句点
  • 获取变量的名称作为输入并使用该名称更改变量

    我从脚本用户那里获取变量的名称作为第一个参数 并将该变量的值回显到控制台 bin bash variablename 1 echo The value of variablename is variablename 这太棒了 我无法开始工作
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • bash中的用户名、密码程序

    我有一个程序 要求用户输入用户名和密码 然后将其存储在文本文件中 第一列是用户名 第二列是密码 我需要一个命令 在用户输入用户名和新密码时替换密码 如下我拥有的 bin bash admin menu Register User echo

随机推荐

  • 从哈希 perl 写入 CSV 文件

    我有一个程序 目前读取FILE 1类似于下面的并且匹配某些字符 例如 Type Fruit Description quantity tropical banana tasty and yummy 5 tropical grapefruit
  • 判断Lua编译器是运行32位还是64位

    我目前正在使用Windows在我的默认开发系统上和Linux在我部署 Lua 脚本的服务器上 为了Windows只有几个 32 位解释器 例如Windows 下的 Lua https github com rjpcomputing luaf
  • 有可用的 ccTalk 库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想将硬币接收器集成到我们的一个应用程序中 这个特定的硬币接收器使用ccTalk协议 http en
  • Firebase Blaze 计划和云功能

    不幸的是 Firebase 的 Flame 计划消失了 我现在必须处理 Blaze 计划 我不喜欢它 因为它的预算 无限 但我的钱包不是 昨天 我在编码时错误地创建了一个名为 3 Cloud Functions 的循环 我发现该循环的速度足
  • Visual Studio 意外停止调试且没有错误

    我正在调试一个项目 Visual Studio 停止调试并在以下行关闭程序 没有异常或错误消息 我已启用选项中任何引发的异常的通知 var query Session Linq
  • 使用 Maven 进行集成测试:在测试之前运行 jar,并在测试之后终止

    我有一个可运行的 jar 我想在集成测试开始之前在新进程中运行 在pre integration test 并在我的集成测试完成后终止它 在post integration test 我可以使用的东西之一是maven antrun 插件 h
  • 自定义 @font-face 无法在 chrome 中加载(chrome 自定义字体不渲染)

    custom font face无法在 chrome 中加载 chrome 自定义字体不渲染 使用 CSS 使用自定义字体 font face font family gotham rounded medium src url fonts
  • 如何在 fstream 文件之间切换而不关闭它们(同时输出文件) - C++

    我有一个 C 的小问题 无法通过在线浏览解决 这是我的代码 摘录 if File is open while File eof i getline File Line if i gt 2 Skip Headers int CharCount
  • 确定一个矩形是否被另一组矩形完全覆盖所需的算法

    我正在寻找一种算法来确定新矩形是否被一组现有矩形完全覆盖 问题的另一种方式是 新矩形是否完全存在于现有矩形覆盖的区域中 似乎有很多算法可以确定矩形重叠等 但我找不到任何可以解决这个确切问题的算法 矩形将使用 x y 坐标表示 这个问题与地理
  • 单元测试WCF方法

    我创建了一个 WCF 服务并尝试测试其中一种方法 我右键单击 WCF 服务方法并选择创建单元测试 它创建了一个新的测试项目并创建了一个单元测试 我尝试运行测试项目 但我不确定应该是什么UrlToTest价值 我已将 url 放入该服务 Te
  • python从具有相同方法名称的不同路径进行多重继承

    通过以下代码示例 可以super被使用 或者C必须打电话A foo and B foo明确地 class A object def foo self print A foo class B object def foo self print
  • 从午夜开始的日期时间到毫秒

    我怎样才能转换time给定的一部分DATETIME自午夜以来的毫秒数 例如 2011 08 29 00 00 00 gt 0 2011 08 28 00 00 00 gt 0 2011 08 29 01 00 00 gt 3600000 在
  • 我的 Eclipse 可以编译,但找不到 JDK!

    我不久前在 Windows 机器上安装了 Eclipse 几天前 我正在做一些 Java 编码 我注意到我没有 JDK 但 Eclipse 仍然可以编译和运行 Java 类 它包含编译器吗 是的 Eclipse 包含它自己的增量编译器 增量
  • 如何从 Express 路由中的 URL 获取可选语言参数?

    我陷入了一个愚蠢的问题 如何与optional区域设置参数 那就是我的意思 例如 我有首页 and contacts 这是路线 app get frontpage get app get contacts contacts get 现在我正
  • 使用 UNION 子句进行 SELECT

    例如 我有这两张桌子 DEPARTMENT DNAME CITY RESEARCH BOSTON IT CITY SCIENCE DALLAS RESEARCH DALLAS 所以我用这个声明 SELECT DNAME FROM DEPAR
  • 如何使 BoxLayout 表现得像垂直 FlowLayout?

    FlowLayout从右侧执行 压力 因此所有组件都试图采用其最小宽度 相反 BoxLayout尝试分散所有组件以填充空间的整个高度 我可以添加一些填充物作为最后一个组件还是使所有组件的高度最小BoxLayout 您可以使用 Box cre
  • 当在下拉列表中选择值时,MVC 使用 ajax 发布值

    我的表单中有几个下拉列表 每次用户在这些下拉列表之一中选择一个值时 我是否希望将该值保存到后端 数据库 我不想重新加载页面 所以我想实现这一点的最佳方法是使用ajax 这就是我需要的帮助 当我在下拉列表中选择一个值时 如何让它自动将值发布到
  • 如何在 Python 2 中发送 HEAD HTTP 请求?

    我在这里尝试做的是获取给定 URL 的标头 以便确定 MIME 类型 我想看看是否http somedomain foo 例如 将返回 HTML 文档或 JPEG 图像 因此 我需要弄清楚如何发送 HEAD 请求 以便我可以读取 MIME
  • 从cmd命令中获取字符串?进程.StartInfo

    所以我尝试过 Process 并启动 cmd exe 并将命令直接发送到该窗口 然后获取写入 cmd exe 窗口的值 代码如下所示 Dim arrServers As ArrayList Dim s ListBoxServers Item
  • 通过 ssh 将脚本和二进制数据传输到 stdin

    我想远程执行一个 bash 脚本 该脚本使用 tarball 并对其执行一些逻辑 诀窍是我只想使用一个 ssh 命令来完成此操作 而不是scp对于 tarball 然后是ssh对于脚本 bash 脚本如下所示 cd tmp tar zx a