использование su в сценарии оболочки

Вам нужна бюрократия как CMDB!, возможно.. но это не серебряная пуля. Самый дешевый инструмент, с которого можно запустить, является словом MS или Wiki.

Серверы в производстве должны являться объектом контроля изменений, изменений не должно происходить волей-неволей.

Необходимо выбрать правильный уровень бюрократии для бизнеса.

Почему там несколько человек, вносящих изменения для подталкивания в такую небольшую среду? Может быть пора представить четкое разделение ролей и иметь одного производственного человека что, который имеет доступ администратора и развертывает все изменения.

Для восстановления машин можно сделать что-то простое как 'руководство сборки' при создании большого количества серверов, которые немного отличаются, затем имеют универсальное руководство и восполняют пробелы для определенных серверов.

Необходимо также зарегистрировать план аварийного восстановления, так, чтобы бизнес знал, что сделать, если сервер / данные потерян.

12
задан 16 July 2010 в 06:05
8 ответов

Вы рассмотрели пароль меньше sudo вместо этого?

15
ответ дан 2 December 2019 в 21:31
  • 1
    Это - подход, который я использовал в прошлом. Можно ограничить sudo необходимыми командами (запустите/остановите сервис), ограничивая полномочия, к которым имеет пользователь точно, в чем Вы нуждаетесь. Это все еще чувствует себя неуклюжим, но работы. –  Mark 15 July 2010 в 06:19

Вместо su используйте sudo с набором NOPASSWD в sudoers для соответствующей команды (команд). Вы захотите сделать позволенный набор команд максимально ограниченным. Наличие его, вызов запускает скрипт для корневых команд, может быть самым чистым путем и безусловно самый легкий сделать безопасным, если Вы незнакомы с sudoer синтаксисом файла. Для команд/сценариев, которые требуют, чтобы полная среда была загружена, sudo su - -c command работы, хотя может быть излишество.

5
ответ дан 2 December 2019 в 21:31

То, что Вы описываете, могло бы быть возможным с, ожидают.

3
ответ дан 2 December 2019 в 21:31

Можно передать команду как аргумент 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 сделал бы процесс еще более гладким.

Я надеюсь, что это помогает :-)

3
ответ дан 2 December 2019 в 21:31
  • 1
    Если Вам нужно больше информации о добавлении этого NOPASSWD правило, проверьте примеры у основания man sudoers. Кроме того, не забудьте использовать visudo при редактировании Вашего sudoers файл для предотвращения поломки! –  jabirali 15 July 2010 в 14:07

Нет. Даже если Вы получаете пароль к su, все еще необходимо иметь дело с фактом это su откроет новую оболочку, что означает, что Ваши дальнейшие команды не будут переданы ей. Необходимо будет записать сценарий для корневых операций наряду с исполняемым файлом помощника, который может вызвать его с соответствующими полномочиями.

2
ответ дан 2 December 2019 в 21:31
  • 1
    Большинство команд su принимает-c опцию, которая примет как аргумент управление для выполнения. Я соглашаюсь, что сценарий на самом сервере является, вероятно, лучшим по сравнению с отправкой всего cmds по ssh. –  Aaron Bush 15 July 2010 в 03:48

Запишите ожидать сценарий. Я знаю, что Вы уже нашли ответ для этого, но это могло бы быть полезно, если необходимо войти в набор серверов, которые требуют интерактивного ввода пароля.

Это - язык, базирующийся прочь 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
1
ответ дан 2 December 2019 в 21:31

Я знаю, что это немного поздно, но я лично использовал бы Сеть:: SSH:: Ожидайте, доступный от CPAN.

http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod

1
ответ дан 2 December 2019 в 21:31

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"'
0
ответ дан 2 December 2019 в 21:31

Теги

Похожие вопросы