【问题标题】:Execute local script remotely and direct output back to local file远程执行本地脚本并将输出定向回本地文件
【发布时间】:2018-04-06 18:07:20
【问题描述】:

我在本地 linux 机器上有一个 shell 脚本 (script.sh),我想在几个远程服务器上运行它。该脚本应将本地 txt 文件 (output.txt) 作为参数并从远程服务器写入。

script.sh:

#!/bin/sh

file="$1"
echo "hello from remote server" >> $file

我尝试了以下方法但没有成功:

ssh user@host "bash -s" < script.sh /path/to/output.txt

【问题讨论】:

  • 您在问题中包含的脚本指的是/bin/sh,而不是第一行的 bash,并且不包含任何特定于 bash 的内容。您真的需要 bash 吗,还是您所追求的便携式 POSIX 解决方案?
  • 已编辑。是的,你是对的,解决方案不一定需要使用 bash

标签: shell ssh


【解决方案1】:

如果我没看错的话……

  • script.sh 存储在本地机器上,但您想在远程机器上执行它,
  • output.txt 应该得到远程执行脚本的输出,但应该存在于本地机器上。

当您在问题中写下内容时,您将本地输出文件的名称提供给不会在本地运行的脚本。虽然$1 可能填充了一个值,但从其运行位置的角度来看,它所引用的文件 无处可寻。

为了让脚本在远程机器上运行,您必须将它放到远程机器上。执行此操作的标准方法是将脚本复制到那里:

$ scp script.sh user@remotehost:.
$ ssh user@remotehost sh ./script.sh > output.txt

不过,根据脚本的复杂程度,您也许可以不用嵌入它:

$ ssh user@remotehost sh -c "$(cat script.sh)" > output.txt

这样做的好处当然是它不需要在远程机器上使用磁盘空间。但是调试起来可能会比较棘手,如果脚本像这样内联运行而不是从文件中运行,它的功能可能会有所不同。 (例如,位置选项会有所不同。)


如果您真的想将本地输出文件作为选项提供给您正在远程运行的脚本,那么您需要包含一个远程路径才能访问该脚本。例如:

script.sh

#!/bin/sh

outputhost="${1%:*}"    # trim off path, leaving host
outputpath="${1#*:}"    # trim off host, leaving path

echo "Hello from $(hostname)." | ssh "$outputhost" "cat >> '$outputpath'"

然后将脚本复制过来后,调用脚本:

$ ssh user@remotehost sh ./script.sh localhostname:/path/to/output.txt

这样,在远程主机上运行的script.sh 将独立发送其输出,而不是通过您现有的 SSH 连接。当然,您需要设置 SSH 密钥等来促进这种额外的连接。

【讨论】:

  • scp 选项似乎是最简单的并且可以完成这项工作。谢谢!
【解决方案2】:

你可以像下面这样实现它:-

在 UNIX/Linux 上本地保存输出:

   ssh remote_host "bash -s script.sh" > /tmp/output.txt

脚本文件的第一行应该是#!/bin/bash,您不需要在命令行中使用bash -s。让我们尝试如下:-

最好始终为您的 bash 文件设置完整路径,例如

 ssh remote_host "/tmp/scriptlocation/script.sh" > /tmp/output.txt

为了测试,首先执行任何unix 命令:-

 ssh remote_host "/usr/bin/ls -l" > /tmp/output.txt

用于在 Windows 上本地保存输出:,

 ssh remote_host "script.sh" > .\output.txt

最好使用 plink.exe 。示例

plink remote_host "script.sh" > log.txt

【讨论】:

  • 不幸的是我不能使用 plink,因为它没有安装在任何一台机器上。 ssh remote_host "ls -l" > /tmp/output.txt 不起作用,因为脚本位于本地机器上,在远程机器上找不到
  • @Gary 我也为您提供了ssh 选项。试试看。
  • 所以我需要执行 script.sh 而不是“ls -l”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 2012-02-18
  • 2014-05-31
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多