我必须在远程机器上运行本地shell脚本(windows/Linux)。
我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。
本地和远程计算机可以是基于Windows或Unix的系统。
是否有一种方法来运行这个使用plink/ssh?
我必须在远程机器上运行本地shell脚本(windows/Linux)。
我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。
本地和远程计算机可以是基于Windows或Unix的系统。
是否有一种方法来运行这个使用plink/ssh?
当前回答
如果你想这样执行命令 temp = ' ls - a ' echo $临时 ' '中的命令将导致错误。
下面的命令将解决这个问题 SSH user@host " ' temp = ' ls - a ' echo $临时 “‘
其他回答
另外,如果想从目标主机获取变量,不要忘记转义变量。
这在过去曾让我陷入困境。
例如:
user@host> ssh user2@host2 "echo \$HOME"
输出/home/user2
而
user@host> ssh user2@host2 "echo $HOME"
打印出/home/user
另一个例子:
user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"
正确地输出“hello”。
我已经开始使用Fabric进行更复杂的操作。Fabric需要Python和一些其他依赖项,但仅在客户机上。服务器只需为ssh服务器即可。我发现这个工具比交付给SSH的shell脚本强大得多,并且非常值得费心设置(特别是如果您喜欢用Python编程)。Fabric处理在多个主机(或具有某些角色的主机)上运行的脚本,帮助促进幂等操作(例如向配置脚本添加一行,但如果已经有一行就不行),并允许构造更复杂的逻辑(例如Python语言可以提供的逻辑)。
答案在这里(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
本地脚本是否使用本地设置的变量、函数或别名尚不清楚。
如果它这样做,应该工作:
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
你可以使用runoverssh:
sudo apt install runoverssh
runoverssh -s localscript.sh user host1 host2 host3...
-s远程运行本地脚本
有用的标志: -g对所有主机使用全局密码(单密码提示) -n使用SSH代替sshpass,用于公钥认证