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

我有两个问题:

  1. 有多个远程 Linux 机器,我需要编写一个 shell 脚本,它将在每台机器上执行相同的命令集。(包括一些 sudo 操作)。如何使用 shell 脚本实现这一点?
  2. 当 ssh 到远程机器时,如何处理它提示 RSA 指纹认证。

远程机器是运行中创建的虚拟机,我只有它们的 IP 地址。所以,我不能预先在这些机器上放置一个脚本文件,然后在我的机器上执行它们。

458329 次浏览

你可以这样做:

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

有多个远程 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"

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

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

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

我最喜欢的方法是在远程系统上安装 http://pamsshagentauth.sourceforge.net/以及您自己的公钥。(想办法把这些文件安装到虚拟机上,不管怎样你已经安装了整个 Unix 系统,再多几个文件又能怎样?)

随着 ssh 代理的转发,您现在可以在没有密码的情况下登录到每个系统。

更妙的是,pam 模块将使用 ssh 密钥对对 sudo 进行身份验证,这样您就可以根据需要使用 root (或任何其他用户的)权限运行。

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

您还应该查看软件包 就像 Capistrano。一定要查看这个站点,它有一个远程脚本的介绍。

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

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

如果您能够编写 Perl 代码,那么您应该考虑使用 并行

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

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

对于这类任务,我反复使用 明白了,它允许在几个容器或 VM 中以一致的方式复制 bash 脚本。安赛尔(更确切地说是 红帽子)现在有一个额外的网络界面 AWX,这是他们的商业大厦的开源版本。

可能性: https://www.ansible.com/
https://github.com/ansible/awx
安赛尔塔: 商业产品,你可能会第一次探索免费开源 AWX,而不是15天免费试用的塔

这对我有用。

语法: ssh-i pemfile.pem user _ name@ip _ address‘ command _ 1; command 2; command 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'

在多个远程 Linux 计算机中,有多种方法可以执行命令或脚本。 一个简单易行的方法是通过 并行 ssh 程序

Pssh : 是一个在许多主机上并行执行 ssh 的程序。它提供了一些特性,比如向所有进程发送输入、向 ssh 传递密码、将输出保存到文件以及超时。

示例和用法:

连接 host1和 host2,并从每个节点打印“ hello,world”: < br/>

 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,那么并行选项也可以设置为100,以确保命令并发运行:

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

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

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

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

Source : man pssh

这对我很有用,我做了一个函数,把它放到你的 shell 脚本中:

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


sshcmd USER HOST COMMAND

如果要在多台机器上执行相同的命令,请使用分号重复该行。例如,如果你有两台机器,你会这样做:

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

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

希望这个能帮上忙!

接受的答案依次向机器发送。如果您希望将 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