我正在致力于自动收集一组服务器上的磁盘空间。
在标准终端中,如果我运行:
ssh server1 ssh server2 df -h
然后我得到命令的输出,就好了。
但是,如果我在使用 For 循环的脚本中尝试此方法。然后就失败了。
脚本示例:
#!/bin/bash
GROUP="server1 server2"
for s in $GROUP; do
ssh bastion1 ssh ${s} df -h
done
在后一个示例中,我没有得到任何输出(或与此相关的错误)。我尝试过各种转义和引用,但仍然没有运气......我有一种感觉,这是我所忽略的明显的东西。有什么指点吗?
答案1
你有两种方法
方法一:
Groups="server1 server2"
echo $Groups | xargs -n1 | xargs -I'{}' echo ssh '{}' df
注意:-如果上述命令的输出正常,则只需echo
在最后删除即可,然后它将在远程服务器上运行命令。不要在大写字母中使用变量,因为它用于环境变量
方法二:
您可以参考下面的脚本
#!/bin/bash
# ssh password less login is required
# mention below remote server seperated by space
remote_srv=( 127.0.0.1 127.0.0.2 127.0.0.3 )
do_ssh() {
ssh $s "$@"
echo -e
}
header() {
echo "#==================={$@}==========================#"
}
n=${#remote_srv[@]} # number of ip's in array
for (( i=0;i<$n;i++)); do
echo -e
echo "$(tput bold)$(tput setaf 2)* Connected Server: ${remote_srv[$i]} @@ $(date) @@"
echo "* Fetching info...$(tput sgr 0)"
s=${remote_srv[$i]}
header "Memory Usage"
do_ssh free -m
header "Disk Usage"
do_ssh df -h
done
## EOF
答案2
UNIX 为您提供了更好的解决方案,您不需要 ssh 并运行 df 或 du 等......
您可以tmux command
在服务器上使用并关闭会话,但是如果您通过打开,则不会关闭程序tmux
。tmux
类似于屏幕命令,但非常非常复杂和有用。