我有两个问题:
- 有多种远程Linux机器,我需要写一个shell脚本将在每台机器执行相同的命令集。 (包括一些须藤操作)。 这怎么可能使用shell脚本做了什么?
- 当ssh'ing到远程机器,该如何处理时,它会提示输入RSA指纹认证。
远程机器上运行创建的VM,我只是有自己的IP地址。 所以,我不能事先放置一个脚本文件,在这些机器和我的机器上执行。
我有两个问题:
远程机器上运行创建的VM,我只是有自己的IP地址。 所以,我不能事先放置一个脚本文件,在这些机器和我的机器上执行。
有多种远程Linux机器,我需要写一个shell脚本将在每台机器执行相同的命令集。 (包括一些须藤操作)。 这怎么可能使用shell脚本做了什么?
您可以使用ssh做到这一点,例如:
#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done
当ssh'ing到远程机器,该如何处理时,它会提示输入RSA指纹认证。
您可以添加StrictHostKeyChecking=no
选项SSH:
ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"
这将禁用主机密钥检查并自动添加主机密钥到已知主机列表中。 如果你不希望有主机加入到已知的hosts文件,添加选项-o UserKnownHostsFile=/dev/null
。
请注意,这将禁用某些安全检查 ,针对中间人攻击例子保护。 因此不应在安全敏感的环境中被应用。
有许多的方式来处理这个问题。
我最喜欢的办法是安装http://pamsshagentauth.sourceforge.net/在远程系统上,还可以将自己的公钥。 (想出一个办法让这些安装在VM,不知为何,你安装了一个完整的Unix系统中,什么是一对夫妇更多的文件?)
随着你的ssh代理转发,您现在就可以登录到每个系统没有密码。
更妙的是,这PAM模块将与您的SSH密钥对,所以你可以根据需要以root(或任何其他用户)的权限运行sudo的验证。
你并不需要担心主机密钥交互。 如果输入不是终端,然后ssh将只限制你的转发代理和使用密码进行身份验证的能力。
你也应该看看包像Capistrano的。 当然环顾四周该网站; 它有介绍远程脚本。
单个脚本行可能是这个样子:
ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply
安装sshpass使用, apt-get install sshpass
然后编辑脚本,并把你的Linux机器的IP,用户名和密码在各自的顺序。 之后,运行该脚本。 而已 ! 这个脚本会在所有系统上安装VLC。
#!/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
如果你能写Perl代码,那么你应该考虑使用的Net :: OpenSSH的并行:: 。
您将能够描述必须在每个主机声明方式运行的操作和模块将采取一切可怕的细节。 通过运行命令sudo
也支持。
对于这种任务,我重复使用Ansible它允许在几个containets或VM复制连贯的bash脚本。 Ansible(更精确的Red Hat)现在有一个额外的网络接口AWX这是他们的商业大厦的开源版本。
Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible塔:商业产品,你可能会拳头探索开源免费的AWX,而不是塔15天自由步道
这项工作对我来说。
语法:SSH -i pemfile.pem USER_NAME @ip地址“command_1; 命令2; 命令3'
#! /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'
你可以按照这个方法: