我必须在远程机器上运行本地shell脚本(windows/Linux)。

我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。

本地和远程计算机可以是基于Windows或Unix的系统。

是否有一种方法来运行这个使用plink/ssh?


当前回答

本地脚本是否使用本地设置的变量、函数或别名尚不清楚。

如果它这样做,应该工作:

myscript.sh:

#!/bin/bash

myalias $myvar
myfunction $myvar

它使用$myvar, myfunction和myalias。让我们假设它们是在本地设置的,而不是在远程机器上。

创建一个包含脚本的bash函数:

eval "myfun() { `cat myscript.sh`; }"

设置变量、函数和别名:

myvar=works
alias myalias='echo This alias'
myfunction() { echo This function "$@"; }

使用env_parallel从GNU Parallel中导出myfun, myfunction, myvar和myalias到服务器:

env_parallel -S server -N0  --nonall myfun ::: dummy

其他回答

cat ./script.sh | ssh <user>@<host>

我已经开始使用Fabric进行更复杂的操作。Fabric需要Python和一些其他依赖项,但仅在客户机上。服务器只需为ssh服务器即可。我发现这个工具比交付给SSH的shell脚本强大得多,并且非常值得费心设置(特别是如果您喜欢用Python编程)。Fabric处理在多个主机(或具有某些角色的主机)上运行的脚本,帮助促进幂等操作(例如向配置脚本添加一行,但如果已经有一行就不行),并允许构造更复杂的逻辑(例如Python语言可以提供的逻辑)。

<hostA_shell_prompt>$ ssh user@hostB "ls -la"

这将提示您输入密码,除非您已经将hostA用户的公钥复制到用户.ssh目录的home目录下的authorized_keys文件。这将允许无密码身份验证(如果在ssh服务器的配置上接受作为身份验证方法)。

如果脚本很短,并且打算嵌入到脚本中,并且您在bash shell下运行,并且bash shell在远程端可用,则可以使用declare将本地上下文传输到远程端。定义包含将传输到远程服务器的状态的变量和函数。定义一个将在远程端执行的函数。然后在bash -s读取的here文档中,您可以使用declare -p来传递变量值,并使用declare -f将函数定义传递到远程文件。

因为declare负责引用并将由远程bash解析,所以变量被正确引用,函数被正确传输。你可以只在本地写脚本,通常我在远程端做一个长函数。上下文需要精心挑选,但是下面的方法对于任何简短的脚本都“足够好”,而且是安全的——应该可以正确处理所有极端情况。

somevar="spaces or other special characters"
somevar2="!@#$%^"
another_func() {
    mkdir -p "$1"
}
work() {
    another_func "$somevar"
    touch "$somevar"/"$somevar2"
}
ssh user@server 'bash -s' <<EOT
$(declare -p somevar somevar2)    # transfer variables values
$(declare -f work another_func)   # transfer function definitions
work                              # call the function
EOT

如果Machine A是一台Windows机器,您可以使用Plink (PuTTY的一部分)和-m参数,它将在远程服务器上执行本地脚本。

plink root@MachineB -m local_script.sh

如果Machine A是一个基于unix的系统,你可以使用:

ssh root@MachineB 'bash -s' < local_script.sh

您不应该必须将脚本复制到远程服务器才能运行它。