远程执行本地脚本并将输出直接返回到本地文件

时间:2018-04-06 09:29:33

标签: shell ssh

我在本地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

2 个答案:

答案 0 :(得分:3)

所以,如果我正确读到这个......

  • 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密钥等,以方便这种额外的连接。

答案 1 :(得分:0)

您可以像下面这样实现: -

在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