编写一个shell脚本ssh到远程机器并执行命令

我有两个问题:

  1. 有多台远程Linux机器,我需要编写一个shell脚本,它将在每台机器上执行相同的一组命令。 (包括一些sudo操作)。 这怎么可以使用shell脚本来完成呢?
  2. 当向远程机器ssh'ing,如何处理,当它提示进行RSA指纹authentication。

远程机器是在运行时创build的虚拟机,我只有他们的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 

当向远程机器ssh'ing,如何处理,当它提示进行RSA指纹authentication。

您可以将StrictHostKeyChecking=no选项添加到ssh:

 ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls" 

这将禁用主机密钥检查并自动将主机密钥添加到已知主机的列表中。 如果您不想让主机添加到已知主机文件,请添加选项-o UserKnownHostsFile=/dev/null

请注意,这会禁用某些安全检查 ,例如防止中间人攻击。 因此它不适用于安全敏感的环境。

有很多方法可以解决这个问题。

我最喜欢的方式是在远程系统上安装http://pamsshagentauth.sourceforge.net/ ,也是您自己的公钥。 (想出一个方法来让这些安装在虚拟机上,不知何故,你已经安装了一个完整的Unix系统,还有多less个文件?)

通过ssh代理转发,您现在可以login到每个系统而不需要密码。

甚至更好的是,pam模块将使用您的ssh密钥对validationsudo,以便您可以根据需要使用root(或任何其他用户)的权限运行。

您不必担心主机密钥交互。 如果input不是terminal,那么ssh将限制您转发代理和使用密码进行身份validation的能力。

你也应该看看Capistrano这样的软件包 绝对环顾该网站; 它介绍了远程脚本。

单独的脚本行可能看起来像这样:

 ssh remote-system-name command arguments ... # so, for exmaple, ssh target.mycorp.net sudo puppet apply 

如果你能够写Perl代码,那么你应该考虑使用Net :: OpenSSH :: Parallel 。

您将能够以声明的方式描述必须在每个主机中运行的操作,并且该模块将处理所有可怕的细节。 通过sudo运行命令也被支持。

使用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 

你可以按照这个方法:

  • 使用Expect脚本连接到远程机器。 如果你的机器不支持期望,你可以下载相同的。 编写Expect脚本非常简单(谷歌获得此帮助)
  • 将需要在远程服务器上执行的所有操作放在shell脚本中。
  • 一旦login成功,从expect脚本调用远程shell脚本。