【问题标题】:Redirect grep output to file in server将 grep 输出重定向到服务器中的文件
【发布时间】:2017-07-06 08:55:11
【问题描述】:

我正在尝试编写一个脚本,该脚本在多个服务器中查找某些内容,并将所有服务器的输出附加到一个文件中。服务器受密码保护。我使用 expect 进入服务器并传递 grep 命令,但我希望将它们中的每一个的输出都放在一个文件中。

这是我想做的事情的概述:

spawn ssh xxx@server1 expect "password: " send "PASSWORD\r" expect "$ " send "grep <something> /some/log/file >> file.txt" expect "$ " send "exit\r"

... 然后继续在几十个服务器上执行此操作,每次将 grep 命令的输出附加到 file.txt 。我不介意 file.txt 实际上在哪里。它可以在我的本地计算机或任何服务器上。

我想出的最好的方法是将这些中的每一个都放在正在执行 grep 的服务器上的文件中,然后将所有这些文件 scp 到本地并将它们全部附加。不过,这似乎非常浪费,所以我正在寻找一种将输出发送到服务器或从服务器发送到本地的方法。

【问题讨论】:

    标签: shell grep sh expect


    【解决方案1】:

    如果您使用公钥身份验证而不是密码身份验证来访问服务器,那么自动化将更容易且更安全。然后你可以像这样简单地循环它们:

    for host in server1 server2 server3  ...; do
      ssh -n "$host" 'grep <something> /some/log/file'
    done >file.txt
    

    由于您有密码访问权限,您可以轻松地将公钥放入.ssh/authorized_keys 以首先启用密钥访问权限。你可以用你的期望脚本来做到这一点:

    spawn ssh xxx@server1
    expect "password: "
    send "PASSWORD\r"
    expect "$ "
    send "mkdir -p .ssh\r"
    expect "$ "
    send "cat >>.ssh/authorized_keys <<EOF"
    send "(public key goes here)\r"
    send "EOF\r"
    expect "$ "
    send "chmod 0700 .ssh\r"
    expect "$ "
    send "chmod 0600 .ssh/authorized_keys\r"
    expect "$ "
    send "exit\r"
    

    【讨论】:

      【解决方案2】:

      如果出于某种原因您必须使用带有密码输入的解决方案,您可以使用expect 附加到文件中,例如:

      log_user 0                 # to not see the output on screen
      set fh [open foo.log a]    # open the file for appending
      
      set servers {user@server user@server2 […]}
      
      foreach s $servers {
          spawn ssh user@server
          […]
          send "command"
          expect "$ " { puts $fh "$expect_out(buffer)"} 
      }
      close $fh
      

      【讨论】:

      • 这很好用,你能解释一下为什么你使用 [open foo.log a] 而不仅仅是 foo.log 吗?还有,close $fh是什么意思?
      猜你喜欢
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多