如何从一台机器远程执行不同机器上的linux命令?

时间:2015-09-02 02:44:56

标签: linux unix ssh command scp

我有大约50台ubuntu机器需要在命令下运行:

sudo apt-get install htop
sudo scp -r todd@machineA.host.com:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r todd@machineA.host.com:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp todd@machineA.host.com:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core

现在一种方法是我可以直接登录所有50台机器并手动运行这些命令,它肯定会起作用。我不想这样做,因为它非常繁琐。

让我们说出这50台机器,我可以在一台机器上手动运行上面的命令1来安装该机器上的所有内容,现在从该机器1我可以在其余49台机器上运行以上所有命令对我而言?如果需要,我可以继续输入密码

以下是机器信息:

machine1.host.com to machine50.host.com

我的用户名是todd,我还需要确保某些目录有golden用户的权限,这就是我正在做chown -R golden的原因。

我可以将所有上述命令保存在文件和机器名中以及文件中吗?这样做的最佳方式是什么?

更新: -

我的计算机列表位于此文件machines.txt

somemachineA
somemachineB

我的命令在此文件中commands.sh

#!/bin/bash
sudo apt-get install htop
sudo scp -r todd@machineA.host.com:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r todd@machineA.host.com:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp todd@machineA.host.com:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core

我有一个像execute.sh这样的脚本,我正在运行./execute.sh machines.txt

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "###################################################"
    echo "Machine Name: $line"
    scp commands.sh $line:/tmp/commands.sh
    ssh -t $line 'script /dev/null . /tmp/commands.sh'
    echo "###################################################"
done < "$1"

在上面运行后,我看到以下错误:

todd@testMachine:~$ ./execute.sh machines.text
###################################################
Machine Name: somemachineA
todd@somemachineA's password:
commands.sh                                                                                                                                                                                                100%  104     0.1KB/s   00:00
Pseudo-terminal will not be allocated because stdin is not a terminal.
todd@somemachineA's password:
Script started, file is /dev/null
Script done, file is /dev/null
todd@somemachineA:/home/todd$ somemachineB: command not found

2 个答案:

答案 0 :(得分:1)

使用这些命令创建脚本,然后将脚本scp到每台机器上并运行它。

例如:

for x in `cat list-of-hosts.txt`
do
  scp command-script $x:/tmp/command-script
  ssh -t $x 'script /dev/null . /tmp/command-script'
done

或允许脚本并行运行:

for x in `cat list-of-hosts.txt`
do
  scp command-script $x:/tmp/command-script
  xterm -e ssh -t $x '/dev/null . /tmp/command-script' &
done

答案 1 :(得分:0)

以下是我的建议:

  • 将所有这些命令放在脚本中(假设golden.sh
  • 在循环运行ssh $user@machine$number 'bash -s' < golden.sh中(您需要手动提供$ user和$ number,或者如果是另一个脚本的一部分则生成)。

如果您需要不时登录这些计算机,可以考虑从这些主机导入公共ssh密钥。在这种情况下,整个工作可以完全自动化,因为不再需要提供密码。