我必须在远程机器上运行本地shell脚本(windows/Linux)。
我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。
本地和远程计算机可以是基于Windows或Unix的系统。
是否有一种方法来运行这个使用plink/ssh?
我必须在远程机器上运行本地shell脚本(windows/Linux)。
我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。
本地和远程计算机可以是基于Windows或Unix的系统。
是否有一种方法来运行这个使用plink/ssh?
当前回答
这是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命令。瞧。
其他回答
ssh user@hostname ". ~/.bashrc;/cd path-to-file/;. filename.sh"
强烈建议使用环境文件(.bashrc/.bashprofile/.profile)。在远程主机上运行某些东西之前,因为目标主机和源主机的环境变量可能会延迟。
尝试运行ssh user@remote sh ./script. unix。
你可以使用runoverssh:
sudo apt install runoverssh
runoverssh -s localscript.sh user host1 host2 host3...
-s远程运行本地脚本
有用的标志: -g对所有主机使用全局密码(单密码提示) -n使用SSH代替sshpass,用于公钥认证
另外,如果想从目标主机获取变量,不要忘记转义变量。
这在过去曾让我陷入困境。
例如:
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”。
如果脚本很短,并且打算嵌入到脚本中,并且您在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