如何通过 ssh 在远程机器上运行本地 bash 脚本?

tre*_*qui 52 scripting ssh configuration bash

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

目的是cfengine在一组没有设置代理的机器上做一些像你会发现的工具,比如。这实际上可能是cfagent在一组现有远程机器上进行设置的好方法。

tre*_*qui 58

您可以传递一个脚本并通过管道将其导入并执行 shell 使其短暂执行。

例如

echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

例如

cat script.sh | ssh me@myserver /bin/bash
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 我如何使它在远程系统上以 sudo 的身份运行。例如,如果我登录到远程服务器,我通常会以 sudo -u testuser script.sh 的身份运行它 (2认同)

小智 21

有几种方法可以做到。

1:

ssh user@remote_server 'bash -s' < localfile
Run Code Online (Sandbox Code Playgroud)

2:

cat localfile  | ssh user@remote_server
Run Code Online (Sandbox Code Playgroud)

3:

ssh user@remote_server "$(< localfile)"
Run Code Online (Sandbox Code Playgroud)

数字 3 是我的首选方式,它允许交互式命令,例如 sudo -S service nginx restart

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

  • 关于在远程机器上运行本地脚本——有没有办法将变量作为参数发送到远程机器..?即与脚本一起,我想发送一个变量(具有多行)作为远程机器的参数。然后脚本打算使用该变量。 (4认同)

Sam*_*cke 13

为此,我会推荐 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
Run Code Online (Sandbox Code Playgroud)

您应该能够使用上述内容开始。其余的请参阅Fabric 的优秀文档。作为补充,完全可以在 Fabric 中编写脚本——不需要复制,但是应该注意的是,要在所有机器上更改脚本,您只需要编辑本地副本并重新部署。此外,通过 API 的基本用法,您可以根据当前运行的主机和/或其他变量来修改脚本。这是一种pythonic Expect。


seu*_*mac 5

这正是 Ansible 的用途。没有代理,您只需要创建一个名为的文本文件:

/etc/ansible/hosts
Run Code Online (Sandbox Code Playgroud)

内容类似于:

[webhosts]
web[1-8]
Run Code Online (Sandbox Code Playgroud)

这将指定机器“web1、web2...web8”在“webhosts”组中。然后你可以做这样的事情:

ansible webhosts -m service -a "name=apache2 state=restarted" --sudo
Run Code Online (Sandbox Code Playgroud)

使用 sudo 重新启动所有机器上的 apache2 服务。

您可以即时执行以下命令:

ansible webhosts -m shell -a "df -h"
Run Code Online (Sandbox Code Playgroud)

或者您可以在远程机器上运行本地脚本:

ansible webhosts -m script -a "./script.sh"
Run Code Online (Sandbox Code Playgroud)

或者您可以使用您希望服务器符合的完整配置创建一个剧本(查看文档以获取详细信息)并使用以下方法进行部署:

ansible-playbook webplaybook.yml
Run Code Online (Sandbox Code Playgroud)

基本上,您可以开始将它用作在多台服务器上运行命令的命令行工具,并根据需要将其用途扩展为完整的配置工具。

  • 我和下一个人一样喜欢 ansible,但是如果他问的是脚本,那么 ansible 有一个非常好的 [脚本模块](http://docs.ansible.com/script_module.html):`ansible webhosts -m script脚本.sh` (3认同)