我需要创建一个脚本来登录 中列出的所有服务器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.txt
和hostname >> /agentnotthere.txt
.正如我的介绍性段落中以及代码中的注释中所述,我希望将(远程)主机名写入本地文件,而不是远程计算机上的文件。显然,远程机器上的命令将写入文件command >> filename
在远程机器上。
如何让我的脚本(用于ssh
在远程计算机上运行一些命令)根据在远程计算机上执行的测试结果将输出写入本地文件?
答案1
我认为没有一种简单的方法可以完成您想要的操作,这意味着将本地主机上的文件与远程计算机上执行的脚本分开写入。
不过,您可以轻松地将脚本的输出通过管道传输到一个本地文件:
ssh host << EOF > output_file
some commands
to be executed
EOF
这样,您可以重组脚本,使其执行ssh
多次(这会增加开销,但您可以通过在配置文件中ssh
使用来减轻大部分开销)。ControlPersist
ssh
所以你最终会得到这样的结果(伪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
,所以除非您使用非常古老的系统,否则它们应该可用。