我有两个问题:
有多台远程linux机器,我需要编写一个shell脚本,它将在每台机器上执行相同的命令集 . (包括一些sudo操作) . 如何使用shell脚本完成此操作?
当ssh到远程机器时,如何在提示进行RSA指纹认证时进行处理 .
远程机器是在运行中创建的VM,我只有他们的IP . 所以,我不能事先在这些机器上放置一个脚本文件,并从我的机器上执行它们 .
有多个远程linux机器,我需要编写一个shell脚本,它将在每台机器上执行相同的命令集 . (包括一些sudo操作) . 如何使用shell脚本完成此操作?
您可以使用ssh执行此操作,例如:
#!/bin/bash USERNAME=someUser HOSTS="host1 host2 host3" SCRIPT="pwd; ls" for HOSTNAME in ${HOSTS} ; do ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}" done
您可以将 StrictHostKeyChecking=no 选项添加到ssh:
StrictHostKeyChecking=no
ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"
这将disable the host key check并自动将主机密钥添加到已知主机列表中 . 如果您不希望将主机添加到已知主机文件,请添加选项 -o UserKnownHostsFile=/dev/null .
-o UserKnownHostsFile=/dev/null
请注意,这个 disables certain security checks ,例如防止中间人攻击 . 因此,它不应该应用于安全敏感的环境中 .
有很多方法可以解决这个问题 .
我最喜欢的方法是在远程系统上安装http://pamsshagentauth.sourceforge.net/以及您自己的公钥 . (弄清楚如何在VM上安装这些,不知何故,你安装了整个Unix系统,还有几个文件?)
转发ssh代理后,您现在可以在没有密码的情况下登录每个系统 .
更好的是,pam模块将使用您的ssh密钥对对sudo进行身份验证,以便您可以根据需要使用root(或任何其他用户)权限运行 .
您无需担心主机密钥交互 . 如果输入不是终端,那么ssh将限制您转发代理和使用密码进行身份验证的能力 .
您还应该查看包 like Capistrano. 绝对环顾该网站;它介绍了远程脚本 .
单个脚本行可能如下所示:
ssh remote-system-name command arguments ... # so, for exmaple, ssh target.mycorp.net sudo puppet apply
使用, apt-get install sshpass 安装sshpass然后编辑脚本并按各自的顺序放置你的linux机器IP,用户名和密码 . 之后运行该脚本 . 而已 !此脚本将在所有系统中安装VLC .
apt-get install sshpass
#!/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::Parallel .
您将能够以声明方式描述必须在每个主机中运行的操作,并且该模块将处理所有可怕的详细信息 . 还支持通过 sudo 运行命令 .
sudo
您可以遵循以下方法:
使用 Expect Script 连接到远程机器 . 如果您的机器不支持,您可以下载相同的 . 编写Expect脚本非常简单(google获取帮助)
将需要在远程服务器上执行的所有操作放在shell脚本中 .
登录成功后,从expect脚本调用远程shell脚本 .
5 回答
您可以使用ssh执行此操作,例如:
您可以将
StrictHostKeyChecking=no
选项添加到ssh:这将disable the host key check并自动将主机密钥添加到已知主机列表中 . 如果您不希望将主机添加到已知主机文件,请添加选项
-o UserKnownHostsFile=/dev/null
.请注意,这个 disables certain security checks ,例如防止中间人攻击 . 因此,它不应该应用于安全敏感的环境中 .
有很多方法可以解决这个问题 .
我最喜欢的方法是在远程系统上安装http://pamsshagentauth.sourceforge.net/以及您自己的公钥 . (弄清楚如何在VM上安装这些,不知何故,你安装了整个Unix系统,还有几个文件?)
转发ssh代理后,您现在可以在没有密码的情况下登录每个系统 .
更好的是,pam模块将使用您的ssh密钥对对sudo进行身份验证,以便您可以根据需要使用root(或任何其他用户)权限运行 .
您无需担心主机密钥交互 . 如果输入不是终端,那么ssh将限制您转发代理和使用密码进行身份验证的能力 .
您还应该查看包 like Capistrano. 绝对环顾该网站;它介绍了远程脚本 .
单个脚本行可能如下所示:
使用,
apt-get install sshpass
安装sshpass然后编辑脚本并按各自的顺序放置你的linux机器IP,用户名和密码 . 之后运行该脚本 . 而已 !此脚本将在所有系统中安装VLC .如果您能够编写Perl代码,那么您应该考虑使用Net::OpenSSH::Parallel .
您将能够以声明方式描述必须在每个主机中运行的操作,并且该模块将处理所有可怕的详细信息 . 还支持通过
sudo
运行命令 .您可以遵循以下方法:
使用 Expect Script 连接到远程机器 . 如果您的机器不支持,您可以下载相同的 . 编写Expect脚本非常简单(google获取帮助)
将需要在远程服务器上执行的所有操作放在shell脚本中 .
登录成功后,从expect脚本调用远程shell脚本 .