URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8919
[ Назад ]

Исходное сообщение
"скрипт удаленного управления *nix службами"

Отправлено Shadowsled , 10-Ноя-10 10:41 
Прошу помочь в написании скрипта.
Есть задача: написать скрипт, который должен на удаленной Linux машине запускать, перезапускать, оставнавливать определенный набор служб и выводить статус выполнения.
С помощью командной строки могу передавать нужные команды, но нужно чтобы в скрипте все эти опции содержались и соответственно пути к ним, знаю, что можно переменными обозначить пути, но как их передавать и делать проверку не могу понять...
К примеру нужно манипулировать службами:
httpd
named
oracle

Надеюсь написал понятно, подобный скрипты раньше не писал, сильно не критикуйте. rolleyes

Выбрал expect, вот что получилось:

#!/usr/bin/expect -f
# Скрипту нужно передавать 5 параметра из командной строки :
# user - пользователь
# ipaddr = IP удаленной машины
# password = пароль на удаленной Unix машине
# scriptname = полный путь к скрипту на удаленной машине
# options =  option
# Пример:
#  ./2test.exp user 192.168.1.11  password  /etc/init.d/oracle status
# ----------------------------------------------------------------------
log_file -a /var/log/expect.log

set user [lindex $argv 0]
set ipaddr [lindex $argv 1]
set password [lindex $argv 2]
set scriptname [lindex $argv 3]
set option [lindex $argv 4]

# тут проверка "на кто я есть"
# set whoami [exec id -u]
# if {$whoami!=0} {
#   send_user "You must be a root user to run this script\n"
#   exit
# }


# проверка на соответствие количества параметров

   if { $user == "" } {
    puts "Usage: <user> <ipaddr> <password> <scriptname> <option>\n"
      exit 1
      } elseif { $user != "" && $ipaddr == "" } {
   puts "Usage: <ipaddr> <password> <scriptname> <option>\n"
      exit 1
      } elseif { $user != "" && $ipaddr != "" && $password == "" } {
   puts "Usage: <password> <scriptname> <option>\n"
      exit 1
      } elseif { $user != "" && $ipaddr != "" && $password != "" && $scriptname == "" } {
   puts "Usage: <scriptname> <option>\n"
      exit 1
      } elseif { $user != "" && $ipaddr != "" && $password != "" && $scriptname != "" && $option == "" } {
   puts "Usage: <option>\n"
      exit 1
      }
set timeout -1
log_user 0
# подключение к удаленной машине
spawn ssh $user@$ipaddr
match_max 100000
set timeout -1

expect {
       -re ".*Are.*.*yes.*no.*" {
       send "yes\r"
       sleep 3
       send "$password\r"
       }
       "*?assword:*" {
       send "$password\r"
        }
       }

send "$scriptname $option\r"
set timeout -1
set results $expect_out(buffer)
log_user 1
expect -re "#"
set timeout -1
send "exit\r"
expect eof

приведу более наглядный пример реализации, допустим команды ping:

ping
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination

То есть, утрировано конечно... но как-то так, чтобы скрипт выглядел(функционировал)как отдельная программа.
Я думал, абсолютные пути к сервисам присвоить переменным и делать проверку по наличию в строке, при вызове скрипта, имени переменной, после передавать на выполнение, только не могу сообразить как..?


Содержание

Сообщения в этом обсуждении
"скрипт удаленного управления *nix службами"
Отправлено Shadowsled , 15-Ноя-10 19:23 
я его сделал!
Впереди оптимизация и доработки, но все же работает!

set user [lindex $argv 0]
set ipaddr [lindex $argv 1]
set password [lindex $argv 2]
set scriptname [lindex $argv 3]
set option [lindex $argv 4]
set dozor_path "/opt/dozor/smap/bin/"
set httpdctlsa "/opt/dozor/smap/admin-httpd/bin/httpdctl"


# set whoami [exec id -u]
# if {$whoami!=0} {
#   send_user "You must be a root user to run this script\n"
#   exit
# }


# now connect to remote UNIX box (ipaddr) with given script to execute
# if { $user == "" || $ipaddr == "" || $password == "" || $scriptname == "" || $option == "" } {
   if { $user == "" } {
    puts "Usage: <user> <ipaddr> <password> <scriptname> <option>\n"
      exit 1
      }
    if { $ipaddr == "" } {
   puts "Usage: <ipaddr> <password> <scriptname> <option>\n"
      exit 1
      }
    if { $password == "" } {
   puts "Usage: <password> <scriptname> <option>\n"
      exit 1
      }
    if { $scriptname == "" } {
   puts "Usage: <scriptname> <option>\n"
      exit 1
      }
    if { $option == "" } {
   puts "Usage: <option>\n"
      exit 1
      }
set timeout -1
log_user 0
spawn ssh $user@$ipaddr
match_max 100000
set timeout -1
expect {
       -re ".*Are.*.*yes.*no.*" { send "yes\r" }
       ".*arning*.*host.*" { send "\r" }
       "*?assword:*" { send "$password\r" }
}
send "\r"
     if {
         $scriptname == "senderctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "archiverctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "smtpgwctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "mailfilterctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "smapctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "actionsctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "httpdctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "monitorctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "tikaserverctl"} {
         send "$dozor_path$scriptname $option\r"
      }  elseif {
         $scriptname == "soooctl"} {
         send "$dozor_path$scriptname $option\r"
      } elseif {
         $scriptname == "httpdctlsa"} {
         send "$httpdctlsa $option\r"
      }


set timeout -1
set results $expect_out(buffer)
log_user 1
expect -re "#"
set timeout -1
send "exit\r"
expect eof


С ssh ключами конечно будет шустрее....
Рассмотрю все предложения по оптимизации...