我必须在远程机器上运行本地shell脚本(windows/Linux)。
我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。
本地和远程计算机可以是基于Windows或Unix的系统。
是否有一种方法来运行这个使用plink/ssh?
我必须在远程机器上运行本地shell脚本(windows/Linux)。
我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。
本地和远程计算机可以是基于Windows或Unix的系统。
是否有一种方法来运行这个使用plink/ssh?
当前回答
ssh user@hostname ". ~/.bashrc;/cd path-to-file/;. filename.sh"
强烈建议使用环境文件(.bashrc/.bashprofile/.profile)。在远程主机上运行某些东西之前,因为目标主机和源主机的环境变量可能会延迟。
其他回答
如果你想这样执行命令 temp = ' ls - a ' echo $临时 ' '中的命令将导致错误。
下面的命令将解决这个问题 SSH user@host " ' temp = ' ls - a ' echo $临时 “‘
<hostA_shell_prompt>$ ssh user@hostB "ls -la"
这将提示您输入密码,除非您已经将hostA用户的公钥复制到用户.ssh目录的home目录下的authorized_keys文件。这将允许无密码身份验证(如果在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
这是YarekT的答案的扩展,将内联远程命令与从本地机器传递到远程主机的ENV变量相结合,这样你就可以在远程端参数化你的脚本:
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
# commands to run on remote host
echo $ARG1 $ARG2
ENDSSH
我发现这非常有用,因为它将所有这些都保存在一个脚本中,因此非常易于阅读和维护。
为什么会这样?SSH支持以下语法:
SSH user@host remote_command
在bash中,我们可以在运行单行命令之前指定环境变量,如下所示:
ENV_VAR_1='value1' ENV_VAR_2='value2' bash -c 'echo $ENV_VAR_1 $ENV_VAR_2'
这使得在运行命令之前很容易定义变量。在本例中,echo是我们正在运行的命令。echo之前的所有内容都定义了环境变量。
因此,我们将这两个特征和YarekT的答案结合起来,得到:
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'…
在本例中,我们将ARG1和ARG2设置为本地值。发送user@host之后的所有内容作为remote_command。当远程计算机执行命令时,ARG1和ARG2被设置为本地值,这要归功于本地命令行计算,它定义了远程服务器上的环境变量,然后使用这些变量执行bash -s命令。瞧。
我已经开始使用Fabric进行更复杂的操作。Fabric需要Python和一些其他依赖项,但仅在客户机上。服务器只需为ssh服务器即可。我发现这个工具比交付给SSH的shell脚本强大得多,并且非常值得费心设置(特别是如果您喜欢用Python编程)。Fabric处理在多个主机(或具有某些角色的主机)上运行的脚本,帮助促进幂等操作(例如向配置脚本添加一行,但如果已经有一行就不行),并允许构造更复杂的逻辑(例如Python语言可以提供的逻辑)。