Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 远程执行本地脚本并将输出定向回本地文件_Shell_Ssh - Fatal编程技术网

Shell 远程执行本地脚本并将输出定向回本地文件

Shell 远程执行本地脚本并将输出定向回本地文件,shell,ssh,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 sshuser@

我在本地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
sshuser@host“bash-s”
您可以通过以下方式实现:-

要在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

您可以通过以下方式实现:-

要在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

如果我读对了

  • 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密钥等来促进这一额外连接。

因此,如果我正确阅读了这篇文章

  • 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密钥等来促进这一额外的连接。

不幸的是,我不能使用plink,因为这两台机器上都没有安装plink。ssh remote_host“ls-l”>/tmp/output.txt无法工作,因为脚本位于本地计算机上,在远程计算机上找不到machine@Gary我也为您提供了
ssh
选项。试试这个。所以我需要执行脚本而不是“ls-l”。幸运的是,我不能使用plink,因为它没有安装在任何一台机器上。ssh remote_host“ls-l”>/tmp/output.txt无法工作,因为脚本位于本地计算机上,在远程计算机上找不到machine@Gary我也为您提供了
ssh
选项。因此,我需要执行script.sh而不是“ls-l”。您在问题中包含的脚本在第一行中引用的是
/bin/sh
,而不是bash,并且不包含任何特定于bash的内容。你真的需要bash吗?或者你想要的是一个可移植的POSIX解决方案吗。是的,您是正确的,解决方案不一定需要使用bash。您在问题中包含的脚本在第一行中引用的是
/bin/sh
,而不是bash,并且不包含任何特定于bash的内容。你真的需要bash吗?或者你想要的是一个可移植的POSIX解决方案吗。是的,你是对的,所以