脚本调用ssh;想要在本地计算机上创建日志

脚本调用ssh;想要在本地计算机上创建日志

我需要创建一个脚本来登录 中列出的所有服务器servers.txt。我想使用密码,而不是无密码。登录后,我需要设置一个变量并执行if-  then-  else。工作完成后,应该在本地计算机上创建一个文件,而不是在远程计算机上。 (本地)文件将包含未运行某些进程的计算机的主机名。

总体思路是:

#!/bin/bash
while read line
do
    sshpass -p ******** ssh "mydomain1\admin1"@$line bash -s << EOF
    pwd=*********
    var=$"(ps -ef | grep http | grep -v grep | wc -l)"
    if (( var > 0 ))
    then
        echo  "$pwd" | sudo -S ps -ef | grep patrol | grep -v grep | awk '{print $2}' | xargs kill
        echo  "$pwd" | sudo -S rm -rf /data/abc /etc/efg 
        #need to create the log on local machine, not on remote machine
        hostname >> /find.txt
    else
        #need to create the log on local machine, not on the remote machine
        hostname >> /agentnotthere.txt
    fi
EOF
#servers.txt contains server names
done < servers.txt

显然,上面的第 5-16 行形成了一个此处文档,其中包含要在远程主机上运行的命令。在此文档中,我有命令hostname >> /find.txthostname >> /agentnotthere.txt.正如我的介绍性段落中以及代码中的注释中所述,我希望将(远程)主机名写入本地文件,而不是远程计算机上的文件。显然,远程机器上的命令将写入文件command >> filename在远程机器上

如何让我的脚本(用于ssh在远程计算机上运行一些命令)根据在远程计算机上执行的测试结果将输出写入本地文件?

答案1

我认为没有一种简单的方法可以完成您想要的操作,这意味着将本地主机上的文件与远程计算机上执行的脚本分开写入。

不过,您可以轻松地将脚本的输出通过管道传输到一个本地文件:

ssh host << EOF > output_file              
some commands
to be executed
EOF

这样,您可以重组脚本,使其执行ssh多次(这会增加开销,但您可以通过在配置文件中ssh使用来减轻大部分开销)。ControlPersistssh

所以你最终会得到这样的结果(伪bash):

echo "get the output of var script" | ssh host > var_value
if var read from the file is more than zero; then
  echo "the thing you want" | ssh host >> /find.txt
else
  echo "the other thing you want" | ssh host >> /agentnotthere.txt
fi

这应该很适合您的用例:)

我对脚本本身的两点看法:

  • Ansible 或其他配置管理工具之一可能比编写 bash 脚本更适合此任务
  • 从安全角度来看,使用 SSH 密码代替密钥验证是不好的。但我遇到过无法实现此操作的情况,原因是公司政策/旧嵌入式内容不支持此操作/等等。
  • ps aux | grep -v grep | grep something您可以使用pgrep和,而不是使用旧的样板pkill。它们是标准的coreutils,所以除非您使用非常古老的系统,否则它们应该可用。

相关内容