将shell脚本写入ssh到远程机器并执行命令

时间:2012-12-18 07:15:55

标签: linux shell ssh

我有两个问题:

  1. 有多台远程linux机器,我需要编写一个shell脚本,它将在每台机器上执行相同的命令集。 (包括一些sudo操作)。如何使用shell脚本完成此操作?
  2. 当ssh到远程机器时,如何在提示进行RSA指纹认证时进行处理。
  3. 远程计算机是在运行时创建的虚拟机,我只有他们的IP。所以,我不能事先在这些机器上放置一个脚本文件,并从我的机器上执行它们。

10 个答案:

答案 0 :(得分:118)

  

有多台远程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到远程机器时,如何在提示进行RSA指纹认证时进行处理。

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

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

这将disable the host key check并自动将主机密钥添加到已知主机列表中。如果您不希望将主机添加到已知主机文件,请添加选项-o UserKnownHostsFile=/dev/null

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

答案 1 :(得分:4)

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

我最喜欢的方法是在远程系统上安装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

答案 2 :(得分:4)

使用apt-get install sshpass安装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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

有多种方法可以在多台远程Linux机器上执行命令或脚本。 一种最简单的方法是通过 pssh(并行ssh程序)

pssh :是用于在多个主机上并行执行ssh的程序。它提供了诸如向所有进程发送输入,向ssh传递密码,将输出保存到文件以及超时等功能。

示例和用法:

连接到host1和host2,并分别从其中打印“ hello,world”:

 pssh -i -H "host1 host2" echo "hello, world"

通过脚本在多个服务器上运行命令:

pssh -h hosts.txt -P -I<./commands.sh

在不检查或保存主机密钥的情况下使用和运行命令:

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

如果文件hosts.txt具有大量条目(例如100),那么也可以将parallelism选项设置为100,以确保命令同时运行:

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

选项
-I:读取输入并发送到每个ssh进程。
-P:告诉pssh在到达时显示输出。
-h:读取主机的文件。
-H: [user @] host [:port]用于单主机。
-i:在每个主机完成时显示标准输出和标准错误
-x args:传递额外的SSH命令行参数
-o选项:可用于以配置文件中使用的格式提供选项。(/ etc / ssh / ssh_config)(〜/ .ssh / config)
-p并行性:使用给定的数量作为并发连接的最大数量
-q安静模式:禁止显示大多数警告和诊断消息。
-t:在给定的秒数后使连接超时。 0表示pssh不会使任何连接超时

在ssh'到远程计算机时,当提示输入时如何处理 RSA指纹认证。

禁用StrictHostKeyChecking以处理RSA身份验证提示。
-o StrictHostKeyChecking =否

来源:man pssh

答案 5 :(得分:1)

这对我有用。我做了一个功能。将其放入您的shell脚本中:

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

如果要在多台计算机上执行相同的命令,请使用半冒号重复该行。例如,如果您有两台计算机,则可以执行以下操作:

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

用计算机用户替换USER。将HOST替换为计算机的名称。将COMMAND替换为要在计算机上执行的命令。

希望这会有所帮助!

答案 6 :(得分:0)

对于此类任务,我反复使用 Ansible ,它允许在多个容器或VM中复制一致的bash脚本。 Ansible(更确切地说是 Red Hat )现在具有附加的Web界面 AWX ,这是其商业大厦的开源版本。

Ansible:https://www.ansible.com/
AWX:https://github.com/ansible/awx
Ansible Tower:商业产品,您可能会首先探索免费的开源AWX,而不是Tower的15天免费试用

答案 7 :(得分:0)

这对我有用。

语法:ssh -i pemfile.pem user_name @ ip_address'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'

答案 8 :(得分:0)

接受的答案按顺序发送到机器。如果您想 ssh 到多台机器并同时在它们上运行一些长时间运行的命令,如 scp,请将 ssh 命令作为后台进程运行。

#!/bin/bash
username="user"
servers=("srv-001" "srv-002" "srv-002" "srv-003");
script="pwd;"
for s in "${servers[@]}"; do
    echo "sshing ${username}@${s} to run ${script}"
    (ssh ${username}@${s} ${script})& # Run in background
done
wait # If removed, you can run some other script here

答案 9 :(得分:-1)

您可以遵循以下方法:

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