【问题标题】:Execute a list of Unix commands using ssh使用 ssh 执行 Unix 命令列表
【发布时间】:2011-03-14 23:36:02
【问题描述】:

我想在多台机器上运行相同的 Unix 命令集。我知道 ssh 和下面的内容。我想写一个shell脚本来做到这一点。我可以访问 bash 和 ksh,而且我使用的是 Linux Red Hat 5。

ssh root@ip "echo \$HOME"

但是,我有两个问题:

  1. 我不断收到输入密码的提示。如何让它不提示我并自动输入密码?
  2. 如何执行多个命令?

【问题讨论】:

    标签: linux shell unix


    【解决方案1】:
    1. 您应该使用key based authentification,可能还要加上ssh-agent 来记住密钥密码。

    2. 你可以调用sh -c作为命令,并传递一个包含要执行的命令列表的字符串。ssh调用远程机器上的一个shell,所以你可以将命令列表作为字符串传递。

    例如:

    $ ssh user@ip "echo 'Hello world'; whoami; cd / ; ls"
    

    【讨论】:

    • 谢谢,这些信息看起来很有帮助。但是,即使在机器 1 上生成密钥并将其添加到机器 2(如该链接中所述)后,仍然会提示我输入密码。你有什么想法吗?这是我所做的:1.) machine1: ssh-keygen 2.) machine1: ssh-copy-id -i .ssh/id_rsa.pub user@ip
    • 您现在需要启动 ssh-agent 并使用 ssh-add 将其添加到您的钥匙串中,以防止将来出现密码提示。
    • 请注意,您每次登录时都需要这样做。您也可以创建一个不带密码的 ssh 密钥,但要注意安全隐患(每个可以读取私钥的人都可以在没有密码的情况下进行连接)。
    • 你不需要sh -c 部分,ssh 无论如何都会启动一个shell。事实上,不要使用sh -c,因为它需要另一个级别的引用(@Sylvain:您的命令不起作用,因为您没有添加额外级别的引用)。
    【解决方案2】:

    使用 ssh-agent 为所有命令设置身份验证。或者将您的多个命令放入一个 shell 脚本中。

    【讨论】:

      【解决方案3】:
      1. 向远程 shell 发送命令列表。可能的解决方案:

        • 使用",转义换行符以格式化代码并以;结束每个子语句。
          缺点:" 应该在命令列表中使用。

          ssh user@ip "\
            echo 'Hallo sir, how are you doing?';\
            whoami;\
            cd /;\
            ls\
          "
          
        • 使用' 并使用常规换行符格式化代码。
          缺点:' 应该在命令列表中使用。

          ssh user@ip '
            echo "Hallo sir, how are you doing?"
            whoami
            cd /
            ls
          '
          

      注意:在各自的语句中使用"' 不一定会导致错误。虽然你可能会得到意想不到的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 2020-03-08
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多