Прошу помочь в написании скрипта.
Есть задача: написать скрипт, который должен на удаленной 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
То есть, утрировано конечно... но как-то так, чтобы скрипт выглядел(функционировал)как отдельная программа.
Я думал, абсолютные пути к сервисам присвоить переменным и делать проверку по наличию в строке, при вызове скрипта, имени переменной, после передавать на выполнение, только не могу сообразить как..?