write a shell script to ssh to a remote machine and execute commands
我有两个问题:
远程机器是运行时创建的虚拟机,我只有它们的IP。所以,我不能预先在这些机器中放置一个脚本文件,然后从我的机器中执行它们。
There are multiple remote linux machines, and I need to write a shell script which will execute the same set of commands in each machine. (Including some sudo operations). How can this be done using shell scripting?
您可以使用ssh执行此操作,例如:
1 2 3 4 5 6 7 | #!/bin/bash USERNAME=someUser HOSTS="host1 host2 host3" SCRIPT="pwd; ls" for HOSTNAME in ${HOSTS} ; do ssh -l ${USERNAME} ${HOSTNAME}"${SCRIPT}" done |
When ssh'ing to the remote machine, how to handle when it prompts for RSA fingerprint authentication.
您可以将
1 | ssh -o StrictHostKeyChecking=no -l username hostname"pwd; ls" |
这将禁用主机密钥检查并自动将主机密钥添加到已知主机的列表中。如果不希望将主机添加到已知主机文件中,请添加选项
请注意,这会禁用某些安全检查,例如针对中间人攻击的保护。因此,它不应该应用于安全敏感的环境。
使用
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash SCRIPT="cd Desktop; pwd; echo -e 'PASSWORD' | sudo -S apt-get install vlc" HOSTS=("192.168.1.121""192.168.1.122""192.168.1.123") USERNAMES=("username1""username2""username3") PASSWORDS=("password1""password2""password3") for i in ${!HOSTS[*]} ; do echo ${HOSTS[i]} SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}} sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]}"${SCR}" done |
有很多方法可以解决这个问题。
我最喜欢的方法是在远程系统上安装http://pamshagentauth.sourceforge.net/,以及您自己的公钥。(想办法在虚拟机上安装这些文件,不知何故安装了整个UNIX系统,还有几个文件呢?)
转发ssh代理后,您现在可以无需密码登录到每个系统。
更好的是,pam模块将使用ssh密钥对对sudo进行身份验证,这样您就可以根据需要使用root(或任何其他用户的)权限运行。
您不需要担心主机密钥交互。如果输入不是终端,那么ssh将限制您转发代理和使用密码进行身份验证的能力。
你也应该看看像卡皮斯特拉诺这样的包裹。一定要看看那个站点;它有一个远程脚本的介绍。
单个脚本行可能如下所示:
1 2 | ssh remote-system-name command arguments ... # so, for exmaple, ssh target.mycorp.net sudo puppet apply |
如果您能够编写Perl代码,那么应该考虑使用net::openssh::parallel。
您将能够以声明性的方式描述必须在每个主机中运行的操作,并且模块将处理所有可怕的细节。还支持通过
这对我有用。
语法:ssh-i pemfile.pem user_name@ip_address'command_1;command 2;command 3'
1 2 3 4 | #! /bin/bash echo"########### connecting to server and run commands in sequence ###########" ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service' |
对于这类任务,我重复使用ansible,它允许在几个容器或VM中复制一致的bash脚本。Ansible(更准确地说是RedHat)现在有了一个额外的Web界面awx,这是他们商业大厦的开源版本。
答案:https://www.ansible.com/awx:https://github.com/ansible/awxAnsible Tower:商业产品,您可能会首先探索免费的开源awx,而不是15天免费的Tower之旅。
您可以遵循以下方法:
- 使用Expect脚本连接到远程计算机。如果您的机器不支持Expect,您可以下载相同的。编写Expect脚本非常简单(Google将获得此方面的帮助)
- 将需要在远程服务器上执行的所有操作放入shell脚本中。
- 登录成功后,从Expect脚本调用远程shell脚本。