使用shell脚本在不同服务器上运行多个命令(从文本文件中获取)并将输出写入另一个文件

时间:2014-04-14 05:32:16

标签: shell

对不起麻烦..这里是适用于单个服务器的代码。我需要帮助将它循环到多个服务器。在此先感谢,请帮助我。

我需要了解多个服务器的信息,例如:

Operating system info
Hostname and dns info
Network info
Who is online
Last logged in users and so on

逻辑是从文本文件传递服务器名称,并为文件中的所有服务器显示相同的信息,并将输出写入其他文件

以下是获取服务器详细信息的不同功能。应该为多个服务器迭代相同的内容。

#!/bin/bash
# grabsysinfo.sh - A simple menu driven shell script to to get information about your 
# Linux server / desktop.

# Define variables
LSB=/usr/bin/lsb_release

# Purpose: Display pause prompt
# $1-> Message (optional)
function pause(){
local message="$@"
[ -z $message ] && message="Press [Enter] key to continue..."
read -p "$message" readEnterKey
}

# Purpose - Display a menu on screen
function show_menu(){
date
echo "---------------------------"
echo " Main Menu"
echo "---------------------------"
echo "1. Operating system info"
echo "2. Hostname and dns info"
echo "3. Network info"
echo "4. Who is online"
echo "5. Last logged in users"
echo "6. Free and used memory info"
echo "7. exit"
}

# Purpose - Display header message
# $1 - message
function write_header(){
local h="$@"
echo "---------------------------------------------------------------"
echo " ${h}"
echo "---------------------------------------------------------------"
}

# Purpose - Get info about your operating system
function os_info(){
write_header " System information "
echo "Operating system : $(uname)"
[ -x $LSB ] && $LSB -a || echo "$LSB command is not insalled (set \$LSB variable)"
#pause "Press [Enter] key to continue..."
pause
}

# Purpose - Get info about host such as dns, IP, and hostname
local dnsips=$(sed -e '/^$/d' /etc/resolv.conf | awk '{if (tolower($1)=="nameserver") print $2}')
write_header " Hostname and DNS information "
echo "Hostname : $(hostname -s)"
echo "DNS domain : $(hostname -d)"
echo "Fully qualified domain name : $(hostname -f)"
echo "Network address (IP) : $(hostname -i)"
echo "DNS name servers (DNS IP) : ${dnsips}"
pause
}

# Purpose - Network inferface and routing info
function net_info(){
devices=$(netstat -i | cut -d" " -f1 | egrep -v "^Kernel|Iface|lo")
write_header " Network information "
echo "Total network interfaces found : $(wc -w <<<${devices})"

echo "*** IP Addresses Information ***"
ip -4 address show

echo "***********************"
echo "*** Network routing ***"
echo "***********************"
netstat -nr

echo "**************************************"
echo "*** Interface traffic information ***"
echo "**************************************"
netstat -i

pause 
}

# Purpose - Display a list of users currently logged on 
# display a list of receltly loggged in users 
function user_info(){
local cmd="$1"
case "$cmd" in 
who) write_header " Who is online "; who -H; pause ;;
last) write_header " List of last logged in users "; last ; pause ;;
esac 
}

# Purpose - Display used and free memory info
function mem_info(){
write_header " Free and used memory "
free -m

echo "*********************************"
echo "*** Virtual memory statistics ***"
echo "*********************************"
vmstat
echo "***********************************"
echo "*** Top 5 memory eating process ***"
echo "***********************************" 
ps auxf | sort -nr -k 4 | head -5 
pause
}
# Purpose - Get input via the keyboard and make a decision using case..esac 
function read_input(){
local c
read -p "Enter your choice [ 1 - 7 ] " c
case $c in
1) os_info ;;
2) host_info ;;
3) net_info ;;
4) user_info "who" ;;
5) user_info "last" ;;
6) mem_info ;;
7) echo "Bye!"; exit 0 ;;
*) 
echo "Please select between 1 to 7 choice only."
pause
esac
}

# ignore CTRL+C, CTRL+Z and quit singles using the trap
trap '' SIGINT SIGQUIT SIGTSTP

1 个答案:

答案 0 :(得分:0)

首先,您需要基于密钥的SSH登录到远程服务器(https://help.ubuntu.com/community/SSH/OpenSSH/Keys#Key-Based_SSH_Logins

之后你使用这样的循环:

function read_input(){
    read -p "Enter your choice [ 1 - 7 ] " c
    for server in $(cat your_server_file);
    do
        case $c in
          1) os_info $server;;
          2) host_info $server;;
          3) net_info $server;;
          4) user_info "who" $server;;
          5) user_info "last" $server;;
          6) mem_info $server;;
          7) echo "Bye!"; exit 0 ;;
          *) 
              echo "Please select between 1 to 7 choice only."
              pause
              esac
   done
}

例如,您的mem_info功能

function mem_info(){
    server=$1
    write_header " Free and used memory "
    ssh ssh_remote_user@server free -m
    echo "*********************************"
    echo "*** Virtual memory statistics ***"
    echo "*********************************"
    ssh ssh_remote_user@server vmstat
    echo "***********************************"
    echo "*** Top 5 memory eating process ***"
    echo "***********************************" 
    ssh ssh_remote_user@server ps auxf | sort -nr -k 4 | head -5 
    pause
}

<强>更新

如果你使用sshpass,你必须稍微改变一下。

您的your_server_file应如下所示:

user1@password1|user1@server1
user2@password2|user2@server2
 ...

您的主要功能

function read_input(){
    read -p "Enter your choice [ 1 - 7 ] " c
    for line in $(cat your_server_file);
    do
        user_pass=$(echo $line | sed -e 's/\(.*\)|\(.*\)/\1/')
        server=$(echo $line | sed -e 's/\(.*\)|\(.*\)/\2/')
        case $c in
          1) os_info $server $user;;
          2) host_info $server $user;;
          3) net_info $server $user;;
          4) user_info "who" $server $user;;
          5) user_info "last" $server $user;;
          6) mem_info $server $user;;
          7) echo "Bye!"; exit 0 ;;
          *) 
              echo "Please select between 1 to 7 choice only."
              pause
              esac
   done
}

和mem_info函数

function mem_info(){
    server=$1
    user_pass=$2
    write_header " Free and used memory "
    sshpass -p $user_pass ssh $server free -m
    echo "*********************************"
    echo "*** Virtual memory statistics ***"
    echo "*********************************"
    sshpass -p $user_pass ssh $server vmstat
    echo "***********************************"
    echo "*** Top 5 memory eating process ***"
    echo "***********************************" 
    sshpass -p $user_pass ssh $server ps auxf | sort -nr -k 4 | head -5 
    pause
}

我没有引用任何内容。请注意特殊字符