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