1:

1:

我正在寻找一种方法,将配置从一台中央机器推送到几台远程机器,而无需在远程机器上安装任何东西。

目的是cfengine在一组未设置代理的机器上执行类似使用 之类的工具所发现的操作。这实际上可能是cfagent在一组现有远程机器上进行设置的一种好方法。

答案1

您可以传递一个脚本,并通过管道传入并执行 shell 来让它暂时执行。

例如

echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash

当然,该"ls -l; echo 'Hello World'"部分可以用存储在本地机器上的文件中的 bash 脚本来替换。

例如

cat script.sh | ssh me@myserver /bin/bash

干杯!

答案2

有几种方法可以做到这一点。

1:

ssh user@remote_server 'bash -s' < localfile

2:

cat localfile  | ssh user@remote_server

3:

ssh user@remote_server "$(< localfile)"

第三个是我喜欢的方式,它允许交互命令,例如sudo -S service nginx restart

(当您使用时,#1 和 #2 将会使用脚本的其余部分作为密码问题的输入sudo -S。)

答案3

为此,我推荐使用 Python 的 Fabric:

#!/usr/bin/python
# ~/fabfile.py

from fabric_api import *

env.hosts = ['host1', 'host2']
def deploy_script():
    put('your_script.sh', 'your_script.sh', mode=0755)
    sudo('./your_script.sh')

# from shell
$ fab deploy_script

您应该能够使用上述内容开始使用。请参阅 Fabric 的优秀文档完成剩下的工作。补充一点,完全可以在 Fabric 中编写脚本 - 无需复制,但需要注意的是,要更改所有机器上的脚本,只需编辑本地副本并重新部署即可。此外,除了 API 的基本使用之外,您还可以根据脚本当前在哪个主机上运行和/或其他变量来修改脚本。这是一种 Python 式的 Expect。

答案4

正如解释的那样这个答案您可以使用定界符

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

您必须小心使用 heredoc,因为它只发送文本,但实际上并不等待响应。这意味着它不会等待您的命令执行。

相关内容