![](/img/trans.png)
[英]Using Python to ssh then run bash script. The output of the running bash script i need to display on the screen
[英]Need to write a bash script to ssh into many UNIX machines, run a python script and push results to GitHub
我正在尝试编写一个bash脚本,该脚本对200台UNIX计算机执行以下操作:
在for循环中,ssh输入,导航到正确的目录。
然后,使用命令行参数在给定目录中执行python文件。 此命令行参数是根据for循环中的位置指定的。 因此,第一台计算机使用命令“ 0”运行脚本,然后第二台计算机使用命令“ 1”运行脚本,依此类推。
我将如何去做呢? 我正在研究shell脚本,但是我以前从未写过。
另外,我必须使用密码登录机器,因此我需要在脚本中进行说明。
Sparrowdo提供一个整洁的API来做到这一点,我写了关于这一主题的小文章- https://sparrowdo.wordpress.com/2017/02/01/sshscp-commands-with-sparrowdo/ 。 好处是您可以使用高级语言Perl6编写脚本,并且可以自由实现任何复杂的逻辑。
PS.disclosure-我是工具作者。
首先,我假设您像我一样懒惰,并且想要采用最简单的解决方案。 我认为在这种情况下是Ansible 。 它是一个自动化工具,可以在hosts
文件中列出的所有计算机上使用ssh命令。
主机文件:
[myServers]
myServer1
myServer2
myServer3
...
您可以编写剧本,这是在每台计算机上执行的一系列操作。 在这里,例如您的playbook.yml
看起来像
- name: Executing my python program
shell: "python mypythoncommand"
args:
chdir: theDirectoryYouWant
此时,我们仍然需要为每台计算机增加命令中的某些部分。 为此,我们可以使用Jinja2语言,该语言基本上是在应用命令之前对代码进行解释的语言。
我认为类似的事情会做的工作:
hosts: myServers
vars:
- myVariable: 0
tasks:
{% for thehost in play_hosts %}
{% if inventory_hostname==thehost %}
- name: Executing my python program
shell: "python mypythoncommand {{myVariable + loop.index}}"
args:
chdir: theDirectoryYouWantToBeIn
{% endif %}
{% endfor %}
该剧本ssh在所有服务器上运行,并在服务器列表上进行迭代,当它发现服务器Ansible处于ssh-ing状态时,它将对已传递的每台服务器执行变量递增的命令。
您将需要在文件中获取程序的输出。 Ansible将日志存储在您想要的位置,您只需要:
export ANSIBLE_LOG_PATH="/path/to/my/log" && ansible-playbook myAwesomePlaybook.yml -k -u username && git commit -a -m "execution log $(date)"
-k
要求输入密码, -u username
选择您要以ssh身份登录的用户。
希望有帮助,如果你真的想要去,你可能需要阅读的bash 这并看看sshpass
才能连接到每台服务器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.