我必须在远程机器上运行本地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

其他回答

这个bash脚本可以ssh到目标远程机器,并在远程机器上运行一些命令,在运行它之前不要忘记安装expect(在mac brew上安装expect)

#!/usr/bin/expect
set username "enterusenamehere"
set password "enterpasswordhere"
set hosts "enteripaddressofhosthere"
spawn ssh  $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "somecommand on target remote machine here\n"
sleep 5
expect "$"
send -- "exit\n"

假设您的意思是希望从“本地”机器自动执行此操作,而不需要手动登录到“远程”机器,那么您应该查看名为Expect的TCL扩展,它正是为这种情况而设计的。我还提供了一个通过SSH登录/交互的脚本链接。

https://www.nist.gov/services-resources/software/expect

http://bash.cyberciti.biz/security/expect-ssh-login-script/

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

plink root@MachineB -m local_script.sh

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

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

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

chmod +x script.sh    
ssh -i key-file root@111.222.3.444 < ./script.sh

答案在这里(https://stackoverflow.com/a/2732991/4752883),如果 您正在尝试使用plink或ssh在远程Linux机器上运行脚本。 如果脚本在linux上有多行,它就可以工作。

**但是,如果您试图运行位于本地的批处理脚本 linux/windows机器,而远程机器是windows,它由 使用**的多行

点击root@MachineB -m local_script.bat

不会工作。

只执行脚本的第一行。这可能是 丁克的限制。

解决方案1:

要运行多行批处理脚本(尤其是相对简单的脚本), 由几行组成):

如果您的原始批处理脚本如下

cd C:\Users\ipython_user\Desktop 
python filename.py

您可以使用“&&”分隔符将这些行组合在一起,如下所示 local_script.bat文件: https://stackoverflow.com/a/8055390/4752883:

cd C:\Users\ipython_user\Desktop && python filename.py

在此更改之后,您可以运行这里指出的脚本 @JasonR。Coombs: https://stackoverflow.com/a/2732991/4752883与:

`plink root@MachineB -m local_script.bat`

解决方案2:

如果批处理脚本相对复杂,使用批处理可能会更好 脚本,它封装了plink命令以及如下所指出的 这里由@Martin https://stackoverflow.com/a/32196999/4752883:

rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N

rem Wait a second to let Plink establish the tunnel 
timeout /t 1

rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R

rem Kill the tunnel
taskkill /im plink.exe