Как выполнить изменения на удаленном сервере от имени пользователя root?

8

Мне интересно, есть ли способ выполнить скрипт / команды с локальной машины без внесения каких-либо изменений от имени пользователя root на удаленной машине?

Некоторый фон

Я пытаюсь настроить некоторые задачи через Capistrano, и мне требуется sudoдоступ. Существует около 30+ серверов, и для меня обновление вручную /etc/sudoersбудет болезненным, поэтому мне было интересно, есть ли способ обновить этот файл удаленно?

kaizenCoder
источник
Вы можете использовать Fabric, которая имеет удаленное взаимодействие. Вы можете сделать то же самое без параллельного взаимодействия, используя fabric.contrib.files.sedметод.
lcipriani
Если у вас есть 30 серверов, которыми вы управляете, я настоятельно рекомендую SaltStack
Уэйн Вернер

Ответы:

18

Вы можете запускать локальные сценарии удаленно, выполняя bashв удаленной системе и передавая им свой сценарий

$ ssh user@host 'bash -s' < script.sh

редактировать

Для выполнения команд, требующих использования sudoна удаленной машине, используйте ssh's -tопцию и передайте команды ssh. -tВариант выделяет псевдо TTY и позволяет взаимодействие пользователя с команды пробежал ssh, например , при вводе пароляsudo

$ ssh user@host -t 'sudo foo'

Для изменения файла с помощью этого метода sedрекомендуется использовать перенаправление, >поскольку перенаправление оболочки не позволяет записывать файлы при использовании sudo. Кроме того, все переменные в sedкоманде должны быть экранированы при их передаче ssh.

$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'

Чтобы автоматизировать все это:

#!/bin/bash
SERVERS=( server1 server2 server3 )

for HOST in ${SERVERS[@]}; do 
    ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'

    if [[ $? -ne 0 ]]; then
        echo "ERROR: $HOST did not complete"
     else   
        echo "$HOST complete"
    fi   
done
ручей
источник
Спасибо за сценарий и все, но он не отвечает на мой вопрос. Если я захочу изменить /etc/sudoersфайл из-за прав доступа root, он не удастся.
kaizenCoder
@aspiringCodeArtisan см. изменения к ответу
Creek,
Привет, даже это запрашивает sudoпароль, который, как я понимаю, установлен в/etc/sudoers
kaizenCoder
1
@aspiringCodeArtisan Если ваша учетная запись не имеет sudoправ на этих компьютерах, то для изменения /etc/sudoersвам нужно будет войти через ssh as root. Таким образом, команда будетssh root@host -t 'sed -i "\$a text to insert" /path/to/file'
Крик
Вход в систему root ssh по умолчанию отключен, поэтому его нельзя использовать. Я думаю, что я могу просить невозможного.
kaizenCoder
1

Я обнаружил, что teeкоманда помогает избежать ограничения sudo при перенаправлении файлов. Использование sed оказалось разочаровывающим из-за требований побега персонажа.

Это команда, которую я использовал для удаленного добавления хостов для всех машин в моем кластере в / etc / hosts:

for i in {1..10}; do ssh ubuntu@10.1.1.$i -t "echo '10.1.1.1 dev-1    
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"

Выходные данные для каждой итерации выглядят так:

0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s

Этот ответ SU сыграл ключевую роль в построении моего окончательного решения: https://superuser.com/a/1026359/587485

Garren
источник
1

Если вам нужно выполнить несколько команд или перенаправлений, вы должны использовать следующий синтаксис:

ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"
riverfall
источник
0

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

jag4701
источник