Answers:
您可以传递脚本并通过管道化它并执行一个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
干杯!
有几种方法可以做到这一点。
ssh user@remote_server 'bash -s' < localfile
cat localfile | ssh user@remote_server
ssh user@remote_server "$(< localfile)"
3是我的首选方式,它允许交互式命令,例如 su -S service nginx restart
(使用时,#1将使用脚本的其余部分作为密码问题的输入su -S
。)
我会为此推荐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的基本用法外,您还可以根据脚本当前在哪个主机上运行和/或其他变量来修改脚本。这是一种pythonic Expect。
run
和sudo
),则甚至不需要。
这正是Ansible的用途。没有代理,您只需要创建一个文本文件即可:
/etc/ansible/hosts
内容类似于:
[webhosts]
web[1-8]
这将指定机器“ web1,web2 ... web8”在“ webhosts”组中。然后,您可以执行以下操作:
ansible webhosts -m service -a "name=apache2 state=restarted" --sudo
使用sudo在所有机器上重新启动apache2服务。
您可以执行以下命令:
ansible webhosts -m shell -a "df -h"
或者您可以在远程计算机上运行本地脚本:
ansible webhosts -m script -a "./script.sh"
或者,您也可以创建一个具有完整配置的剧本(查看文档以了解详细信息),以使服务器符合并进行配置:
ansible-playbook webplaybook.yml
基本上,您可以开始将其用作在多台服务器上运行命令的命令行工具,并根据需要将其用法扩展到完整的配置工具中。
如果您尝试使用或在远程Linux计算机上运行脚本,则此处的答案(https://stackoverflow.com/a/2732991/4752883)非常有用。如果脚本上有多行,它将起作用。plink
ssh
linux
**但是,如果您尝试运行位于本地linux/windows
计算机上的批处理脚本,而您的远程计算机是Windows
,并且使用**由多行组成
plink root@MachineB -m local_script.bat
它不会工作。
仅脚本的第一行将被执行。这可能是的限制plink
。
要运行多行批处理脚本(尤其是如果它相对简单一些,则由几行组成):
如果您的原始批处理脚本如下
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命令的批处理脚本以及@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
为什么不先复制脚本,然后再运行它呢?
scp your_script.sh the_server:
ssh the_server "chmod +x your_script.sh; ./your_script.sh"
当然,您应该小心,不要将其上传到世界可写的地方,这样,在您运行它(可能是root用户)之前,没有其他人可以弄弄它。