Вам нужна бюрократия как CMDB!, возможно.. но это не серебряная пуля. Самый дешевый инструмент, с которого можно запустить, является словом MS или Wiki.
Серверы в производстве должны являться объектом контроля изменений, изменений не должно происходить волей-неволей.
Необходимо выбрать правильный уровень бюрократии для бизнеса.
Почему там несколько человек, вносящих изменения для подталкивания в такую небольшую среду? Может быть пора представить четкое разделение ролей и иметь одного производственного человека что, который имеет доступ администратора и развертывает все изменения.
Для восстановления машин можно сделать что-то простое как 'руководство сборки' при создании большого количества серверов, которые немного отличаются, затем имеют универсальное руководство и восполняют пробелы для определенных серверов.
Необходимо также зарегистрировать план аварийного восстановления, так, чтобы бизнес знал, что сделать, если сервер / данные потерян.
Вместо su используйте sudo с набором NOPASSWD в sudoers для соответствующей команды (команд). Вы захотите сделать позволенный набор команд максимально ограниченным. Наличие его, вызов запускает скрипт для корневых команд, может быть самым чистым путем и безусловно самый легкий сделать безопасным, если Вы незнакомы с sudoer синтаксисом файла. Для команд/сценариев, которые требуют, чтобы полная среда была загружена, sudo su - -c command
работы, хотя может быть излишество.
То, что Вы описываете, могло бы быть возможным с, ожидают.
Можно передать команду как аргумент SSH, чтобы просто выполнить ту команду на сервере и затем выйти:
ssh user@host "command to run"
Это также работает на список нескольких команд:
ssh user@host "command1; command2; command3"
Или альтернативно:
ssh user@host "
command1
command2
command3
"
Поскольку другие пользователи указали передо мной, работая su
на сервере запустит новую оболочку вместо того, чтобы выполнить последующие команды в сценарии как корень. То, что необходимо сделать, должно использовать также sudo
или su -c
, и вызовите выделение TTY к SSH с -t
переключатель (потребовал, если необходимо ввести пароль root):
ssh -t user@host 'su - -c "command"'
ssh -t user@host 'sudo command'
Для подведения все это, один способ выполнить, что Вы хотите сделать, было бы:
#!/bin/bash
ssh -t user@172.1.1.101 "
sudo some_command
sudo service server_instance stop
sudo some_other_command
"
С тех пор sudo
обычно помнит Вас уровень авторизации в течение нескольких минут прежде, чем попросить пароль root снова, просто предварительно ожидая sudo
ко всем командам необходимо работать, поскольку корень вероятен самый легкий путь к командам выполнения как корень на сервере. Добавление a NOPASSWD
управляйте для своего пользователя в /etc/sudoers
сделал бы процесс еще более гладким.
Я надеюсь, что это помогает :-)
NOPASSWD
правило, проверьте примеры у основания man sudoers
. Кроме того, не забудьте использовать visudo
при редактировании Вашего sudoers
файл для предотвращения поломки!
– jabirali
15 July 2010 в 14:07
Нет. Даже если Вы получаете пароль к su
, все еще необходимо иметь дело с фактом это su
откроет новую оболочку, что означает, что Ваши дальнейшие команды не будут переданы ей. Необходимо будет записать сценарий для корневых операций наряду с исполняемым файлом помощника, который может вызвать его с соответствующими полномочиями.
Запишите ожидать сценарий. Я знаю, что Вы уже нашли ответ для этого, но это могло бы быть полезно, если необходимо войти в набор серверов, которые требуют интерактивного ввода пароля.
Это - язык, базирующийся прочь TCL, таким образом, это могло бы быть немного странно по сравнению с простыми сценариями оболочки. Но это обрабатывает автоматизацию ввода текста и, Вы предположили это, "ожидает" определенные биты вывода прежде, чем войти в любой вид автоматизированного ввода пароля или эскалацию полномочий.
Вот хорошая ссылка как руководство: http://bash.cyberciti.biz/security/expect-ssh-login-script/
На всякий случай сайт понижается:
#!/usr/bin/expect -f
# Expect script to supply root/admin password for remote ssh server
# and execute command.
# This script needs three argument to(s) connect to remote server:
# password = Password of remote UNIX server, for root user.
# ipaddr = IP Addreess of remote UNIX server, no hostname
# scriptname = Path to remote script which will execute on remote server
# For example:
# ./sshlogin.exp password 192.168.1.11 who
# ------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# set Variables
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set scriptname [lrange $argv 2 2]
set arg1 [lrange $argv 3 3]
set timeout -1
# now connect to remote UNIX box (ipaddr) with given script to execute
spawn ssh root@$ipaddr $scriptname $arg1
match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof
Я знаю, что это немного поздно, но я лично использовал бы Сеть:: SSH:: Ожидайте, доступный от CPAN.
http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod
You can use 'ssh example.com su -lc "$cmd"'.
When command contains options, you need to quote it, otherwise "su" might eat them ("su: invalid option -- 'A').
ssh -AX -tt example.com 'su -lc "tmux new-session -A"'