Я автоматизирую процесс развертывания и хочу иметь возможность просто вызвать один файл .sh на моей машине, сделать так, чтобы он выполнил мою сборку и загрузить .zip на сервер, а затем сделать кучу вещей на сервере. Одна из вещей, которые мне нужно сделать, требует, чтобы я был root. Итак, что я хочу сделать, это:
ssh user@172.1.1.101 <<END_SCRIPT
su -
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT
Это вообще возможно?
Ответы:
Вы рассматривали sudo без пароля вместо этого?
источник
Вместо su используйте sudo с набором NOPASSWD в sudoers для соответствующих команд. Вы хотите, чтобы разрешенный набор команд был максимально ограничен. Вызывать запуск скрипта для корневых команд может быть самым чистым способом, и гораздо проще сделать его безопасным, если вы не знакомы с синтаксисом файла sudoer. Для команд / сценариев, которые требуют полной загрузки среды,
sudo su - -c command
работает, хотя может быть излишним.источник
То, что вы описываете, может быть возможно с ожиданием .
источник
Вы можете передать команду в качестве аргумента SSH, чтобы просто запустить эту команду на сервере и затем выйти:
Это также работает для списка нескольких команд:
Или в качестве альтернативы:
Как уже указывали другие пользователи, при запуске
su
на сервере будет запущена новая оболочка вместо выполнения последующих команд в сценарии от имени пользователя root. Что вам нужно сделать, это использовать либоsudo
илиsu -c
, и принудительно назначить TTY SSH с-t
коммутатором (требуется, если вам нужно ввести пароль root):Подводя итог, можно сказать, что одним из способов достижения того, что вы хотите сделать, будет:
Поскольку,
sudo
как правило, запоминает уровень авторизации на несколько минут, прежде чем снова запрашивать пароль пользователя root, простое добавлениеsudo
ко всем командам, которые необходимо выполнить от имени пользователя root, является, вероятно, самым простым способом запуска команд от имени пользователя root на сервере. ДобавлениеNOPASSWD
правила для вашего пользователя/etc/sudoers
сделает этот процесс еще более плавным.Надеюсь, это поможет :-)
источник
NOPASSWD
правила, проверьте примеры в нижней частиman sudoers
. Кроме того, не забудьте использоватьvisudo
при редактировании вашегоsudoers
файла, чтобы избежать поломки!su -c
вместоsudo
, вы должны запустить SSH с-t
флагом - вам будет предложено ввести пароль root на сервере при выполнении команды. Предоставление пароля непосредственноsu
в качестве аргумента командной строки не поддерживается (насколько я знаю) и не рекомендуется - поскольку простоеps -ef | grep su
раскрывает все переданные аргументыsu
, включая любой пароль, предоставленный из командной строки ...su -c
через SSH:ssh -t user@host 'su -lc "
<br />echo this is a test
<br />echo this is another test
<br />"
<br />'
<br />
вышеприведенное на новые строки в вашем скрипте. Не по теме: Можете ли вы добавить новые строки в комментарии ServerFault? Это было бы весьма полезно при публикации фрагментов кода ...Нет. Даже если вы получите пароль
su
, вам все равно придется иметь дело с тем фактом, чтоsu
откроется новая оболочка, а это означает, что ваши дальнейшие команды не будут переданы ей. Вам нужно будет написать сценарий для корневых операций вместе с исполняемым файлом помощника, который может вызывать его с соответствующими привилегиями.источник
Напишите сценарий ожидания. Я знаю, что вы уже нашли ответ на этот вопрос, но это может быть полезно, если вам нужно войти на группу серверов, которые требуют интерактивного ввода пароля.
Это язык, основанный на TCL, поэтому он может быть немного странным по сравнению с простыми старыми сценариями оболочки. Но он управляет автоматизацией ввода текста и, как вы уже догадались, «ожидает» определенные биты вывода перед вводом любого вида автоматического ввода пароля или повышения привилегий.
Вот хорошая ссылка в качестве руководства: http://bash.cyberciti.biz/security/expect-ssh-login-script/
На случай, если сайт отключится:
источник
Я знаю, что это немного поздно, но я бы лично использовал Net :: SSH :: Expect, доступный на CPAN.
http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod
источник
Вы можете использовать 'ssh example.com su -lc "$ cmd"'.
Когда команда содержит опции, вам нужно заключить их в кавычки, иначе «su» может их съесть («su: неверная опция -« A »).
источник