关于linux:将一个shell脚本写入ssh到远程机器并执行命令

write a shell script to ssh to a remote machine and execute commands

我有两个问题:

  • 有多台远程Linux机器,我需要编写一个shell脚本,它将在每台机器中执行相同的命令集。(包括一些sudo操作)。如何使用shell脚本实现这一点?
  • 当ssh连接到远程机器时,如何在它提示进行rsa指纹认证时进行处理。
  • 远程机器是运行时创建的虚拟机,我只有它们的IP。所以,我不能预先在这些机器中放置一个脚本文件,然后从我的机器中执行它们。


    There are multiple remote linux machines, and I need to write a shell script which will execute the same set of commands in each machine. (Including some sudo operations). How can this be done using shell scripting?

    您可以使用ssh执行此操作,例如:

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    USERNAME=someUser
    HOSTS="host1 host2 host3"
    SCRIPT="pwd; ls"
    for HOSTNAME in ${HOSTS} ; do
        ssh -l ${USERNAME} ${HOSTNAME}"${SCRIPT}"
    done

    When ssh'ing to the remote machine, how to handle when it prompts for RSA fingerprint authentication.

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

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

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

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


    使用apt-get install sshpass安装sshspass,然后编辑脚本,并将Linux机器的ips、用户名和密码按各自的顺序排列。然后运行那个脚本。就是这样!这个脚本将在所有系统中安装VLC。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/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


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

    我最喜欢的方法是在远程系统上安装http://pamshagentauth.sourceforge.net/,以及您自己的公钥。(想办法在虚拟机上安装这些文件,不知何故安装了整个UNIX系统,还有几个文件呢?)

    转发ssh代理后,您现在可以无需密码登录到每个系统。

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

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

    你也应该看看像卡皮斯特拉诺这样的包裹。一定要看看那个站点;它有一个远程脚本的介绍。

    单个脚本行可能如下所示:

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

    如果您能够编写Perl代码,那么应该考虑使用net::openssh::parallel。

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


    这对我有用。

    语法:ssh-i pemfile.pem user_name@ip_address'command_1;command 2;command 3'

    1
    2
    3
    4
    #! /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'

    对于这类任务,我重复使用ansible,它允许在几个容器或VM中复制一致的bash脚本。Ansible(更准确地说是RedHat)现在有了一个额外的Web界面awx,这是他们商业大厦的开源版本。

    答案:https://www.ansible.com/awx:https://github.com/ansible/awxAnsible Tower:商业产品,您可能会首先探索免费的开源awx,而不是15天免费的Tower之旅。


    您可以遵循以下方法:

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